diff --git a/aerosense b/aerosense index 56004bd..d112ac3 100644 --- a/aerosense +++ b/aerosense @@ -1 +1 @@ -{"Id":160,"Name":null,"Description":null,"FirmwareVersion":"","InProgress":true,"MessageTypes":[{"Id":4674,"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,"Command":null,"CacheImei":false,"RegEx":"\\+RESP:NACT,[^,]*,[^\\$,]*\\$","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":4417,"Code":"ACK-VERSION","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"AEROSENSE;ACK-VERSION;<>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"Command":{"Id":2704,"Protocol":{"Id":160,"Code":"AeroSense","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"GetFirmware","TemplateSMS":null,"Template":"1201000200000000000000000006001300000000","AckTemplate":null,"Operation":"// write your code here...","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":1,"Order":null},"CacheImei":false,"RegEx":"^AEROSENSE;ACK-VERSION;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":4359,"Code":"CHK","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"AEROSENSE;CHK;<>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"Command":null,"CacheImei":false,"RegEx":"^AEROSENSE;CHK;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":3787,"Code":"COMM","Name":null,"MessageCode":null,"NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":true,"NoOperation":false,"Type":0,"Template":"AEROSENSE-ASSOCIATE;<>;<>;","HasTemplateGlobal":true,"ResponseTemplate":"<>","TemplateGlobal":"1201<>","LongConnection":true,"HexString":true,"AckFirst":true,"ScaipH":false,"DoNotSendCommands":false,"Command":null,"CacheImei":false,"RegEx":"^AEROSENSE-ASSOCIATE;[^;]*;[^;;]*;","RegExGlobal":"^1201[^ ]*","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":4204,"Code":"INFO","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"AEROSENSE;HEATMAP;<>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"Command":null,"CacheImei":false,"RegEx":"^AEROSENSE;HEATMAP;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":4197,"Code":"ACK-WORKRANGE","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"AEROSENSE;ACK-WORKRANGE;<>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"Command":{"Id":2359,"Protocol":{"Id":160,"Code":"AeroSense","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"SetWorkRange","TemplateSMS":null,"Template":"12010002000000000000000000060006<>","AckTemplate":null,"Operation":"// write your code here...\n//var header = \"12010002000000000000000000060006\"\nvar configs = [];\n// Convert Float32 to Hex string\nconst Float32ToHex = (float32) => {\n const getHex = i => ('00' + i.toString(16)).slice(-2);\n var view = new DataView(new ArrayBuffer(4))\n view.setFloat32(0, float32);\n return Array.apply(null, {\n length: 4\n }).map((_, i) => getHex(view.getUint8(i))).join('');\n};\nvar data = Float32ToHex(Number(params.RadarSettings.WorkRange));\nAddValue(\"value\", 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":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":1},"CacheImei":false,"RegEx":"^AEROSENSE;ACK-WORKRANGE;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":4210,"Code":"STATUS-USERRESET","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"AEROSENSE;USERRESET;<>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"Command":null,"CacheImei":false,"RegEx":"^AEROSENSE;USERRESET;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":4208,"Code":"ALF-NEG","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"AEROSENSE;NEGFALL;<>;<>;<>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"Command":null,"CacheImei":false,"RegEx":"^AEROSENSE;NEGFALL;[^;]*;[^;;]*;[^;;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":4207,"Code":"DIST-POS","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"AEROSENSE;DIST-POS;<>;<>;<>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"Command":null,"CacheImei":false,"RegEx":"^AEROSENSE;DIST-POS;[^;]*;[^;;]*;[^;;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":4205,"Code":"ACK-HEATMAP","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"AEROSENSE;ACK-HEATMAP;<>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"Command":{"Id":2699,"Protocol":{"Id":160,"Code":"AeroSense","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"SetEnableHeatMap","TemplateSMS":null,"Template":"1201000200000000000000000006000c<>","AckTemplate":null,"Operation":"var configs = [];\nlet data = '00000000';\nif (params.RadarSettings.EnableHeatmap == 'true') {\n data = '00000001'\n}\nAddValue(\"value\", 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":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":1},"CacheImei":false,"RegEx":"^AEROSENSE;ACK-HEATMAP;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":4203,"Code":"ALINVADE","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":1,"Template":"AEROSENSE;INVADE;<>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"Command":null,"CacheImei":false,"RegEx":"^AEROSENSE;INVADE;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":4202,"Code":"ACK-MACHINELEARN","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"AEROSENSE;ACK-MACHINELEARN;<>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"Command":{"Id":2581,"Protocol":{"Id":160,"Code":"AeroSense","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"SetEnableMachineLearning","TemplateSMS":null,"Template":"12010002000000000000000000060015<>","AckTemplate":null,"Operation":"var configs = [];\nlet data = '00000000';\nif (params.RadarSettings.EnableMachineLearning == 'true') {\n data = '00000001'\n}\nAddValue(\"value\", 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":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":1},"CacheImei":false,"RegEx":"^AEROSENSE;ACK-MACHINELEARN;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":4201,"Code":"ACK-INVADE","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"AEROSENSE;ACK-INVADE;<>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"Command":{"Id":2580,"Protocol":{"Id":160,"Code":"AeroSense","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"SetInvadeDetection","TemplateSMS":null,"Template":"1201000200000000000000000006000e<>","AckTemplate":null,"Operation":"var configs = [];\nlet data = '00000000';\nif (params.RadarSettings.InvadeDetection == 'true') {\n data = '00000001'\n}\nAddValue(\"value\", 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":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":1},"CacheImei":false,"RegEx":"^AEROSENSE;ACK-INVADE;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":4200,"Code":"ACK-TIMEINT","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"AEROSENSE;ACK-TIMEINT;<>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"Command":{"Id":2579,"Protocol":{"Id":160,"Code":"AeroSense","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"SetTimeInterval","TemplateSMS":null,"Template":"12010002000000000000000000060004<>","AckTemplate":null,"Operation":"var configs = [];\n/**\n * Converts integer number to hex string\n * @param {Integer} number \n * @returns hex string\n */\nfunction IntToHex(number, padding = 8) {\n return number.toString(16).padStart(8, '0');\n}\nvar data = IntToHex(Number(params.RadarSettings.TimeInterval));\nAddValue(\"value\", 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":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":1},"CacheImei":false,"RegEx":"^AEROSENSE;ACK-TIMEINT;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":4199,"Code":"ACK-WORKHEIGHT","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"AEROSENSE;ACK-WORKHEIGHT;<>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"Command":{"Id":2578,"Protocol":{"Id":160,"Code":"AeroSense","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"SetWorkHeight","TemplateSMS":null,"Template":"12010002000000000000000000060002<>","AckTemplate":null,"Operation":"// write your code here...\n//var header = \"12010002000000000000000000060006\"\nvar configs = [];\n// Convert Float32 to Hex string\nconst Float32ToHex = (float32) => {\n const getHex = i => ('00' + i.toString(16)).slice(-2);\n var view = new DataView(new ArrayBuffer(4))\n view.setFloat32(0, float32);\n return Array.apply(null, {\n length: 4\n }).map((_, i) => getHex(view.getUint8(i))).join('');\n};\nvar data = Float32ToHex(Number(params.RadarSettings.WorkHeight));\nAddValue(\"value\", 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":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":1},"CacheImei":false,"RegEx":"^AEROSENSE;ACK-WORKHEIGHT;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":4196,"Code":"COMM-LOG","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"AEROSENSE-LOG;<>;<>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"Command":null,"CacheImei":false,"RegEx":"^AEROSENSE-LOG;[^;]*;[^;;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":2,"NewValue":"{\"Id\":4196,\"Code\":\"COMM-LOG\",\"Name\":null,\"MessageCode\":\"COMM\",\"NeedAck\":false,\"IsAck\":false,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"AEROSENSE-LOG;<>;<>;\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":null,\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":true,\"Command\":null,\"CacheImei\":false,\"RegEx\":\"^AEROSENSE-LOG;[^;]*;[^;;]*;\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1689772836}],"Tags":[]},{"Id":4098,"Code":"ALF","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":1,"Template":"AEROSENSE;FALL;<>;<>;<>;","HasTemplateGlobal":false,"ResponseTemplate":"OK","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"Command":null,"CacheImei":false,"RegEx":"^AEROSENSE;FALL;[^;]*;[^;;]*;[^;;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]}],"Commands":[{"Id":2821,"Name":"GetEnableHeatMap","TemplateSMS":null,"Template":"1201000200000000000000000006000d00000000","AckTemplate":null,"Operation":"// write your code here...","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":4,"ProtocolActionObjects":[],"Tags":[]},{"Id":2822,"Name":"GetEnableMachineLearning","TemplateSMS":null,"Template":"1201000200000000000000000006001600000000","AckTemplate":null,"Operation":"// write your code here...","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":4,"ProtocolActionObjects":[],"Tags":[]},{"Id":2823,"Name":"GetInvadeDetection","TemplateSMS":null,"Template":"1201000200000000000000000006000f00000000","AckTemplate":null,"Operation":"// write your code here...","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":4,"ProtocolActionObjects":[],"Tags":[]},{"Id":2579,"Name":"SetTimeInterval","TemplateSMS":null,"Template":"12010002000000000000000000060004<>","AckTemplate":null,"Operation":"var configs = [];\n/**\n * Converts integer number to hex string\n * @param {Integer} number \n * @returns hex string\n */\nfunction IntToHex(number, padding = 8) {\n return number.toString(16).padStart(8, '0');\n}\nvar data = IntToHex(Number(params.RadarSettings.TimeInterval));\nAddValue(\"value\", 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":0,"HasAck":true,"HexString":true,"Order":1,"SendAttempts":4,"ProtocolActionObjects":[],"Tags":[]},{"Id":2581,"Name":"SetEnableMachineLearning","TemplateSMS":null,"Template":"12010002000000000000000000060015<>","AckTemplate":null,"Operation":"var configs = [];\nlet data = '00000000';\nif (params.RadarSettings.EnableMachineLearning == 'true') {\n data = '00000001'\n}\nAddValue(\"value\", 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":0,"HasAck":true,"HexString":true,"Order":1,"SendAttempts":4,"ProtocolActionObjects":[],"Tags":[]},{"Id":2580,"Name":"SetInvadeDetection","TemplateSMS":null,"Template":"1201000200000000000000000006000e<>","AckTemplate":null,"Operation":"var configs = [];\nlet data = '00000000';\nif (params.RadarSettings.InvadeDetection == 'true') {\n data = '00000001'\n}\nAddValue(\"value\", 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":0,"HasAck":true,"HexString":true,"Order":1,"SendAttempts":4,"ProtocolActionObjects":[],"Tags":[]},{"Id":2578,"Name":"SetWorkHeight","TemplateSMS":null,"Template":"12010002000000000000000000060002<>","AckTemplate":null,"Operation":"// write your code here...\n//var header = \"12010002000000000000000000060006\"\nvar configs = [];\n// Convert Float32 to Hex string\nconst Float32ToHex = (float32) => {\n const getHex = i => ('00' + i.toString(16)).slice(-2);\n var view = new DataView(new ArrayBuffer(4))\n view.setFloat32(0, float32);\n return Array.apply(null, {\n length: 4\n }).map((_, i) => getHex(view.getUint8(i))).join('');\n};\nvar data = Float32ToHex(Number(params.RadarSettings.WorkHeight));\nAddValue(\"value\", 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":0,"HasAck":true,"HexString":true,"Order":1,"SendAttempts":4,"ProtocolActionObjects":[],"Tags":[]},{"Id":2582,"Name":"GetWorkRange","TemplateSMS":null,"Template":"1201000200000000000000000006000700000000","AckTemplate":null,"Operation":"// write your code here...","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":4,"ProtocolActionObjects":[],"Tags":[]},{"Id":2359,"Name":"SetWorkRange","TemplateSMS":null,"Template":"12010002000000000000000000060006<>","AckTemplate":null,"Operation":"// write your code here...\n//var header = \"12010002000000000000000000060006\"\nvar configs = [];\n// Convert Float32 to Hex string\nconst Float32ToHex = (float32) => {\n const getHex = i => ('00' + i.toString(16)).slice(-2);\n var view = new DataView(new ArrayBuffer(4))\n view.setFloat32(0, float32);\n return Array.apply(null, {\n length: 4\n }).map((_, i) => getHex(view.getUint8(i))).join('');\n};\nvar data = Float32ToHex(Number(params.RadarSettings.WorkRange));\nAddValue(\"value\", 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":0,"HasAck":true,"HexString":true,"Order":1,"SendAttempts":4,"ProtocolActionObjects":[],"Tags":[]},{"Id":2699,"Name":"SetEnableHeatMap","TemplateSMS":null,"Template":"1201000200000000000000000006000c<>","AckTemplate":null,"Operation":"var configs = [];\nlet data = '00000000';\nif (params.RadarSettings.EnableHeatmap == 'true') {\n data = '00000001'\n}\nAddValue(\"value\", 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":0,"HasAck":true,"HexString":true,"Order":1,"SendAttempts":4,"ProtocolActionObjects":[],"Tags":[]},{"Id":2700,"Name":"StartSendRealtimePos","TemplateSMS":null,"Template":"1201000200000000000000000006001000000001","AckTemplate":null,"Operation":"// write your code here...","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":false,"HexString":true,"Order":null,"SendAttempts":1,"ProtocolActionObjects":[],"Tags":[]},{"Id":2701,"Name":"StopSendRealtimePos","TemplateSMS":null,"Template":"1201000200000000000000000006001000000003","AckTemplate":null,"Operation":"// write your code here...","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":false,"HexString":true,"Order":null,"SendAttempts":1,"ProtocolActionObjects":[],"Tags":[]},{"Id":2702,"Name":"GetWorkHeight","TemplateSMS":null,"Template":"1201000200000000000000000006000300000000","AckTemplate":null,"Operation":"// write your code here...","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":4,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":2702,\"Name\":\"GetWorkHeight\",\"TemplateSMS\":null,\"Template\":\"1201000200000000000000000006000300000000\",\"AckTemplate\":null,\"Operation\":\"// write your code here...\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":true,\"Order\":null,\"SendAttempts\":1,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1689161144}],"Tags":[]},{"Id":2703,"Name":"GetTimeLimit","TemplateSMS":null,"Template":"1201000200000000000000000006000500000000","AckTemplate":null,"Operation":"// write your code here...","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":4,"ProtocolActionObjects":[],"Tags":[]},{"Id":2704,"Name":"GetFirmware","TemplateSMS":null,"Template":"1201000200000000000000000006001300000000","AckTemplate":null,"Operation":"// write your code here...","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":1,"ProtocolActionObjects":[],"Tags":[]},{"Id":3058,"Name":"GetAll","TemplateSMS":null,"Template":null,"AckTemplate":null,"Operation":"// configs to send on all read only items\n// they will turn amber\n// on return ack individual items\n// auto ack read all button","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":false,"HexString":false,"Order":null,"SendAttempts":1,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":3058,\"Name\":\"GetAll\",\"TemplateSMS\":null,\"Template\":null,\"AckTemplate\":null,\"Operation\":\"// configs to send on all read only items\\n// they will turn amber\\n// on return ack individual items\\n// auto ack read all button\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":1,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1688729273},{"Type":1,"NewValue":"{\"Id\":3058,\"Name\":\"GetAll\",\"TemplateSMS\":null,\"Template\":null,\"AckTemplate\":null,\"Operation\":\"// configs to send on all read only items\\n// they will turn amber\\n// on return ack individual items\\n// auto ack read all button\\nvar configsToSend = [];\\nvar configsToAck = [];\\nconfigsToAck.push(configIds.ReadFromDevice.ReadAll);\\nvar dataToReceiver = {\\n //'configsToSend': configsToSend,\\n 'configsToAck': configsToAck\\n};\\nconsole.log(dataToReceiver);\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":1,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1688729504},{"Type":1,"NewValue":"{\"Id\":3058,\"Name\":\"GetAll\",\"TemplateSMS\":null,\"Template\":null,\"AckTemplate\":null,\"Operation\":\"var msg = []\\nvar configs = [];\\nvar configsToSend = [];\\nvar configsToAck = [];\\nconfigsToAck.push(configIds.ReadFromDevice.ReadAll);\\n// let data = '00000000';\\n// if (params.RadarSettings.InvadeDetection == 'true') {\\n// data = '00000001'\\n// }\\n// AddValue(\\\"value\\\", data);\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n //configs: configs,\\n configsToAck: configsToAck\\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\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":1,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1688732397}],"Tags":[]}],"Operations":[{"Id":172,"Name":"AeroSense","Operation":"function execute_ops(msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\n var net = require('net');\n var moment = require('moment');\n var codeValues = [];\n var dataToReceiver = [];\n var configsToAck = [];\n var configsToUpdate = [];\n var configsToSend = [];\n\n function parse_message(hex) {\n let message = {};\n hex = hex.toLowerCase();\n message.magic = hex.slice(0, 4);\n message.type = hex.slice(4, 6);\n message.cmd = hex.slice(6, 8);\n message.sequence = parseInt(hex.slice(8, 16), 16);\n message.timeout = parseInt(hex.slice(16, 20), 16);\n message.length = parseInt(hex.slice(20, 28), 16);\n message.function = hex.slice(28, 32);\n message.hw_version = hex.slice(32, 42);\n message.radar_id = hex.slice(42);\n message.header = hex.slice(0, 20);\n message.data = hex.slice(32);\n return message;\n }\n if (oystaTemplate == 'True') {\n AddValue(codeValues, \"event_time\", Math.round(Date.now() / 1000));\n }\n if (globalTemplate == \"True\") {\n let message = parse_message(rawFromBytes.slice(0));\n let ack = '';\n let imei = '';\n switch (message.function) {\n case '0001':\n imei = message.radar_id;\n ack = message.header + \"00000006000100000001\";\n AddValue(codeValues, \"ack\", ack);\n AddValue(codeValues, \"imei\", imei);\n if (imei != serverParams.Imei) { //no need to associate if already done.\n let new_message = \"AEROSENSE-ASSOCIATE;\" + imei + \";\" + serverParams.Guid + \";\"\n sendMessageToLocalhost(new_message);\n AddValue(codeValues, \"toSend\", new_message);\n }\n let cyc_message = \"AEROSENSE;CHK;\" + imei + \";\";\n sendMessageToLocalhost(cyc_message);\n AddValue(codeValues, \"toSendCyc\", cyc_message);\n break;\n case '0002': // working height set acknowledge AEROSENSE;ACK-WORKHEIGHT;<>;\n if (HexToInt(message.data) == 1) {\n ack_config(\"ACK-WORKHEIGHT\");\n }\n break;\n case '0003': // get working height response, push to Read only configs\n let workheight = (HexToFloat32(message.data)).toFixed(2);\n AddValue(codeValues, \"imei\", serverParams.Imei);\n AddValue(codeValues, \"workheight\", workheight);\n configsToUpdate.push({\n 'code': configIds.ReadFromDevice.WorkHeightRead,\n 'value': workheight\n });\n configsToAck.push(configIds.ReadFromDevice.WorkHeightRead);\n break;\n case '0004': // Time interval set acknowledge -> AEROSENSE;ACK-TIMEINT;<>;\n if (HexToInt(message.data) == 1) {\n ack_config(\"ACK-TIMEINT\");\n }\n break;\n case '0005': // get timeout response, push to Read only configs\n let timeout = HexToInt(message.data);\n AddValue(codeValues, \"imei\", serverParams.Imei);\n AddValue(codeValues, \"timeout\", timeout);\n configsToUpdate.push({\n 'code': configIds.ReadFromDevice.TimeLimitRead,\n 'value': timeout\n });\n configsToAck.push(configIds.ReadFromDevice.TimeLimitRead);\n break;\n case '0006': // working distance set acknowledge -> AEROSENSE;ACK-WORKRANGE;<>;\n if (HexToInt(message.data) == 1) {\n ack_config(\"ACK-WORKRANGE\");\n }\n break;\n case '0007': // response to workrange request, push to Read only configs\n let workrange = HexToFloat32(message.data).toFixed(2);\n AddValue(codeValues, \"imei\", serverParams.Imei);\n AddValue(codeValues, \"workrange\", workrange);\n configsToUpdate.push({\n 'code': configIds.ReadFromDevice.WorkRangeRead,\n 'value': workrange\n });\n configsToAck.push(configIds.ReadFromDevice.WorkRangeRead);\n break;\n //case '0008': // does not exist.\n case '0009': // Fall detected ->AEROSENSE;FALL;<>;<>;<>;\n // parse positions\n let posx = HexToFloat32(message.data.slice(0, 8)).toFixed(2);\n let posy = HexToFloat32(message.data.slice(8, 16)).toFixed(2);\n // create message\n let fall_message = \"AEROSENSE;FALL;\" + serverParams.Imei + \";\" + posx + \";\" + posy + \";\"\n sendMessageToLocalhost(fall_message);\n AddValue(codeValues, \"toSend\", fall_message);\n AddValue(codeValues, \"imei\", serverParams.Imei);\n // send ack\n let fall_response_hex = message.header + \"00000006000900000001\";\n AddValue(codeValues, \"ack\", fall_response_hex);\n break;\n case '000a': //invade detection alert -> AEROSENSE;INVADE;<>;\n let invade_message = \"AEROSENSE;INVADE;\" + serverParams.Imei + \";\"\n sendMessageToLocalhost(invade_message);\n AddValue(codeValues, \"imei\", serverParams.Imei);\n AddValue(codeValues, \"toSend\", invade_message);\n //send ack\n let invade_response_hex = message.header + \"00000006000a00000001\";\n AddValue(codeValues, \"ack\", invade_response_hex);\n break;\n case '000b': //heatmap received -> NOT IN USE AEROSENSE;HEATMAP;<>;\n let heatmap_message = \"AEROSENSE;HEATMAP;\" + serverParams.Imei + \";\"\n sendMessageToLocalhost(heatmap_message);\n AddValue(codeValues, \"imei\", serverParams.Imei);\n AddValue(codeValues, \"toSend\", heatmap_message);\n // send switch off heatmap command\n let heatmap_response_hex = message.header + \"00000006000c00000000\"\n AddValue(codeValues, \"ack\", heatmap_response_hex);\n break;\n case '000c': //set enable heatmap ack -> AEROSENSE;ACK-HEATMAP;<>;\n if (HexToInt(message.data) == 1) {\n ack_config(\"ACK-HEATMAP\");\n }\n break;\n case '000d': // receive heatmap collect state, push to readonly configs\n let heatmap_enabled = parseInt(message.data) == 1;\n AddValue(codeValues, \"imei\", serverParams.Imei);\n AddValue(codeValues, \"heatmap_enabled\", heatmap_enabled);\n configsToUpdate.push({\n 'code': configIds.ReadFromDevice.EnableHeatMapRead,\n 'value': heatmap_enabled ? 'true' : 'false'\n });\n configsToAck.push(configIds.ReadFromDevice.EnableHeatMapRead);\n break;\n case '000e': // Invade Detection set acknowledge AEROSENSE;ACK-INVADE;<>;\n if (HexToInt(message.data) == 1) {\n ack_config(\"ACK-INVADE\");\n }\n break;\n case '000f': // receive invade detection state, push to readonly configs\n let invade_state = parseInt(message.data) == 1;\n AddValue(codeValues, \"imei\", serverParams.Imei);\n AddValue(codeValues, \"invade_enabled\", invade_state);\n configsToUpdate.push({\n 'code': configIds.ReadFromDevice.InvadeDetectionRead,\n 'value': invade_state ? 'true' : 'false'\n });\n configsToAck.push(configIds.ReadFromDevice.InvadeDetectionRead);\n break;\n case '0010': // position update received -> AEROSENSE;DIST-POS;<>;>;<>;\n let x = HexToFloat32(message.data.slice(8, 16)).toFixed(2);\n let y = HexToFloat32(message.data.slice(16, 24)).toFixed(2);\n AddValue(codeValues, \"imei\", serverParams.Imei);\n AddValue(codeValues, \"pos_x\", x);\n AddValue(codeValues, \"pos_y\", y);\n let position_message = \"AEROSENSE;DIST-POS;\" + serverParams.Imei + \";\" + x + \";\" + y + \";\";\n sendMessageToLocalhost(position_message);\n //no ack as positions resent regularly\n break;\n case '0011': // ack negative fall detection\n // parse positions\n let posx_neg = HexToFloat32(message.data.slice(0, 8)).toFixed(2);\n let posy_neg = HexToFloat32(message.data.slice(8, 16)).toFixed(2);\n // create message\n let negfall_message = \"AEROSENSE;NEGFALL;\" + serverParams.Imei + \";\" + posx_neg + \";\" + posy_neg + \";\"\n sendMessageToLocalhost(negfall_message);\n AddValue(codeValues, \"toSend\", negfall_message);\n AddValue(codeValues, \"imei\", serverParams.Imei);\n // send ack\n let negfall_response_hex = message.header + \"00000006001100000001\";\n AddValue(codeValues, \"ack\", negfall_response_hex);\n break;\n case '0012': // reconnect message\n message.radar_id = message.data.slice(2);\n imei = message.radar_id;\n const response_reconnect_OK = \"00000006001200000001\";\n ack = message.header + response_reconnect_OK;\n AddValue(codeValues, \"ack\", ack);\n AddValue(codeValues, \"imei\", imei);\n let reply = \"AEROSENSE-ASSOCIATE;\" + imei + \";\" + serverParams.Guid + \";\"\n sendMessageToLocalhost(reply);\n AddValue(codeValues, \"toSend\", reply);\n break;\n case '0013': // firmware version response, push to Read only configs\n let firmware_version = `${HexToInt(message.data.slice(0,2))}.${HexToInt(message.data.slice(2,4))}.${HexToInt(message.data.slice(4,6))}.${HexToInt(message.data.slice(6,8))}`; // just raw hex for now\n AddValue(codeValues, \"imei\", serverParams.Imei);\n AddValue(codeValues, \"firmware_ver\", firmware_version);\n configsToUpdate.push({\n 'code': configIds.ReadFromDevice.FirmwareRead,\n 'value': firmware_version\n });\n configsToAck.push(configIds.ReadFromDevice.ReadAll);\n configsToAck.push(configIds.ReadFromDevice.FirmwareRead);\n // internal ack config\n // ack_config(\"ACK-VERSION\");\n // update LastDateTimeRead\n configsToUpdate.push({\n 'code': configIds.ReadFromDevice.LastDateTimeRead,\n 'value': moment().format('YYYY/MM/DD, HH:mm:ss')\n });\n break;\n case '0014': // Radar reset received\n if (message.data == '0d0d0d0d') { // message must contein this value according to docs\n let reset_message = \"AEROSENSE;USERRESET;\" + serverParams.Imei + \";\";\n sendMessageToLocalhost(reset_message);\n AddValue(codeValues, \"toSend\", reset_message);\n AddValue(codeValues, \"imei\", serverParams.Imei);\n }\n // no ack\n break;\n case '0015': // Enable Machine learning set acknowledge AEROSENSE;ACK-MACHINELEARN;<>;\n ack_config(\"ACK-MACHINELEARN\");\n break;\n case '0016': // receive machine learning state, not in use\n let machinelearning_state = parseInt(message.data) == 1;\n AddValue(codeValues, \"imei\", serverParams.Imei);\n AddValue(codeValues, \"machinelearning_enabled\", machinelearning_state);\n configsToUpdate.push({\n 'code': configIds.ReadFromDevice.EnableMachineLearningRead,\n 'value': machinelearning_state ? 'true' : 'false'\n });\n configsToAck.push(configIds.ReadFromDevice.EnableMachineLearningRead);\n break;\n default:\n imei = serverParams.Imei;\n AddValue(codeValues, \"imei\", imei);\n AddValue(codeValues, \"Error\", \"Unhandled message received of type: \" + message.function);\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 }\n return {\n 'output': dataToReceiver\n }\n //---------------------HELPERS START----------------------------\n function ack_config(ack_command) {\n if (serverParams.Imei != null) {\n AddValue(codeValues, \"imei\", serverParams.Imei);\n let ack_message = \"AEROSENSE;\" + ack_command + \";\" + serverParams.Imei + \";\";\n AddValue(codeValues, \"toSend\", ack_message);\n sendMessageToLocalhost(ack_message);\n } else { //only used for debugging\n AddValue(codeValues, \"imei\", \"6796c41dc6e44e3db8d1cadce00abe6b\");\n AddValue(codeValues, \"error\", \"serverParams do not contain Imei!\")\n }\n }\n\n function AddValue(msgArray, p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n msgArray.push(cvpair);\n }\n\n function sendMessageToLocalhost(str) {\n if (localTesting) {\n console.log(\"Sending message to server: \" + str);\n } else {\n var server = '127.0.0.1';\n var c = createConnection(5678, server);\n c.write(`${str}`);\n c.end();\n }\n }\n\n function createConnection(port, server) {\n c = net.createConnection(port, server);\n c.on('error', function(error) {\n c = createConnection(port, server);\n });\n return c;\n }\n //---------------------HELPERS END----------------------------\n //---------------------CONVERTERS START----------------------------\n /**\n * Convert hex string to integer\n * @param {String} hex_string hex string\n * @returns Integer number\n */\n function HexToInt(hex_string) {\n return parseInt(hex_string, 16);\n }\n\n function HexToFloat32(hex_string) {\n let int = parseInt(hex_string, 16);\n if (int > 0 || int < 0) {\n var sign = (int >>> 31) ? -1 : 1;\n var exp = (int >>> 23 & 0xff) - 127;\n var mantissa = ((int & 0x7fffff) + 0x800000).toString(2);\n var float32 = 0\n for (i = 0; i < mantissa.length; i += 1) {\n float32 += parseInt(mantissa[i]) ? Math.pow(2, exp) : 0;\n exp--\n }\n return float32 * sign;\n } else {\n return 0;\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(msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\n // map output to global var\n dataToReceiver = return_values.output;\n}","Type":0,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":172,\"Name\":\"AeroSense\",\"Operation\":\"function execute_ops(msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\n var net = require('net');\\n var moment = require('moment');\\n var codeValues = [];\\n var dataToReceiver = [];\\n var configsToAck = [];\\n var configsToUpdate = [];\\n var configsToSend = [];\\n\\n function parse_message(hex) {\\n let message = {};\\n hex = hex.toLowerCase();\\n message.magic = hex.slice(0, 4);\\n message.type = hex.slice(4, 6);\\n message.cmd = hex.slice(6, 8);\\n message.sequence = parseInt(hex.slice(8, 16), 16);\\n message.timeout = parseInt(hex.slice(16, 20), 16);\\n message.length = parseInt(hex.slice(20, 28), 16);\\n message.function = hex.slice(28, 32);\\n message.hw_version = hex.slice(32, 42);\\n message.radar_id = hex.slice(42);\\n message.header = hex.slice(0, 20);\\n message.data = hex.slice(32);\\n return message;\\n }\\n if (oystaTemplate == 'True') {\\n AddValue(codeValues, \\\"event_time\\\", Math.round(Date.now() / 1000));\\n }\\n if (globalTemplate == \\\"True\\\") {\\n let message = parse_message(rawFromBytes.slice(0));\\n let ack = '';\\n let imei = '';\\n switch (message.function) {\\n case '0001':\\n imei = message.radar_id;\\n ack = message.header + \\\"00000006000100000001\\\";\\n AddValue(codeValues, \\\"ack\\\", ack);\\n AddValue(codeValues, \\\"imei\\\", imei);\\n if (imei != serverParams.Imei) { //no need to associate if already done.\\n let new_message = \\\"AEROSENSE-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\"\\n sendMessageToLocalhost(new_message);\\n AddValue(codeValues, \\\"toSend\\\", new_message);\\n }\\n let cyc_message = \\\"AEROSENSE;CHK;\\\" + imei + \\\";\\\";\\n sendMessageToLocalhost(cyc_message);\\n AddValue(codeValues, \\\"toSendCyc\\\", cyc_message);\\n break;\\n case '0002': // working height set acknowledge AEROSENSE;ACK-WORKHEIGHT;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-WORKHEIGHT\\\");\\n }\\n break;\\n case '0003': // get working height response, push to Read only configs\\n let workheight = (HexToFloat32(message.data)).toFixed(2);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"workheight\\\", workheight);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.WorkHeightRead,\\n 'value': workheight\\n });\\n configsToAck.push(configIds.ReadFromDevice.WorkHeightRead);\\n break;\\n case '0004': // Time interval set acknowledge -> AEROSENSE;ACK-TIMEINT;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-TIMEINT\\\");\\n }\\n break;\\n case '0005': // get timeout response, push to Read only configs\\n let timeout = HexToInt(message.data);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"timeout\\\", timeout);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.TimeLimitRead,\\n 'value': timeout\\n });\\n configsToAck.push(configIds.ReadFromDevice.TimeLimitRead);\\n break;\\n case '0006': // working distance set acknowledge -> AEROSENSE;ACK-WORKRANGE;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-WORKRANGE\\\");\\n }\\n break;\\n case '0007': // response to workrange request, push to Read only configs\\n let workrange = HexToFloat32(message.data).toFixed(2);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"workrange\\\", workrange);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.WorkRangeRead,\\n 'value': workrange\\n });\\n configsToAck.push(configIds.ReadFromDevice.WorkRangeRead);\\n break;\\n //case '0008': // does not exist.\\n case '0009': // Fall detected ->AEROSENSE;FALL;<>;<>;<>;\\n // parse positions\\n let posx = HexToFloat32(message.data.slice(0, 8)).toFixed(2);\\n let posy = HexToFloat32(message.data.slice(8, 16)).toFixed(2);\\n // create message\\n let fall_message = \\\"AEROSENSE;FALL;\\\" + serverParams.Imei + \\\";\\\" + posx + \\\";\\\" + posy + \\\";\\\"\\n sendMessageToLocalhost(fall_message);\\n AddValue(codeValues, \\\"toSend\\\", fall_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n // send ack\\n let fall_response_hex = message.header + \\\"00000006000900000001\\\";\\n AddValue(codeValues, \\\"ack\\\", fall_response_hex);\\n break;\\n case '000a': //invade detection alert -> AEROSENSE;INVADE;<>;\\n let invade_message = \\\"AEROSENSE;INVADE;\\\" + serverParams.Imei + \\\";\\\"\\n sendMessageToLocalhost(invade_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"toSend\\\", invade_message);\\n //send ack\\n let invade_response_hex = message.header + \\\"00000006000a00000001\\\";\\n AddValue(codeValues, \\\"ack\\\", invade_response_hex);\\n break;\\n case '000b': //heatmap received -> NOT IN USE AEROSENSE;HEATMAP;<>;\\n let heatmap_message = \\\"AEROSENSE;HEATMAP;\\\" + serverParams.Imei + \\\";\\\"\\n sendMessageToLocalhost(heatmap_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"toSend\\\", heatmap_message);\\n // send switch off heatmap command\\n let heatmap_response_hex = message.header + \\\"00000006000c00000000\\\"\\n AddValue(codeValues, \\\"ack\\\", heatmap_response_hex);\\n break;\\n case '000c': //set enable heatmap ack -> AEROSENSE;ACK-HEATMAP;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-HEATMAP\\\");\\n }\\n break;\\n case '000d': // receive heatmap collect state, push to readonly configs\\n let heatmap_enabled = parseInt(message.data) == 1;\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"heatmap_enabled\\\", heatmap_enabled);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.EnableHeatMapRead,\\n 'value': heatmap_enabled ? 'true' : 'false'\\n });\\n configsToAck.push(configIds.ReadFromDevice.EnableHeatMapRead);\\n break;\\n case '000e': // Invade Detection set acknowledge AEROSENSE;ACK-INVADE;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-INVADE\\\");\\n }\\n break;\\n case '000f': // receive invade detection state, push to readonly configs\\n let invade_state = parseInt(message.data) == 1;\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"invade_enabled\\\", invade_state);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.InvadeDetectionRead,\\n 'value': invade_state ? 'true' : 'false'\\n });\\n configsToAck.push(configIds.ReadFromDevice.InvadeDetectionRead);\\n break;\\n case '0010': // position update received -> AEROSENSE;DIST-POS;<>;>;<>;\\n let x = HexToFloat32(message.data.slice(8, 16)).toFixed(2);\\n let y = HexToFloat32(message.data.slice(16, 24)).toFixed(2);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"pos_x\\\", x);\\n AddValue(codeValues, \\\"pos_y\\\", y);\\n let position_message = \\\"AEROSENSE;DIST-POS;\\\" + serverParams.Imei + \\\";\\\" + x + \\\";\\\" + y + \\\";\\\";\\n sendMessageToLocalhost(position_message);\\n //no ack as positions resent regularly\\n break;\\n case '0011': // ack negative fall detection\\n // parse positions\\n let posx_neg = HexToFloat32(message.data.slice(0, 8)).toFixed(2);\\n let posy_neg = HexToFloat32(message.data.slice(8, 16)).toFixed(2);\\n // create message\\n let negfall_message = \\\"AEROSENSE;NEGFALL;\\\" + serverParams.Imei + \\\";\\\" + posx_neg + \\\";\\\" + posy_neg + \\\";\\\"\\n sendMessageToLocalhost(negfall_message);\\n AddValue(codeValues, \\\"toSend\\\", negfall_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n // send ack\\n let negfall_response_hex = message.header + \\\"00000006001100000001\\\";\\n AddValue(codeValues, \\\"ack\\\", negfall_response_hex);\\n break;\\n case '0012': // reconnect message\\n message.radar_id = message.data.slice(2);\\n imei = message.radar_id;\\n const response_reconnect_OK = \\\"00000006001200000001\\\";\\n ack = message.header + response_reconnect_OK;\\n AddValue(codeValues, \\\"ack\\\", ack);\\n AddValue(codeValues, \\\"imei\\\", imei);\\n let reply = \\\"AEROSENSE-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\"\\n sendMessageToLocalhost(reply);\\n AddValue(codeValues, \\\"toSend\\\", reply);\\n break;\\n case '0013': // firmware version response, push to Read only configs\\n let firmware_version = `${HexToInt(message.data.slice(0,2))}.${HexToInt(message.data.slice(2,4))}.${HexToInt(message.data.slice(4,6))}.${HexToInt(message.data.slice(6,8))}`; // just raw hex for now\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"firmware_ver\\\", firmware_version);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.FirmwareRead,\\n 'value': firmware_version\\n });\\n //configsToAck.push(configIds.ReadFromDevice.ReadAll);\\n configsToAck.push(configIds.ReadFromDevice.FirmwareRead);\\n // internal ack config\\n // ack_config(\\\"ACK-VERSION\\\");\\n // update LastDateTimeRead\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.LastDateTimeRead,\\n 'value': moment().format('YYYY/MM/DD, HH:mm:ss')\\n });\\n break;\\n case '0014': // Radar reset received\\n if (message.data == '0d0d0d0d') { // message must contein this value according to docs\\n let reset_message = \\\"AEROSENSE;USERRESET;\\\" + serverParams.Imei + \\\";\\\";\\n sendMessageToLocalhost(reset_message);\\n AddValue(codeValues, \\\"toSend\\\", reset_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n }\\n // no ack\\n break;\\n case '0015': // Enable Machine learning set acknowledge AEROSENSE;ACK-MACHINELEARN;<>;\\n ack_config(\\\"ACK-MACHINELEARN\\\");\\n break;\\n case '0016': // receive machine learning state, not in use\\n let machinelearning_state = parseInt(message.data) == 1;\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"machinelearning_enabled\\\", machinelearning_state);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.EnableMachineLearningRead,\\n 'value': machinelearning_state ? 'true' : 'false'\\n });\\n configsToAck.push(configIds.ReadFromDevice.EnableMachineLearningRead);\\n break;\\n default:\\n imei = serverParams.Imei;\\n AddValue(codeValues, \\\"imei\\\", imei);\\n AddValue(codeValues, \\\"Error\\\", \\\"Unhandled message received of type: \\\" + message.function);\\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 }\\n return {\\n 'output': dataToReceiver\\n }\\n //---------------------HELPERS START----------------------------\\n function ack_config(ack_command) {\\n if (serverParams.Imei != null) {\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n let ack_message = \\\"AEROSENSE;\\\" + ack_command + \\\";\\\" + serverParams.Imei + \\\";\\\";\\n AddValue(codeValues, \\\"toSend\\\", ack_message);\\n sendMessageToLocalhost(ack_message);\\n } else { //only used for debugging\\n AddValue(codeValues, \\\"imei\\\", \\\"6796c41dc6e44e3db8d1cadce00abe6b\\\");\\n AddValue(codeValues, \\\"error\\\", \\\"serverParams do not contain Imei!\\\")\\n }\\n }\\n\\n function AddValue(msgArray, p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n msgArray.push(cvpair);\\n }\\n\\n function sendMessageToLocalhost(str) {\\n if (localTesting) {\\n console.log(\\\"Sending message to server: \\\" + str);\\n } else {\\n var server = '127.0.0.1';\\n var c = createConnection(5678, server);\\n c.write(`${str}`);\\n c.end();\\n }\\n }\\n\\n function createConnection(port, server) {\\n c = net.createConnection(port, server);\\n c.on('error', function(error) {\\n c = createConnection(port, server);\\n });\\n return c;\\n }\\n //---------------------HELPERS END----------------------------\\n //---------------------CONVERTERS START----------------------------\\n /**\\n * Convert hex string to integer\\n * @param {String} hex_string hex string\\n * @returns Integer number\\n */\\n function HexToInt(hex_string) {\\n return parseInt(hex_string, 16);\\n }\\n\\n function HexToFloat32(hex_string) {\\n let int = parseInt(hex_string, 16);\\n if (int > 0 || int < 0) {\\n var sign = (int >>> 31) ? -1 : 1;\\n var exp = (int >>> 23 & 0xff) - 127;\\n var mantissa = ((int & 0x7fffff) + 0x800000).toString(2);\\n var float32 = 0\\n for (i = 0; i < mantissa.length; i += 1) {\\n float32 += parseInt(mantissa[i]) ? Math.pow(2, exp) : 0;\\n exp--\\n }\\n return float32 * sign;\\n } else {\\n return 0;\\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(msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\n // map output to global var\\n dataToReceiver = return_values.output;\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1689160500},{"Type":1,"NewValue":"{\"Id\":172,\"Name\":\"AeroSense\",\"Operation\":\"function execute_ops(msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\n var net = require('net');\\n var moment = require('moment');\\n var codeValues = [];\\n var dataToReceiver = [];\\n var configsToAck = [];\\n var configsToUpdate = [];\\n var configsToSend = [];\\n\\n function parse_message(hex) {\\n let message = {};\\n hex = hex.toLowerCase();\\n message.magic = hex.slice(0, 4);\\n message.type = hex.slice(4, 6);\\n message.cmd = hex.slice(6, 8);\\n message.sequence = parseInt(hex.slice(8, 16), 16);\\n message.timeout = parseInt(hex.slice(16, 20), 16);\\n message.length = parseInt(hex.slice(20, 28), 16);\\n message.function = hex.slice(28, 32);\\n message.hw_version = hex.slice(32, 42);\\n message.radar_id = hex.slice(42);\\n message.header = hex.slice(0, 20);\\n message.data = hex.slice(32);\\n return message;\\n }\\n if (oystaTemplate == 'True') {\\n AddValue(codeValues, \\\"event_time\\\", Math.round(Date.now() / 1000));\\n }\\n if (globalTemplate == \\\"True\\\") {\\n let message = parse_message(rawFromBytes.slice(0));\\n let ack = '';\\n let imei = '';\\n switch (message.function) {\\n case '0001':\\n imei = message.radar_id;\\n ack = message.header + \\\"00000006000100000001\\\";\\n AddValue(codeValues, \\\"ack\\\", ack);\\n AddValue(codeValues, \\\"imei\\\", imei);\\n if (imei != serverParams.Imei) { //no need to associate if already done.\\n let new_message = \\\"AEROSENSE-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\"\\n sendMessageToLocalhost(new_message);\\n AddValue(codeValues, \\\"toSend\\\", new_message);\\n }\\n let cyc_message = \\\"AEROSENSE;CHK;\\\" + imei + \\\";\\\";\\n sendMessageToLocalhost(cyc_message);\\n AddValue(codeValues, \\\"toSendCyc\\\", cyc_message);\\n break;\\n case '0002': // working height set acknowledge AEROSENSE;ACK-WORKHEIGHT;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-WORKHEIGHT\\\");\\n }\\n break;\\n case '0003': // get working height response, push to Read only configs\\n let workheight = (HexToFloat32(message.data)).toFixed(2);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"workheight\\\", workheight);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.WorkHeightRead,\\n 'value': workheight\\n });\\n configsToAck.push(configIds.ReadFromDevice.WorkHeightRead);\\n break;\\n case '0004': // Time interval set acknowledge -> AEROSENSE;ACK-TIMEINT;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-TIMEINT\\\");\\n }\\n break;\\n case '0005': // get timeout response, push to Read only configs\\n let timeout = HexToInt(message.data);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"timeout\\\", timeout);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.TimeLimitRead,\\n 'value': timeout\\n });\\n configsToAck.push(configIds.ReadFromDevice.TimeLimitRead);\\n break;\\n case '0006': // working distance set acknowledge -> AEROSENSE;ACK-WORKRANGE;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-WORKRANGE\\\");\\n }\\n break;\\n case '0007': // response to workrange request, push to Read only configs\\n let workrange = HexToFloat32(message.data).toFixed(2);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"workrange\\\", workrange);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.WorkRangeRead,\\n 'value': workrange\\n });\\n configsToAck.push(configIds.ReadFromDevice.WorkRangeRead);\\n break;\\n //case '0008': // does not exist.\\n case '0009': // Fall detected ->AEROSENSE;FALL;<>;<>;<>;\\n // parse positions\\n let posx = HexToFloat32(message.data.slice(0, 8)).toFixed(2);\\n let posy = HexToFloat32(message.data.slice(8, 16)).toFixed(2);\\n // create message\\n let fall_message = \\\"AEROSENSE;FALL;\\\" + serverParams.Imei + \\\";\\\" + posx + \\\";\\\" + posy + \\\";\\\"\\n sendMessageToLocalhost(fall_message);\\n AddValue(codeValues, \\\"toSend\\\", fall_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n // send ack\\n let fall_response_hex = message.header + \\\"00000006000900000001\\\";\\n AddValue(codeValues, \\\"ack\\\", fall_response_hex);\\n break;\\n case '000a': //invade detection alert -> AEROSENSE;INVADE;<>;\\n let invade_message = \\\"AEROSENSE;INVADE;\\\" + serverParams.Imei + \\\";\\\"\\n sendMessageToLocalhost(invade_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"toSend\\\", invade_message);\\n //send ack\\n let invade_response_hex = message.header + \\\"00000006000a00000001\\\";\\n AddValue(codeValues, \\\"ack\\\", invade_response_hex);\\n break;\\n case '000b': //heatmap received -> NOT IN USE AEROSENSE;HEATMAP;<>;\\n let heatmap_message = \\\"AEROSENSE;HEATMAP;\\\" + serverParams.Imei + \\\";\\\"\\n sendMessageToLocalhost(heatmap_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"toSend\\\", heatmap_message);\\n // send switch off heatmap command\\n let heatmap_response_hex = message.header + \\\"00000006000c00000000\\\"\\n AddValue(codeValues, \\\"ack\\\", heatmap_response_hex);\\n break;\\n case '000c': //set enable heatmap ack -> AEROSENSE;ACK-HEATMAP;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-HEATMAP\\\");\\n }\\n break;\\n case '000d': // receive heatmap collect state, push to readonly configs\\n let heatmap_enabled = parseInt(message.data) == 1;\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"heatmap_enabled\\\", heatmap_enabled);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.EnableHeatMapRead,\\n 'value': heatmap_enabled ? 'true' : 'false'\\n });\\n configsToAck.push(configIds.ReadFromDevice.EnableHeatMapRead);\\n break;\\n case '000e': // Invade Detection set acknowledge AEROSENSE;ACK-INVADE;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-INVADE\\\");\\n }\\n break;\\n case '000f': // receive invade detection state, push to readonly configs\\n let invade_state = parseInt(message.data) == 1;\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"invade_enabled\\\", invade_state);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.InvadeDetectionRead,\\n 'value': invade_state ? 'true' : 'false'\\n });\\n configsToAck.push(configIds.ReadFromDevice.InvadeDetectionRead);\\n break;\\n case '0010': // position update received -> AEROSENSE;DIST-POS;<>;>;<>;\\n let x = HexToFloat32(message.data.slice(8, 16)).toFixed(2);\\n let y = HexToFloat32(message.data.slice(16, 24)).toFixed(2);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"pos_x\\\", x);\\n AddValue(codeValues, \\\"pos_y\\\", y);\\n let position_message = \\\"AEROSENSE;DIST-POS;\\\" + serverParams.Imei + \\\";\\\" + x + \\\";\\\" + y + \\\";\\\";\\n sendMessageToLocalhost(position_message);\\n //no ack as positions resent regularly\\n break;\\n case '0011': // ack negative fall detection\\n // parse positions\\n let posx_neg = HexToFloat32(message.data.slice(0, 8)).toFixed(2);\\n let posy_neg = HexToFloat32(message.data.slice(8, 16)).toFixed(2);\\n // create message\\n let negfall_message = \\\"AEROSENSE;NEGFALL;\\\" + serverParams.Imei + \\\";\\\" + posx_neg + \\\";\\\" + posy_neg + \\\";\\\"\\n sendMessageToLocalhost(negfall_message);\\n AddValue(codeValues, \\\"toSend\\\", negfall_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n // send ack\\n let negfall_response_hex = message.header + \\\"00000006001100000001\\\";\\n AddValue(codeValues, \\\"ack\\\", negfall_response_hex);\\n break;\\n case '0012': // reconnect message\\n message.radar_id = message.data.slice(2);\\n imei = message.radar_id;\\n const response_reconnect_OK = \\\"00000006001200000001\\\";\\n ack = message.header + response_reconnect_OK;\\n AddValue(codeValues, \\\"ack\\\", ack);\\n AddValue(codeValues, \\\"imei\\\", imei);\\n let reply = \\\"AEROSENSE-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\"\\n sendMessageToLocalhost(reply);\\n AddValue(codeValues, \\\"toSend\\\", reply);\\n break;\\n case '0013': // firmware version response, push to Read only configs\\n let firmware_version = `${HexToInt(message.data.slice(0,2))}.${HexToInt(message.data.slice(2,4))}.${HexToInt(message.data.slice(4,6))}.${HexToInt(message.data.slice(6,8))}`; // just raw hex for now\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"firmware_ver\\\", firmware_version);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.FirmwareRead,\\n 'value': firmware_version\\n });\\n //configsToAck.push(configIds.ReadFromDevice.ReadAll);\\n configsToAck.push(configIds.ReadFromDevice.ReadAll);\\n // internal ack config\\n // ack_config(\\\"ACK-VERSION\\\");\\n // update LastDateTimeRead\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.LastDateTimeRead,\\n 'value': moment().format('YYYY/MM/DD, HH:mm:ss')\\n });\\n break;\\n case '0014': // Radar reset received\\n if (message.data == '0d0d0d0d') { // message must contein this value according to docs\\n let reset_message = \\\"AEROSENSE;USERRESET;\\\" + serverParams.Imei + \\\";\\\";\\n sendMessageToLocalhost(reset_message);\\n AddValue(codeValues, \\\"toSend\\\", reset_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n }\\n // no ack\\n break;\\n case '0015': // Enable Machine learning set acknowledge AEROSENSE;ACK-MACHINELEARN;<>;\\n ack_config(\\\"ACK-MACHINELEARN\\\");\\n break;\\n case '0016': // receive machine learning state, not in use\\n let machinelearning_state = parseInt(message.data) == 1;\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"machinelearning_enabled\\\", machinelearning_state);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.EnableMachineLearningRead,\\n 'value': machinelearning_state ? 'true' : 'false'\\n });\\n configsToAck.push(configIds.ReadFromDevice.EnableMachineLearningRead);\\n break;\\n default:\\n imei = serverParams.Imei;\\n AddValue(codeValues, \\\"imei\\\", imei);\\n AddValue(codeValues, \\\"Error\\\", \\\"Unhandled message received of type: \\\" + message.function);\\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 }\\n return {\\n 'output': dataToReceiver\\n }\\n //---------------------HELPERS START----------------------------\\n function ack_config(ack_command) {\\n if (serverParams.Imei != null) {\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n let ack_message = \\\"AEROSENSE;\\\" + ack_command + \\\";\\\" + serverParams.Imei + \\\";\\\";\\n AddValue(codeValues, \\\"toSend\\\", ack_message);\\n sendMessageToLocalhost(ack_message);\\n } else { //only used for debugging\\n AddValue(codeValues, \\\"imei\\\", \\\"6796c41dc6e44e3db8d1cadce00abe6b\\\");\\n AddValue(codeValues, \\\"error\\\", \\\"serverParams do not contain Imei!\\\")\\n }\\n }\\n\\n function AddValue(msgArray, p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n msgArray.push(cvpair);\\n }\\n\\n function sendMessageToLocalhost(str) {\\n if (localTesting) {\\n console.log(\\\"Sending message to server: \\\" + str);\\n } else {\\n var server = '127.0.0.1';\\n var c = createConnection(5678, server);\\n c.write(`${str}`);\\n c.end();\\n }\\n }\\n\\n function createConnection(port, server) {\\n c = net.createConnection(port, server);\\n c.on('error', function(error) {\\n c = createConnection(port, server);\\n });\\n return c;\\n }\\n //---------------------HELPERS END----------------------------\\n //---------------------CONVERTERS START----------------------------\\n /**\\n * Convert hex string to integer\\n * @param {String} hex_string hex string\\n * @returns Integer number\\n */\\n function HexToInt(hex_string) {\\n return parseInt(hex_string, 16);\\n }\\n\\n function HexToFloat32(hex_string) {\\n let int = parseInt(hex_string, 16);\\n if (int > 0 || int < 0) {\\n var sign = (int >>> 31) ? -1 : 1;\\n var exp = (int >>> 23 & 0xff) - 127;\\n var mantissa = ((int & 0x7fffff) + 0x800000).toString(2);\\n var float32 = 0\\n for (i = 0; i < mantissa.length; i += 1) {\\n float32 += parseInt(mantissa[i]) ? Math.pow(2, exp) : 0;\\n exp--\\n }\\n return float32 * sign;\\n } else {\\n return 0;\\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(msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\n // map output to global var\\n dataToReceiver = return_values.output;\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1689160878},{"Type":1,"NewValue":"{\"Id\":172,\"Name\":\"AeroSense\",\"Operation\":\"function execute_ops(msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\n var net = require('net');\\n var moment = require('moment');\\n var codeValues = [];\\n var dataToReceiver = [];\\n var configsToAck = [];\\n var configsToUpdate = [];\\n var configsToSend = [];\\n\\n function parse_message(hex) {\\n let message = {};\\n hex = hex.toLowerCase();\\n message.magic = hex.slice(0, 4);\\n message.type = hex.slice(4, 6);\\n message.cmd = hex.slice(6, 8);\\n message.sequence = parseInt(hex.slice(8, 16), 16);\\n message.timeout = parseInt(hex.slice(16, 20), 16);\\n message.length = parseInt(hex.slice(20, 28), 16);\\n message.function = hex.slice(28, 32);\\n message.hw_version = hex.slice(32, 42);\\n message.radar_id = hex.slice(42);\\n message.header = hex.slice(0, 20);\\n message.data = hex.slice(32);\\n return message;\\n }\\n if (oystaTemplate == 'True') {\\n AddValue(codeValues, \\\"event_time\\\", Math.round(Date.now() / 1000));\\n }\\n if (globalTemplate == \\\"True\\\") {\\n let message = parse_message(rawFromBytes.slice(0));\\n let ack = '';\\n let imei = '';\\n switch (message.function) {\\n case '0001':\\n imei = message.radar_id;\\n ack = message.header + \\\"00000006000100000001\\\";\\n AddValue(codeValues, \\\"ack\\\", ack);\\n AddValue(codeValues, \\\"imei\\\", imei);\\n if (imei != serverParams.Imei) { //no need to associate if already done.\\n let new_message = \\\"AEROSENSE-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\"\\n sendMessageToLocalhost(new_message);\\n AddValue(codeValues, \\\"toSend\\\", new_message);\\n }\\n let cyc_message = \\\"AEROSENSE;CHK;\\\" + imei + \\\";\\\";\\n sendMessageToLocalhost(cyc_message);\\n AddValue(codeValues, \\\"toSendCyc\\\", cyc_message);\\n break;\\n case '0002': // working height set acknowledge AEROSENSE;ACK-WORKHEIGHT;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-WORKHEIGHT\\\");\\n }\\n break;\\n case '0003': // get working height response, push to Read only configs\\n let workheight = (HexToFloat32(message.data)).toFixed(2);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"workheight\\\", workheight);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.WorkHeightRead,\\n 'value': workheight\\n });\\n configsToAck.push(configIds.ReadFromDevice.WorkHeightRead);\\n break;\\n case '0004': // Time interval set acknowledge -> AEROSENSE;ACK-TIMEINT;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-TIMEINT\\\");\\n }\\n break;\\n case '0005': // get timeout response, push to Read only configs\\n let timeout = HexToInt(message.data);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"timeout\\\", timeout);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.TimeLimitRead,\\n 'value': timeout\\n });\\n configsToAck.push(configIds.ReadFromDevice.TimeLimitRead);\\n break;\\n case '0006': // working distance set acknowledge -> AEROSENSE;ACK-WORKRANGE;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-WORKRANGE\\\");\\n }\\n break;\\n case '0007': // response to workrange request, push to Read only configs\\n let workrange = HexToFloat32(message.data).toFixed(2);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"workrange\\\", workrange);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.WorkRangeRead,\\n 'value': workrange\\n });\\n configsToAck.push(configIds.ReadFromDevice.WorkRangeRead);\\n break;\\n //case '0008': // does not exist.\\n case '0009': // Fall detected ->AEROSENSE;FALL;<>;<>;<>;\\n // parse positions\\n let posx = HexToFloat32(message.data.slice(0, 8)).toFixed(2);\\n let posy = HexToFloat32(message.data.slice(8, 16)).toFixed(2);\\n // create message\\n let fall_message = \\\"AEROSENSE;FALL;\\\" + serverParams.Imei + \\\";\\\" + posx + \\\";\\\" + posy + \\\";\\\"\\n sendMessageToLocalhost(fall_message);\\n AddValue(codeValues, \\\"toSend\\\", fall_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n // send ack\\n let fall_response_hex = message.header + \\\"00000006000900000001\\\";\\n AddValue(codeValues, \\\"ack\\\", fall_response_hex);\\n break;\\n case '000a': //invade detection alert -> AEROSENSE;INVADE;<>;\\n let invade_message = \\\"AEROSENSE;INVADE;\\\" + serverParams.Imei + \\\";\\\"\\n sendMessageToLocalhost(invade_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"toSend\\\", invade_message);\\n //send ack\\n let invade_response_hex = message.header + \\\"00000006000a00000001\\\";\\n AddValue(codeValues, \\\"ack\\\", invade_response_hex);\\n break;\\n case '000b': //heatmap received -> NOT IN USE AEROSENSE;HEATMAP;<>;\\n let heatmap_message = \\\"AEROSENSE;HEATMAP;\\\" + serverParams.Imei + \\\";\\\"\\n sendMessageToLocalhost(heatmap_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"toSend\\\", heatmap_message);\\n // send switch off heatmap command\\n let heatmap_response_hex = message.header + \\\"00000006000c00000000\\\"\\n AddValue(codeValues, \\\"ack\\\", heatmap_response_hex);\\n break;\\n case '000c': //set enable heatmap ack -> AEROSENSE;ACK-HEATMAP;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-HEATMAP\\\");\\n }\\n break;\\n case '000d': // receive heatmap collect state, push to readonly configs\\n let heatmap_enabled = parseInt(message.data) == 1;\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"heatmap_enabled\\\", heatmap_enabled);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.EnableHeatMapRead,\\n 'value': heatmap_enabled ? 'true' : 'false'\\n });\\n configsToAck.push(configIds.ReadFromDevice.EnableHeatMapRead);\\n break;\\n case '000e': // Invade Detection set acknowledge AEROSENSE;ACK-INVADE;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-INVADE\\\");\\n }\\n break;\\n case '000f': // receive invade detection state, push to readonly configs\\n let invade_state = parseInt(message.data) == 1;\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"invade_enabled\\\", invade_state);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.InvadeDetectionRead,\\n 'value': invade_state ? 'true' : 'false'\\n });\\n configsToAck.push(configIds.ReadFromDevice.InvadeDetectionRead);\\n break;\\n case '0010': // position update received -> AEROSENSE;DIST-POS;<>;>;<>;\\n let x = HexToFloat32(message.data.slice(8, 16)).toFixed(2);\\n let y = HexToFloat32(message.data.slice(16, 24)).toFixed(2);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"pos_x\\\", x);\\n AddValue(codeValues, \\\"pos_y\\\", y);\\n let position_message = \\\"AEROSENSE;DIST-POS;\\\" + serverParams.Imei + \\\";\\\" + x + \\\";\\\" + y + \\\";\\\";\\n sendMessageToLocalhost(position_message);\\n //no ack as positions resent regularly\\n break;\\n case '0011': // ack negative fall detection\\n // parse positions\\n let posx_neg = HexToFloat32(message.data.slice(0, 8)).toFixed(2);\\n let posy_neg = HexToFloat32(message.data.slice(8, 16)).toFixed(2);\\n // create message\\n let negfall_message = \\\"AEROSENSE;NEGFALL;\\\" + serverParams.Imei + \\\";\\\" + posx_neg + \\\";\\\" + posy_neg + \\\";\\\"\\n sendMessageToLocalhost(negfall_message);\\n AddValue(codeValues, \\\"toSend\\\", negfall_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n // send ack\\n let negfall_response_hex = message.header + \\\"00000006001100000001\\\";\\n AddValue(codeValues, \\\"ack\\\", negfall_response_hex);\\n break;\\n case '0012': // reconnect message\\n message.radar_id = message.data.slice(2);\\n imei = message.radar_id;\\n const response_reconnect_OK = \\\"00000006001200000001\\\";\\n ack = message.header + response_reconnect_OK;\\n AddValue(codeValues, \\\"ack\\\", ack);\\n AddValue(codeValues, \\\"imei\\\", imei);\\n let reply = \\\"AEROSENSE-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\"\\n sendMessageToLocalhost(reply);\\n AddValue(codeValues, \\\"toSend\\\", reply);\\n break;\\n case '0013': // firmware version response, push to Read only configs\\n let firmware_version = `${HexToInt(message.data.slice(0,2))}.${HexToInt(message.data.slice(2,4))}.${HexToInt(message.data.slice(4,6))}.${HexToInt(message.data.slice(6,8))}`; // just raw hex for now\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"firmware_ver\\\", firmware_version);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.FirmwareRead,\\n 'value': firmware_version\\n });\\n //configsToAck.push(configIds.ReadFromDevice.ReadAll);\\n configsToAck.push(configIds.ReadFromDevice.ReadAll);\\n configsToAck.push(configIds.ReadFromDevice.FirmwareRead);\\n configsToAck.push(configIds.ReadFromDevice.LastDateTimeRead);\\n // internal ack config\\n // ack_config(\\\"ACK-VERSION\\\");\\n // update LastDateTimeRead\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.LastDateTimeRead,\\n 'value': moment().format('YYYY/MM/DD, HH:mm:ss')\\n });\\n break;\\n case '0014': // Radar reset received\\n if (message.data == '0d0d0d0d') { // message must contein this value according to docs\\n let reset_message = \\\"AEROSENSE;USERRESET;\\\" + serverParams.Imei + \\\";\\\";\\n sendMessageToLocalhost(reset_message);\\n AddValue(codeValues, \\\"toSend\\\", reset_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n }\\n // no ack\\n break;\\n case '0015': // Enable Machine learning set acknowledge AEROSENSE;ACK-MACHINELEARN;<>;\\n ack_config(\\\"ACK-MACHINELEARN\\\");\\n break;\\n case '0016': // receive machine learning state, not in use\\n let machinelearning_state = parseInt(message.data) == 1;\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"machinelearning_enabled\\\", machinelearning_state);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.EnableMachineLearningRead,\\n 'value': machinelearning_state ? 'true' : 'false'\\n });\\n configsToAck.push(configIds.ReadFromDevice.EnableMachineLearningRead);\\n break;\\n default:\\n imei = serverParams.Imei;\\n AddValue(codeValues, \\\"imei\\\", imei);\\n AddValue(codeValues, \\\"Error\\\", \\\"Unhandled message received of type: \\\" + message.function);\\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 }\\n return {\\n 'output': dataToReceiver\\n }\\n //---------------------HELPERS START----------------------------\\n function ack_config(ack_command) {\\n if (serverParams.Imei != null) {\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n let ack_message = \\\"AEROSENSE;\\\" + ack_command + \\\";\\\" + serverParams.Imei + \\\";\\\";\\n AddValue(codeValues, \\\"toSend\\\", ack_message);\\n sendMessageToLocalhost(ack_message);\\n } else { //only used for debugging\\n AddValue(codeValues, \\\"imei\\\", \\\"6796c41dc6e44e3db8d1cadce00abe6b\\\");\\n AddValue(codeValues, \\\"error\\\", \\\"serverParams do not contain Imei!\\\")\\n }\\n }\\n\\n function AddValue(msgArray, p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n msgArray.push(cvpair);\\n }\\n\\n function sendMessageToLocalhost(str) {\\n if (localTesting) {\\n console.log(\\\"Sending message to server: \\\" + str);\\n } else {\\n var server = '127.0.0.1';\\n var c = createConnection(5678, server);\\n c.write(`${str}`);\\n c.end();\\n }\\n }\\n\\n function createConnection(port, server) {\\n c = net.createConnection(port, server);\\n c.on('error', function(error) {\\n c = createConnection(port, server);\\n });\\n return c;\\n }\\n //---------------------HELPERS END----------------------------\\n //---------------------CONVERTERS START----------------------------\\n /**\\n * Convert hex string to integer\\n * @param {String} hex_string hex string\\n * @returns Integer number\\n */\\n function HexToInt(hex_string) {\\n return parseInt(hex_string, 16);\\n }\\n\\n function HexToFloat32(hex_string) {\\n let int = parseInt(hex_string, 16);\\n if (int > 0 || int < 0) {\\n var sign = (int >>> 31) ? -1 : 1;\\n var exp = (int >>> 23 & 0xff) - 127;\\n var mantissa = ((int & 0x7fffff) + 0x800000).toString(2);\\n var float32 = 0\\n for (i = 0; i < mantissa.length; i += 1) {\\n float32 += parseInt(mantissa[i]) ? Math.pow(2, exp) : 0;\\n exp--\\n }\\n return float32 * sign;\\n } else {\\n return 0;\\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(msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\n // map output to global var\\n dataToReceiver = return_values.output;\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1689161014},{"Type":1,"NewValue":"{\"Id\":172,\"Name\":\"AeroSense\",\"Operation\":\"function execute_ops(msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\n var net = require('net');\\n var moment = require('moment');\\n var codeValues = [];\\n var dataToReceiver = [];\\n var configsToAck = [];\\n var configsToUpdate = [];\\n var configsToSend = [];\\n\\n function parse_message(hex) {\\n let message = {};\\n hex = hex.toLowerCase();\\n message.magic = hex.slice(0, 4);\\n message.type = hex.slice(4, 6);\\n message.cmd = hex.slice(6, 8);\\n message.sequence = parseInt(hex.slice(8, 16), 16);\\n message.timeout = parseInt(hex.slice(16, 20), 16);\\n message.length = parseInt(hex.slice(20, 28), 16);\\n message.function = hex.slice(28, 32);\\n message.hw_version = hex.slice(32, 42);\\n message.radar_id = hex.slice(42);\\n message.header = hex.slice(0, 20);\\n message.data = hex.slice(32);\\n return message;\\n }\\n if (oystaTemplate == 'True') {\\n AddValue(codeValues, \\\"event_time\\\", Math.round(Date.now() / 1000));\\n }\\n if (globalTemplate == \\\"True\\\") {\\n let message = parse_message(rawFromBytes.slice(0));\\n let ack = '';\\n let imei = '';\\n switch (message.function) {\\n case '0001':\\n imei = message.radar_id;\\n ack = message.header + \\\"00000006000100000001\\\";\\n AddValue(codeValues, \\\"ack\\\", ack);\\n AddValue(codeValues, \\\"imei\\\", imei);\\n if (imei != serverParams.Imei) { //no need to associate if already done.\\n let new_message = \\\"AEROSENSE-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\"\\n sendMessageToLocalhost(new_message);\\n AddValue(codeValues, \\\"toSend\\\", new_message);\\n }\\n let cyc_message = \\\"AEROSENSE;CHK;\\\" + imei + \\\";\\\";\\n sendMessageToLocalhost(cyc_message);\\n AddValue(codeValues, \\\"toSendCyc\\\", cyc_message);\\n break;\\n case '0002': // working height set acknowledge AEROSENSE;ACK-WORKHEIGHT;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-WORKHEIGHT\\\");\\n }\\n break;\\n case '0003': // get working height response, push to Read only configs\\n let workheight = (HexToFloat32(message.data)).toFixed(2);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"workheight\\\", workheight);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.WorkHeightRead,\\n 'value': workheight\\n });\\n configsToAck.push(configIds.ReadFromDevice.WorkHeightRead);\\n break;\\n case '0004': // Time interval set acknowledge -> AEROSENSE;ACK-TIMEINT;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-TIMEINT\\\");\\n }\\n break;\\n case '0005': // get timeout response, push to Read only configs\\n let timeout = HexToInt(message.data);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"timeout\\\", timeout);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.TimeLimitRead,\\n 'value': timeout\\n });\\n configsToAck.push(configIds.ReadFromDevice.TimeLimitRead);\\n break;\\n case '0006': // working distance set acknowledge -> AEROSENSE;ACK-WORKRANGE;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-WORKRANGE\\\");\\n }\\n break;\\n case '0007': // response to workrange request, push to Read only configs\\n let workrange = HexToFloat32(message.data).toFixed(2);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"workrange\\\", workrange);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.WorkRangeRead,\\n 'value': workrange\\n });\\n configsToAck.push(configIds.ReadFromDevice.WorkRangeRead);\\n break;\\n //case '0008': // does not exist.\\n case '0009': // Fall detected ->AEROSENSE;FALL;<>;<>;<>;\\n // parse positions\\n let posx = HexToFloat32(message.data.slice(0, 8)).toFixed(2);\\n let posy = HexToFloat32(message.data.slice(8, 16)).toFixed(2);\\n // create message\\n let fall_message = \\\"AEROSENSE;FALL;\\\" + serverParams.Imei + \\\";\\\" + posx + \\\";\\\" + posy + \\\";\\\"\\n sendMessageToLocalhost(fall_message);\\n AddValue(codeValues, \\\"toSend\\\", fall_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n // send ack\\n let fall_response_hex = message.header + \\\"00000006000900000001\\\";\\n AddValue(codeValues, \\\"ack\\\", fall_response_hex);\\n break;\\n case '000a': //invade detection alert -> AEROSENSE;INVADE;<>;\\n let invade_message = \\\"AEROSENSE;INVADE;\\\" + serverParams.Imei + \\\";\\\"\\n sendMessageToLocalhost(invade_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"toSend\\\", invade_message);\\n //send ack\\n let invade_response_hex = message.header + \\\"00000006000a00000001\\\";\\n AddValue(codeValues, \\\"ack\\\", invade_response_hex);\\n break;\\n case '000b': //heatmap received -> NOT IN USE AEROSENSE;HEATMAP;<>;\\n let heatmap_message = \\\"AEROSENSE;HEATMAP;\\\" + serverParams.Imei + \\\";\\\"\\n sendMessageToLocalhost(heatmap_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"toSend\\\", heatmap_message);\\n // send switch off heatmap command\\n let heatmap_response_hex = message.header + \\\"00000006000c00000000\\\"\\n AddValue(codeValues, \\\"ack\\\", heatmap_response_hex);\\n break;\\n case '000c': //set enable heatmap ack -> AEROSENSE;ACK-HEATMAP;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-HEATMAP\\\");\\n }\\n break;\\n case '000d': // receive heatmap collect state, push to readonly configs\\n let heatmap_enabled = parseInt(message.data) == 1;\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"heatmap_enabled\\\", heatmap_enabled);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.EnableHeatMapRead,\\n 'value': heatmap_enabled ? 'true' : 'false'\\n });\\n configsToAck.push(configIds.ReadFromDevice.EnableHeatMapRead);\\n break;\\n case '000e': // Invade Detection set acknowledge AEROSENSE;ACK-INVADE;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-INVADE\\\");\\n }\\n break;\\n case '000f': // receive invade detection state, push to readonly configs\\n let invade_state = parseInt(message.data) == 1;\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"invade_enabled\\\", invade_state);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.InvadeDetectionRead,\\n 'value': invade_state ? 'true' : 'false'\\n });\\n configsToAck.push(configIds.ReadFromDevice.InvadeDetectionRead);\\n break;\\n case '0010': // position update received -> AEROSENSE;DIST-POS;<>;>;<>;\\n let x = HexToFloat32(message.data.slice(8, 16)).toFixed(2);\\n let y = HexToFloat32(message.data.slice(16, 24)).toFixed(2);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"pos_x\\\", x);\\n AddValue(codeValues, \\\"pos_y\\\", y);\\n let position_message = \\\"AEROSENSE;DIST-POS;\\\" + serverParams.Imei + \\\";\\\" + x + \\\";\\\" + y + \\\";\\\";\\n sendMessageToLocalhost(position_message);\\n //no ack as positions resent regularly\\n break;\\n case '0011': // ack negative fall detection\\n // parse positions\\n let posx_neg = HexToFloat32(message.data.slice(0, 8)).toFixed(2);\\n let posy_neg = HexToFloat32(message.data.slice(8, 16)).toFixed(2);\\n // create message\\n let negfall_message = \\\"AEROSENSE;NEGFALL;\\\" + serverParams.Imei + \\\";\\\" + posx_neg + \\\";\\\" + posy_neg + \\\";\\\"\\n sendMessageToLocalhost(negfall_message);\\n AddValue(codeValues, \\\"toSend\\\", negfall_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n // send ack\\n let negfall_response_hex = message.header + \\\"00000006001100000001\\\";\\n AddValue(codeValues, \\\"ack\\\", negfall_response_hex);\\n break;\\n case '0012': // reconnect message\\n message.radar_id = message.data.slice(2);\\n imei = message.radar_id;\\n const response_reconnect_OK = \\\"00000006001200000001\\\";\\n ack = message.header + response_reconnect_OK;\\n AddValue(codeValues, \\\"ack\\\", ack);\\n AddValue(codeValues, \\\"imei\\\", imei);\\n let reply = \\\"AEROSENSE-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\"\\n sendMessageToLocalhost(reply);\\n AddValue(codeValues, \\\"toSend\\\", reply);\\n break;\\n case '0013': // firmware version response, push to Read only configs\\n let firmware_version = `${HexToInt(message.data.slice(0,2))}.${HexToInt(message.data.slice(2,4))}.${HexToInt(message.data.slice(4,6))}.${HexToInt(message.data.slice(6,8))}`; // just raw hex for now\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"firmware_ver\\\", firmware_version);\\n // update firmware and lastTimeread fields\\n AddValue(configsToUpdate, configIds.ReadFromDevice.FirmwareRead, firmware_version);\\n AddValue(configsToUpdate, configIds.ReadFromDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\n configsToAck.push(configIds.ReadFromDevice.ReadAll);\\n configsToAck.push(configIds.ReadFromDevice.FirmwareRead);\\n configsToAck.push(configIds.ReadFromDevice.LastDateTimeRead);\\n // internal ack config\\n // ack_config(\\\"ACK-VERSION\\\");\\n // update LastDateTimeRead\\n // trigger getting all other values\\n AddValue(configsToSend, configIds.ReadFromDevice.WorkHeightRead, 0);\\n break;\\n case '0014': // Radar reset received\\n if (message.data == '0d0d0d0d') { // message must contein this value according to docs\\n let reset_message = \\\"AEROSENSE;USERRESET;\\\" + serverParams.Imei + \\\";\\\";\\n sendMessageToLocalhost(reset_message);\\n AddValue(codeValues, \\\"toSend\\\", reset_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n }\\n // no ack\\n break;\\n case '0015': // Enable Machine learning set acknowledge AEROSENSE;ACK-MACHINELEARN;<>;\\n ack_config(\\\"ACK-MACHINELEARN\\\");\\n break;\\n case '0016': // receive machine learning state, not in use\\n let machinelearning_state = parseInt(message.data) == 1;\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"machinelearning_enabled\\\", machinelearning_state);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.EnableMachineLearningRead,\\n 'value': machinelearning_state ? 'true' : 'false'\\n });\\n configsToAck.push(configIds.ReadFromDevice.EnableMachineLearningRead);\\n break;\\n default:\\n imei = serverParams.Imei;\\n AddValue(codeValues, \\\"imei\\\", imei);\\n AddValue(codeValues, \\\"Error\\\", \\\"Unhandled message received of type: \\\" + message.function);\\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 }\\n return {\\n 'output': dataToReceiver\\n }\\n //---------------------HELPERS START----------------------------\\n function ack_config(ack_command) {\\n if (serverParams.Imei != null) {\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n let ack_message = \\\"AEROSENSE;\\\" + ack_command + \\\";\\\" + serverParams.Imei + \\\";\\\";\\n AddValue(codeValues, \\\"toSend\\\", ack_message);\\n sendMessageToLocalhost(ack_message);\\n } else { //only used for debugging\\n AddValue(codeValues, \\\"imei\\\", \\\"6796c41dc6e44e3db8d1cadce00abe6b\\\");\\n AddValue(codeValues, \\\"error\\\", \\\"serverParams do not contain Imei!\\\")\\n }\\n }\\n\\n function AddValue(msgArray, p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n msgArray.push(cvpair);\\n }\\n\\n function sendMessageToLocalhost(str) {\\n if (localTesting) {\\n console.log(\\\"Sending message to server: \\\" + str);\\n } else {\\n var server = '127.0.0.1';\\n var c = createConnection(5678, server);\\n c.write(`${str}`);\\n c.end();\\n }\\n }\\n\\n function createConnection(port, server) {\\n c = net.createConnection(port, server);\\n c.on('error', function(error) {\\n c = createConnection(port, server);\\n });\\n return c;\\n }\\n //---------------------HELPERS END----------------------------\\n //---------------------CONVERTERS START----------------------------\\n /**\\n * Convert hex string to integer\\n * @param {String} hex_string hex string\\n * @returns Integer number\\n */\\n function HexToInt(hex_string) {\\n return parseInt(hex_string, 16);\\n }\\n\\n function HexToFloat32(hex_string) {\\n let int = parseInt(hex_string, 16);\\n if (int > 0 || int < 0) {\\n var sign = (int >>> 31) ? -1 : 1;\\n var exp = (int >>> 23 & 0xff) - 127;\\n var mantissa = ((int & 0x7fffff) + 0x800000).toString(2);\\n var float32 = 0\\n for (i = 0; i < mantissa.length; i += 1) {\\n float32 += parseInt(mantissa[i]) ? Math.pow(2, exp) : 0;\\n exp--\\n }\\n return float32 * sign;\\n } else {\\n return 0;\\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(msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\n // map output to global var\\n dataToReceiver = return_values.output;\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1689161661},{"Type":1,"NewValue":"{\"Id\":172,\"Name\":\"AeroSense\",\"Operation\":\"function execute_ops(msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\n var net = require('net');\\n var moment = require('moment');\\n var codeValues = [];\\n var dataToReceiver = [];\\n var configsToAck = [];\\n var configsToUpdate = [];\\n var configsToSend = [];\\n\\n function parse_message(hex) {\\n let message = {};\\n hex = hex.toLowerCase();\\n message.magic = hex.slice(0, 4);\\n message.type = hex.slice(4, 6);\\n message.cmd = hex.slice(6, 8);\\n message.sequence = parseInt(hex.slice(8, 16), 16);\\n message.timeout = parseInt(hex.slice(16, 20), 16);\\n message.length = parseInt(hex.slice(20, 28), 16);\\n message.function = hex.slice(28, 32);\\n message.hw_version = hex.slice(32, 42);\\n message.radar_id = hex.slice(42);\\n message.header = hex.slice(0, 20);\\n message.data = hex.slice(32);\\n return message;\\n }\\n if (oystaTemplate == 'True') {\\n AddValue(codeValues, \\\"event_time\\\", Math.round(Date.now() / 1000));\\n }\\n if (globalTemplate == \\\"True\\\") {\\n let message = parse_message(rawFromBytes.slice(0));\\n let ack = '';\\n let imei = '';\\n switch (message.function) {\\n case '0001':\\n imei = message.radar_id;\\n ack = message.header + \\\"00000006000100000001\\\";\\n AddValue(codeValues, \\\"ack\\\", ack);\\n AddValue(codeValues, \\\"imei\\\", imei);\\n if (imei != serverParams.Imei) { //no need to associate if already done.\\n let new_message = \\\"AEROSENSE-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\"\\n sendMessageToLocalhost(new_message);\\n AddValue(codeValues, \\\"toSend\\\", new_message);\\n }\\n let cyc_message = \\\"AEROSENSE;CHK;\\\" + imei + \\\";\\\";\\n sendMessageToLocalhost(cyc_message);\\n AddValue(codeValues, \\\"toSendCyc\\\", cyc_message);\\n break;\\n case '0002': // working height set acknowledge AEROSENSE;ACK-WORKHEIGHT;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-WORKHEIGHT\\\");\\n }\\n break;\\n case '0003': // get working height response, push to Read only configs\\n let workheight = (HexToFloat32(message.data)).toFixed(2);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"workheight\\\", workheight);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.WorkHeightRead,\\n 'value': workheight\\n });\\n configsToAck.push(configIds.ReadFromDevice.WorkHeightRead);\\n break;\\n case '0004': // Time interval set acknowledge -> AEROSENSE;ACK-TIMEINT;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-TIMEINT\\\");\\n }\\n break;\\n case '0005': // get timeout response, push to Read only configs\\n let timeout = HexToInt(message.data);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"timeout\\\", timeout);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.TimeLimitRead,\\n 'value': timeout\\n });\\n configsToAck.push(configIds.ReadFromDevice.TimeLimitRead);\\n break;\\n case '0006': // working distance set acknowledge -> AEROSENSE;ACK-WORKRANGE;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-WORKRANGE\\\");\\n }\\n break;\\n case '0007': // response to workrange request, push to Read only configs\\n let workrange = HexToFloat32(message.data).toFixed(2);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"workrange\\\", workrange);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.WorkRangeRead,\\n 'value': workrange\\n });\\n configsToAck.push(configIds.ReadFromDevice.WorkRangeRead);\\n break;\\n //case '0008': // does not exist.\\n case '0009': // Fall detected ->AEROSENSE;FALL;<>;<>;<>;\\n // parse positions\\n let posx = HexToFloat32(message.data.slice(0, 8)).toFixed(2);\\n let posy = HexToFloat32(message.data.slice(8, 16)).toFixed(2);\\n // create message\\n let fall_message = \\\"AEROSENSE;FALL;\\\" + serverParams.Imei + \\\";\\\" + posx + \\\";\\\" + posy + \\\";\\\"\\n sendMessageToLocalhost(fall_message);\\n AddValue(codeValues, \\\"toSend\\\", fall_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n // send ack\\n let fall_response_hex = message.header + \\\"00000006000900000001\\\";\\n AddValue(codeValues, \\\"ack\\\", fall_response_hex);\\n break;\\n case '000a': //invade detection alert -> AEROSENSE;INVADE;<>;\\n let invade_message = \\\"AEROSENSE;INVADE;\\\" + serverParams.Imei + \\\";\\\"\\n sendMessageToLocalhost(invade_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"toSend\\\", invade_message);\\n //send ack\\n let invade_response_hex = message.header + \\\"00000006000a00000001\\\";\\n AddValue(codeValues, \\\"ack\\\", invade_response_hex);\\n break;\\n case '000b': //heatmap received -> NOT IN USE AEROSENSE;HEATMAP;<>;\\n let heatmap_message = \\\"AEROSENSE;HEATMAP;\\\" + serverParams.Imei + \\\";\\\"\\n sendMessageToLocalhost(heatmap_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"toSend\\\", heatmap_message);\\n // send switch off heatmap command\\n let heatmap_response_hex = message.header + \\\"00000006000c00000000\\\"\\n AddValue(codeValues, \\\"ack\\\", heatmap_response_hex);\\n break;\\n case '000c': //set enable heatmap ack -> AEROSENSE;ACK-HEATMAP;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-HEATMAP\\\");\\n }\\n break;\\n case '000d': // receive heatmap collect state, push to readonly configs\\n let heatmap_enabled = parseInt(message.data) == 1;\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"heatmap_enabled\\\", heatmap_enabled);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.EnableHeatMapRead,\\n 'value': heatmap_enabled ? 'true' : 'false'\\n });\\n configsToAck.push(configIds.ReadFromDevice.EnableHeatMapRead);\\n break;\\n case '000e': // Invade Detection set acknowledge AEROSENSE;ACK-INVADE;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-INVADE\\\");\\n }\\n break;\\n case '000f': // receive invade detection state, push to readonly configs\\n let invade_state = parseInt(message.data) == 1;\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"invade_enabled\\\", invade_state);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.InvadeDetectionRead,\\n 'value': invade_state ? 'true' : 'false'\\n });\\n configsToAck.push(configIds.ReadFromDevice.InvadeDetectionRead);\\n break;\\n case '0010': // position update received -> AEROSENSE;DIST-POS;<>;>;<>;\\n let x = HexToFloat32(message.data.slice(8, 16)).toFixed(2);\\n let y = HexToFloat32(message.data.slice(16, 24)).toFixed(2);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"pos_x\\\", x);\\n AddValue(codeValues, \\\"pos_y\\\", y);\\n let position_message = \\\"AEROSENSE;DIST-POS;\\\" + serverParams.Imei + \\\";\\\" + x + \\\";\\\" + y + \\\";\\\";\\n sendMessageToLocalhost(position_message);\\n //no ack as positions resent regularly\\n break;\\n case '0011': // ack negative fall detection\\n // parse positions\\n let posx_neg = HexToFloat32(message.data.slice(0, 8)).toFixed(2);\\n let posy_neg = HexToFloat32(message.data.slice(8, 16)).toFixed(2);\\n // create message\\n let negfall_message = \\\"AEROSENSE;NEGFALL;\\\" + serverParams.Imei + \\\";\\\" + posx_neg + \\\";\\\" + posy_neg + \\\";\\\"\\n sendMessageToLocalhost(negfall_message);\\n AddValue(codeValues, \\\"toSend\\\", negfall_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n // send ack\\n let negfall_response_hex = message.header + \\\"00000006001100000001\\\";\\n AddValue(codeValues, \\\"ack\\\", negfall_response_hex);\\n break;\\n case '0012': // reconnect message\\n message.radar_id = message.data.slice(2);\\n imei = message.radar_id;\\n const response_reconnect_OK = \\\"00000006001200000001\\\";\\n ack = message.header + response_reconnect_OK;\\n AddValue(codeValues, \\\"ack\\\", ack);\\n AddValue(codeValues, \\\"imei\\\", imei);\\n let reply = \\\"AEROSENSE-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\"\\n sendMessageToLocalhost(reply);\\n AddValue(codeValues, \\\"toSend\\\", reply);\\n break;\\n case '0013': // firmware version response, push to Read only configs\\n let firmware_version = `${HexToInt(message.data.slice(0,2))}.${HexToInt(message.data.slice(2,4))}.${HexToInt(message.data.slice(4,6))}.${HexToInt(message.data.slice(6,8))}`; // just raw hex for now\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"firmware_ver\\\", firmware_version);\\n // update firmware and lastTimeread fields\\n AddValue(configsToUpdate, configIds.ReadFromDevice.FirmwareRead, firmware_version);\\n AddValue(configsToUpdate, configIds.ReadFromDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\n configsToAck.push(configIds.ReadFromDevice.ReadAll);\\n configsToAck.push(configIds.ReadFromDevice.FirmwareRead);\\n configsToAck.push(configIds.ReadFromDevice.LastDateTimeRead);\\n // internal ack config\\n // ack_config(\\\"ACK-VERSION\\\");\\n // update LastDateTimeRead\\n // trigger getting all other values\\n AddValue(configsToSend, configIds.ReadFromDevice.WorkHeightRead, \\\"0\\\");\\n break;\\n case '0014': // Radar reset received\\n if (message.data == '0d0d0d0d') { // message must contein this value according to docs\\n let reset_message = \\\"AEROSENSE;USERRESET;\\\" + serverParams.Imei + \\\";\\\";\\n sendMessageToLocalhost(reset_message);\\n AddValue(codeValues, \\\"toSend\\\", reset_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n }\\n // no ack\\n break;\\n case '0015': // Enable Machine learning set acknowledge AEROSENSE;ACK-MACHINELEARN;<>;\\n ack_config(\\\"ACK-MACHINELEARN\\\");\\n break;\\n case '0016': // receive machine learning state, not in use\\n let machinelearning_state = parseInt(message.data) == 1;\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"machinelearning_enabled\\\", machinelearning_state);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.EnableMachineLearningRead,\\n 'value': machinelearning_state ? 'true' : 'false'\\n });\\n configsToAck.push(configIds.ReadFromDevice.EnableMachineLearningRead);\\n break;\\n default:\\n imei = serverParams.Imei;\\n AddValue(codeValues, \\\"imei\\\", imei);\\n AddValue(codeValues, \\\"Error\\\", \\\"Unhandled message received of type: \\\" + message.function);\\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 }\\n return {\\n 'output': dataToReceiver\\n }\\n //---------------------HELPERS START----------------------------\\n function ack_config(ack_command) {\\n if (serverParams.Imei != null) {\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n let ack_message = \\\"AEROSENSE;\\\" + ack_command + \\\";\\\" + serverParams.Imei + \\\";\\\";\\n AddValue(codeValues, \\\"toSend\\\", ack_message);\\n sendMessageToLocalhost(ack_message);\\n } else { //only used for debugging\\n AddValue(codeValues, \\\"imei\\\", \\\"6796c41dc6e44e3db8d1cadce00abe6b\\\");\\n AddValue(codeValues, \\\"error\\\", \\\"serverParams do not contain Imei!\\\")\\n }\\n }\\n\\n function AddValue(msgArray, p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n msgArray.push(cvpair);\\n }\\n\\n function sendMessageToLocalhost(str) {\\n if (localTesting) {\\n console.log(\\\"Sending message to server: \\\" + str);\\n } else {\\n var server = '127.0.0.1';\\n var c = createConnection(5678, server);\\n c.write(`${str}`);\\n c.end();\\n }\\n }\\n\\n function createConnection(port, server) {\\n c = net.createConnection(port, server);\\n c.on('error', function(error) {\\n c = createConnection(port, server);\\n });\\n return c;\\n }\\n //---------------------HELPERS END----------------------------\\n //---------------------CONVERTERS START----------------------------\\n /**\\n * Convert hex string to integer\\n * @param {String} hex_string hex string\\n * @returns Integer number\\n */\\n function HexToInt(hex_string) {\\n return parseInt(hex_string, 16);\\n }\\n\\n function HexToFloat32(hex_string) {\\n let int = parseInt(hex_string, 16);\\n if (int > 0 || int < 0) {\\n var sign = (int >>> 31) ? -1 : 1;\\n var exp = (int >>> 23 & 0xff) - 127;\\n var mantissa = ((int & 0x7fffff) + 0x800000).toString(2);\\n var float32 = 0\\n for (i = 0; i < mantissa.length; i += 1) {\\n float32 += parseInt(mantissa[i]) ? Math.pow(2, exp) : 0;\\n exp--\\n }\\n return float32 * sign;\\n } else {\\n return 0;\\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(msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\n // map output to global var\\n dataToReceiver = return_values.output;\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1689162094},{"Type":1,"NewValue":"{\"Id\":172,\"Name\":\"AeroSense\",\"Operation\":\"function execute_ops(msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\n var net = require('net');\\n var moment = require('moment');\\n var codeValues = [];\\n var dataToReceiver = [];\\n var configsToAck = [];\\n var configsToUpdate = [];\\n var configsToSend = [];\\n\\n function parse_message(hex) {\\n let message = {};\\n hex = hex.toLowerCase();\\n message.magic = hex.slice(0, 4);\\n message.type = hex.slice(4, 6);\\n message.cmd = hex.slice(6, 8);\\n message.sequence = parseInt(hex.slice(8, 16), 16);\\n message.timeout = parseInt(hex.slice(16, 20), 16);\\n message.length = parseInt(hex.slice(20, 28), 16);\\n message.function = hex.slice(28, 32);\\n message.hw_version = hex.slice(32, 42);\\n message.radar_id = hex.slice(42);\\n message.header = hex.slice(0, 20);\\n message.data = hex.slice(32);\\n return message;\\n }\\n if (oystaTemplate == 'True') {\\n AddValue(codeValues, \\\"event_time\\\", Math.round(Date.now() / 1000));\\n }\\n if (globalTemplate == \\\"True\\\") {\\n let message = parse_message(rawFromBytes.slice(0));\\n let ack = '';\\n let imei = '';\\n switch (message.function) {\\n case '0001':\\n imei = message.radar_id;\\n ack = message.header + \\\"00000006000100000001\\\";\\n AddValue(codeValues, \\\"ack\\\", ack);\\n AddValue(codeValues, \\\"imei\\\", imei);\\n if (imei != serverParams.Imei) { //no need to associate if already done.\\n let new_message = \\\"AEROSENSE-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\"\\n sendMessageToLocalhost(new_message);\\n AddValue(codeValues, \\\"toSend\\\", new_message);\\n }\\n let cyc_message = \\\"AEROSENSE;CHK;\\\" + imei + \\\";\\\";\\n sendMessageToLocalhost(cyc_message);\\n AddValue(codeValues, \\\"toSendCyc\\\", cyc_message);\\n break;\\n case '0002': // working height set acknowledge AEROSENSE;ACK-WORKHEIGHT;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-WORKHEIGHT\\\");\\n }\\n break;\\n case '0003': // get working height response, push to Read only configs\\n let workheight = (HexToFloat32(message.data)).toFixed(2);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"workheight\\\", workheight);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.WorkHeightRead,\\n 'value': workheight\\n });\\n configsToAck.push(configIds.ReadFromDevice.WorkHeightRead);\\n break;\\n case '0004': // Time interval set acknowledge -> AEROSENSE;ACK-TIMEINT;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-TIMEINT\\\");\\n }\\n break;\\n case '0005': // get timeout response, push to Read only configs\\n let timeout = HexToInt(message.data);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"timeout\\\", timeout);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.TimeLimitRead,\\n 'value': timeout\\n });\\n configsToAck.push(configIds.ReadFromDevice.TimeLimitRead);\\n break;\\n case '0006': // working distance set acknowledge -> AEROSENSE;ACK-WORKRANGE;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-WORKRANGE\\\");\\n }\\n break;\\n case '0007': // response to workrange request, push to Read only configs\\n let workrange = HexToFloat32(message.data).toFixed(2);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"workrange\\\", workrange);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.WorkRangeRead,\\n 'value': workrange\\n });\\n configsToAck.push(configIds.ReadFromDevice.WorkRangeRead);\\n break;\\n //case '0008': // does not exist.\\n case '0009': // Fall detected ->AEROSENSE;FALL;<>;<>;<>;\\n // parse positions\\n let posx = HexToFloat32(message.data.slice(0, 8)).toFixed(2);\\n let posy = HexToFloat32(message.data.slice(8, 16)).toFixed(2);\\n // create message\\n let fall_message = \\\"AEROSENSE;FALL;\\\" + serverParams.Imei + \\\";\\\" + posx + \\\";\\\" + posy + \\\";\\\"\\n sendMessageToLocalhost(fall_message);\\n AddValue(codeValues, \\\"toSend\\\", fall_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n // send ack\\n let fall_response_hex = message.header + \\\"00000006000900000001\\\";\\n AddValue(codeValues, \\\"ack\\\", fall_response_hex);\\n break;\\n case '000a': //invade detection alert -> AEROSENSE;INVADE;<>;\\n let invade_message = \\\"AEROSENSE;INVADE;\\\" + serverParams.Imei + \\\";\\\"\\n sendMessageToLocalhost(invade_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"toSend\\\", invade_message);\\n //send ack\\n let invade_response_hex = message.header + \\\"00000006000a00000001\\\";\\n AddValue(codeValues, \\\"ack\\\", invade_response_hex);\\n break;\\n case '000b': //heatmap received -> NOT IN USE AEROSENSE;HEATMAP;<>;\\n let heatmap_message = \\\"AEROSENSE;HEATMAP;\\\" + serverParams.Imei + \\\";\\\"\\n sendMessageToLocalhost(heatmap_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"toSend\\\", heatmap_message);\\n // send switch off heatmap command\\n let heatmap_response_hex = message.header + \\\"00000006000c00000000\\\"\\n AddValue(codeValues, \\\"ack\\\", heatmap_response_hex);\\n break;\\n case '000c': //set enable heatmap ack -> AEROSENSE;ACK-HEATMAP;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-HEATMAP\\\");\\n }\\n break;\\n case '000d': // receive heatmap collect state, push to readonly configs\\n let heatmap_enabled = parseInt(message.data) == 1;\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"heatmap_enabled\\\", heatmap_enabled);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.EnableHeatMapRead,\\n 'value': heatmap_enabled ? 'true' : 'false'\\n });\\n configsToAck.push(configIds.ReadFromDevice.EnableHeatMapRead);\\n break;\\n case '000e': // Invade Detection set acknowledge AEROSENSE;ACK-INVADE;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-INVADE\\\");\\n }\\n break;\\n case '000f': // receive invade detection state, push to readonly configs\\n let invade_state = parseInt(message.data) == 1;\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"invade_enabled\\\", invade_state);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.InvadeDetectionRead,\\n 'value': invade_state ? 'true' : 'false'\\n });\\n configsToAck.push(configIds.ReadFromDevice.InvadeDetectionRead);\\n break;\\n case '0010': // position update received -> AEROSENSE;DIST-POS;<>;>;<>;\\n let x = HexToFloat32(message.data.slice(8, 16)).toFixed(2);\\n let y = HexToFloat32(message.data.slice(16, 24)).toFixed(2);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"pos_x\\\", x);\\n AddValue(codeValues, \\\"pos_y\\\", y);\\n let position_message = \\\"AEROSENSE;DIST-POS;\\\" + serverParams.Imei + \\\";\\\" + x + \\\";\\\" + y + \\\";\\\";\\n sendMessageToLocalhost(position_message);\\n //no ack as positions resent regularly\\n break;\\n case '0011': // ack negative fall detection\\n // parse positions\\n let posx_neg = HexToFloat32(message.data.slice(0, 8)).toFixed(2);\\n let posy_neg = HexToFloat32(message.data.slice(8, 16)).toFixed(2);\\n // create message\\n let negfall_message = \\\"AEROSENSE;NEGFALL;\\\" + serverParams.Imei + \\\";\\\" + posx_neg + \\\";\\\" + posy_neg + \\\";\\\"\\n sendMessageToLocalhost(negfall_message);\\n AddValue(codeValues, \\\"toSend\\\", negfall_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n // send ack\\n let negfall_response_hex = message.header + \\\"00000006001100000001\\\";\\n AddValue(codeValues, \\\"ack\\\", negfall_response_hex);\\n break;\\n case '0012': // reconnect message\\n message.radar_id = message.data.slice(2);\\n imei = message.radar_id;\\n const response_reconnect_OK = \\\"00000006001200000001\\\";\\n ack = message.header + response_reconnect_OK;\\n AddValue(codeValues, \\\"ack\\\", ack);\\n AddValue(codeValues, \\\"imei\\\", imei);\\n let reply = \\\"AEROSENSE-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\"\\n sendMessageToLocalhost(reply);\\n AddValue(codeValues, \\\"toSend\\\", reply);\\n break;\\n case '0013': // firmware version response, push to Read only configs\\n let firmware_version = `${HexToInt(message.data.slice(0,2))}.${HexToInt(message.data.slice(2,4))}.${HexToInt(message.data.slice(4,6))}.${HexToInt(message.data.slice(6,8))}`; // just raw hex for now\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"firmware_ver\\\", firmware_version);\\n // update firmware and lastTimeread fields\\n AddValue(configsToUpdate, configIds.ReadFromDevice.FirmwareRead, firmware_version);\\n AddValue(configsToUpdate, configIds.ReadFromDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\n configsToAck.push(configIds.ReadFromDevice.ReadAll);\\n configsToAck.push(configIds.ReadFromDevice.FirmwareRead);\\n configsToAck.push(configIds.ReadFromDevice.LastDateTimeRead);\\n // internal ack config\\n // ack_config(\\\"ACK-VERSION\\\");\\n // update LastDateTimeRead\\n // trigger getting all other values\\n AddValue(configsToSend, configIds.ReadFromDevice.WorkHeightRead, 1.6);\\n break;\\n case '0014': // Radar reset received\\n if (message.data == '0d0d0d0d') { // message must contein this value according to docs\\n let reset_message = \\\"AEROSENSE;USERRESET;\\\" + serverParams.Imei + \\\";\\\";\\n sendMessageToLocalhost(reset_message);\\n AddValue(codeValues, \\\"toSend\\\", reset_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n }\\n // no ack\\n break;\\n case '0015': // Enable Machine learning set acknowledge AEROSENSE;ACK-MACHINELEARN;<>;\\n ack_config(\\\"ACK-MACHINELEARN\\\");\\n break;\\n case '0016': // receive machine learning state, not in use\\n let machinelearning_state = parseInt(message.data) == 1;\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"machinelearning_enabled\\\", machinelearning_state);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.EnableMachineLearningRead,\\n 'value': machinelearning_state ? 'true' : 'false'\\n });\\n configsToAck.push(configIds.ReadFromDevice.EnableMachineLearningRead);\\n break;\\n default:\\n imei = serverParams.Imei;\\n AddValue(codeValues, \\\"imei\\\", imei);\\n AddValue(codeValues, \\\"Error\\\", \\\"Unhandled message received of type: \\\" + message.function);\\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 }\\n return {\\n 'output': dataToReceiver\\n }\\n //---------------------HELPERS START----------------------------\\n function ack_config(ack_command) {\\n if (serverParams.Imei != null) {\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n let ack_message = \\\"AEROSENSE;\\\" + ack_command + \\\";\\\" + serverParams.Imei + \\\";\\\";\\n AddValue(codeValues, \\\"toSend\\\", ack_message);\\n sendMessageToLocalhost(ack_message);\\n } else { //only used for debugging\\n AddValue(codeValues, \\\"imei\\\", \\\"6796c41dc6e44e3db8d1cadce00abe6b\\\");\\n AddValue(codeValues, \\\"error\\\", \\\"serverParams do not contain Imei!\\\")\\n }\\n }\\n\\n function AddValue(msgArray, p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n msgArray.push(cvpair);\\n }\\n\\n function sendMessageToLocalhost(str) {\\n if (localTesting) {\\n console.log(\\\"Sending message to server: \\\" + str);\\n } else {\\n var server = '127.0.0.1';\\n var c = createConnection(5678, server);\\n c.write(`${str}`);\\n c.end();\\n }\\n }\\n\\n function createConnection(port, server) {\\n c = net.createConnection(port, server);\\n c.on('error', function(error) {\\n c = createConnection(port, server);\\n });\\n return c;\\n }\\n //---------------------HELPERS END----------------------------\\n //---------------------CONVERTERS START----------------------------\\n /**\\n * Convert hex string to integer\\n * @param {String} hex_string hex string\\n * @returns Integer number\\n */\\n function HexToInt(hex_string) {\\n return parseInt(hex_string, 16);\\n }\\n\\n function HexToFloat32(hex_string) {\\n let int = parseInt(hex_string, 16);\\n if (int > 0 || int < 0) {\\n var sign = (int >>> 31) ? -1 : 1;\\n var exp = (int >>> 23 & 0xff) - 127;\\n var mantissa = ((int & 0x7fffff) + 0x800000).toString(2);\\n var float32 = 0\\n for (i = 0; i < mantissa.length; i += 1) {\\n float32 += parseInt(mantissa[i]) ? Math.pow(2, exp) : 0;\\n exp--\\n }\\n return float32 * sign;\\n } else {\\n return 0;\\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(msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\n // map output to global var\\n dataToReceiver = return_values.output;\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1689162388},{"Type":1,"NewValue":"{\"Id\":172,\"Name\":\"AeroSense\",\"Operation\":\"function execute_ops(msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\n var net = require('net');\\n var moment = require('moment');\\n var codeValues = [];\\n var dataToReceiver = [];\\n var configsToAck = [];\\n var configsToUpdate = [];\\n var configsToSend = [];\\n\\n function parse_message(hex) {\\n let message = {};\\n hex = hex.toLowerCase();\\n message.magic = hex.slice(0, 4);\\n message.type = hex.slice(4, 6);\\n message.cmd = hex.slice(6, 8);\\n message.sequence = parseInt(hex.slice(8, 16), 16);\\n message.timeout = parseInt(hex.slice(16, 20), 16);\\n message.length = parseInt(hex.slice(20, 28), 16);\\n message.function = hex.slice(28, 32);\\n message.hw_version = hex.slice(32, 42);\\n message.radar_id = hex.slice(42);\\n message.header = hex.slice(0, 20);\\n message.data = hex.slice(32);\\n return message;\\n }\\n if (oystaTemplate == 'True') {\\n AddValue(codeValues, \\\"event_time\\\", Math.round(Date.now() / 1000));\\n }\\n if (globalTemplate == \\\"True\\\") {\\n let message = parse_message(rawFromBytes.slice(0));\\n let ack = '';\\n let imei = '';\\n switch (message.function) {\\n case '0001':\\n imei = message.radar_id;\\n ack = message.header + \\\"00000006000100000001\\\";\\n AddValue(codeValues, \\\"ack\\\", ack);\\n AddValue(codeValues, \\\"imei\\\", imei);\\n if (imei != serverParams.Imei) { //no need to associate if already done.\\n let new_message = \\\"AEROSENSE-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\"\\n sendMessageToLocalhost(new_message);\\n AddValue(codeValues, \\\"toSend\\\", new_message);\\n }\\n let cyc_message = \\\"AEROSENSE;CHK;\\\" + imei + \\\";\\\";\\n sendMessageToLocalhost(cyc_message);\\n AddValue(codeValues, \\\"toSendCyc\\\", cyc_message);\\n break;\\n case '0002': // working height set acknowledge AEROSENSE;ACK-WORKHEIGHT;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-WORKHEIGHT\\\");\\n }\\n break;\\n case '0003': // get working height response, push to Read only configs\\n let workheight = (HexToFloat32(message.data)).toFixed(2);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"workheight\\\", workheight);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.WorkHeightRead,\\n 'value': workheight\\n });\\n configsToAck.push(configIds.ReadFromDevice.WorkHeightRead);\\n break;\\n case '0004': // Time interval set acknowledge -> AEROSENSE;ACK-TIMEINT;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-TIMEINT\\\");\\n }\\n break;\\n case '0005': // get timeout response, push to Read only configs\\n let timeout = HexToInt(message.data);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"timeout\\\", timeout);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.TimeLimitRead,\\n 'value': timeout\\n });\\n configsToAck.push(configIds.ReadFromDevice.TimeLimitRead);\\n break;\\n case '0006': // working distance set acknowledge -> AEROSENSE;ACK-WORKRANGE;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-WORKRANGE\\\");\\n }\\n break;\\n case '0007': // response to workrange request, push to Read only configs\\n let workrange = HexToFloat32(message.data).toFixed(2);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"workrange\\\", workrange);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.WorkRangeRead,\\n 'value': workrange\\n });\\n configsToAck.push(configIds.ReadFromDevice.WorkRangeRead);\\n break;\\n //case '0008': // does not exist.\\n case '0009': // Fall detected ->AEROSENSE;FALL;<>;<>;<>;\\n // parse positions\\n let posx = HexToFloat32(message.data.slice(0, 8)).toFixed(2);\\n let posy = HexToFloat32(message.data.slice(8, 16)).toFixed(2);\\n // create message\\n let fall_message = \\\"AEROSENSE;FALL;\\\" + serverParams.Imei + \\\";\\\" + posx + \\\";\\\" + posy + \\\";\\\"\\n sendMessageToLocalhost(fall_message);\\n AddValue(codeValues, \\\"toSend\\\", fall_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n // send ack\\n let fall_response_hex = message.header + \\\"00000006000900000001\\\";\\n AddValue(codeValues, \\\"ack\\\", fall_response_hex);\\n break;\\n case '000a': //invade detection alert -> AEROSENSE;INVADE;<>;\\n let invade_message = \\\"AEROSENSE;INVADE;\\\" + serverParams.Imei + \\\";\\\"\\n sendMessageToLocalhost(invade_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"toSend\\\", invade_message);\\n //send ack\\n let invade_response_hex = message.header + \\\"00000006000a00000001\\\";\\n AddValue(codeValues, \\\"ack\\\", invade_response_hex);\\n break;\\n case '000b': //heatmap received -> NOT IN USE AEROSENSE;HEATMAP;<>;\\n let heatmap_message = \\\"AEROSENSE;HEATMAP;\\\" + serverParams.Imei + \\\";\\\"\\n sendMessageToLocalhost(heatmap_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"toSend\\\", heatmap_message);\\n // send switch off heatmap command\\n let heatmap_response_hex = message.header + \\\"00000006000c00000000\\\"\\n AddValue(codeValues, \\\"ack\\\", heatmap_response_hex);\\n break;\\n case '000c': //set enable heatmap ack -> AEROSENSE;ACK-HEATMAP;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-HEATMAP\\\");\\n }\\n break;\\n case '000d': // receive heatmap collect state, push to readonly configs\\n let heatmap_enabled = parseInt(message.data) == 1;\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"heatmap_enabled\\\", heatmap_enabled);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.EnableHeatMapRead,\\n 'value': heatmap_enabled ? 'true' : 'false'\\n });\\n configsToAck.push(configIds.ReadFromDevice.EnableHeatMapRead);\\n break;\\n case '000e': // Invade Detection set acknowledge AEROSENSE;ACK-INVADE;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-INVADE\\\");\\n }\\n break;\\n case '000f': // receive invade detection state, push to readonly configs\\n let invade_state = parseInt(message.data) == 1;\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"invade_enabled\\\", invade_state);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.InvadeDetectionRead,\\n 'value': invade_state ? 'true' : 'false'\\n });\\n configsToAck.push(configIds.ReadFromDevice.InvadeDetectionRead);\\n break;\\n case '0010': // position update received -> AEROSENSE;DIST-POS;<>;>;<>;\\n let x = HexToFloat32(message.data.slice(8, 16)).toFixed(2);\\n let y = HexToFloat32(message.data.slice(16, 24)).toFixed(2);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"pos_x\\\", x);\\n AddValue(codeValues, \\\"pos_y\\\", y);\\n let position_message = \\\"AEROSENSE;DIST-POS;\\\" + serverParams.Imei + \\\";\\\" + x + \\\";\\\" + y + \\\";\\\";\\n sendMessageToLocalhost(position_message);\\n //no ack as positions resent regularly\\n break;\\n case '0011': // ack negative fall detection\\n // parse positions\\n let posx_neg = HexToFloat32(message.data.slice(0, 8)).toFixed(2);\\n let posy_neg = HexToFloat32(message.data.slice(8, 16)).toFixed(2);\\n // create message\\n let negfall_message = \\\"AEROSENSE;NEGFALL;\\\" + serverParams.Imei + \\\";\\\" + posx_neg + \\\";\\\" + posy_neg + \\\";\\\"\\n sendMessageToLocalhost(negfall_message);\\n AddValue(codeValues, \\\"toSend\\\", negfall_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n // send ack\\n let negfall_response_hex = message.header + \\\"00000006001100000001\\\";\\n AddValue(codeValues, \\\"ack\\\", negfall_response_hex);\\n break;\\n case '0012': // reconnect message\\n message.radar_id = message.data.slice(2);\\n imei = message.radar_id;\\n const response_reconnect_OK = \\\"00000006001200000001\\\";\\n ack = message.header + response_reconnect_OK;\\n AddValue(codeValues, \\\"ack\\\", ack);\\n AddValue(codeValues, \\\"imei\\\", imei);\\n let reply = \\\"AEROSENSE-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\"\\n sendMessageToLocalhost(reply);\\n AddValue(codeValues, \\\"toSend\\\", reply);\\n break;\\n case '0013': // firmware version response, push to Read only configs\\n let firmware_version = `${HexToInt(message.data.slice(0,2))}.${HexToInt(message.data.slice(2,4))}.${HexToInt(message.data.slice(4,6))}.${HexToInt(message.data.slice(6,8))}`; // just raw hex for now\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"firmware_ver\\\", firmware_version);\\n // update firmware and lastTimeread fields\\n AddValue(configsToUpdate, configIds.ReadFromDevice.FirmwareRead, firmware_version);\\n AddValue(configsToUpdate, configIds.ReadFromDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\n configsToAck.push(configIds.ReadFromDevice.ReadAll);\\n configsToAck.push(configIds.ReadFromDevice.FirmwareRead);\\n configsToAck.push(configIds.ReadFromDevice.LastDateTimeRead);\\n // internal ack config\\n // ack_config(\\\"ACK-VERSION\\\");\\n // update LastDateTimeRead\\n // trigger getting all other values\\n AddValue(configsToUpdate, configIds.ReadFromDevice.WorkHeightRead, 1.6);\\n break;\\n case '0014': // Radar reset received\\n if (message.data == '0d0d0d0d') { // message must contein this value according to docs\\n let reset_message = \\\"AEROSENSE;USERRESET;\\\" + serverParams.Imei + \\\";\\\";\\n sendMessageToLocalhost(reset_message);\\n AddValue(codeValues, \\\"toSend\\\", reset_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n }\\n // no ack\\n break;\\n case '0015': // Enable Machine learning set acknowledge AEROSENSE;ACK-MACHINELEARN;<>;\\n ack_config(\\\"ACK-MACHINELEARN\\\");\\n break;\\n case '0016': // receive machine learning state, not in use\\n let machinelearning_state = parseInt(message.data) == 1;\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"machinelearning_enabled\\\", machinelearning_state);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.EnableMachineLearningRead,\\n 'value': machinelearning_state ? 'true' : 'false'\\n });\\n configsToAck.push(configIds.ReadFromDevice.EnableMachineLearningRead);\\n break;\\n default:\\n imei = serverParams.Imei;\\n AddValue(codeValues, \\\"imei\\\", imei);\\n AddValue(codeValues, \\\"Error\\\", \\\"Unhandled message received of type: \\\" + message.function);\\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 }\\n return {\\n 'output': dataToReceiver\\n }\\n //---------------------HELPERS START----------------------------\\n function ack_config(ack_command) {\\n if (serverParams.Imei != null) {\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n let ack_message = \\\"AEROSENSE;\\\" + ack_command + \\\";\\\" + serverParams.Imei + \\\";\\\";\\n AddValue(codeValues, \\\"toSend\\\", ack_message);\\n sendMessageToLocalhost(ack_message);\\n } else { //only used for debugging\\n AddValue(codeValues, \\\"imei\\\", \\\"6796c41dc6e44e3db8d1cadce00abe6b\\\");\\n AddValue(codeValues, \\\"error\\\", \\\"serverParams do not contain Imei!\\\")\\n }\\n }\\n\\n function AddValue(msgArray, p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n msgArray.push(cvpair);\\n }\\n\\n function sendMessageToLocalhost(str) {\\n if (localTesting) {\\n console.log(\\\"Sending message to server: \\\" + str);\\n } else {\\n var server = '127.0.0.1';\\n var c = createConnection(5678, server);\\n c.write(`${str}`);\\n c.end();\\n }\\n }\\n\\n function createConnection(port, server) {\\n c = net.createConnection(port, server);\\n c.on('error', function(error) {\\n c = createConnection(port, server);\\n });\\n return c;\\n }\\n //---------------------HELPERS END----------------------------\\n //---------------------CONVERTERS START----------------------------\\n /**\\n * Convert hex string to integer\\n * @param {String} hex_string hex string\\n * @returns Integer number\\n */\\n function HexToInt(hex_string) {\\n return parseInt(hex_string, 16);\\n }\\n\\n function HexToFloat32(hex_string) {\\n let int = parseInt(hex_string, 16);\\n if (int > 0 || int < 0) {\\n var sign = (int >>> 31) ? -1 : 1;\\n var exp = (int >>> 23 & 0xff) - 127;\\n var mantissa = ((int & 0x7fffff) + 0x800000).toString(2);\\n var float32 = 0\\n for (i = 0; i < mantissa.length; i += 1) {\\n float32 += parseInt(mantissa[i]) ? Math.pow(2, exp) : 0;\\n exp--\\n }\\n return float32 * sign;\\n } else {\\n return 0;\\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(msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\n // map output to global var\\n dataToReceiver = return_values.output;\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1689162745},{"Type":1,"NewValue":"{\"Id\":172,\"Name\":\"AeroSense\",\"Operation\":\"function execute_ops(msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\n var net = require('net');\\n var moment = require('moment');\\n var codeValues = [];\\n var dataToReceiver = [];\\n var configsToAck = [];\\n var configsToUpdate = [];\\n var configsToSend = [];\\n\\n function parse_message(hex) {\\n let message = {};\\n hex = hex.toLowerCase();\\n message.magic = hex.slice(0, 4);\\n message.type = hex.slice(4, 6);\\n message.cmd = hex.slice(6, 8);\\n message.sequence = parseInt(hex.slice(8, 16), 16);\\n message.timeout = parseInt(hex.slice(16, 20), 16);\\n message.length = parseInt(hex.slice(20, 28), 16);\\n message.function = hex.slice(28, 32);\\n message.hw_version = hex.slice(32, 42);\\n message.radar_id = hex.slice(42);\\n message.header = hex.slice(0, 20);\\n message.data = hex.slice(32);\\n return message;\\n }\\n if (oystaTemplate == 'True') {\\n AddValue(codeValues, \\\"event_time\\\", Math.round(Date.now() / 1000));\\n }\\n if (globalTemplate == \\\"True\\\") {\\n let message = parse_message(rawFromBytes.slice(0));\\n let ack = '';\\n let imei = '';\\n switch (message.function) {\\n case '0001':\\n imei = message.radar_id;\\n ack = message.header + \\\"00000006000100000001\\\";\\n AddValue(codeValues, \\\"ack\\\", ack);\\n AddValue(codeValues, \\\"imei\\\", imei);\\n if (imei != serverParams.Imei) { //no need to associate if already done.\\n let new_message = \\\"AEROSENSE-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\"\\n sendMessageToLocalhost(new_message);\\n AddValue(codeValues, \\\"toSend\\\", new_message);\\n }\\n let cyc_message = \\\"AEROSENSE;CHK;\\\" + imei + \\\";\\\";\\n sendMessageToLocalhost(cyc_message);\\n AddValue(codeValues, \\\"toSendCyc\\\", cyc_message);\\n break;\\n case '0002': // working height set acknowledge AEROSENSE;ACK-WORKHEIGHT;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-WORKHEIGHT\\\");\\n }\\n break;\\n case '0003': // get working height response, push to Read only configs\\n let workheight = (HexToFloat32(message.data)).toFixed(2);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"workheight\\\", workheight);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.WorkHeightRead,\\n 'value': workheight\\n });\\n configsToAck.push(configIds.ReadFromDevice.WorkHeightRead);\\n break;\\n case '0004': // Time interval set acknowledge -> AEROSENSE;ACK-TIMEINT;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-TIMEINT\\\");\\n }\\n break;\\n case '0005': // get timeout response, push to Read only configs\\n let timeout = HexToInt(message.data);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"timeout\\\", timeout);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.TimeLimitRead,\\n 'value': timeout\\n });\\n configsToAck.push(configIds.ReadFromDevice.TimeLimitRead);\\n break;\\n case '0006': // working distance set acknowledge -> AEROSENSE;ACK-WORKRANGE;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-WORKRANGE\\\");\\n }\\n break;\\n case '0007': // response to workrange request, push to Read only configs\\n let workrange = HexToFloat32(message.data).toFixed(2);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"workrange\\\", workrange);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.WorkRangeRead,\\n 'value': workrange\\n });\\n configsToAck.push(configIds.ReadFromDevice.WorkRangeRead);\\n break;\\n //case '0008': // does not exist.\\n case '0009': // Fall detected ->AEROSENSE;FALL;<>;<>;<>;\\n // parse positions\\n let posx = HexToFloat32(message.data.slice(0, 8)).toFixed(2);\\n let posy = HexToFloat32(message.data.slice(8, 16)).toFixed(2);\\n // create message\\n let fall_message = \\\"AEROSENSE;FALL;\\\" + serverParams.Imei + \\\";\\\" + posx + \\\";\\\" + posy + \\\";\\\"\\n sendMessageToLocalhost(fall_message);\\n AddValue(codeValues, \\\"toSend\\\", fall_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n // send ack\\n let fall_response_hex = message.header + \\\"00000006000900000001\\\";\\n AddValue(codeValues, \\\"ack\\\", fall_response_hex);\\n break;\\n case '000a': //invade detection alert -> AEROSENSE;INVADE;<>;\\n let invade_message = \\\"AEROSENSE;INVADE;\\\" + serverParams.Imei + \\\";\\\"\\n sendMessageToLocalhost(invade_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"toSend\\\", invade_message);\\n //send ack\\n let invade_response_hex = message.header + \\\"00000006000a00000001\\\";\\n AddValue(codeValues, \\\"ack\\\", invade_response_hex);\\n break;\\n case '000b': //heatmap received -> NOT IN USE AEROSENSE;HEATMAP;<>;\\n let heatmap_message = \\\"AEROSENSE;HEATMAP;\\\" + serverParams.Imei + \\\";\\\"\\n sendMessageToLocalhost(heatmap_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"toSend\\\", heatmap_message);\\n // send switch off heatmap command\\n let heatmap_response_hex = message.header + \\\"00000006000c00000000\\\"\\n AddValue(codeValues, \\\"ack\\\", heatmap_response_hex);\\n break;\\n case '000c': //set enable heatmap ack -> AEROSENSE;ACK-HEATMAP;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-HEATMAP\\\");\\n }\\n break;\\n case '000d': // receive heatmap collect state, push to readonly configs\\n let heatmap_enabled = parseInt(message.data) == 1;\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"heatmap_enabled\\\", heatmap_enabled);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.EnableHeatMapRead,\\n 'value': heatmap_enabled ? 'true' : 'false'\\n });\\n configsToAck.push(configIds.ReadFromDevice.EnableHeatMapRead);\\n break;\\n case '000e': // Invade Detection set acknowledge AEROSENSE;ACK-INVADE;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-INVADE\\\");\\n }\\n break;\\n case '000f': // receive invade detection state, push to readonly configs\\n let invade_state = parseInt(message.data) == 1;\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"invade_enabled\\\", invade_state);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.InvadeDetectionRead,\\n 'value': invade_state ? 'true' : 'false'\\n });\\n configsToAck.push(configIds.ReadFromDevice.InvadeDetectionRead);\\n break;\\n case '0010': // position update received -> AEROSENSE;DIST-POS;<>;>;<>;\\n let x = HexToFloat32(message.data.slice(8, 16)).toFixed(2);\\n let y = HexToFloat32(message.data.slice(16, 24)).toFixed(2);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"pos_x\\\", x);\\n AddValue(codeValues, \\\"pos_y\\\", y);\\n let position_message = \\\"AEROSENSE;DIST-POS;\\\" + serverParams.Imei + \\\";\\\" + x + \\\";\\\" + y + \\\";\\\";\\n sendMessageToLocalhost(position_message);\\n //no ack as positions resent regularly\\n break;\\n case '0011': // ack negative fall detection\\n // parse positions\\n let posx_neg = HexToFloat32(message.data.slice(0, 8)).toFixed(2);\\n let posy_neg = HexToFloat32(message.data.slice(8, 16)).toFixed(2);\\n // create message\\n let negfall_message = \\\"AEROSENSE;NEGFALL;\\\" + serverParams.Imei + \\\";\\\" + posx_neg + \\\";\\\" + posy_neg + \\\";\\\"\\n sendMessageToLocalhost(negfall_message);\\n AddValue(codeValues, \\\"toSend\\\", negfall_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n // send ack\\n let negfall_response_hex = message.header + \\\"00000006001100000001\\\";\\n AddValue(codeValues, \\\"ack\\\", negfall_response_hex);\\n break;\\n case '0012': // reconnect message\\n message.radar_id = message.data.slice(2);\\n imei = message.radar_id;\\n const response_reconnect_OK = \\\"00000006001200000001\\\";\\n ack = message.header + response_reconnect_OK;\\n AddValue(codeValues, \\\"ack\\\", ack);\\n AddValue(codeValues, \\\"imei\\\", imei);\\n let reply = \\\"AEROSENSE-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\"\\n sendMessageToLocalhost(reply);\\n AddValue(codeValues, \\\"toSend\\\", reply);\\n break;\\n case '0013': // firmware version response, push to Read only configs\\n let firmware_version = `${HexToInt(message.data.slice(0,2))}.${HexToInt(message.data.slice(2,4))}.${HexToInt(message.data.slice(4,6))}.${HexToInt(message.data.slice(6,8))}`; // just raw hex for now\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"firmware_ver\\\", firmware_version);\\n // update firmware and lastTimeread fields\\n AddValue(configsToUpdate, configIds.ReadFromDevice.FirmwareRead, firmware_version);\\n AddValue(configsToUpdate, configIds.ReadFromDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\n configsToAck.push(configIds.ReadFromDevice.ReadAll);\\n configsToAck.push(configIds.ReadFromDevice.FirmwareRead);\\n configsToAck.push(configIds.ReadFromDevice.LastDateTimeRead);\\n // internal ack config\\n // ack_config(\\\"ACK-VERSION\\\");\\n // update LastDateTimeRead\\n // trigger getting all other values\\n AddValue(configsToSend, configIds.ReadFromDevice.WorkHeightRead, 1.6);\\n break;\\n case '0014': // Radar reset received\\n if (message.data == '0d0d0d0d') { // message must contein this value according to docs\\n let reset_message = \\\"AEROSENSE;USERRESET;\\\" + serverParams.Imei + \\\";\\\";\\n sendMessageToLocalhost(reset_message);\\n AddValue(codeValues, \\\"toSend\\\", reset_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n }\\n // no ack\\n break;\\n case '0015': // Enable Machine learning set acknowledge AEROSENSE;ACK-MACHINELEARN;<>;\\n ack_config(\\\"ACK-MACHINELEARN\\\");\\n break;\\n case '0016': // receive machine learning state, not in use\\n let machinelearning_state = parseInt(message.data) == 1;\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"machinelearning_enabled\\\", machinelearning_state);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.EnableMachineLearningRead,\\n 'value': machinelearning_state ? 'true' : 'false'\\n });\\n configsToAck.push(configIds.ReadFromDevice.EnableMachineLearningRead);\\n break;\\n default:\\n imei = serverParams.Imei;\\n AddValue(codeValues, \\\"imei\\\", imei);\\n AddValue(codeValues, \\\"Error\\\", \\\"Unhandled message received of type: \\\" + message.function);\\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 }\\n return {\\n 'output': dataToReceiver\\n }\\n //---------------------HELPERS START----------------------------\\n function ack_config(ack_command) {\\n if (serverParams.Imei != null) {\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n let ack_message = \\\"AEROSENSE;\\\" + ack_command + \\\";\\\" + serverParams.Imei + \\\";\\\";\\n AddValue(codeValues, \\\"toSend\\\", ack_message);\\n sendMessageToLocalhost(ack_message);\\n } else { //only used for debugging\\n AddValue(codeValues, \\\"imei\\\", \\\"6796c41dc6e44e3db8d1cadce00abe6b\\\");\\n AddValue(codeValues, \\\"error\\\", \\\"serverParams do not contain Imei!\\\")\\n }\\n }\\n\\n function AddValue(msgArray, p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n msgArray.push(cvpair);\\n }\\n\\n function sendMessageToLocalhost(str) {\\n if (localTesting) {\\n console.log(\\\"Sending message to server: \\\" + str);\\n } else {\\n var server = '127.0.0.1';\\n var c = createConnection(5678, server);\\n c.write(`${str}`);\\n c.end();\\n }\\n }\\n\\n function createConnection(port, server) {\\n c = net.createConnection(port, server);\\n c.on('error', function(error) {\\n c = createConnection(port, server);\\n });\\n return c;\\n }\\n //---------------------HELPERS END----------------------------\\n //---------------------CONVERTERS START----------------------------\\n /**\\n * Convert hex string to integer\\n * @param {String} hex_string hex string\\n * @returns Integer number\\n */\\n function HexToInt(hex_string) {\\n return parseInt(hex_string, 16);\\n }\\n\\n function HexToFloat32(hex_string) {\\n let int = parseInt(hex_string, 16);\\n if (int > 0 || int < 0) {\\n var sign = (int >>> 31) ? -1 : 1;\\n var exp = (int >>> 23 & 0xff) - 127;\\n var mantissa = ((int & 0x7fffff) + 0x800000).toString(2);\\n var float32 = 0\\n for (i = 0; i < mantissa.length; i += 1) {\\n float32 += parseInt(mantissa[i]) ? Math.pow(2, exp) : 0;\\n exp--\\n }\\n return float32 * sign;\\n } else {\\n return 0;\\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(msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\n // map output to global var\\n dataToReceiver = return_values.output;\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1689162937}]}],"Groups":[{"Id":4207,"Parent":null,"Name":"Feature","Json":"{\"description\":\"All AeroSense Features\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"ProtocolActionObjects":[]},{"Id":4208,"Parent":{"Id":4207,"Name":"Feature","Json":{"description":"All AeroSense Features","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":4208,"Name":"RadarSettings","Json":{"description":"Configuration for Radar Unit.","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":4524,"Name":"ReadFromDevice","Json":{"description":"Contains values downloaded from the device.","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":4800,"Name":"No activity monitor","Json":{"description":"Send alarms when no activity is detected.","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"RadarSettings","Json":"{\"description\":\"Configuration for Radar Unit.\",\"columns\":2,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"ProtocolActionObjects":[]},{"Id":4524,"Parent":{"Id":4207,"Name":"Feature","Json":{"description":"All AeroSense Features","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":4208,"Name":"RadarSettings","Json":{"description":"Configuration for Radar Unit.","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":4524,"Name":"ReadFromDevice","Json":{"description":"Contains values downloaded from the device.","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":4800,"Name":"No activity monitor","Json":{"description":"Send alarms when no activity is detected.","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"ReadFromDevice","Json":"{\"description\":\"Contains values downloaded from the device.\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"ProtocolActionObjects":[]},{"Id":4800,"Parent":{"Id":4207,"Name":"Feature","Json":{"description":"All AeroSense Features","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":4208,"Name":"RadarSettings","Json":{"description":"Configuration for Radar Unit.","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":4524,"Name":"ReadFromDevice","Json":{"description":"Contains values downloaded from the device.","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":4800,"Name":"No activity monitor","Json":{"description":"Send alarms when no activity is detected.","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"No activity monitor","Json":"{\"description\":\"Send alarms when no activity is detected.\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"ProtocolActionObjects":[]}],"GroupParams":[{"Id":7396,"Group":{"Id":4208,"Name":"RadarSettings","Json":{"description":"Configuration for Radar Unit.","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":4207,"Name":"Feature","Json":{"description":"All AeroSense Features","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":4524,"Name":"ReadFromDevice","Json":{"description":"Contains values downloaded from the device.","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":4800,"Name":"No activity monitor","Json":{"description":"Send alarms when no activity is detected.","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":"Show RadarSettings","Json":"{\"name\":\"Show RadarSettings\",\"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":[],"Tags":[]},{"Id":6619,"Group":{"Id":4208,"Name":"RadarSettings","Json":{"description":"Configuration for Radar Unit.","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":4207,"Name":"Feature","Json":{"description":"All AeroSense Features","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":4524,"Name":"ReadFromDevice","Json":{"description":"Contains values downloaded from the device.","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":4800,"Name":"No activity monitor","Json":{"description":"Send alarms when no activity is detected.","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":"StopSendingRealtimePos","Json":"{\"name\":\"StopSendingRealtimePos\",\"default\":\"\",\"description\":\"Stop sending realtime positions.\",\"type\":\"button\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":true,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":7}","Default":"","Command":null,"ProtocolActionObjects":[],"Tags":[]},{"Id":6618,"Group":{"Id":4208,"Name":"RadarSettings","Json":{"description":"Configuration for Radar Unit.","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":4207,"Name":"Feature","Json":{"description":"All AeroSense Features","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":4524,"Name":"ReadFromDevice","Json":{"description":"Contains values downloaded from the device.","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":4800,"Name":"No activity monitor","Json":{"description":"Send alarms when no activity is detected.","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":"StartSendingRealtimePos","Json":"{\"name\":\"StartSendingRealtimePos\",\"default\":\"\",\"description\":\"Start sending realtime positions\",\"type\":\"button\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":true,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":6}","Default":"","Command":null,"ProtocolActionObjects":[],"Tags":[]},{"Id":6617,"Group":{"Id":4208,"Name":"RadarSettings","Json":{"description":"Configuration for Radar Unit.","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":4207,"Name":"Feature","Json":{"description":"All AeroSense Features","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":4524,"Name":"ReadFromDevice","Json":{"description":"Contains values downloaded from the device.","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":4800,"Name":"No activity monitor","Json":{"description":"Send alarms when no activity is detected.","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":"EnableHeatmap","Json":"{\"name\":\"EnableHeatmap\",\"default\":\"true\",\"description\":\"Enable heatmap images.\",\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":true,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Currently not supported. Please switch off.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"true","Command":null,"ProtocolActionObjects":[],"Tags":[]},{"Id":6292,"Group":{"Id":4208,"Name":"RadarSettings","Json":{"description":"Configuration for Radar Unit.","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":4207,"Name":"Feature","Json":{"description":"All AeroSense Features","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":4524,"Name":"ReadFromDevice","Json":{"description":"Contains values downloaded from the device.","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":4800,"Name":"No activity monitor","Json":{"description":"Send alarms when no activity is detected.","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":"EnableMachineLearning","Json":"{\"name\":\"EnableMachineLearning\",\"default\":\"false\",\"description\":\"Turn on machine learning algorythm.\",\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"The machine learning algorithm is to further reduce the false alerts of fall detection for better user experiences. However, it may result in lower accuracy in certain scenarios.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":4}","Default":"true","Command":null,"ProtocolActionObjects":[],"Tags":[]},{"Id":6291,"Group":{"Id":4208,"Name":"RadarSettings","Json":{"description":"Configuration for Radar Unit.","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":4207,"Name":"Feature","Json":{"description":"All AeroSense Features","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":4524,"Name":"ReadFromDevice","Json":{"description":"Contains values downloaded from the device.","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":4800,"Name":"No activity monitor","Json":{"description":"Send alarms when no activity is detected.","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":"InvadeDetection","Json":"{\"name\":\"InvadeDetection\",\"default\":\"true\",\"description\":\"Enable activity monitoring feature.\",\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":5}","Default":"true","Command":null,"ProtocolActionObjects":[],"Tags":[]},{"Id":6290,"Group":{"Id":4208,"Name":"RadarSettings","Json":{"description":"Configuration for Radar Unit.","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":4207,"Name":"Feature","Json":{"description":"All AeroSense Features","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":4524,"Name":"ReadFromDevice","Json":{"description":"Contains values downloaded from the device.","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":4800,"Name":"No activity monitor","Json":{"description":"Send alarms when no activity is detected.","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":"TimeInterval","Json":"{\"name\":\"TimeInterval\",\"default\":\"\",\"description\":\"Time interval to trigger the fall detection (in seconds).\",\"type\":\"number\",\"suffix\":\"s\",\"prefix\":null,\"min\":30,\"max\":300,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":2}","Default":"","Command":null,"ProtocolActionObjects":[],"Tags":[]},{"Id":6289,"Group":{"Id":4208,"Name":"RadarSettings","Json":{"description":"Configuration for Radar Unit.","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":4207,"Name":"Feature","Json":{"description":"All AeroSense Features","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":4524,"Name":"ReadFromDevice","Json":{"description":"Contains values downloaded from the device.","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":4800,"Name":"No activity monitor","Json":{"description":"Send alarms when no activity is detected.","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":"WorkHeight","Json":"{\"name\":\"WorkHeight\",\"default\":\"\",\"description\":\"Set the mounted height of radar unit.\",\"type\":\"number\",\"suffix\":null,\"prefix\":null,\"min\":1.4,\"max\":2.2,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":0}","Default":"","Command":null,"ProtocolActionObjects":[],"Tags":[]},{"Id":5802,"Group":{"Id":4208,"Name":"RadarSettings","Json":{"description":"Configuration for Radar Unit.","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":4207,"Name":"Feature","Json":{"description":"All AeroSense Features","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":4524,"Name":"ReadFromDevice","Json":{"description":"Contains values downloaded from the device.","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":4800,"Name":"No activity monitor","Json":{"description":"Send alarms when no activity is detected.","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":"WorkRange","Json":"{\"name\":\"WorkRange\",\"default\":\"\",\"description\":\"Set the work range of the sensor\",\"type\":\"number\",\"suffix\":null,\"prefix\":null,\"min\":0.5,\"max\":7,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":1}","Default":"","Command":null,"ProtocolActionObjects":[],"Tags":[]},{"Id":6621,"Group":{"Id":4524,"Name":"ReadFromDevice","Json":{"description":"Contains values downloaded from the device.","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":4207,"Name":"Feature","Json":{"description":"All AeroSense Features","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":4208,"Name":"RadarSettings","Json":{"description":"Configuration for Radar Unit.","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":4800,"Name":"No activity monitor","Json":{"description":"Send alarms when no activity is detected.","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":"WorkRangeRead","Json":"{\"name\":\"WorkRangeRead\",\"default\":\"\",\"description\":\"Workrange as read from the device.\",\"type\":\"number\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":4}","Default":"","Command":null,"ProtocolActionObjects":[],"Tags":[]},{"Id":6624,"Group":{"Id":4524,"Name":"ReadFromDevice","Json":{"description":"Contains values downloaded from the device.","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":4207,"Name":"Feature","Json":{"description":"All AeroSense Features","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":4208,"Name":"RadarSettings","Json":{"description":"Configuration for Radar Unit.","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":4800,"Name":"No activity monitor","Json":{"description":"Send alarms when no activity is detected.","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":"ReadAll","Json":"{\"name\":\"ReadAll\",\"default\":\"\",\"description\":\"Read values from Device.\",\"type\":\"button\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":6624,\"Group\":{\"Id\":4524,\"Name\":\"ReadFromDevice\",\"Json\":{\"description\":\"Contains values downloaded from the device.\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"ReadAll\",\"Json\":\"{\\\"name\\\":\\\"ReadAll\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Read values from Device.\\\",\\\"type\\\":\\\"button\\\",\\\"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\":[],\"Tags\":[]}","Timestamp":1688729222},{"Type":0,"NewValue":"{\"Id\":6624,\"Group\":{\"Id\":4524,\"Name\":\"ReadFromDevice\",\"Json\":{\"description\":\"Contains values downloaded from the device.\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"ReadAll\",\"Json\":\"{\\\"name\\\":\\\"ReadAll\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Read values from Device.\\\",\\\"type\\\":\\\"button\\\",\\\"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\":{\"Id\":3058,\"Protocol\":{\"Id\":160,\"Code\":\"AeroSense\",\"Version\":\"0.2\",\"FirmwareVersion\":\"\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"GetAll\",\"TemplateSMS\":null,\"Template\":null,\"AckTemplate\":null,\"Operation\":\"// configs to send on all read only items\\n// they will turn amber\\n// on return ack individual items\\n// auto ack read all button\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":false,\"HexString\":false,\"SendAttempts\":1,\"Order\":null},\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1688729227},{"Type":1,"NewValue":"{\"Id\":6624,\"Group\":{\"Id\":4524,\"Name\":\"ReadFromDevice\",\"Json\":{\"description\":\"Contains values downloaded from the device.\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"ReadAll\",\"Json\":\"{\\\"name\\\":\\\"ReadAll\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Read values from Device.\\\",\\\"type\\\":\\\"button\\\",\\\"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\":[],\"Tags\":[]}","Timestamp":1688998381},{"Type":0,"NewValue":"{\"Id\":6624,\"Group\":{\"Id\":4524,\"Name\":\"ReadFromDevice\",\"Json\":{\"description\":\"Contains values downloaded from the device.\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"ReadAll\",\"Json\":\"{\\\"name\\\":\\\"ReadAll\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Read values from Device.\\\",\\\"type\\\":\\\"button\\\",\\\"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\":{\"Id\":2704,\"Protocol\":{\"Id\":160,\"Code\":\"AeroSense\",\"Version\":\"0.2\",\"FirmwareVersion\":\"\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"GetFirmware\",\"TemplateSMS\":null,\"Template\":\"1201000200000000000000000006001300000000\",\"AckTemplate\":null,\"Operation\":\"// write your code here...\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":1,\"Order\":null},\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1688998387},{"Type":2,"NewValue":"{\"Id\":6624,\"Group\":{\"Id\":4524,\"Name\":\"ReadFromDevice\",\"Json\":{\"description\":\"Contains values downloaded from the device.\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"ReadAll\",\"Json\":\"{\\\"name\\\":\\\"ReadAll\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Read values from Device.\\\",\\\"type\\\":\\\"button\\\",\\\"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\":{\"Id\":3058,\"Protocol\":{\"Id\":160,\"Code\":\"AeroSense\",\"Version\":\"0.2\",\"FirmwareVersion\":\"\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"GetAll\",\"TemplateSMS\":null,\"Template\":null,\"AckTemplate\":null,\"Operation\":\"var msg = []\\nvar configs = [];\\nvar configsToSend = [];\\nvar configsToAck = [];\\nconfigsToAck.push(configIds.ReadFromDevice.ReadAll);\\n// let data = '00000000';\\n// if (params.RadarSettings.InvadeDetection == 'true') {\\n// data = '00000001'\\n// }\\n// AddValue(\\\"value\\\", data);\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n //configs: configs,\\n configsToAck: configsToAck\\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\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":false,\"SendAttempts\":1,\"Order\":null},\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1688998390},{"Type":1,"NewValue":"{\"Id\":6624,\"Group\":{\"Id\":4524,\"Name\":\"ReadFromDevice\",\"Json\":{\"description\":\"Contains values downloaded from the device.\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"ReadAll\",\"Json\":\"{\\\"name\\\":\\\"ReadAll\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Read values from Device.\\\",\\\"type\\\":\\\"button\\\",\\\"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\":[],\"Tags\":[]}","Timestamp":1689773141},{"Type":0,"NewValue":"{\"Id\":6624,\"Group\":{\"Id\":4524,\"Name\":\"ReadFromDevice\",\"Json\":{\"description\":\"Contains values downloaded from the device.\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"ReadAll\",\"Json\":\"{\\\"name\\\":\\\"ReadAll\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Read values from Device.\\\",\\\"type\\\":\\\"button\\\",\\\"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\":{\"Id\":2821,\"Protocol\":{\"Id\":160,\"Code\":\"AeroSense\",\"Version\":\"0.2\",\"FirmwareVersion\":\"\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"GetEnableHeatMap\",\"TemplateSMS\":null,\"Template\":\"1201000200000000000000000006000d00000000\",\"AckTemplate\":null,\"Operation\":\"// write your code here...\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":null},\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1689773145}],"Tags":[]},{"Id":6623,"Group":{"Id":4524,"Name":"ReadFromDevice","Json":{"description":"Contains values downloaded from the device.","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":4207,"Name":"Feature","Json":{"description":"All AeroSense Features","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":4208,"Name":"RadarSettings","Json":{"description":"Configuration for Radar Unit.","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":4800,"Name":"No activity monitor","Json":{"description":"Send alarms when no activity is detected.","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":"TimeLimitRead","Json":"{\"name\":\"TimeLimitRead\",\"default\":\"\",\"description\":\"Timelimit read from the device (s).\",\"type\":\"number\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":true,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":5}","Default":"","Command":null,"ProtocolActionObjects":[],"Tags":[]},{"Id":6622,"Group":{"Id":4524,"Name":"ReadFromDevice","Json":{"description":"Contains values downloaded from the device.","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":4207,"Name":"Feature","Json":{"description":"All AeroSense Features","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":4208,"Name":"RadarSettings","Json":{"description":"Configuration for Radar Unit.","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":4800,"Name":"No activity monitor","Json":{"description":"Send alarms when no activity is detected.","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":"WorkHeightRead","Json":"{\"name\":\"WorkHeightRead\",\"default\":\"\",\"description\":\"Workheight read from the device.\",\"type\":\"number\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":6622,\"Group\":{\"Id\":4524,\"Name\":\"ReadFromDevice\",\"Json\":{\"description\":\"Contains values downloaded from the device.\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"WorkHeightRead\",\"Json\":\"{\\\"name\\\":\\\"WorkHeightRead\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Workheight read from the device.\\\",\\\"type\\\":\\\"number\\\",\\\"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\":[],\"Tags\":[]}","Timestamp":1689162205}],"Tags":[]},{"Id":7397,"Group":{"Id":4524,"Name":"ReadFromDevice","Json":{"description":"Contains values downloaded from the device.","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":4207,"Name":"Feature","Json":{"description":"All AeroSense Features","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":4208,"Name":"RadarSettings","Json":{"description":"Configuration for Radar Unit.","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":4800,"Name":"No activity monitor","Json":{"description":"Send alarms when no activity is detected.","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":"LastDateTimeRead","Json":"{\"name\":\"LastDateTimeRead\",\"default\":\"\",\"description\":\"Date time of last parameter read.\",\"type\":\"datetime\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":1}","Default":"","Command":null,"ProtocolActionObjects":[],"Tags":[]},{"Id":6625,"Group":{"Id":4524,"Name":"ReadFromDevice","Json":{"description":"Contains values downloaded from the device.","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":4207,"Name":"Feature","Json":{"description":"All AeroSense Features","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":4208,"Name":"RadarSettings","Json":{"description":"Configuration for Radar Unit.","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":4800,"Name":"No activity monitor","Json":{"description":"Send alarms when no activity is detected.","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":"FirmwareRead","Json":"{\"name\":\"FirmwareRead\",\"default\":\"\",\"description\":\"Firmware read from the device.\",\"type\":\"text\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"Tags":[]},{"Id":6798,"Group":{"Id":4524,"Name":"ReadFromDevice","Json":{"description":"Contains values downloaded from the device.","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":4207,"Name":"Feature","Json":{"description":"All AeroSense Features","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":4208,"Name":"RadarSettings","Json":{"description":"Configuration for Radar Unit.","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":4800,"Name":"No activity monitor","Json":{"description":"Send alarms when no activity is detected.","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":"EnableHeatMapRead","Json":"{\"name\":\"EnableHeatMapRead\",\"default\":\"\",\"description\":\"Enable Heatmap state read from device.\",\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":6}","Default":"false","Command":null,"ProtocolActionObjects":[],"Tags":[]},{"Id":6797,"Group":{"Id":4524,"Name":"ReadFromDevice","Json":{"description":"Contains values downloaded from the device.","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":4207,"Name":"Feature","Json":{"description":"All AeroSense Features","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":4208,"Name":"RadarSettings","Json":{"description":"Configuration for Radar Unit.","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":4800,"Name":"No activity monitor","Json":{"description":"Send alarms when no activity is detected.","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":"InvadeDetectionRead","Json":"{\"name\":\"InvadeDetectionRead\",\"default\":\"false\",\"description\":\"Activity monitoring state read from device.\",\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":8}","Default":"true","Command":null,"ProtocolActionObjects":[],"Tags":[]},{"Id":6796,"Group":{"Id":4524,"Name":"ReadFromDevice","Json":{"description":"Contains values downloaded from the device.","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":4207,"Name":"Feature","Json":{"description":"All AeroSense Features","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":4208,"Name":"RadarSettings","Json":{"description":"Configuration for Radar Unit.","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":4800,"Name":"No activity monitor","Json":{"description":"Send alarms when no activity is detected.","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":"EnableMachineLearningRead","Json":"{\"name\":\"EnableMachineLearningRead\",\"default\":\"false\",\"description\":\"Enable Machine Learning state read from device.\",\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":7}","Default":"true","Command":null,"ProtocolActionObjects":[],"Tags":[]},{"Id":7394,"Group":{"Id":4800,"Name":"No activity monitor","Json":{"description":"Send alarms when no activity is detected.","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":4207,"Name":"Feature","Json":{"description":"All AeroSense Features","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":4208,"Name":"RadarSettings","Json":{"description":"Configuration for Radar Unit.","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":4524,"Name":"ReadFromDevice","Json":{"description":"Contains values downloaded from the device.","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 No activity monitor","Json":"{\"name\":\"Enable Disable No activity monitor\",\"default\":\"true\",\"description\":\"Enable no Activity Monitor\",\"type\":\"enable\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"If enabled server will send alerts when no activity is detected for the timespan set.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"true","Command":null,"ProtocolActionObjects":[],"Tags":[]},{"Id":7395,"Group":{"Id":4800,"Name":"No activity monitor","Json":{"description":"Send alarms when no activity is detected.","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":4207,"Name":"Feature","Json":{"description":"All AeroSense Features","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":4208,"Name":"RadarSettings","Json":{"description":"Configuration for Radar Unit.","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":4524,"Name":"ReadFromDevice","Json":{"description":"Contains values downloaded from the device.","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":"No Activity","Json":"{\"name\":\"No Activity\",\"default\":\"\",\"description\":\"No Activity Interval (minutes)\",\"type\":\"number\",\"suffix\":null,\"prefix\":null,\"min\":1,\"max\":60,\"futureOnly\":false,\"integerOnly\":true,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Set the no activity monitor to send an alert if no message has been received for the time frame set in minutes.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"Tags":[]},{"Id":6624,"Group":{"Id":4524,"Name":"ReadFromDevice","Json":{"description":"Contains values downloaded from the device.","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"ReadAll","Json":"{\"name\":\"ReadAll\",\"default\":\"\",\"description\":\"Read values from Device.\",\"type\":\"button\",\"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":{"Id":3058,"Protocol":{"Id":160,"Code":"AeroSense","Version":"0.2","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"GetAll","TemplateSMS":null,"Template":null,"AckTemplate":null,"Operation":"// configs to send on all read only items\n// they will turn amber\n// on return ack individual items\n// auto ack read all button","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":false,"HexString":false,"SendAttempts":1,"Order":null},"ProtocolActionObjects":[],"Tags":[]},{"Id":6624,"Group":{"Id":4524,"Name":"ReadFromDevice","Json":{"description":"Contains values downloaded from the device.","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"ReadAll","Json":"{\"name\":\"ReadAll\",\"default\":\"\",\"description\":\"Read values from Device.\",\"type\":\"button\",\"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":{"Id":2704,"Protocol":{"Id":160,"Code":"AeroSense","Version":"0.2","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"GetFirmware","TemplateSMS":null,"Template":"1201000200000000000000000006001300000000","AckTemplate":null,"Operation":"// write your code here...","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":1,"Order":null},"ProtocolActionObjects":[],"Tags":[]},{"Id":6624,"Group":{"Id":4524,"Name":"ReadFromDevice","Json":{"description":"Contains values downloaded from the device.","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"ReadAll","Json":"{\"name\":\"ReadAll\",\"default\":\"\",\"description\":\"Read values from Device.\",\"type\":\"button\",\"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":{"Id":2821,"Protocol":{"Id":160,"Code":"AeroSense","Version":"0.2","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"GetEnableHeatMap","TemplateSMS":null,"Template":"1201000200000000000000000006000d00000000","AckTemplate":null,"Operation":"// write your code here...","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":null},"ProtocolActionObjects":[],"Tags":[]}],"ProtocolChanges":[{"Version":"0.2","UserName":"Sean-Admin","Resource":"GroupParam","Name":"ReadAll","Message":"(Update) (ReadAll) setting getAll command\n","Timestamp":1688729222},{"Version":"0.2","UserName":"Sean-Admin","Resource":"GroupParam","Name":"ReadAll","Message":"Associate groupParam ReadAll to command GetAll","Timestamp":1688729227},{"Version":"0.2","UserName":"Sean-Admin","Resource":"Command","Name":"GetAll","Message":"(Update) (GetAll) set GetAllto Ack","Timestamp":1688729273},{"Version":"0.2","UserName":"Sean-Admin","Resource":"Command","Name":"GetAll","Message":"(Update) (GetAll) Direct ack for GetAll button","Timestamp":1688729504},{"Version":"0.2","UserName":"Sean-Admin","Resource":"Command","Name":"GetAll","Message":"(Update) (GetAll) trying different ack","Timestamp":1688732397},{"Version":"0.2","UserName":"Sean-Admin","Resource":"GroupParam","Name":"ReadAll","Message":"(Update) (ReadAll) ReadAll to GetFirmware","Timestamp":1688998381},{"Version":"0.2","UserName":"Sean-Admin","Resource":"GroupParam","Name":"ReadAll","Message":"Associate groupParam ReadAll to command GetFirmware","Timestamp":1688998387},{"Version":"0.2","UserName":"Sean-Admin","Resource":"GroupParam","Name":"ReadAll","Message":"Dissociate groupParam ReadAll from command GetAll","Timestamp":1688998390},{"Version":"0.2","UserName":"Sean-Admin","Resource":"Operation","Name":"AeroSense","Message":"(Update) (AeroSense) ReadAll ack development\n","Timestamp":1689160500},{"Version":"0.2","UserName":"Sean-Admin","Resource":"Operation","Name":"AeroSense","Message":"(Update) (AeroSense) ReadAll ack\n","Timestamp":1689160878},{"Version":"0.2","UserName":"Sean-Admin","Resource":"Operation","Name":"AeroSense","Message":"(Update) (AeroSense) ReadAll ack","Timestamp":1689161014},{"Version":"0.2","UserName":"Sean-Admin","Resource":"Command","Name":"GetWorkHeight","Message":"(Update) (GetWorkHeight) readall ack","Timestamp":1689161144},{"Version":"0.2","UserName":"Sean-Admin","Resource":"Operation","Name":"AeroSense","Message":"(Update) (AeroSense) ReadAll ack sendconfig test","Timestamp":1689161661},{"Version":"0.2","UserName":"Sean-Admin","Resource":"Operation","Name":"AeroSense","Message":"(Update) (AeroSense) testing configsToSend","Timestamp":1689162094},{"Version":"0.2","UserName":"Sean-Admin","Resource":"GroupParam","Name":"WorkHeightRead","Message":"(Update) (WorkHeightRead) testing sendconfig","Timestamp":1689162205},{"Version":"0.2","UserName":"Sean-Admin","Resource":"Operation","Name":"AeroSense","Message":"(Update) (AeroSense) sendconfig test","Timestamp":1689162388},{"Version":"0.2","UserName":"Sean-Admin","Resource":"Operation","Name":"AeroSense","Message":"(Update) (AeroSense) configsToSend test","Timestamp":1689162745},{"Version":"0.2","UserName":"Sean-Admin","Resource":"Operation","Name":"AeroSense","Message":"(Update) (AeroSense) reverting configsToSend","Timestamp":1689162937},{"Version":"0.2","UserName":"Sean-Admin","Resource":"MessageType","Name":"COMM-LOG","Message":"(Delete) (COMM-LOG)","Timestamp":1689772836},{"Version":"0.2","UserName":"Sean-Admin","Resource":"GroupParam","Name":"ReadAll","Message":"(Update) (ReadAll) enabling all read commands","Timestamp":1689773141},{"Version":"0.2","UserName":"Sean-Admin","Resource":"GroupParam","Name":"ReadAll","Message":"Associate groupParam ReadAll to command GetEnableHeatMap","Timestamp":1689773145}],"ProtocolActionObjects":[],"Tags":[]} \ No newline at end of file +{"Id":160,"Name":null,"Description":null,"FirmwareVersion":"","InProgress":true,"MessageTypes":[{"Id":4674,"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,"Command":null,"CacheImei":false,"RegEx":"\\+RESP:NACT,[^,]*,[^\\$,]*\\$","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":4417,"Code":"ACK-VERSION","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"AEROSENSE;ACK-VERSION;<>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"Command":{"Id":2704,"Protocol":{"Id":160,"Code":"AeroSense","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"GetFirmware","TemplateSMS":null,"Template":"1201000200000000000000000006001300000000","AckTemplate":null,"Operation":"// write your code here...","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":1,"Order":null},"CacheImei":false,"RegEx":"^AEROSENSE;ACK-VERSION;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":4359,"Code":"CHK","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"AEROSENSE;CHK;<>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"Command":null,"CacheImei":false,"RegEx":"^AEROSENSE;CHK;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":3787,"Code":"COMM","Name":null,"MessageCode":null,"NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":true,"NoOperation":false,"Type":0,"Template":"AEROSENSE-ASSOCIATE;<>;<>;","HasTemplateGlobal":true,"ResponseTemplate":"<>","TemplateGlobal":"1201<>","LongConnection":true,"HexString":true,"AckFirst":true,"ScaipH":false,"DoNotSendCommands":false,"Command":null,"CacheImei":false,"RegEx":"^AEROSENSE-ASSOCIATE;[^;]*;[^;;]*;","RegExGlobal":"^1201[^ ]*","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":4204,"Code":"INFO","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"AEROSENSE;HEATMAP;<>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"Command":null,"CacheImei":false,"RegEx":"^AEROSENSE;HEATMAP;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":4197,"Code":"ACK-WORKRANGE","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"AEROSENSE;ACK-WORKRANGE;<>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"Command":{"Id":2359,"Protocol":{"Id":160,"Code":"AeroSense","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"SetWorkRange","TemplateSMS":null,"Template":"12010002000000000000000000060006<>","AckTemplate":null,"Operation":"// write your code here...\n//var header = \"12010002000000000000000000060006\"\nvar configs = [];\n// Convert Float32 to Hex string\nconst Float32ToHex = (float32) => {\n const getHex = i => ('00' + i.toString(16)).slice(-2);\n var view = new DataView(new ArrayBuffer(4))\n view.setFloat32(0, float32);\n return Array.apply(null, {\n length: 4\n }).map((_, i) => getHex(view.getUint8(i))).join('');\n};\nvar data = Float32ToHex(Number(params.RadarSettings.WorkRange));\nAddValue(\"value\", 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":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":1},"CacheImei":false,"RegEx":"^AEROSENSE;ACK-WORKRANGE;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":4210,"Code":"STATUS-USERRESET","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"AEROSENSE;USERRESET;<>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"Command":null,"CacheImei":false,"RegEx":"^AEROSENSE;USERRESET;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":4208,"Code":"ALF-NEG","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"AEROSENSE;NEGFALL;<>;<>;<>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"Command":null,"CacheImei":false,"RegEx":"^AEROSENSE;NEGFALL;[^;]*;[^;;]*;[^;;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":4207,"Code":"DIST-POS","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"AEROSENSE;DIST-POS;<>;<>;<>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"Command":null,"CacheImei":false,"RegEx":"^AEROSENSE;DIST-POS;[^;]*;[^;;]*;[^;;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":4205,"Code":"ACK-HEATMAP","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"AEROSENSE;ACK-HEATMAP;<>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"Command":{"Id":2699,"Protocol":{"Id":160,"Code":"AeroSense","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"SetEnableHeatMap","TemplateSMS":null,"Template":"1201000200000000000000000006000c<>","AckTemplate":null,"Operation":"var configs = [];\nlet data = '00000000';\nif (params.RadarSettings.EnableHeatmap == 'true') {\n data = '00000001'\n}\nAddValue(\"value\", 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":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":1},"CacheImei":false,"RegEx":"^AEROSENSE;ACK-HEATMAP;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":4203,"Code":"ALINVADE","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":1,"Template":"AEROSENSE;INVADE;<>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"Command":null,"CacheImei":false,"RegEx":"^AEROSENSE;INVADE;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":4202,"Code":"ACK-MACHINELEARN","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"AEROSENSE;ACK-MACHINELEARN;<>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"Command":{"Id":2581,"Protocol":{"Id":160,"Code":"AeroSense","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"SetEnableMachineLearning","TemplateSMS":null,"Template":"12010002000000000000000000060015<>","AckTemplate":null,"Operation":"var configs = [];\nlet data = '00000000';\nif (params.RadarSettings.EnableMachineLearning == 'true') {\n data = '00000001'\n}\nAddValue(\"value\", 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":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":1},"CacheImei":false,"RegEx":"^AEROSENSE;ACK-MACHINELEARN;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":4201,"Code":"ACK-INVADE","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"AEROSENSE;ACK-INVADE;<>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"Command":{"Id":2580,"Protocol":{"Id":160,"Code":"AeroSense","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"SetInvadeDetection","TemplateSMS":null,"Template":"1201000200000000000000000006000e<>","AckTemplate":null,"Operation":"var configs = [];\nlet data = '00000000';\nif (params.RadarSettings.InvadeDetection == 'true') {\n data = '00000001'\n}\nAddValue(\"value\", 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":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":1},"CacheImei":false,"RegEx":"^AEROSENSE;ACK-INVADE;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":4200,"Code":"ACK-TIMEINT","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"AEROSENSE;ACK-TIMEINT;<>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"Command":{"Id":2579,"Protocol":{"Id":160,"Code":"AeroSense","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"SetTimeInterval","TemplateSMS":null,"Template":"12010002000000000000000000060004<>","AckTemplate":null,"Operation":"var configs = [];\n/**\n * Converts integer number to hex string\n * @param {Integer} number \n * @returns hex string\n */\nfunction IntToHex(number, padding = 8) {\n return number.toString(16).padStart(8, '0');\n}\nvar data = IntToHex(Number(params.RadarSettings.TimeInterval));\nAddValue(\"value\", 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":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":1},"CacheImei":false,"RegEx":"^AEROSENSE;ACK-TIMEINT;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":4199,"Code":"ACK-WORKHEIGHT","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"AEROSENSE;ACK-WORKHEIGHT;<>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"Command":{"Id":2578,"Protocol":{"Id":160,"Code":"AeroSense","Version":"0.1","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"SetWorkHeight","TemplateSMS":null,"Template":"12010002000000000000000000060002<>","AckTemplate":null,"Operation":"// write your code here...\n//var header = \"12010002000000000000000000060006\"\nvar configs = [];\n// Convert Float32 to Hex string\nconst Float32ToHex = (float32) => {\n const getHex = i => ('00' + i.toString(16)).slice(-2);\n var view = new DataView(new ArrayBuffer(4))\n view.setFloat32(0, float32);\n return Array.apply(null, {\n length: 4\n }).map((_, i) => getHex(view.getUint8(i))).join('');\n};\nvar data = Float32ToHex(Number(params.RadarSettings.WorkHeight));\nAddValue(\"value\", 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":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":1},"CacheImei":false,"RegEx":"^AEROSENSE;ACK-WORKHEIGHT;[^;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":4196,"Code":"COMM-LOG","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"AEROSENSE-LOG;<>;<>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"Command":null,"CacheImei":false,"RegEx":"^AEROSENSE-LOG;[^;]*;[^;;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":2,"NewValue":"{\"Id\":4196,\"Code\":\"COMM-LOG\",\"Name\":null,\"MessageCode\":\"COMM\",\"NeedAck\":false,\"IsAck\":false,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"AEROSENSE-LOG;<>;<>;\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":null,\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":true,\"Command\":null,\"CacheImei\":false,\"RegEx\":\"^AEROSENSE-LOG;[^;]*;[^;;]*;\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1689772836}],"Tags":[]},{"Id":4098,"Code":"ALF","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":1,"Template":"AEROSENSE;FALL;<>;<>;<>;","HasTemplateGlobal":false,"ResponseTemplate":"OK","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"Command":null,"CacheImei":false,"RegEx":"^AEROSENSE;FALL;[^;]*;[^;;]*;[^;;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]}],"Commands":[{"Id":2821,"Name":"GetEnableHeatMap","TemplateSMS":null,"Template":"1201000200000000000000000006000d00000000","AckTemplate":null,"Operation":"// write your code here...","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":4,"ProtocolActionObjects":[],"Tags":[]},{"Id":2822,"Name":"GetEnableMachineLearning","TemplateSMS":null,"Template":"1201000200000000000000000006001600000000","AckTemplate":null,"Operation":"// write your code here...","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":4,"ProtocolActionObjects":[],"Tags":[]},{"Id":2823,"Name":"GetInvadeDetection","TemplateSMS":null,"Template":"1201000200000000000000000006000f00000000","AckTemplate":null,"Operation":"// write your code here...","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":4,"ProtocolActionObjects":[],"Tags":[]},{"Id":2579,"Name":"SetTimeInterval","TemplateSMS":null,"Template":"12010002000000000000000000060004<>","AckTemplate":null,"Operation":"var configs = [];\n/**\n * Converts integer number to hex string\n * @param {Integer} number \n * @returns hex string\n */\nfunction IntToHex(number, padding = 8) {\n return number.toString(16).padStart(8, '0');\n}\nvar data = IntToHex(Number(params.RadarSettings.TimeInterval));\nAddValue(\"value\", 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":0,"HasAck":true,"HexString":true,"Order":1,"SendAttempts":4,"ProtocolActionObjects":[],"Tags":[]},{"Id":2581,"Name":"SetEnableMachineLearning","TemplateSMS":null,"Template":"12010002000000000000000000060015<>","AckTemplate":null,"Operation":"var configs = [];\nlet data = '00000000';\nif (params.RadarSettings.EnableMachineLearning == 'true') {\n data = '00000001'\n}\nAddValue(\"value\", 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":0,"HasAck":true,"HexString":true,"Order":1,"SendAttempts":4,"ProtocolActionObjects":[],"Tags":[]},{"Id":2580,"Name":"SetInvadeDetection","TemplateSMS":null,"Template":"1201000200000000000000000006000e<>","AckTemplate":null,"Operation":"var configs = [];\nlet data = '00000000';\nif (params.RadarSettings.InvadeDetection == 'true') {\n data = '00000001'\n}\nAddValue(\"value\", 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":0,"HasAck":true,"HexString":true,"Order":1,"SendAttempts":4,"ProtocolActionObjects":[],"Tags":[]},{"Id":2578,"Name":"SetWorkHeight","TemplateSMS":null,"Template":"12010002000000000000000000060002<>","AckTemplate":null,"Operation":"// write your code here...\n//var header = \"12010002000000000000000000060006\"\nvar configs = [];\n// Convert Float32 to Hex string\nconst Float32ToHex = (float32) => {\n const getHex = i => ('00' + i.toString(16)).slice(-2);\n var view = new DataView(new ArrayBuffer(4))\n view.setFloat32(0, float32);\n return Array.apply(null, {\n length: 4\n }).map((_, i) => getHex(view.getUint8(i))).join('');\n};\nvar data = Float32ToHex(Number(params.RadarSettings.WorkHeight));\nAddValue(\"value\", 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":0,"HasAck":true,"HexString":true,"Order":1,"SendAttempts":4,"ProtocolActionObjects":[],"Tags":[]},{"Id":2582,"Name":"GetWorkRange","TemplateSMS":null,"Template":"1201000200000000000000000006000700000000","AckTemplate":null,"Operation":"// write your code here...","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":4,"ProtocolActionObjects":[],"Tags":[]},{"Id":2359,"Name":"SetWorkRange","TemplateSMS":null,"Template":"12010002000000000000000000060006<>","AckTemplate":null,"Operation":"// write your code here...\n//var header = \"12010002000000000000000000060006\"\nvar configs = [];\n// Convert Float32 to Hex string\nconst Float32ToHex = (float32) => {\n const getHex = i => ('00' + i.toString(16)).slice(-2);\n var view = new DataView(new ArrayBuffer(4))\n view.setFloat32(0, float32);\n return Array.apply(null, {\n length: 4\n }).map((_, i) => getHex(view.getUint8(i))).join('');\n};\nvar data = Float32ToHex(Number(params.RadarSettings.WorkRange));\nAddValue(\"value\", 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":0,"HasAck":true,"HexString":true,"Order":1,"SendAttempts":4,"ProtocolActionObjects":[],"Tags":[]},{"Id":2699,"Name":"SetEnableHeatMap","TemplateSMS":null,"Template":"1201000200000000000000000006000c<>","AckTemplate":null,"Operation":"var configs = [];\nlet data = '00000000';\nif (params.RadarSettings.EnableHeatmap == 'true') {\n data = '00000001'\n}\nAddValue(\"value\", 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":0,"HasAck":true,"HexString":true,"Order":1,"SendAttempts":4,"ProtocolActionObjects":[],"Tags":[]},{"Id":2700,"Name":"StartSendRealtimePos","TemplateSMS":null,"Template":"1201000200000000000000000006001000000001","AckTemplate":null,"Operation":"// write your code here...","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":false,"HexString":true,"Order":null,"SendAttempts":1,"ProtocolActionObjects":[],"Tags":[]},{"Id":2701,"Name":"StopSendRealtimePos","TemplateSMS":null,"Template":"1201000200000000000000000006001000000003","AckTemplate":null,"Operation":"// write your code here...","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":false,"HexString":true,"Order":null,"SendAttempts":1,"ProtocolActionObjects":[],"Tags":[]},{"Id":2702,"Name":"GetWorkHeight","TemplateSMS":null,"Template":"1201000200000000000000000006000300000000","AckTemplate":null,"Operation":"// write your code here...","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":4,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":2702,\"Name\":\"GetWorkHeight\",\"TemplateSMS\":null,\"Template\":\"1201000200000000000000000006000300000000\",\"AckTemplate\":null,\"Operation\":\"// write your code here...\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":true,\"Order\":null,\"SendAttempts\":1,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1689161144}],"Tags":[]},{"Id":2703,"Name":"GetTimeLimit","TemplateSMS":null,"Template":"1201000200000000000000000006000500000000","AckTemplate":null,"Operation":"// write your code here...","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":4,"ProtocolActionObjects":[],"Tags":[]},{"Id":2704,"Name":"GetFirmware","TemplateSMS":null,"Template":"1201000200000000000000000006001300000000","AckTemplate":null,"Operation":"// write your code here...","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":true,"Order":null,"SendAttempts":1,"ProtocolActionObjects":[],"Tags":[]},{"Id":3058,"Name":"GetAll","TemplateSMS":null,"Template":null,"AckTemplate":null,"Operation":"// configs to send on all read only items\n// they will turn amber\n// on return ack individual items\n// auto ack read all button","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":false,"HexString":false,"Order":null,"SendAttempts":1,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":3058,\"Name\":\"GetAll\",\"TemplateSMS\":null,\"Template\":null,\"AckTemplate\":null,\"Operation\":\"// configs to send on all read only items\\n// they will turn amber\\n// on return ack individual items\\n// auto ack read all button\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":1,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1688729273},{"Type":1,"NewValue":"{\"Id\":3058,\"Name\":\"GetAll\",\"TemplateSMS\":null,\"Template\":null,\"AckTemplate\":null,\"Operation\":\"// configs to send on all read only items\\n// they will turn amber\\n// on return ack individual items\\n// auto ack read all button\\nvar configsToSend = [];\\nvar configsToAck = [];\\nconfigsToAck.push(configIds.ReadFromDevice.ReadAll);\\nvar dataToReceiver = {\\n //'configsToSend': configsToSend,\\n 'configsToAck': configsToAck\\n};\\nconsole.log(dataToReceiver);\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":1,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1688729504},{"Type":1,"NewValue":"{\"Id\":3058,\"Name\":\"GetAll\",\"TemplateSMS\":null,\"Template\":null,\"AckTemplate\":null,\"Operation\":\"var msg = []\\nvar configs = [];\\nvar configsToSend = [];\\nvar configsToAck = [];\\nconfigsToAck.push(configIds.ReadFromDevice.ReadAll);\\n// let data = '00000000';\\n// if (params.RadarSettings.InvadeDetection == 'true') {\\n// data = '00000001'\\n// }\\n// AddValue(\\\"value\\\", data);\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n //configs: configs,\\n configsToAck: configsToAck\\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\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":1,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1688732397}],"Tags":[]}],"Operations":[{"Id":172,"Name":"AeroSense","Operation":"function execute_ops(msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\n var net = require('net');\n var moment = require('moment');\n var codeValues = [];\n var dataToReceiver = [];\n var configsToAck = [];\n var configsToUpdate = [];\n var configsToSend = [];\n\n function parse_message(hex) {\n let message = {};\n hex = hex.toLowerCase();\n message.magic = hex.slice(0, 4);\n message.type = hex.slice(4, 6);\n message.cmd = hex.slice(6, 8);\n message.sequence = parseInt(hex.slice(8, 16), 16);\n message.timeout = parseInt(hex.slice(16, 20), 16);\n message.length = parseInt(hex.slice(20, 28), 16);\n message.function = hex.slice(28, 32);\n message.hw_version = hex.slice(32, 42);\n message.radar_id = hex.slice(42);\n message.header = hex.slice(0, 20);\n message.data = hex.slice(32);\n return message;\n }\n if (oystaTemplate == 'True') {\n AddValue(codeValues, \"event_time\", Math.round(Date.now() / 1000));\n }\n if (globalTemplate == \"True\") {\n let message = parse_message(rawFromBytes.slice(0));\n let ack = '';\n let imei = '';\n switch (message.function) {\n case '0001':\n imei = message.radar_id;\n ack = message.header + \"00000006000100000001\";\n AddValue(codeValues, \"ack\", ack);\n AddValue(codeValues, \"imei\", imei);\n if (imei != serverParams.Imei) { //no need to associate if already done.\n let new_message = \"AEROSENSE-ASSOCIATE;\" + imei + \";\" + serverParams.Guid + \";\"\n sendMessageToLocalhost(new_message);\n AddValue(codeValues, \"toSend\", new_message);\n }\n let cyc_message = \"AEROSENSE;CHK;\" + imei + \";\";\n sendMessageToLocalhost(cyc_message);\n AddValue(codeValues, \"toSendCyc\", cyc_message);\n break;\n case '0002': // working height set acknowledge AEROSENSE;ACK-WORKHEIGHT;<>;\n if (HexToInt(message.data) == 1) {\n ack_config(\"ACK-WORKHEIGHT\");\n }\n break;\n case '0003': // get working height response, push to Read only configs\n let workheight = (HexToFloat32(message.data)).toFixed(2);\n AddValue(codeValues, \"imei\", serverParams.Imei);\n AddValue(codeValues, \"workheight\", workheight);\n configsToUpdate.push({\n 'code': configIds.ReadFromDevice.WorkHeightRead,\n 'value': workheight\n });\n configsToAck.push(configIds.ReadFromDevice.WorkHeightRead);\n break;\n case '0004': // Time interval set acknowledge -> AEROSENSE;ACK-TIMEINT;<>;\n if (HexToInt(message.data) == 1) {\n ack_config(\"ACK-TIMEINT\");\n }\n break;\n case '0005': // get timeout response, push to Read only configs\n let timeout = HexToInt(message.data);\n AddValue(codeValues, \"imei\", serverParams.Imei);\n AddValue(codeValues, \"timeout\", timeout);\n configsToUpdate.push({\n 'code': configIds.ReadFromDevice.TimeLimitRead,\n 'value': timeout\n });\n configsToAck.push(configIds.ReadFromDevice.TimeLimitRead);\n break;\n case '0006': // working distance set acknowledge -> AEROSENSE;ACK-WORKRANGE;<>;\n if (HexToInt(message.data) == 1) {\n ack_config(\"ACK-WORKRANGE\");\n }\n break;\n case '0007': // response to workrange request, push to Read only configs\n let workrange = HexToFloat32(message.data).toFixed(2);\n AddValue(codeValues, \"imei\", serverParams.Imei);\n AddValue(codeValues, \"workrange\", workrange);\n configsToUpdate.push({\n 'code': configIds.ReadFromDevice.WorkRangeRead,\n 'value': workrange\n });\n configsToAck.push(configIds.ReadFromDevice.WorkRangeRead);\n break;\n //case '0008': // does not exist.\n case '0009': // Fall detected ->AEROSENSE;FALL;<>;<>;<>;\n // parse positions\n let posx = HexToFloat32(message.data.slice(0, 8)).toFixed(2);\n let posy = HexToFloat32(message.data.slice(8, 16)).toFixed(2);\n // create message\n let fall_message = \"AEROSENSE;FALL;\" + serverParams.Imei + \";\" + posx + \";\" + posy + \";\"\n sendMessageToLocalhost(fall_message);\n AddValue(codeValues, \"toSend\", fall_message);\n AddValue(codeValues, \"imei\", serverParams.Imei);\n // send ack\n let fall_response_hex = message.header + \"00000006000900000001\";\n AddValue(codeValues, \"ack\", fall_response_hex);\n break;\n case '000a': //invade detection alert -> AEROSENSE;INVADE;<>;\n let invade_message = \"AEROSENSE;INVADE;\" + serverParams.Imei + \";\"\n sendMessageToLocalhost(invade_message);\n AddValue(codeValues, \"imei\", serverParams.Imei);\n AddValue(codeValues, \"toSend\", invade_message);\n //send ack\n let invade_response_hex = message.header + \"00000006000a00000001\";\n AddValue(codeValues, \"ack\", invade_response_hex);\n break;\n case '000b': //heatmap received -> NOT IN USE AEROSENSE;HEATMAP;<>;\n let heatmap_message = \"AEROSENSE;HEATMAP;\" + serverParams.Imei + \";\"\n sendMessageToLocalhost(heatmap_message);\n AddValue(codeValues, \"imei\", serverParams.Imei);\n AddValue(codeValues, \"toSend\", heatmap_message);\n // send switch off heatmap command\n let heatmap_response_hex = message.header + \"00000006000c00000000\"\n AddValue(codeValues, \"ack\", heatmap_response_hex);\n break;\n case '000c': //set enable heatmap ack -> AEROSENSE;ACK-HEATMAP;<>;\n if (HexToInt(message.data) == 1) {\n ack_config(\"ACK-HEATMAP\");\n }\n break;\n case '000d': // receive heatmap collect state, push to readonly configs\n let heatmap_enabled = parseInt(message.data) == 1;\n AddValue(codeValues, \"imei\", serverParams.Imei);\n AddValue(codeValues, \"heatmap_enabled\", heatmap_enabled);\n configsToUpdate.push({\n 'code': configIds.ReadFromDevice.EnableHeatMapRead,\n 'value': heatmap_enabled ? 'true' : 'false'\n });\n configsToAck.push(configIds.ReadFromDevice.EnableHeatMapRead);\n break;\n case '000e': // Invade Detection set acknowledge AEROSENSE;ACK-INVADE;<>;\n if (HexToInt(message.data) == 1) {\n ack_config(\"ACK-INVADE\");\n }\n break;\n case '000f': // receive invade detection state, push to readonly configs\n let invade_state = parseInt(message.data) == 1;\n AddValue(codeValues, \"imei\", serverParams.Imei);\n AddValue(codeValues, \"invade_enabled\", invade_state);\n configsToUpdate.push({\n 'code': configIds.ReadFromDevice.InvadeDetectionRead,\n 'value': invade_state ? 'true' : 'false'\n });\n configsToAck.push(configIds.ReadFromDevice.InvadeDetectionRead);\n break;\n case '0010': // position update received -> AEROSENSE;DIST-POS;<>;>;<>;\n let x = HexToFloat32(message.data.slice(8, 16)).toFixed(2);\n let y = HexToFloat32(message.data.slice(16, 24)).toFixed(2);\n AddValue(codeValues, \"imei\", serverParams.Imei);\n AddValue(codeValues, \"pos_x\", x);\n AddValue(codeValues, \"pos_y\", y);\n let position_message = \"AEROSENSE;DIST-POS;\" + serverParams.Imei + \";\" + x + \";\" + y + \";\";\n sendMessageToLocalhost(position_message);\n //no ack as positions resent regularly\n break;\n case '0011': // ack negative fall detection\n // parse positions\n let posx_neg = HexToFloat32(message.data.slice(0, 8)).toFixed(2);\n let posy_neg = HexToFloat32(message.data.slice(8, 16)).toFixed(2);\n // create message\n let negfall_message = \"AEROSENSE;NEGFALL;\" + serverParams.Imei + \";\" + posx_neg + \";\" + posy_neg + \";\"\n sendMessageToLocalhost(negfall_message);\n AddValue(codeValues, \"toSend\", negfall_message);\n AddValue(codeValues, \"imei\", serverParams.Imei);\n // send ack\n let negfall_response_hex = message.header + \"00000006001100000001\";\n AddValue(codeValues, \"ack\", negfall_response_hex);\n break;\n case '0012': // reconnect message\n message.radar_id = message.data.slice(2);\n imei = message.radar_id;\n const response_reconnect_OK = \"00000006001200000001\";\n ack = message.header + response_reconnect_OK;\n AddValue(codeValues, \"ack\", ack);\n AddValue(codeValues, \"imei\", imei);\n let reply = \"AEROSENSE-ASSOCIATE;\" + imei + \";\" + serverParams.Guid + \";\"\n sendMessageToLocalhost(reply);\n AddValue(codeValues, \"toSend\", reply);\n break;\n case '0013': // firmware version response, push to Read only configs\n let firmware_version = `${HexToInt(message.data.slice(0,2))}.${HexToInt(message.data.slice(2,4))}.${HexToInt(message.data.slice(4,6))}.${HexToInt(message.data.slice(6,8))}`; // just raw hex for now\n AddValue(codeValues, \"imei\", serverParams.Imei);\n AddValue(codeValues, \"firmware_ver\", firmware_version);\n configsToUpdate.push({\n 'code': configIds.ReadFromDevice.FirmwareRead,\n 'value': firmware_version\n });\n configsToAck.push(configIds.ReadFromDevice.ReadAll);\n configsToAck.push(configIds.ReadFromDevice.FirmwareRead);\n // internal ack config\n // ack_config(\"ACK-VERSION\");\n // update LastDateTimeRead\n configsToUpdate.push({\n 'code': configIds.ReadFromDevice.LastDateTimeRead,\n 'value': moment().format('YYYY/MM/DD, HH:mm:ss')\n });\n break;\n case '0014': // Radar reset received\n if (message.data == '0d0d0d0d') { // message must contein this value according to docs\n let reset_message = \"AEROSENSE;USERRESET;\" + serverParams.Imei + \";\";\n sendMessageToLocalhost(reset_message);\n AddValue(codeValues, \"toSend\", reset_message);\n AddValue(codeValues, \"imei\", serverParams.Imei);\n }\n // no ack\n break;\n case '0015': // Enable Machine learning set acknowledge AEROSENSE;ACK-MACHINELEARN;<>;\n ack_config(\"ACK-MACHINELEARN\");\n break;\n case '0016': // receive machine learning state, not in use\n let machinelearning_state = parseInt(message.data) == 1;\n AddValue(codeValues, \"imei\", serverParams.Imei);\n AddValue(codeValues, \"machinelearning_enabled\", machinelearning_state);\n configsToUpdate.push({\n 'code': configIds.ReadFromDevice.EnableMachineLearningRead,\n 'value': machinelearning_state ? 'true' : 'false'\n });\n configsToAck.push(configIds.ReadFromDevice.EnableMachineLearningRead);\n break;\n default:\n imei = serverParams.Imei;\n AddValue(codeValues, \"imei\", imei);\n AddValue(codeValues, \"Error\", \"Unhandled message received of type: \" + message.function);\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 }\n return {\n 'output': dataToReceiver\n }\n //---------------------HELPERS START----------------------------\n function ack_config(ack_command) {\n if (serverParams.Imei != null) {\n AddValue(codeValues, \"imei\", serverParams.Imei);\n let ack_message = \"AEROSENSE;\" + ack_command + \";\" + serverParams.Imei + \";\";\n AddValue(codeValues, \"toSend\", ack_message);\n sendMessageToLocalhost(ack_message);\n } else { //only used for debugging\n AddValue(codeValues, \"imei\", \"6796c41dc6e44e3db8d1cadce00abe6b\");\n AddValue(codeValues, \"error\", \"serverParams do not contain Imei!\")\n }\n }\n\n function AddValue(msgArray, p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n msgArray.push(cvpair);\n }\n\n function sendMessageToLocalhost(str) {\n if (localTesting) {\n console.log(\"Sending message to server: \" + str);\n } else {\n var server = '127.0.0.1';\n var c = createConnection(5678, server);\n c.write(`${str}`);\n c.end();\n }\n }\n\n function createConnection(port, server) {\n c = net.createConnection(port, server);\n c.on('error', function(error) {\n c = createConnection(port, server);\n });\n return c;\n }\n //---------------------HELPERS END----------------------------\n //---------------------CONVERTERS START----------------------------\n /**\n * Convert hex string to integer\n * @param {String} hex_string hex string\n * @returns Integer number\n */\n function HexToInt(hex_string) {\n return parseInt(hex_string, 16);\n }\n\n function HexToFloat32(hex_string) {\n let int = parseInt(hex_string, 16);\n if (int > 0 || int < 0) {\n var sign = (int >>> 31) ? -1 : 1;\n var exp = (int >>> 23 & 0xff) - 127;\n var mantissa = ((int & 0x7fffff) + 0x800000).toString(2);\n var float32 = 0\n for (i = 0; i < mantissa.length; i += 1) {\n float32 += parseInt(mantissa[i]) ? Math.pow(2, exp) : 0;\n exp--\n }\n return float32 * sign;\n } else {\n return 0;\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(msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\n // map output to global var\n dataToReceiver = return_values.output;\n}","Type":0,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":172,\"Name\":\"AeroSense\",\"Operation\":\"function execute_ops(msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\n var net = require('net');\\n var moment = require('moment');\\n var codeValues = [];\\n var dataToReceiver = [];\\n var configsToAck = [];\\n var configsToUpdate = [];\\n var configsToSend = [];\\n\\n function parse_message(hex) {\\n let message = {};\\n hex = hex.toLowerCase();\\n message.magic = hex.slice(0, 4);\\n message.type = hex.slice(4, 6);\\n message.cmd = hex.slice(6, 8);\\n message.sequence = parseInt(hex.slice(8, 16), 16);\\n message.timeout = parseInt(hex.slice(16, 20), 16);\\n message.length = parseInt(hex.slice(20, 28), 16);\\n message.function = hex.slice(28, 32);\\n message.hw_version = hex.slice(32, 42);\\n message.radar_id = hex.slice(42);\\n message.header = hex.slice(0, 20);\\n message.data = hex.slice(32);\\n return message;\\n }\\n if (oystaTemplate == 'True') {\\n AddValue(codeValues, \\\"event_time\\\", Math.round(Date.now() / 1000));\\n }\\n if (globalTemplate == \\\"True\\\") {\\n let message = parse_message(rawFromBytes.slice(0));\\n let ack = '';\\n let imei = '';\\n switch (message.function) {\\n case '0001':\\n imei = message.radar_id;\\n ack = message.header + \\\"00000006000100000001\\\";\\n AddValue(codeValues, \\\"ack\\\", ack);\\n AddValue(codeValues, \\\"imei\\\", imei);\\n if (imei != serverParams.Imei) { //no need to associate if already done.\\n let new_message = \\\"AEROSENSE-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\"\\n sendMessageToLocalhost(new_message);\\n AddValue(codeValues, \\\"toSend\\\", new_message);\\n }\\n let cyc_message = \\\"AEROSENSE;CHK;\\\" + imei + \\\";\\\";\\n sendMessageToLocalhost(cyc_message);\\n AddValue(codeValues, \\\"toSendCyc\\\", cyc_message);\\n break;\\n case '0002': // working height set acknowledge AEROSENSE;ACK-WORKHEIGHT;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-WORKHEIGHT\\\");\\n }\\n break;\\n case '0003': // get working height response, push to Read only configs\\n let workheight = (HexToFloat32(message.data)).toFixed(2);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"workheight\\\", workheight);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.WorkHeightRead,\\n 'value': workheight\\n });\\n configsToAck.push(configIds.ReadFromDevice.WorkHeightRead);\\n break;\\n case '0004': // Time interval set acknowledge -> AEROSENSE;ACK-TIMEINT;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-TIMEINT\\\");\\n }\\n break;\\n case '0005': // get timeout response, push to Read only configs\\n let timeout = HexToInt(message.data);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"timeout\\\", timeout);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.TimeLimitRead,\\n 'value': timeout\\n });\\n configsToAck.push(configIds.ReadFromDevice.TimeLimitRead);\\n break;\\n case '0006': // working distance set acknowledge -> AEROSENSE;ACK-WORKRANGE;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-WORKRANGE\\\");\\n }\\n break;\\n case '0007': // response to workrange request, push to Read only configs\\n let workrange = HexToFloat32(message.data).toFixed(2);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"workrange\\\", workrange);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.WorkRangeRead,\\n 'value': workrange\\n });\\n configsToAck.push(configIds.ReadFromDevice.WorkRangeRead);\\n break;\\n //case '0008': // does not exist.\\n case '0009': // Fall detected ->AEROSENSE;FALL;<>;<>;<>;\\n // parse positions\\n let posx = HexToFloat32(message.data.slice(0, 8)).toFixed(2);\\n let posy = HexToFloat32(message.data.slice(8, 16)).toFixed(2);\\n // create message\\n let fall_message = \\\"AEROSENSE;FALL;\\\" + serverParams.Imei + \\\";\\\" + posx + \\\";\\\" + posy + \\\";\\\"\\n sendMessageToLocalhost(fall_message);\\n AddValue(codeValues, \\\"toSend\\\", fall_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n // send ack\\n let fall_response_hex = message.header + \\\"00000006000900000001\\\";\\n AddValue(codeValues, \\\"ack\\\", fall_response_hex);\\n break;\\n case '000a': //invade detection alert -> AEROSENSE;INVADE;<>;\\n let invade_message = \\\"AEROSENSE;INVADE;\\\" + serverParams.Imei + \\\";\\\"\\n sendMessageToLocalhost(invade_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"toSend\\\", invade_message);\\n //send ack\\n let invade_response_hex = message.header + \\\"00000006000a00000001\\\";\\n AddValue(codeValues, \\\"ack\\\", invade_response_hex);\\n break;\\n case '000b': //heatmap received -> NOT IN USE AEROSENSE;HEATMAP;<>;\\n let heatmap_message = \\\"AEROSENSE;HEATMAP;\\\" + serverParams.Imei + \\\";\\\"\\n sendMessageToLocalhost(heatmap_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"toSend\\\", heatmap_message);\\n // send switch off heatmap command\\n let heatmap_response_hex = message.header + \\\"00000006000c00000000\\\"\\n AddValue(codeValues, \\\"ack\\\", heatmap_response_hex);\\n break;\\n case '000c': //set enable heatmap ack -> AEROSENSE;ACK-HEATMAP;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-HEATMAP\\\");\\n }\\n break;\\n case '000d': // receive heatmap collect state, push to readonly configs\\n let heatmap_enabled = parseInt(message.data) == 1;\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"heatmap_enabled\\\", heatmap_enabled);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.EnableHeatMapRead,\\n 'value': heatmap_enabled ? 'true' : 'false'\\n });\\n configsToAck.push(configIds.ReadFromDevice.EnableHeatMapRead);\\n break;\\n case '000e': // Invade Detection set acknowledge AEROSENSE;ACK-INVADE;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-INVADE\\\");\\n }\\n break;\\n case '000f': // receive invade detection state, push to readonly configs\\n let invade_state = parseInt(message.data) == 1;\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"invade_enabled\\\", invade_state);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.InvadeDetectionRead,\\n 'value': invade_state ? 'true' : 'false'\\n });\\n configsToAck.push(configIds.ReadFromDevice.InvadeDetectionRead);\\n break;\\n case '0010': // position update received -> AEROSENSE;DIST-POS;<>;>;<>;\\n let x = HexToFloat32(message.data.slice(8, 16)).toFixed(2);\\n let y = HexToFloat32(message.data.slice(16, 24)).toFixed(2);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"pos_x\\\", x);\\n AddValue(codeValues, \\\"pos_y\\\", y);\\n let position_message = \\\"AEROSENSE;DIST-POS;\\\" + serverParams.Imei + \\\";\\\" + x + \\\";\\\" + y + \\\";\\\";\\n sendMessageToLocalhost(position_message);\\n //no ack as positions resent regularly\\n break;\\n case '0011': // ack negative fall detection\\n // parse positions\\n let posx_neg = HexToFloat32(message.data.slice(0, 8)).toFixed(2);\\n let posy_neg = HexToFloat32(message.data.slice(8, 16)).toFixed(2);\\n // create message\\n let negfall_message = \\\"AEROSENSE;NEGFALL;\\\" + serverParams.Imei + \\\";\\\" + posx_neg + \\\";\\\" + posy_neg + \\\";\\\"\\n sendMessageToLocalhost(negfall_message);\\n AddValue(codeValues, \\\"toSend\\\", negfall_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n // send ack\\n let negfall_response_hex = message.header + \\\"00000006001100000001\\\";\\n AddValue(codeValues, \\\"ack\\\", negfall_response_hex);\\n break;\\n case '0012': // reconnect message\\n message.radar_id = message.data.slice(2);\\n imei = message.radar_id;\\n const response_reconnect_OK = \\\"00000006001200000001\\\";\\n ack = message.header + response_reconnect_OK;\\n AddValue(codeValues, \\\"ack\\\", ack);\\n AddValue(codeValues, \\\"imei\\\", imei);\\n let reply = \\\"AEROSENSE-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\"\\n sendMessageToLocalhost(reply);\\n AddValue(codeValues, \\\"toSend\\\", reply);\\n break;\\n case '0013': // firmware version response, push to Read only configs\\n let firmware_version = `${HexToInt(message.data.slice(0,2))}.${HexToInt(message.data.slice(2,4))}.${HexToInt(message.data.slice(4,6))}.${HexToInt(message.data.slice(6,8))}`; // just raw hex for now\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"firmware_ver\\\", firmware_version);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.FirmwareRead,\\n 'value': firmware_version\\n });\\n //configsToAck.push(configIds.ReadFromDevice.ReadAll);\\n configsToAck.push(configIds.ReadFromDevice.FirmwareRead);\\n // internal ack config\\n // ack_config(\\\"ACK-VERSION\\\");\\n // update LastDateTimeRead\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.LastDateTimeRead,\\n 'value': moment().format('YYYY/MM/DD, HH:mm:ss')\\n });\\n break;\\n case '0014': // Radar reset received\\n if (message.data == '0d0d0d0d') { // message must contein this value according to docs\\n let reset_message = \\\"AEROSENSE;USERRESET;\\\" + serverParams.Imei + \\\";\\\";\\n sendMessageToLocalhost(reset_message);\\n AddValue(codeValues, \\\"toSend\\\", reset_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n }\\n // no ack\\n break;\\n case '0015': // Enable Machine learning set acknowledge AEROSENSE;ACK-MACHINELEARN;<>;\\n ack_config(\\\"ACK-MACHINELEARN\\\");\\n break;\\n case '0016': // receive machine learning state, not in use\\n let machinelearning_state = parseInt(message.data) == 1;\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"machinelearning_enabled\\\", machinelearning_state);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.EnableMachineLearningRead,\\n 'value': machinelearning_state ? 'true' : 'false'\\n });\\n configsToAck.push(configIds.ReadFromDevice.EnableMachineLearningRead);\\n break;\\n default:\\n imei = serverParams.Imei;\\n AddValue(codeValues, \\\"imei\\\", imei);\\n AddValue(codeValues, \\\"Error\\\", \\\"Unhandled message received of type: \\\" + message.function);\\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 }\\n return {\\n 'output': dataToReceiver\\n }\\n //---------------------HELPERS START----------------------------\\n function ack_config(ack_command) {\\n if (serverParams.Imei != null) {\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n let ack_message = \\\"AEROSENSE;\\\" + ack_command + \\\";\\\" + serverParams.Imei + \\\";\\\";\\n AddValue(codeValues, \\\"toSend\\\", ack_message);\\n sendMessageToLocalhost(ack_message);\\n } else { //only used for debugging\\n AddValue(codeValues, \\\"imei\\\", \\\"6796c41dc6e44e3db8d1cadce00abe6b\\\");\\n AddValue(codeValues, \\\"error\\\", \\\"serverParams do not contain Imei!\\\")\\n }\\n }\\n\\n function AddValue(msgArray, p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n msgArray.push(cvpair);\\n }\\n\\n function sendMessageToLocalhost(str) {\\n if (localTesting) {\\n console.log(\\\"Sending message to server: \\\" + str);\\n } else {\\n var server = '127.0.0.1';\\n var c = createConnection(5678, server);\\n c.write(`${str}`);\\n c.end();\\n }\\n }\\n\\n function createConnection(port, server) {\\n c = net.createConnection(port, server);\\n c.on('error', function(error) {\\n c = createConnection(port, server);\\n });\\n return c;\\n }\\n //---------------------HELPERS END----------------------------\\n //---------------------CONVERTERS START----------------------------\\n /**\\n * Convert hex string to integer\\n * @param {String} hex_string hex string\\n * @returns Integer number\\n */\\n function HexToInt(hex_string) {\\n return parseInt(hex_string, 16);\\n }\\n\\n function HexToFloat32(hex_string) {\\n let int = parseInt(hex_string, 16);\\n if (int > 0 || int < 0) {\\n var sign = (int >>> 31) ? -1 : 1;\\n var exp = (int >>> 23 & 0xff) - 127;\\n var mantissa = ((int & 0x7fffff) + 0x800000).toString(2);\\n var float32 = 0\\n for (i = 0; i < mantissa.length; i += 1) {\\n float32 += parseInt(mantissa[i]) ? Math.pow(2, exp) : 0;\\n exp--\\n }\\n return float32 * sign;\\n } else {\\n return 0;\\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(msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\n // map output to global var\\n dataToReceiver = return_values.output;\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1689160500},{"Type":1,"NewValue":"{\"Id\":172,\"Name\":\"AeroSense\",\"Operation\":\"function execute_ops(msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\n var net = require('net');\\n var moment = require('moment');\\n var codeValues = [];\\n var dataToReceiver = [];\\n var configsToAck = [];\\n var configsToUpdate = [];\\n var configsToSend = [];\\n\\n function parse_message(hex) {\\n let message = {};\\n hex = hex.toLowerCase();\\n message.magic = hex.slice(0, 4);\\n message.type = hex.slice(4, 6);\\n message.cmd = hex.slice(6, 8);\\n message.sequence = parseInt(hex.slice(8, 16), 16);\\n message.timeout = parseInt(hex.slice(16, 20), 16);\\n message.length = parseInt(hex.slice(20, 28), 16);\\n message.function = hex.slice(28, 32);\\n message.hw_version = hex.slice(32, 42);\\n message.radar_id = hex.slice(42);\\n message.header = hex.slice(0, 20);\\n message.data = hex.slice(32);\\n return message;\\n }\\n if (oystaTemplate == 'True') {\\n AddValue(codeValues, \\\"event_time\\\", Math.round(Date.now() / 1000));\\n }\\n if (globalTemplate == \\\"True\\\") {\\n let message = parse_message(rawFromBytes.slice(0));\\n let ack = '';\\n let imei = '';\\n switch (message.function) {\\n case '0001':\\n imei = message.radar_id;\\n ack = message.header + \\\"00000006000100000001\\\";\\n AddValue(codeValues, \\\"ack\\\", ack);\\n AddValue(codeValues, \\\"imei\\\", imei);\\n if (imei != serverParams.Imei) { //no need to associate if already done.\\n let new_message = \\\"AEROSENSE-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\"\\n sendMessageToLocalhost(new_message);\\n AddValue(codeValues, \\\"toSend\\\", new_message);\\n }\\n let cyc_message = \\\"AEROSENSE;CHK;\\\" + imei + \\\";\\\";\\n sendMessageToLocalhost(cyc_message);\\n AddValue(codeValues, \\\"toSendCyc\\\", cyc_message);\\n break;\\n case '0002': // working height set acknowledge AEROSENSE;ACK-WORKHEIGHT;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-WORKHEIGHT\\\");\\n }\\n break;\\n case '0003': // get working height response, push to Read only configs\\n let workheight = (HexToFloat32(message.data)).toFixed(2);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"workheight\\\", workheight);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.WorkHeightRead,\\n 'value': workheight\\n });\\n configsToAck.push(configIds.ReadFromDevice.WorkHeightRead);\\n break;\\n case '0004': // Time interval set acknowledge -> AEROSENSE;ACK-TIMEINT;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-TIMEINT\\\");\\n }\\n break;\\n case '0005': // get timeout response, push to Read only configs\\n let timeout = HexToInt(message.data);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"timeout\\\", timeout);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.TimeLimitRead,\\n 'value': timeout\\n });\\n configsToAck.push(configIds.ReadFromDevice.TimeLimitRead);\\n break;\\n case '0006': // working distance set acknowledge -> AEROSENSE;ACK-WORKRANGE;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-WORKRANGE\\\");\\n }\\n break;\\n case '0007': // response to workrange request, push to Read only configs\\n let workrange = HexToFloat32(message.data).toFixed(2);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"workrange\\\", workrange);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.WorkRangeRead,\\n 'value': workrange\\n });\\n configsToAck.push(configIds.ReadFromDevice.WorkRangeRead);\\n break;\\n //case '0008': // does not exist.\\n case '0009': // Fall detected ->AEROSENSE;FALL;<>;<>;<>;\\n // parse positions\\n let posx = HexToFloat32(message.data.slice(0, 8)).toFixed(2);\\n let posy = HexToFloat32(message.data.slice(8, 16)).toFixed(2);\\n // create message\\n let fall_message = \\\"AEROSENSE;FALL;\\\" + serverParams.Imei + \\\";\\\" + posx + \\\";\\\" + posy + \\\";\\\"\\n sendMessageToLocalhost(fall_message);\\n AddValue(codeValues, \\\"toSend\\\", fall_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n // send ack\\n let fall_response_hex = message.header + \\\"00000006000900000001\\\";\\n AddValue(codeValues, \\\"ack\\\", fall_response_hex);\\n break;\\n case '000a': //invade detection alert -> AEROSENSE;INVADE;<>;\\n let invade_message = \\\"AEROSENSE;INVADE;\\\" + serverParams.Imei + \\\";\\\"\\n sendMessageToLocalhost(invade_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"toSend\\\", invade_message);\\n //send ack\\n let invade_response_hex = message.header + \\\"00000006000a00000001\\\";\\n AddValue(codeValues, \\\"ack\\\", invade_response_hex);\\n break;\\n case '000b': //heatmap received -> NOT IN USE AEROSENSE;HEATMAP;<>;\\n let heatmap_message = \\\"AEROSENSE;HEATMAP;\\\" + serverParams.Imei + \\\";\\\"\\n sendMessageToLocalhost(heatmap_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"toSend\\\", heatmap_message);\\n // send switch off heatmap command\\n let heatmap_response_hex = message.header + \\\"00000006000c00000000\\\"\\n AddValue(codeValues, \\\"ack\\\", heatmap_response_hex);\\n break;\\n case '000c': //set enable heatmap ack -> AEROSENSE;ACK-HEATMAP;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-HEATMAP\\\");\\n }\\n break;\\n case '000d': // receive heatmap collect state, push to readonly configs\\n let heatmap_enabled = parseInt(message.data) == 1;\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"heatmap_enabled\\\", heatmap_enabled);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.EnableHeatMapRead,\\n 'value': heatmap_enabled ? 'true' : 'false'\\n });\\n configsToAck.push(configIds.ReadFromDevice.EnableHeatMapRead);\\n break;\\n case '000e': // Invade Detection set acknowledge AEROSENSE;ACK-INVADE;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-INVADE\\\");\\n }\\n break;\\n case '000f': // receive invade detection state, push to readonly configs\\n let invade_state = parseInt(message.data) == 1;\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"invade_enabled\\\", invade_state);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.InvadeDetectionRead,\\n 'value': invade_state ? 'true' : 'false'\\n });\\n configsToAck.push(configIds.ReadFromDevice.InvadeDetectionRead);\\n break;\\n case '0010': // position update received -> AEROSENSE;DIST-POS;<>;>;<>;\\n let x = HexToFloat32(message.data.slice(8, 16)).toFixed(2);\\n let y = HexToFloat32(message.data.slice(16, 24)).toFixed(2);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"pos_x\\\", x);\\n AddValue(codeValues, \\\"pos_y\\\", y);\\n let position_message = \\\"AEROSENSE;DIST-POS;\\\" + serverParams.Imei + \\\";\\\" + x + \\\";\\\" + y + \\\";\\\";\\n sendMessageToLocalhost(position_message);\\n //no ack as positions resent regularly\\n break;\\n case '0011': // ack negative fall detection\\n // parse positions\\n let posx_neg = HexToFloat32(message.data.slice(0, 8)).toFixed(2);\\n let posy_neg = HexToFloat32(message.data.slice(8, 16)).toFixed(2);\\n // create message\\n let negfall_message = \\\"AEROSENSE;NEGFALL;\\\" + serverParams.Imei + \\\";\\\" + posx_neg + \\\";\\\" + posy_neg + \\\";\\\"\\n sendMessageToLocalhost(negfall_message);\\n AddValue(codeValues, \\\"toSend\\\", negfall_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n // send ack\\n let negfall_response_hex = message.header + \\\"00000006001100000001\\\";\\n AddValue(codeValues, \\\"ack\\\", negfall_response_hex);\\n break;\\n case '0012': // reconnect message\\n message.radar_id = message.data.slice(2);\\n imei = message.radar_id;\\n const response_reconnect_OK = \\\"00000006001200000001\\\";\\n ack = message.header + response_reconnect_OK;\\n AddValue(codeValues, \\\"ack\\\", ack);\\n AddValue(codeValues, \\\"imei\\\", imei);\\n let reply = \\\"AEROSENSE-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\"\\n sendMessageToLocalhost(reply);\\n AddValue(codeValues, \\\"toSend\\\", reply);\\n break;\\n case '0013': // firmware version response, push to Read only configs\\n let firmware_version = `${HexToInt(message.data.slice(0,2))}.${HexToInt(message.data.slice(2,4))}.${HexToInt(message.data.slice(4,6))}.${HexToInt(message.data.slice(6,8))}`; // just raw hex for now\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"firmware_ver\\\", firmware_version);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.FirmwareRead,\\n 'value': firmware_version\\n });\\n //configsToAck.push(configIds.ReadFromDevice.ReadAll);\\n configsToAck.push(configIds.ReadFromDevice.ReadAll);\\n // internal ack config\\n // ack_config(\\\"ACK-VERSION\\\");\\n // update LastDateTimeRead\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.LastDateTimeRead,\\n 'value': moment().format('YYYY/MM/DD, HH:mm:ss')\\n });\\n break;\\n case '0014': // Radar reset received\\n if (message.data == '0d0d0d0d') { // message must contein this value according to docs\\n let reset_message = \\\"AEROSENSE;USERRESET;\\\" + serverParams.Imei + \\\";\\\";\\n sendMessageToLocalhost(reset_message);\\n AddValue(codeValues, \\\"toSend\\\", reset_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n }\\n // no ack\\n break;\\n case '0015': // Enable Machine learning set acknowledge AEROSENSE;ACK-MACHINELEARN;<>;\\n ack_config(\\\"ACK-MACHINELEARN\\\");\\n break;\\n case '0016': // receive machine learning state, not in use\\n let machinelearning_state = parseInt(message.data) == 1;\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"machinelearning_enabled\\\", machinelearning_state);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.EnableMachineLearningRead,\\n 'value': machinelearning_state ? 'true' : 'false'\\n });\\n configsToAck.push(configIds.ReadFromDevice.EnableMachineLearningRead);\\n break;\\n default:\\n imei = serverParams.Imei;\\n AddValue(codeValues, \\\"imei\\\", imei);\\n AddValue(codeValues, \\\"Error\\\", \\\"Unhandled message received of type: \\\" + message.function);\\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 }\\n return {\\n 'output': dataToReceiver\\n }\\n //---------------------HELPERS START----------------------------\\n function ack_config(ack_command) {\\n if (serverParams.Imei != null) {\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n let ack_message = \\\"AEROSENSE;\\\" + ack_command + \\\";\\\" + serverParams.Imei + \\\";\\\";\\n AddValue(codeValues, \\\"toSend\\\", ack_message);\\n sendMessageToLocalhost(ack_message);\\n } else { //only used for debugging\\n AddValue(codeValues, \\\"imei\\\", \\\"6796c41dc6e44e3db8d1cadce00abe6b\\\");\\n AddValue(codeValues, \\\"error\\\", \\\"serverParams do not contain Imei!\\\")\\n }\\n }\\n\\n function AddValue(msgArray, p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n msgArray.push(cvpair);\\n }\\n\\n function sendMessageToLocalhost(str) {\\n if (localTesting) {\\n console.log(\\\"Sending message to server: \\\" + str);\\n } else {\\n var server = '127.0.0.1';\\n var c = createConnection(5678, server);\\n c.write(`${str}`);\\n c.end();\\n }\\n }\\n\\n function createConnection(port, server) {\\n c = net.createConnection(port, server);\\n c.on('error', function(error) {\\n c = createConnection(port, server);\\n });\\n return c;\\n }\\n //---------------------HELPERS END----------------------------\\n //---------------------CONVERTERS START----------------------------\\n /**\\n * Convert hex string to integer\\n * @param {String} hex_string hex string\\n * @returns Integer number\\n */\\n function HexToInt(hex_string) {\\n return parseInt(hex_string, 16);\\n }\\n\\n function HexToFloat32(hex_string) {\\n let int = parseInt(hex_string, 16);\\n if (int > 0 || int < 0) {\\n var sign = (int >>> 31) ? -1 : 1;\\n var exp = (int >>> 23 & 0xff) - 127;\\n var mantissa = ((int & 0x7fffff) + 0x800000).toString(2);\\n var float32 = 0\\n for (i = 0; i < mantissa.length; i += 1) {\\n float32 += parseInt(mantissa[i]) ? Math.pow(2, exp) : 0;\\n exp--\\n }\\n return float32 * sign;\\n } else {\\n return 0;\\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(msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\n // map output to global var\\n dataToReceiver = return_values.output;\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1689160878},{"Type":1,"NewValue":"{\"Id\":172,\"Name\":\"AeroSense\",\"Operation\":\"function execute_ops(msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\n var net = require('net');\\n var moment = require('moment');\\n var codeValues = [];\\n var dataToReceiver = [];\\n var configsToAck = [];\\n var configsToUpdate = [];\\n var configsToSend = [];\\n\\n function parse_message(hex) {\\n let message = {};\\n hex = hex.toLowerCase();\\n message.magic = hex.slice(0, 4);\\n message.type = hex.slice(4, 6);\\n message.cmd = hex.slice(6, 8);\\n message.sequence = parseInt(hex.slice(8, 16), 16);\\n message.timeout = parseInt(hex.slice(16, 20), 16);\\n message.length = parseInt(hex.slice(20, 28), 16);\\n message.function = hex.slice(28, 32);\\n message.hw_version = hex.slice(32, 42);\\n message.radar_id = hex.slice(42);\\n message.header = hex.slice(0, 20);\\n message.data = hex.slice(32);\\n return message;\\n }\\n if (oystaTemplate == 'True') {\\n AddValue(codeValues, \\\"event_time\\\", Math.round(Date.now() / 1000));\\n }\\n if (globalTemplate == \\\"True\\\") {\\n let message = parse_message(rawFromBytes.slice(0));\\n let ack = '';\\n let imei = '';\\n switch (message.function) {\\n case '0001':\\n imei = message.radar_id;\\n ack = message.header + \\\"00000006000100000001\\\";\\n AddValue(codeValues, \\\"ack\\\", ack);\\n AddValue(codeValues, \\\"imei\\\", imei);\\n if (imei != serverParams.Imei) { //no need to associate if already done.\\n let new_message = \\\"AEROSENSE-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\"\\n sendMessageToLocalhost(new_message);\\n AddValue(codeValues, \\\"toSend\\\", new_message);\\n }\\n let cyc_message = \\\"AEROSENSE;CHK;\\\" + imei + \\\";\\\";\\n sendMessageToLocalhost(cyc_message);\\n AddValue(codeValues, \\\"toSendCyc\\\", cyc_message);\\n break;\\n case '0002': // working height set acknowledge AEROSENSE;ACK-WORKHEIGHT;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-WORKHEIGHT\\\");\\n }\\n break;\\n case '0003': // get working height response, push to Read only configs\\n let workheight = (HexToFloat32(message.data)).toFixed(2);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"workheight\\\", workheight);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.WorkHeightRead,\\n 'value': workheight\\n });\\n configsToAck.push(configIds.ReadFromDevice.WorkHeightRead);\\n break;\\n case '0004': // Time interval set acknowledge -> AEROSENSE;ACK-TIMEINT;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-TIMEINT\\\");\\n }\\n break;\\n case '0005': // get timeout response, push to Read only configs\\n let timeout = HexToInt(message.data);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"timeout\\\", timeout);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.TimeLimitRead,\\n 'value': timeout\\n });\\n configsToAck.push(configIds.ReadFromDevice.TimeLimitRead);\\n break;\\n case '0006': // working distance set acknowledge -> AEROSENSE;ACK-WORKRANGE;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-WORKRANGE\\\");\\n }\\n break;\\n case '0007': // response to workrange request, push to Read only configs\\n let workrange = HexToFloat32(message.data).toFixed(2);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"workrange\\\", workrange);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.WorkRangeRead,\\n 'value': workrange\\n });\\n configsToAck.push(configIds.ReadFromDevice.WorkRangeRead);\\n break;\\n //case '0008': // does not exist.\\n case '0009': // Fall detected ->AEROSENSE;FALL;<>;<>;<>;\\n // parse positions\\n let posx = HexToFloat32(message.data.slice(0, 8)).toFixed(2);\\n let posy = HexToFloat32(message.data.slice(8, 16)).toFixed(2);\\n // create message\\n let fall_message = \\\"AEROSENSE;FALL;\\\" + serverParams.Imei + \\\";\\\" + posx + \\\";\\\" + posy + \\\";\\\"\\n sendMessageToLocalhost(fall_message);\\n AddValue(codeValues, \\\"toSend\\\", fall_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n // send ack\\n let fall_response_hex = message.header + \\\"00000006000900000001\\\";\\n AddValue(codeValues, \\\"ack\\\", fall_response_hex);\\n break;\\n case '000a': //invade detection alert -> AEROSENSE;INVADE;<>;\\n let invade_message = \\\"AEROSENSE;INVADE;\\\" + serverParams.Imei + \\\";\\\"\\n sendMessageToLocalhost(invade_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"toSend\\\", invade_message);\\n //send ack\\n let invade_response_hex = message.header + \\\"00000006000a00000001\\\";\\n AddValue(codeValues, \\\"ack\\\", invade_response_hex);\\n break;\\n case '000b': //heatmap received -> NOT IN USE AEROSENSE;HEATMAP;<>;\\n let heatmap_message = \\\"AEROSENSE;HEATMAP;\\\" + serverParams.Imei + \\\";\\\"\\n sendMessageToLocalhost(heatmap_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"toSend\\\", heatmap_message);\\n // send switch off heatmap command\\n let heatmap_response_hex = message.header + \\\"00000006000c00000000\\\"\\n AddValue(codeValues, \\\"ack\\\", heatmap_response_hex);\\n break;\\n case '000c': //set enable heatmap ack -> AEROSENSE;ACK-HEATMAP;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-HEATMAP\\\");\\n }\\n break;\\n case '000d': // receive heatmap collect state, push to readonly configs\\n let heatmap_enabled = parseInt(message.data) == 1;\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"heatmap_enabled\\\", heatmap_enabled);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.EnableHeatMapRead,\\n 'value': heatmap_enabled ? 'true' : 'false'\\n });\\n configsToAck.push(configIds.ReadFromDevice.EnableHeatMapRead);\\n break;\\n case '000e': // Invade Detection set acknowledge AEROSENSE;ACK-INVADE;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-INVADE\\\");\\n }\\n break;\\n case '000f': // receive invade detection state, push to readonly configs\\n let invade_state = parseInt(message.data) == 1;\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"invade_enabled\\\", invade_state);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.InvadeDetectionRead,\\n 'value': invade_state ? 'true' : 'false'\\n });\\n configsToAck.push(configIds.ReadFromDevice.InvadeDetectionRead);\\n break;\\n case '0010': // position update received -> AEROSENSE;DIST-POS;<>;>;<>;\\n let x = HexToFloat32(message.data.slice(8, 16)).toFixed(2);\\n let y = HexToFloat32(message.data.slice(16, 24)).toFixed(2);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"pos_x\\\", x);\\n AddValue(codeValues, \\\"pos_y\\\", y);\\n let position_message = \\\"AEROSENSE;DIST-POS;\\\" + serverParams.Imei + \\\";\\\" + x + \\\";\\\" + y + \\\";\\\";\\n sendMessageToLocalhost(position_message);\\n //no ack as positions resent regularly\\n break;\\n case '0011': // ack negative fall detection\\n // parse positions\\n let posx_neg = HexToFloat32(message.data.slice(0, 8)).toFixed(2);\\n let posy_neg = HexToFloat32(message.data.slice(8, 16)).toFixed(2);\\n // create message\\n let negfall_message = \\\"AEROSENSE;NEGFALL;\\\" + serverParams.Imei + \\\";\\\" + posx_neg + \\\";\\\" + posy_neg + \\\";\\\"\\n sendMessageToLocalhost(negfall_message);\\n AddValue(codeValues, \\\"toSend\\\", negfall_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n // send ack\\n let negfall_response_hex = message.header + \\\"00000006001100000001\\\";\\n AddValue(codeValues, \\\"ack\\\", negfall_response_hex);\\n break;\\n case '0012': // reconnect message\\n message.radar_id = message.data.slice(2);\\n imei = message.radar_id;\\n const response_reconnect_OK = \\\"00000006001200000001\\\";\\n ack = message.header + response_reconnect_OK;\\n AddValue(codeValues, \\\"ack\\\", ack);\\n AddValue(codeValues, \\\"imei\\\", imei);\\n let reply = \\\"AEROSENSE-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\"\\n sendMessageToLocalhost(reply);\\n AddValue(codeValues, \\\"toSend\\\", reply);\\n break;\\n case '0013': // firmware version response, push to Read only configs\\n let firmware_version = `${HexToInt(message.data.slice(0,2))}.${HexToInt(message.data.slice(2,4))}.${HexToInt(message.data.slice(4,6))}.${HexToInt(message.data.slice(6,8))}`; // just raw hex for now\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"firmware_ver\\\", firmware_version);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.FirmwareRead,\\n 'value': firmware_version\\n });\\n //configsToAck.push(configIds.ReadFromDevice.ReadAll);\\n configsToAck.push(configIds.ReadFromDevice.ReadAll);\\n configsToAck.push(configIds.ReadFromDevice.FirmwareRead);\\n configsToAck.push(configIds.ReadFromDevice.LastDateTimeRead);\\n // internal ack config\\n // ack_config(\\\"ACK-VERSION\\\");\\n // update LastDateTimeRead\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.LastDateTimeRead,\\n 'value': moment().format('YYYY/MM/DD, HH:mm:ss')\\n });\\n break;\\n case '0014': // Radar reset received\\n if (message.data == '0d0d0d0d') { // message must contein this value according to docs\\n let reset_message = \\\"AEROSENSE;USERRESET;\\\" + serverParams.Imei + \\\";\\\";\\n sendMessageToLocalhost(reset_message);\\n AddValue(codeValues, \\\"toSend\\\", reset_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n }\\n // no ack\\n break;\\n case '0015': // Enable Machine learning set acknowledge AEROSENSE;ACK-MACHINELEARN;<>;\\n ack_config(\\\"ACK-MACHINELEARN\\\");\\n break;\\n case '0016': // receive machine learning state, not in use\\n let machinelearning_state = parseInt(message.data) == 1;\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"machinelearning_enabled\\\", machinelearning_state);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.EnableMachineLearningRead,\\n 'value': machinelearning_state ? 'true' : 'false'\\n });\\n configsToAck.push(configIds.ReadFromDevice.EnableMachineLearningRead);\\n break;\\n default:\\n imei = serverParams.Imei;\\n AddValue(codeValues, \\\"imei\\\", imei);\\n AddValue(codeValues, \\\"Error\\\", \\\"Unhandled message received of type: \\\" + message.function);\\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 }\\n return {\\n 'output': dataToReceiver\\n }\\n //---------------------HELPERS START----------------------------\\n function ack_config(ack_command) {\\n if (serverParams.Imei != null) {\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n let ack_message = \\\"AEROSENSE;\\\" + ack_command + \\\";\\\" + serverParams.Imei + \\\";\\\";\\n AddValue(codeValues, \\\"toSend\\\", ack_message);\\n sendMessageToLocalhost(ack_message);\\n } else { //only used for debugging\\n AddValue(codeValues, \\\"imei\\\", \\\"6796c41dc6e44e3db8d1cadce00abe6b\\\");\\n AddValue(codeValues, \\\"error\\\", \\\"serverParams do not contain Imei!\\\")\\n }\\n }\\n\\n function AddValue(msgArray, p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n msgArray.push(cvpair);\\n }\\n\\n function sendMessageToLocalhost(str) {\\n if (localTesting) {\\n console.log(\\\"Sending message to server: \\\" + str);\\n } else {\\n var server = '127.0.0.1';\\n var c = createConnection(5678, server);\\n c.write(`${str}`);\\n c.end();\\n }\\n }\\n\\n function createConnection(port, server) {\\n c = net.createConnection(port, server);\\n c.on('error', function(error) {\\n c = createConnection(port, server);\\n });\\n return c;\\n }\\n //---------------------HELPERS END----------------------------\\n //---------------------CONVERTERS START----------------------------\\n /**\\n * Convert hex string to integer\\n * @param {String} hex_string hex string\\n * @returns Integer number\\n */\\n function HexToInt(hex_string) {\\n return parseInt(hex_string, 16);\\n }\\n\\n function HexToFloat32(hex_string) {\\n let int = parseInt(hex_string, 16);\\n if (int > 0 || int < 0) {\\n var sign = (int >>> 31) ? -1 : 1;\\n var exp = (int >>> 23 & 0xff) - 127;\\n var mantissa = ((int & 0x7fffff) + 0x800000).toString(2);\\n var float32 = 0\\n for (i = 0; i < mantissa.length; i += 1) {\\n float32 += parseInt(mantissa[i]) ? Math.pow(2, exp) : 0;\\n exp--\\n }\\n return float32 * sign;\\n } else {\\n return 0;\\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(msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\n // map output to global var\\n dataToReceiver = return_values.output;\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1689161014},{"Type":1,"NewValue":"{\"Id\":172,\"Name\":\"AeroSense\",\"Operation\":\"function execute_ops(msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\n var net = require('net');\\n var moment = require('moment');\\n var codeValues = [];\\n var dataToReceiver = [];\\n var configsToAck = [];\\n var configsToUpdate = [];\\n var configsToSend = [];\\n\\n function parse_message(hex) {\\n let message = {};\\n hex = hex.toLowerCase();\\n message.magic = hex.slice(0, 4);\\n message.type = hex.slice(4, 6);\\n message.cmd = hex.slice(6, 8);\\n message.sequence = parseInt(hex.slice(8, 16), 16);\\n message.timeout = parseInt(hex.slice(16, 20), 16);\\n message.length = parseInt(hex.slice(20, 28), 16);\\n message.function = hex.slice(28, 32);\\n message.hw_version = hex.slice(32, 42);\\n message.radar_id = hex.slice(42);\\n message.header = hex.slice(0, 20);\\n message.data = hex.slice(32);\\n return message;\\n }\\n if (oystaTemplate == 'True') {\\n AddValue(codeValues, \\\"event_time\\\", Math.round(Date.now() / 1000));\\n }\\n if (globalTemplate == \\\"True\\\") {\\n let message = parse_message(rawFromBytes.slice(0));\\n let ack = '';\\n let imei = '';\\n switch (message.function) {\\n case '0001':\\n imei = message.radar_id;\\n ack = message.header + \\\"00000006000100000001\\\";\\n AddValue(codeValues, \\\"ack\\\", ack);\\n AddValue(codeValues, \\\"imei\\\", imei);\\n if (imei != serverParams.Imei) { //no need to associate if already done.\\n let new_message = \\\"AEROSENSE-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\"\\n sendMessageToLocalhost(new_message);\\n AddValue(codeValues, \\\"toSend\\\", new_message);\\n }\\n let cyc_message = \\\"AEROSENSE;CHK;\\\" + imei + \\\";\\\";\\n sendMessageToLocalhost(cyc_message);\\n AddValue(codeValues, \\\"toSendCyc\\\", cyc_message);\\n break;\\n case '0002': // working height set acknowledge AEROSENSE;ACK-WORKHEIGHT;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-WORKHEIGHT\\\");\\n }\\n break;\\n case '0003': // get working height response, push to Read only configs\\n let workheight = (HexToFloat32(message.data)).toFixed(2);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"workheight\\\", workheight);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.WorkHeightRead,\\n 'value': workheight\\n });\\n configsToAck.push(configIds.ReadFromDevice.WorkHeightRead);\\n break;\\n case '0004': // Time interval set acknowledge -> AEROSENSE;ACK-TIMEINT;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-TIMEINT\\\");\\n }\\n break;\\n case '0005': // get timeout response, push to Read only configs\\n let timeout = HexToInt(message.data);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"timeout\\\", timeout);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.TimeLimitRead,\\n 'value': timeout\\n });\\n configsToAck.push(configIds.ReadFromDevice.TimeLimitRead);\\n break;\\n case '0006': // working distance set acknowledge -> AEROSENSE;ACK-WORKRANGE;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-WORKRANGE\\\");\\n }\\n break;\\n case '0007': // response to workrange request, push to Read only configs\\n let workrange = HexToFloat32(message.data).toFixed(2);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"workrange\\\", workrange);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.WorkRangeRead,\\n 'value': workrange\\n });\\n configsToAck.push(configIds.ReadFromDevice.WorkRangeRead);\\n break;\\n //case '0008': // does not exist.\\n case '0009': // Fall detected ->AEROSENSE;FALL;<>;<>;<>;\\n // parse positions\\n let posx = HexToFloat32(message.data.slice(0, 8)).toFixed(2);\\n let posy = HexToFloat32(message.data.slice(8, 16)).toFixed(2);\\n // create message\\n let fall_message = \\\"AEROSENSE;FALL;\\\" + serverParams.Imei + \\\";\\\" + posx + \\\";\\\" + posy + \\\";\\\"\\n sendMessageToLocalhost(fall_message);\\n AddValue(codeValues, \\\"toSend\\\", fall_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n // send ack\\n let fall_response_hex = message.header + \\\"00000006000900000001\\\";\\n AddValue(codeValues, \\\"ack\\\", fall_response_hex);\\n break;\\n case '000a': //invade detection alert -> AEROSENSE;INVADE;<>;\\n let invade_message = \\\"AEROSENSE;INVADE;\\\" + serverParams.Imei + \\\";\\\"\\n sendMessageToLocalhost(invade_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"toSend\\\", invade_message);\\n //send ack\\n let invade_response_hex = message.header + \\\"00000006000a00000001\\\";\\n AddValue(codeValues, \\\"ack\\\", invade_response_hex);\\n break;\\n case '000b': //heatmap received -> NOT IN USE AEROSENSE;HEATMAP;<>;\\n let heatmap_message = \\\"AEROSENSE;HEATMAP;\\\" + serverParams.Imei + \\\";\\\"\\n sendMessageToLocalhost(heatmap_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"toSend\\\", heatmap_message);\\n // send switch off heatmap command\\n let heatmap_response_hex = message.header + \\\"00000006000c00000000\\\"\\n AddValue(codeValues, \\\"ack\\\", heatmap_response_hex);\\n break;\\n case '000c': //set enable heatmap ack -> AEROSENSE;ACK-HEATMAP;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-HEATMAP\\\");\\n }\\n break;\\n case '000d': // receive heatmap collect state, push to readonly configs\\n let heatmap_enabled = parseInt(message.data) == 1;\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"heatmap_enabled\\\", heatmap_enabled);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.EnableHeatMapRead,\\n 'value': heatmap_enabled ? 'true' : 'false'\\n });\\n configsToAck.push(configIds.ReadFromDevice.EnableHeatMapRead);\\n break;\\n case '000e': // Invade Detection set acknowledge AEROSENSE;ACK-INVADE;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-INVADE\\\");\\n }\\n break;\\n case '000f': // receive invade detection state, push to readonly configs\\n let invade_state = parseInt(message.data) == 1;\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"invade_enabled\\\", invade_state);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.InvadeDetectionRead,\\n 'value': invade_state ? 'true' : 'false'\\n });\\n configsToAck.push(configIds.ReadFromDevice.InvadeDetectionRead);\\n break;\\n case '0010': // position update received -> AEROSENSE;DIST-POS;<>;>;<>;\\n let x = HexToFloat32(message.data.slice(8, 16)).toFixed(2);\\n let y = HexToFloat32(message.data.slice(16, 24)).toFixed(2);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"pos_x\\\", x);\\n AddValue(codeValues, \\\"pos_y\\\", y);\\n let position_message = \\\"AEROSENSE;DIST-POS;\\\" + serverParams.Imei + \\\";\\\" + x + \\\";\\\" + y + \\\";\\\";\\n sendMessageToLocalhost(position_message);\\n //no ack as positions resent regularly\\n break;\\n case '0011': // ack negative fall detection\\n // parse positions\\n let posx_neg = HexToFloat32(message.data.slice(0, 8)).toFixed(2);\\n let posy_neg = HexToFloat32(message.data.slice(8, 16)).toFixed(2);\\n // create message\\n let negfall_message = \\\"AEROSENSE;NEGFALL;\\\" + serverParams.Imei + \\\";\\\" + posx_neg + \\\";\\\" + posy_neg + \\\";\\\"\\n sendMessageToLocalhost(negfall_message);\\n AddValue(codeValues, \\\"toSend\\\", negfall_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n // send ack\\n let negfall_response_hex = message.header + \\\"00000006001100000001\\\";\\n AddValue(codeValues, \\\"ack\\\", negfall_response_hex);\\n break;\\n case '0012': // reconnect message\\n message.radar_id = message.data.slice(2);\\n imei = message.radar_id;\\n const response_reconnect_OK = \\\"00000006001200000001\\\";\\n ack = message.header + response_reconnect_OK;\\n AddValue(codeValues, \\\"ack\\\", ack);\\n AddValue(codeValues, \\\"imei\\\", imei);\\n let reply = \\\"AEROSENSE-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\"\\n sendMessageToLocalhost(reply);\\n AddValue(codeValues, \\\"toSend\\\", reply);\\n break;\\n case '0013': // firmware version response, push to Read only configs\\n let firmware_version = `${HexToInt(message.data.slice(0,2))}.${HexToInt(message.data.slice(2,4))}.${HexToInt(message.data.slice(4,6))}.${HexToInt(message.data.slice(6,8))}`; // just raw hex for now\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"firmware_ver\\\", firmware_version);\\n // update firmware and lastTimeread fields\\n AddValue(configsToUpdate, configIds.ReadFromDevice.FirmwareRead, firmware_version);\\n AddValue(configsToUpdate, configIds.ReadFromDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\n configsToAck.push(configIds.ReadFromDevice.ReadAll);\\n configsToAck.push(configIds.ReadFromDevice.FirmwareRead);\\n configsToAck.push(configIds.ReadFromDevice.LastDateTimeRead);\\n // internal ack config\\n // ack_config(\\\"ACK-VERSION\\\");\\n // update LastDateTimeRead\\n // trigger getting all other values\\n AddValue(configsToSend, configIds.ReadFromDevice.WorkHeightRead, 0);\\n break;\\n case '0014': // Radar reset received\\n if (message.data == '0d0d0d0d') { // message must contein this value according to docs\\n let reset_message = \\\"AEROSENSE;USERRESET;\\\" + serverParams.Imei + \\\";\\\";\\n sendMessageToLocalhost(reset_message);\\n AddValue(codeValues, \\\"toSend\\\", reset_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n }\\n // no ack\\n break;\\n case '0015': // Enable Machine learning set acknowledge AEROSENSE;ACK-MACHINELEARN;<>;\\n ack_config(\\\"ACK-MACHINELEARN\\\");\\n break;\\n case '0016': // receive machine learning state, not in use\\n let machinelearning_state = parseInt(message.data) == 1;\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"machinelearning_enabled\\\", machinelearning_state);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.EnableMachineLearningRead,\\n 'value': machinelearning_state ? 'true' : 'false'\\n });\\n configsToAck.push(configIds.ReadFromDevice.EnableMachineLearningRead);\\n break;\\n default:\\n imei = serverParams.Imei;\\n AddValue(codeValues, \\\"imei\\\", imei);\\n AddValue(codeValues, \\\"Error\\\", \\\"Unhandled message received of type: \\\" + message.function);\\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 }\\n return {\\n 'output': dataToReceiver\\n }\\n //---------------------HELPERS START----------------------------\\n function ack_config(ack_command) {\\n if (serverParams.Imei != null) {\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n let ack_message = \\\"AEROSENSE;\\\" + ack_command + \\\";\\\" + serverParams.Imei + \\\";\\\";\\n AddValue(codeValues, \\\"toSend\\\", ack_message);\\n sendMessageToLocalhost(ack_message);\\n } else { //only used for debugging\\n AddValue(codeValues, \\\"imei\\\", \\\"6796c41dc6e44e3db8d1cadce00abe6b\\\");\\n AddValue(codeValues, \\\"error\\\", \\\"serverParams do not contain Imei!\\\")\\n }\\n }\\n\\n function AddValue(msgArray, p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n msgArray.push(cvpair);\\n }\\n\\n function sendMessageToLocalhost(str) {\\n if (localTesting) {\\n console.log(\\\"Sending message to server: \\\" + str);\\n } else {\\n var server = '127.0.0.1';\\n var c = createConnection(5678, server);\\n c.write(`${str}`);\\n c.end();\\n }\\n }\\n\\n function createConnection(port, server) {\\n c = net.createConnection(port, server);\\n c.on('error', function(error) {\\n c = createConnection(port, server);\\n });\\n return c;\\n }\\n //---------------------HELPERS END----------------------------\\n //---------------------CONVERTERS START----------------------------\\n /**\\n * Convert hex string to integer\\n * @param {String} hex_string hex string\\n * @returns Integer number\\n */\\n function HexToInt(hex_string) {\\n return parseInt(hex_string, 16);\\n }\\n\\n function HexToFloat32(hex_string) {\\n let int = parseInt(hex_string, 16);\\n if (int > 0 || int < 0) {\\n var sign = (int >>> 31) ? -1 : 1;\\n var exp = (int >>> 23 & 0xff) - 127;\\n var mantissa = ((int & 0x7fffff) + 0x800000).toString(2);\\n var float32 = 0\\n for (i = 0; i < mantissa.length; i += 1) {\\n float32 += parseInt(mantissa[i]) ? Math.pow(2, exp) : 0;\\n exp--\\n }\\n return float32 * sign;\\n } else {\\n return 0;\\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(msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\n // map output to global var\\n dataToReceiver = return_values.output;\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1689161661},{"Type":1,"NewValue":"{\"Id\":172,\"Name\":\"AeroSense\",\"Operation\":\"function execute_ops(msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\n var net = require('net');\\n var moment = require('moment');\\n var codeValues = [];\\n var dataToReceiver = [];\\n var configsToAck = [];\\n var configsToUpdate = [];\\n var configsToSend = [];\\n\\n function parse_message(hex) {\\n let message = {};\\n hex = hex.toLowerCase();\\n message.magic = hex.slice(0, 4);\\n message.type = hex.slice(4, 6);\\n message.cmd = hex.slice(6, 8);\\n message.sequence = parseInt(hex.slice(8, 16), 16);\\n message.timeout = parseInt(hex.slice(16, 20), 16);\\n message.length = parseInt(hex.slice(20, 28), 16);\\n message.function = hex.slice(28, 32);\\n message.hw_version = hex.slice(32, 42);\\n message.radar_id = hex.slice(42);\\n message.header = hex.slice(0, 20);\\n message.data = hex.slice(32);\\n return message;\\n }\\n if (oystaTemplate == 'True') {\\n AddValue(codeValues, \\\"event_time\\\", Math.round(Date.now() / 1000));\\n }\\n if (globalTemplate == \\\"True\\\") {\\n let message = parse_message(rawFromBytes.slice(0));\\n let ack = '';\\n let imei = '';\\n switch (message.function) {\\n case '0001':\\n imei = message.radar_id;\\n ack = message.header + \\\"00000006000100000001\\\";\\n AddValue(codeValues, \\\"ack\\\", ack);\\n AddValue(codeValues, \\\"imei\\\", imei);\\n if (imei != serverParams.Imei) { //no need to associate if already done.\\n let new_message = \\\"AEROSENSE-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\"\\n sendMessageToLocalhost(new_message);\\n AddValue(codeValues, \\\"toSend\\\", new_message);\\n }\\n let cyc_message = \\\"AEROSENSE;CHK;\\\" + imei + \\\";\\\";\\n sendMessageToLocalhost(cyc_message);\\n AddValue(codeValues, \\\"toSendCyc\\\", cyc_message);\\n break;\\n case '0002': // working height set acknowledge AEROSENSE;ACK-WORKHEIGHT;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-WORKHEIGHT\\\");\\n }\\n break;\\n case '0003': // get working height response, push to Read only configs\\n let workheight = (HexToFloat32(message.data)).toFixed(2);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"workheight\\\", workheight);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.WorkHeightRead,\\n 'value': workheight\\n });\\n configsToAck.push(configIds.ReadFromDevice.WorkHeightRead);\\n break;\\n case '0004': // Time interval set acknowledge -> AEROSENSE;ACK-TIMEINT;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-TIMEINT\\\");\\n }\\n break;\\n case '0005': // get timeout response, push to Read only configs\\n let timeout = HexToInt(message.data);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"timeout\\\", timeout);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.TimeLimitRead,\\n 'value': timeout\\n });\\n configsToAck.push(configIds.ReadFromDevice.TimeLimitRead);\\n break;\\n case '0006': // working distance set acknowledge -> AEROSENSE;ACK-WORKRANGE;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-WORKRANGE\\\");\\n }\\n break;\\n case '0007': // response to workrange request, push to Read only configs\\n let workrange = HexToFloat32(message.data).toFixed(2);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"workrange\\\", workrange);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.WorkRangeRead,\\n 'value': workrange\\n });\\n configsToAck.push(configIds.ReadFromDevice.WorkRangeRead);\\n break;\\n //case '0008': // does not exist.\\n case '0009': // Fall detected ->AEROSENSE;FALL;<>;<>;<>;\\n // parse positions\\n let posx = HexToFloat32(message.data.slice(0, 8)).toFixed(2);\\n let posy = HexToFloat32(message.data.slice(8, 16)).toFixed(2);\\n // create message\\n let fall_message = \\\"AEROSENSE;FALL;\\\" + serverParams.Imei + \\\";\\\" + posx + \\\";\\\" + posy + \\\";\\\"\\n sendMessageToLocalhost(fall_message);\\n AddValue(codeValues, \\\"toSend\\\", fall_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n // send ack\\n let fall_response_hex = message.header + \\\"00000006000900000001\\\";\\n AddValue(codeValues, \\\"ack\\\", fall_response_hex);\\n break;\\n case '000a': //invade detection alert -> AEROSENSE;INVADE;<>;\\n let invade_message = \\\"AEROSENSE;INVADE;\\\" + serverParams.Imei + \\\";\\\"\\n sendMessageToLocalhost(invade_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"toSend\\\", invade_message);\\n //send ack\\n let invade_response_hex = message.header + \\\"00000006000a00000001\\\";\\n AddValue(codeValues, \\\"ack\\\", invade_response_hex);\\n break;\\n case '000b': //heatmap received -> NOT IN USE AEROSENSE;HEATMAP;<>;\\n let heatmap_message = \\\"AEROSENSE;HEATMAP;\\\" + serverParams.Imei + \\\";\\\"\\n sendMessageToLocalhost(heatmap_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"toSend\\\", heatmap_message);\\n // send switch off heatmap command\\n let heatmap_response_hex = message.header + \\\"00000006000c00000000\\\"\\n AddValue(codeValues, \\\"ack\\\", heatmap_response_hex);\\n break;\\n case '000c': //set enable heatmap ack -> AEROSENSE;ACK-HEATMAP;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-HEATMAP\\\");\\n }\\n break;\\n case '000d': // receive heatmap collect state, push to readonly configs\\n let heatmap_enabled = parseInt(message.data) == 1;\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"heatmap_enabled\\\", heatmap_enabled);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.EnableHeatMapRead,\\n 'value': heatmap_enabled ? 'true' : 'false'\\n });\\n configsToAck.push(configIds.ReadFromDevice.EnableHeatMapRead);\\n break;\\n case '000e': // Invade Detection set acknowledge AEROSENSE;ACK-INVADE;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-INVADE\\\");\\n }\\n break;\\n case '000f': // receive invade detection state, push to readonly configs\\n let invade_state = parseInt(message.data) == 1;\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"invade_enabled\\\", invade_state);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.InvadeDetectionRead,\\n 'value': invade_state ? 'true' : 'false'\\n });\\n configsToAck.push(configIds.ReadFromDevice.InvadeDetectionRead);\\n break;\\n case '0010': // position update received -> AEROSENSE;DIST-POS;<>;>;<>;\\n let x = HexToFloat32(message.data.slice(8, 16)).toFixed(2);\\n let y = HexToFloat32(message.data.slice(16, 24)).toFixed(2);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"pos_x\\\", x);\\n AddValue(codeValues, \\\"pos_y\\\", y);\\n let position_message = \\\"AEROSENSE;DIST-POS;\\\" + serverParams.Imei + \\\";\\\" + x + \\\";\\\" + y + \\\";\\\";\\n sendMessageToLocalhost(position_message);\\n //no ack as positions resent regularly\\n break;\\n case '0011': // ack negative fall detection\\n // parse positions\\n let posx_neg = HexToFloat32(message.data.slice(0, 8)).toFixed(2);\\n let posy_neg = HexToFloat32(message.data.slice(8, 16)).toFixed(2);\\n // create message\\n let negfall_message = \\\"AEROSENSE;NEGFALL;\\\" + serverParams.Imei + \\\";\\\" + posx_neg + \\\";\\\" + posy_neg + \\\";\\\"\\n sendMessageToLocalhost(negfall_message);\\n AddValue(codeValues, \\\"toSend\\\", negfall_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n // send ack\\n let negfall_response_hex = message.header + \\\"00000006001100000001\\\";\\n AddValue(codeValues, \\\"ack\\\", negfall_response_hex);\\n break;\\n case '0012': // reconnect message\\n message.radar_id = message.data.slice(2);\\n imei = message.radar_id;\\n const response_reconnect_OK = \\\"00000006001200000001\\\";\\n ack = message.header + response_reconnect_OK;\\n AddValue(codeValues, \\\"ack\\\", ack);\\n AddValue(codeValues, \\\"imei\\\", imei);\\n let reply = \\\"AEROSENSE-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\"\\n sendMessageToLocalhost(reply);\\n AddValue(codeValues, \\\"toSend\\\", reply);\\n break;\\n case '0013': // firmware version response, push to Read only configs\\n let firmware_version = `${HexToInt(message.data.slice(0,2))}.${HexToInt(message.data.slice(2,4))}.${HexToInt(message.data.slice(4,6))}.${HexToInt(message.data.slice(6,8))}`; // just raw hex for now\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"firmware_ver\\\", firmware_version);\\n // update firmware and lastTimeread fields\\n AddValue(configsToUpdate, configIds.ReadFromDevice.FirmwareRead, firmware_version);\\n AddValue(configsToUpdate, configIds.ReadFromDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\n configsToAck.push(configIds.ReadFromDevice.ReadAll);\\n configsToAck.push(configIds.ReadFromDevice.FirmwareRead);\\n configsToAck.push(configIds.ReadFromDevice.LastDateTimeRead);\\n // internal ack config\\n // ack_config(\\\"ACK-VERSION\\\");\\n // update LastDateTimeRead\\n // trigger getting all other values\\n AddValue(configsToSend, configIds.ReadFromDevice.WorkHeightRead, \\\"0\\\");\\n break;\\n case '0014': // Radar reset received\\n if (message.data == '0d0d0d0d') { // message must contein this value according to docs\\n let reset_message = \\\"AEROSENSE;USERRESET;\\\" + serverParams.Imei + \\\";\\\";\\n sendMessageToLocalhost(reset_message);\\n AddValue(codeValues, \\\"toSend\\\", reset_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n }\\n // no ack\\n break;\\n case '0015': // Enable Machine learning set acknowledge AEROSENSE;ACK-MACHINELEARN;<>;\\n ack_config(\\\"ACK-MACHINELEARN\\\");\\n break;\\n case '0016': // receive machine learning state, not in use\\n let machinelearning_state = parseInt(message.data) == 1;\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"machinelearning_enabled\\\", machinelearning_state);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.EnableMachineLearningRead,\\n 'value': machinelearning_state ? 'true' : 'false'\\n });\\n configsToAck.push(configIds.ReadFromDevice.EnableMachineLearningRead);\\n break;\\n default:\\n imei = serverParams.Imei;\\n AddValue(codeValues, \\\"imei\\\", imei);\\n AddValue(codeValues, \\\"Error\\\", \\\"Unhandled message received of type: \\\" + message.function);\\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 }\\n return {\\n 'output': dataToReceiver\\n }\\n //---------------------HELPERS START----------------------------\\n function ack_config(ack_command) {\\n if (serverParams.Imei != null) {\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n let ack_message = \\\"AEROSENSE;\\\" + ack_command + \\\";\\\" + serverParams.Imei + \\\";\\\";\\n AddValue(codeValues, \\\"toSend\\\", ack_message);\\n sendMessageToLocalhost(ack_message);\\n } else { //only used for debugging\\n AddValue(codeValues, \\\"imei\\\", \\\"6796c41dc6e44e3db8d1cadce00abe6b\\\");\\n AddValue(codeValues, \\\"error\\\", \\\"serverParams do not contain Imei!\\\")\\n }\\n }\\n\\n function AddValue(msgArray, p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n msgArray.push(cvpair);\\n }\\n\\n function sendMessageToLocalhost(str) {\\n if (localTesting) {\\n console.log(\\\"Sending message to server: \\\" + str);\\n } else {\\n var server = '127.0.0.1';\\n var c = createConnection(5678, server);\\n c.write(`${str}`);\\n c.end();\\n }\\n }\\n\\n function createConnection(port, server) {\\n c = net.createConnection(port, server);\\n c.on('error', function(error) {\\n c = createConnection(port, server);\\n });\\n return c;\\n }\\n //---------------------HELPERS END----------------------------\\n //---------------------CONVERTERS START----------------------------\\n /**\\n * Convert hex string to integer\\n * @param {String} hex_string hex string\\n * @returns Integer number\\n */\\n function HexToInt(hex_string) {\\n return parseInt(hex_string, 16);\\n }\\n\\n function HexToFloat32(hex_string) {\\n let int = parseInt(hex_string, 16);\\n if (int > 0 || int < 0) {\\n var sign = (int >>> 31) ? -1 : 1;\\n var exp = (int >>> 23 & 0xff) - 127;\\n var mantissa = ((int & 0x7fffff) + 0x800000).toString(2);\\n var float32 = 0\\n for (i = 0; i < mantissa.length; i += 1) {\\n float32 += parseInt(mantissa[i]) ? Math.pow(2, exp) : 0;\\n exp--\\n }\\n return float32 * sign;\\n } else {\\n return 0;\\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(msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\n // map output to global var\\n dataToReceiver = return_values.output;\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1689162094},{"Type":1,"NewValue":"{\"Id\":172,\"Name\":\"AeroSense\",\"Operation\":\"function execute_ops(msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\n var net = require('net');\\n var moment = require('moment');\\n var codeValues = [];\\n var dataToReceiver = [];\\n var configsToAck = [];\\n var configsToUpdate = [];\\n var configsToSend = [];\\n\\n function parse_message(hex) {\\n let message = {};\\n hex = hex.toLowerCase();\\n message.magic = hex.slice(0, 4);\\n message.type = hex.slice(4, 6);\\n message.cmd = hex.slice(6, 8);\\n message.sequence = parseInt(hex.slice(8, 16), 16);\\n message.timeout = parseInt(hex.slice(16, 20), 16);\\n message.length = parseInt(hex.slice(20, 28), 16);\\n message.function = hex.slice(28, 32);\\n message.hw_version = hex.slice(32, 42);\\n message.radar_id = hex.slice(42);\\n message.header = hex.slice(0, 20);\\n message.data = hex.slice(32);\\n return message;\\n }\\n if (oystaTemplate == 'True') {\\n AddValue(codeValues, \\\"event_time\\\", Math.round(Date.now() / 1000));\\n }\\n if (globalTemplate == \\\"True\\\") {\\n let message = parse_message(rawFromBytes.slice(0));\\n let ack = '';\\n let imei = '';\\n switch (message.function) {\\n case '0001':\\n imei = message.radar_id;\\n ack = message.header + \\\"00000006000100000001\\\";\\n AddValue(codeValues, \\\"ack\\\", ack);\\n AddValue(codeValues, \\\"imei\\\", imei);\\n if (imei != serverParams.Imei) { //no need to associate if already done.\\n let new_message = \\\"AEROSENSE-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\"\\n sendMessageToLocalhost(new_message);\\n AddValue(codeValues, \\\"toSend\\\", new_message);\\n }\\n let cyc_message = \\\"AEROSENSE;CHK;\\\" + imei + \\\";\\\";\\n sendMessageToLocalhost(cyc_message);\\n AddValue(codeValues, \\\"toSendCyc\\\", cyc_message);\\n break;\\n case '0002': // working height set acknowledge AEROSENSE;ACK-WORKHEIGHT;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-WORKHEIGHT\\\");\\n }\\n break;\\n case '0003': // get working height response, push to Read only configs\\n let workheight = (HexToFloat32(message.data)).toFixed(2);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"workheight\\\", workheight);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.WorkHeightRead,\\n 'value': workheight\\n });\\n configsToAck.push(configIds.ReadFromDevice.WorkHeightRead);\\n break;\\n case '0004': // Time interval set acknowledge -> AEROSENSE;ACK-TIMEINT;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-TIMEINT\\\");\\n }\\n break;\\n case '0005': // get timeout response, push to Read only configs\\n let timeout = HexToInt(message.data);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"timeout\\\", timeout);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.TimeLimitRead,\\n 'value': timeout\\n });\\n configsToAck.push(configIds.ReadFromDevice.TimeLimitRead);\\n break;\\n case '0006': // working distance set acknowledge -> AEROSENSE;ACK-WORKRANGE;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-WORKRANGE\\\");\\n }\\n break;\\n case '0007': // response to workrange request, push to Read only configs\\n let workrange = HexToFloat32(message.data).toFixed(2);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"workrange\\\", workrange);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.WorkRangeRead,\\n 'value': workrange\\n });\\n configsToAck.push(configIds.ReadFromDevice.WorkRangeRead);\\n break;\\n //case '0008': // does not exist.\\n case '0009': // Fall detected ->AEROSENSE;FALL;<>;<>;<>;\\n // parse positions\\n let posx = HexToFloat32(message.data.slice(0, 8)).toFixed(2);\\n let posy = HexToFloat32(message.data.slice(8, 16)).toFixed(2);\\n // create message\\n let fall_message = \\\"AEROSENSE;FALL;\\\" + serverParams.Imei + \\\";\\\" + posx + \\\";\\\" + posy + \\\";\\\"\\n sendMessageToLocalhost(fall_message);\\n AddValue(codeValues, \\\"toSend\\\", fall_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n // send ack\\n let fall_response_hex = message.header + \\\"00000006000900000001\\\";\\n AddValue(codeValues, \\\"ack\\\", fall_response_hex);\\n break;\\n case '000a': //invade detection alert -> AEROSENSE;INVADE;<>;\\n let invade_message = \\\"AEROSENSE;INVADE;\\\" + serverParams.Imei + \\\";\\\"\\n sendMessageToLocalhost(invade_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"toSend\\\", invade_message);\\n //send ack\\n let invade_response_hex = message.header + \\\"00000006000a00000001\\\";\\n AddValue(codeValues, \\\"ack\\\", invade_response_hex);\\n break;\\n case '000b': //heatmap received -> NOT IN USE AEROSENSE;HEATMAP;<>;\\n let heatmap_message = \\\"AEROSENSE;HEATMAP;\\\" + serverParams.Imei + \\\";\\\"\\n sendMessageToLocalhost(heatmap_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"toSend\\\", heatmap_message);\\n // send switch off heatmap command\\n let heatmap_response_hex = message.header + \\\"00000006000c00000000\\\"\\n AddValue(codeValues, \\\"ack\\\", heatmap_response_hex);\\n break;\\n case '000c': //set enable heatmap ack -> AEROSENSE;ACK-HEATMAP;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-HEATMAP\\\");\\n }\\n break;\\n case '000d': // receive heatmap collect state, push to readonly configs\\n let heatmap_enabled = parseInt(message.data) == 1;\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"heatmap_enabled\\\", heatmap_enabled);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.EnableHeatMapRead,\\n 'value': heatmap_enabled ? 'true' : 'false'\\n });\\n configsToAck.push(configIds.ReadFromDevice.EnableHeatMapRead);\\n break;\\n case '000e': // Invade Detection set acknowledge AEROSENSE;ACK-INVADE;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-INVADE\\\");\\n }\\n break;\\n case '000f': // receive invade detection state, push to readonly configs\\n let invade_state = parseInt(message.data) == 1;\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"invade_enabled\\\", invade_state);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.InvadeDetectionRead,\\n 'value': invade_state ? 'true' : 'false'\\n });\\n configsToAck.push(configIds.ReadFromDevice.InvadeDetectionRead);\\n break;\\n case '0010': // position update received -> AEROSENSE;DIST-POS;<>;>;<>;\\n let x = HexToFloat32(message.data.slice(8, 16)).toFixed(2);\\n let y = HexToFloat32(message.data.slice(16, 24)).toFixed(2);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"pos_x\\\", x);\\n AddValue(codeValues, \\\"pos_y\\\", y);\\n let position_message = \\\"AEROSENSE;DIST-POS;\\\" + serverParams.Imei + \\\";\\\" + x + \\\";\\\" + y + \\\";\\\";\\n sendMessageToLocalhost(position_message);\\n //no ack as positions resent regularly\\n break;\\n case '0011': // ack negative fall detection\\n // parse positions\\n let posx_neg = HexToFloat32(message.data.slice(0, 8)).toFixed(2);\\n let posy_neg = HexToFloat32(message.data.slice(8, 16)).toFixed(2);\\n // create message\\n let negfall_message = \\\"AEROSENSE;NEGFALL;\\\" + serverParams.Imei + \\\";\\\" + posx_neg + \\\";\\\" + posy_neg + \\\";\\\"\\n sendMessageToLocalhost(negfall_message);\\n AddValue(codeValues, \\\"toSend\\\", negfall_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n // send ack\\n let negfall_response_hex = message.header + \\\"00000006001100000001\\\";\\n AddValue(codeValues, \\\"ack\\\", negfall_response_hex);\\n break;\\n case '0012': // reconnect message\\n message.radar_id = message.data.slice(2);\\n imei = message.radar_id;\\n const response_reconnect_OK = \\\"00000006001200000001\\\";\\n ack = message.header + response_reconnect_OK;\\n AddValue(codeValues, \\\"ack\\\", ack);\\n AddValue(codeValues, \\\"imei\\\", imei);\\n let reply = \\\"AEROSENSE-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\"\\n sendMessageToLocalhost(reply);\\n AddValue(codeValues, \\\"toSend\\\", reply);\\n break;\\n case '0013': // firmware version response, push to Read only configs\\n let firmware_version = `${HexToInt(message.data.slice(0,2))}.${HexToInt(message.data.slice(2,4))}.${HexToInt(message.data.slice(4,6))}.${HexToInt(message.data.slice(6,8))}`; // just raw hex for now\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"firmware_ver\\\", firmware_version);\\n // update firmware and lastTimeread fields\\n AddValue(configsToUpdate, configIds.ReadFromDevice.FirmwareRead, firmware_version);\\n AddValue(configsToUpdate, configIds.ReadFromDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\n configsToAck.push(configIds.ReadFromDevice.ReadAll);\\n configsToAck.push(configIds.ReadFromDevice.FirmwareRead);\\n configsToAck.push(configIds.ReadFromDevice.LastDateTimeRead);\\n // internal ack config\\n // ack_config(\\\"ACK-VERSION\\\");\\n // update LastDateTimeRead\\n // trigger getting all other values\\n AddValue(configsToSend, configIds.ReadFromDevice.WorkHeightRead, 1.6);\\n break;\\n case '0014': // Radar reset received\\n if (message.data == '0d0d0d0d') { // message must contein this value according to docs\\n let reset_message = \\\"AEROSENSE;USERRESET;\\\" + serverParams.Imei + \\\";\\\";\\n sendMessageToLocalhost(reset_message);\\n AddValue(codeValues, \\\"toSend\\\", reset_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n }\\n // no ack\\n break;\\n case '0015': // Enable Machine learning set acknowledge AEROSENSE;ACK-MACHINELEARN;<>;\\n ack_config(\\\"ACK-MACHINELEARN\\\");\\n break;\\n case '0016': // receive machine learning state, not in use\\n let machinelearning_state = parseInt(message.data) == 1;\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"machinelearning_enabled\\\", machinelearning_state);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.EnableMachineLearningRead,\\n 'value': machinelearning_state ? 'true' : 'false'\\n });\\n configsToAck.push(configIds.ReadFromDevice.EnableMachineLearningRead);\\n break;\\n default:\\n imei = serverParams.Imei;\\n AddValue(codeValues, \\\"imei\\\", imei);\\n AddValue(codeValues, \\\"Error\\\", \\\"Unhandled message received of type: \\\" + message.function);\\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 }\\n return {\\n 'output': dataToReceiver\\n }\\n //---------------------HELPERS START----------------------------\\n function ack_config(ack_command) {\\n if (serverParams.Imei != null) {\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n let ack_message = \\\"AEROSENSE;\\\" + ack_command + \\\";\\\" + serverParams.Imei + \\\";\\\";\\n AddValue(codeValues, \\\"toSend\\\", ack_message);\\n sendMessageToLocalhost(ack_message);\\n } else { //only used for debugging\\n AddValue(codeValues, \\\"imei\\\", \\\"6796c41dc6e44e3db8d1cadce00abe6b\\\");\\n AddValue(codeValues, \\\"error\\\", \\\"serverParams do not contain Imei!\\\")\\n }\\n }\\n\\n function AddValue(msgArray, p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n msgArray.push(cvpair);\\n }\\n\\n function sendMessageToLocalhost(str) {\\n if (localTesting) {\\n console.log(\\\"Sending message to server: \\\" + str);\\n } else {\\n var server = '127.0.0.1';\\n var c = createConnection(5678, server);\\n c.write(`${str}`);\\n c.end();\\n }\\n }\\n\\n function createConnection(port, server) {\\n c = net.createConnection(port, server);\\n c.on('error', function(error) {\\n c = createConnection(port, server);\\n });\\n return c;\\n }\\n //---------------------HELPERS END----------------------------\\n //---------------------CONVERTERS START----------------------------\\n /**\\n * Convert hex string to integer\\n * @param {String} hex_string hex string\\n * @returns Integer number\\n */\\n function HexToInt(hex_string) {\\n return parseInt(hex_string, 16);\\n }\\n\\n function HexToFloat32(hex_string) {\\n let int = parseInt(hex_string, 16);\\n if (int > 0 || int < 0) {\\n var sign = (int >>> 31) ? -1 : 1;\\n var exp = (int >>> 23 & 0xff) - 127;\\n var mantissa = ((int & 0x7fffff) + 0x800000).toString(2);\\n var float32 = 0\\n for (i = 0; i < mantissa.length; i += 1) {\\n float32 += parseInt(mantissa[i]) ? Math.pow(2, exp) : 0;\\n exp--\\n }\\n return float32 * sign;\\n } else {\\n return 0;\\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(msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\n // map output to global var\\n dataToReceiver = return_values.output;\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1689162388},{"Type":1,"NewValue":"{\"Id\":172,\"Name\":\"AeroSense\",\"Operation\":\"function execute_ops(msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\n var net = require('net');\\n var moment = require('moment');\\n var codeValues = [];\\n var dataToReceiver = [];\\n var configsToAck = [];\\n var configsToUpdate = [];\\n var configsToSend = [];\\n\\n function parse_message(hex) {\\n let message = {};\\n hex = hex.toLowerCase();\\n message.magic = hex.slice(0, 4);\\n message.type = hex.slice(4, 6);\\n message.cmd = hex.slice(6, 8);\\n message.sequence = parseInt(hex.slice(8, 16), 16);\\n message.timeout = parseInt(hex.slice(16, 20), 16);\\n message.length = parseInt(hex.slice(20, 28), 16);\\n message.function = hex.slice(28, 32);\\n message.hw_version = hex.slice(32, 42);\\n message.radar_id = hex.slice(42);\\n message.header = hex.slice(0, 20);\\n message.data = hex.slice(32);\\n return message;\\n }\\n if (oystaTemplate == 'True') {\\n AddValue(codeValues, \\\"event_time\\\", Math.round(Date.now() / 1000));\\n }\\n if (globalTemplate == \\\"True\\\") {\\n let message = parse_message(rawFromBytes.slice(0));\\n let ack = '';\\n let imei = '';\\n switch (message.function) {\\n case '0001':\\n imei = message.radar_id;\\n ack = message.header + \\\"00000006000100000001\\\";\\n AddValue(codeValues, \\\"ack\\\", ack);\\n AddValue(codeValues, \\\"imei\\\", imei);\\n if (imei != serverParams.Imei) { //no need to associate if already done.\\n let new_message = \\\"AEROSENSE-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\"\\n sendMessageToLocalhost(new_message);\\n AddValue(codeValues, \\\"toSend\\\", new_message);\\n }\\n let cyc_message = \\\"AEROSENSE;CHK;\\\" + imei + \\\";\\\";\\n sendMessageToLocalhost(cyc_message);\\n AddValue(codeValues, \\\"toSendCyc\\\", cyc_message);\\n break;\\n case '0002': // working height set acknowledge AEROSENSE;ACK-WORKHEIGHT;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-WORKHEIGHT\\\");\\n }\\n break;\\n case '0003': // get working height response, push to Read only configs\\n let workheight = (HexToFloat32(message.data)).toFixed(2);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"workheight\\\", workheight);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.WorkHeightRead,\\n 'value': workheight\\n });\\n configsToAck.push(configIds.ReadFromDevice.WorkHeightRead);\\n break;\\n case '0004': // Time interval set acknowledge -> AEROSENSE;ACK-TIMEINT;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-TIMEINT\\\");\\n }\\n break;\\n case '0005': // get timeout response, push to Read only configs\\n let timeout = HexToInt(message.data);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"timeout\\\", timeout);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.TimeLimitRead,\\n 'value': timeout\\n });\\n configsToAck.push(configIds.ReadFromDevice.TimeLimitRead);\\n break;\\n case '0006': // working distance set acknowledge -> AEROSENSE;ACK-WORKRANGE;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-WORKRANGE\\\");\\n }\\n break;\\n case '0007': // response to workrange request, push to Read only configs\\n let workrange = HexToFloat32(message.data).toFixed(2);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"workrange\\\", workrange);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.WorkRangeRead,\\n 'value': workrange\\n });\\n configsToAck.push(configIds.ReadFromDevice.WorkRangeRead);\\n break;\\n //case '0008': // does not exist.\\n case '0009': // Fall detected ->AEROSENSE;FALL;<>;<>;<>;\\n // parse positions\\n let posx = HexToFloat32(message.data.slice(0, 8)).toFixed(2);\\n let posy = HexToFloat32(message.data.slice(8, 16)).toFixed(2);\\n // create message\\n let fall_message = \\\"AEROSENSE;FALL;\\\" + serverParams.Imei + \\\";\\\" + posx + \\\";\\\" + posy + \\\";\\\"\\n sendMessageToLocalhost(fall_message);\\n AddValue(codeValues, \\\"toSend\\\", fall_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n // send ack\\n let fall_response_hex = message.header + \\\"00000006000900000001\\\";\\n AddValue(codeValues, \\\"ack\\\", fall_response_hex);\\n break;\\n case '000a': //invade detection alert -> AEROSENSE;INVADE;<>;\\n let invade_message = \\\"AEROSENSE;INVADE;\\\" + serverParams.Imei + \\\";\\\"\\n sendMessageToLocalhost(invade_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"toSend\\\", invade_message);\\n //send ack\\n let invade_response_hex = message.header + \\\"00000006000a00000001\\\";\\n AddValue(codeValues, \\\"ack\\\", invade_response_hex);\\n break;\\n case '000b': //heatmap received -> NOT IN USE AEROSENSE;HEATMAP;<>;\\n let heatmap_message = \\\"AEROSENSE;HEATMAP;\\\" + serverParams.Imei + \\\";\\\"\\n sendMessageToLocalhost(heatmap_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"toSend\\\", heatmap_message);\\n // send switch off heatmap command\\n let heatmap_response_hex = message.header + \\\"00000006000c00000000\\\"\\n AddValue(codeValues, \\\"ack\\\", heatmap_response_hex);\\n break;\\n case '000c': //set enable heatmap ack -> AEROSENSE;ACK-HEATMAP;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-HEATMAP\\\");\\n }\\n break;\\n case '000d': // receive heatmap collect state, push to readonly configs\\n let heatmap_enabled = parseInt(message.data) == 1;\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"heatmap_enabled\\\", heatmap_enabled);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.EnableHeatMapRead,\\n 'value': heatmap_enabled ? 'true' : 'false'\\n });\\n configsToAck.push(configIds.ReadFromDevice.EnableHeatMapRead);\\n break;\\n case '000e': // Invade Detection set acknowledge AEROSENSE;ACK-INVADE;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-INVADE\\\");\\n }\\n break;\\n case '000f': // receive invade detection state, push to readonly configs\\n let invade_state = parseInt(message.data) == 1;\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"invade_enabled\\\", invade_state);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.InvadeDetectionRead,\\n 'value': invade_state ? 'true' : 'false'\\n });\\n configsToAck.push(configIds.ReadFromDevice.InvadeDetectionRead);\\n break;\\n case '0010': // position update received -> AEROSENSE;DIST-POS;<>;>;<>;\\n let x = HexToFloat32(message.data.slice(8, 16)).toFixed(2);\\n let y = HexToFloat32(message.data.slice(16, 24)).toFixed(2);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"pos_x\\\", x);\\n AddValue(codeValues, \\\"pos_y\\\", y);\\n let position_message = \\\"AEROSENSE;DIST-POS;\\\" + serverParams.Imei + \\\";\\\" + x + \\\";\\\" + y + \\\";\\\";\\n sendMessageToLocalhost(position_message);\\n //no ack as positions resent regularly\\n break;\\n case '0011': // ack negative fall detection\\n // parse positions\\n let posx_neg = HexToFloat32(message.data.slice(0, 8)).toFixed(2);\\n let posy_neg = HexToFloat32(message.data.slice(8, 16)).toFixed(2);\\n // create message\\n let negfall_message = \\\"AEROSENSE;NEGFALL;\\\" + serverParams.Imei + \\\";\\\" + posx_neg + \\\";\\\" + posy_neg + \\\";\\\"\\n sendMessageToLocalhost(negfall_message);\\n AddValue(codeValues, \\\"toSend\\\", negfall_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n // send ack\\n let negfall_response_hex = message.header + \\\"00000006001100000001\\\";\\n AddValue(codeValues, \\\"ack\\\", negfall_response_hex);\\n break;\\n case '0012': // reconnect message\\n message.radar_id = message.data.slice(2);\\n imei = message.radar_id;\\n const response_reconnect_OK = \\\"00000006001200000001\\\";\\n ack = message.header + response_reconnect_OK;\\n AddValue(codeValues, \\\"ack\\\", ack);\\n AddValue(codeValues, \\\"imei\\\", imei);\\n let reply = \\\"AEROSENSE-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\"\\n sendMessageToLocalhost(reply);\\n AddValue(codeValues, \\\"toSend\\\", reply);\\n break;\\n case '0013': // firmware version response, push to Read only configs\\n let firmware_version = `${HexToInt(message.data.slice(0,2))}.${HexToInt(message.data.slice(2,4))}.${HexToInt(message.data.slice(4,6))}.${HexToInt(message.data.slice(6,8))}`; // just raw hex for now\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"firmware_ver\\\", firmware_version);\\n // update firmware and lastTimeread fields\\n AddValue(configsToUpdate, configIds.ReadFromDevice.FirmwareRead, firmware_version);\\n AddValue(configsToUpdate, configIds.ReadFromDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\n configsToAck.push(configIds.ReadFromDevice.ReadAll);\\n configsToAck.push(configIds.ReadFromDevice.FirmwareRead);\\n configsToAck.push(configIds.ReadFromDevice.LastDateTimeRead);\\n // internal ack config\\n // ack_config(\\\"ACK-VERSION\\\");\\n // update LastDateTimeRead\\n // trigger getting all other values\\n AddValue(configsToUpdate, configIds.ReadFromDevice.WorkHeightRead, 1.6);\\n break;\\n case '0014': // Radar reset received\\n if (message.data == '0d0d0d0d') { // message must contein this value according to docs\\n let reset_message = \\\"AEROSENSE;USERRESET;\\\" + serverParams.Imei + \\\";\\\";\\n sendMessageToLocalhost(reset_message);\\n AddValue(codeValues, \\\"toSend\\\", reset_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n }\\n // no ack\\n break;\\n case '0015': // Enable Machine learning set acknowledge AEROSENSE;ACK-MACHINELEARN;<>;\\n ack_config(\\\"ACK-MACHINELEARN\\\");\\n break;\\n case '0016': // receive machine learning state, not in use\\n let machinelearning_state = parseInt(message.data) == 1;\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"machinelearning_enabled\\\", machinelearning_state);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.EnableMachineLearningRead,\\n 'value': machinelearning_state ? 'true' : 'false'\\n });\\n configsToAck.push(configIds.ReadFromDevice.EnableMachineLearningRead);\\n break;\\n default:\\n imei = serverParams.Imei;\\n AddValue(codeValues, \\\"imei\\\", imei);\\n AddValue(codeValues, \\\"Error\\\", \\\"Unhandled message received of type: \\\" + message.function);\\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 }\\n return {\\n 'output': dataToReceiver\\n }\\n //---------------------HELPERS START----------------------------\\n function ack_config(ack_command) {\\n if (serverParams.Imei != null) {\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n let ack_message = \\\"AEROSENSE;\\\" + ack_command + \\\";\\\" + serverParams.Imei + \\\";\\\";\\n AddValue(codeValues, \\\"toSend\\\", ack_message);\\n sendMessageToLocalhost(ack_message);\\n } else { //only used for debugging\\n AddValue(codeValues, \\\"imei\\\", \\\"6796c41dc6e44e3db8d1cadce00abe6b\\\");\\n AddValue(codeValues, \\\"error\\\", \\\"serverParams do not contain Imei!\\\")\\n }\\n }\\n\\n function AddValue(msgArray, p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n msgArray.push(cvpair);\\n }\\n\\n function sendMessageToLocalhost(str) {\\n if (localTesting) {\\n console.log(\\\"Sending message to server: \\\" + str);\\n } else {\\n var server = '127.0.0.1';\\n var c = createConnection(5678, server);\\n c.write(`${str}`);\\n c.end();\\n }\\n }\\n\\n function createConnection(port, server) {\\n c = net.createConnection(port, server);\\n c.on('error', function(error) {\\n c = createConnection(port, server);\\n });\\n return c;\\n }\\n //---------------------HELPERS END----------------------------\\n //---------------------CONVERTERS START----------------------------\\n /**\\n * Convert hex string to integer\\n * @param {String} hex_string hex string\\n * @returns Integer number\\n */\\n function HexToInt(hex_string) {\\n return parseInt(hex_string, 16);\\n }\\n\\n function HexToFloat32(hex_string) {\\n let int = parseInt(hex_string, 16);\\n if (int > 0 || int < 0) {\\n var sign = (int >>> 31) ? -1 : 1;\\n var exp = (int >>> 23 & 0xff) - 127;\\n var mantissa = ((int & 0x7fffff) + 0x800000).toString(2);\\n var float32 = 0\\n for (i = 0; i < mantissa.length; i += 1) {\\n float32 += parseInt(mantissa[i]) ? Math.pow(2, exp) : 0;\\n exp--\\n }\\n return float32 * sign;\\n } else {\\n return 0;\\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(msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\n // map output to global var\\n dataToReceiver = return_values.output;\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1689162745},{"Type":1,"NewValue":"{\"Id\":172,\"Name\":\"AeroSense\",\"Operation\":\"function execute_ops(msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\n var net = require('net');\\n var moment = require('moment');\\n var codeValues = [];\\n var dataToReceiver = [];\\n var configsToAck = [];\\n var configsToUpdate = [];\\n var configsToSend = [];\\n\\n function parse_message(hex) {\\n let message = {};\\n hex = hex.toLowerCase();\\n message.magic = hex.slice(0, 4);\\n message.type = hex.slice(4, 6);\\n message.cmd = hex.slice(6, 8);\\n message.sequence = parseInt(hex.slice(8, 16), 16);\\n message.timeout = parseInt(hex.slice(16, 20), 16);\\n message.length = parseInt(hex.slice(20, 28), 16);\\n message.function = hex.slice(28, 32);\\n message.hw_version = hex.slice(32, 42);\\n message.radar_id = hex.slice(42);\\n message.header = hex.slice(0, 20);\\n message.data = hex.slice(32);\\n return message;\\n }\\n if (oystaTemplate == 'True') {\\n AddValue(codeValues, \\\"event_time\\\", Math.round(Date.now() / 1000));\\n }\\n if (globalTemplate == \\\"True\\\") {\\n let message = parse_message(rawFromBytes.slice(0));\\n let ack = '';\\n let imei = '';\\n switch (message.function) {\\n case '0001':\\n imei = message.radar_id;\\n ack = message.header + \\\"00000006000100000001\\\";\\n AddValue(codeValues, \\\"ack\\\", ack);\\n AddValue(codeValues, \\\"imei\\\", imei);\\n if (imei != serverParams.Imei) { //no need to associate if already done.\\n let new_message = \\\"AEROSENSE-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\"\\n sendMessageToLocalhost(new_message);\\n AddValue(codeValues, \\\"toSend\\\", new_message);\\n }\\n let cyc_message = \\\"AEROSENSE;CHK;\\\" + imei + \\\";\\\";\\n sendMessageToLocalhost(cyc_message);\\n AddValue(codeValues, \\\"toSendCyc\\\", cyc_message);\\n break;\\n case '0002': // working height set acknowledge AEROSENSE;ACK-WORKHEIGHT;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-WORKHEIGHT\\\");\\n }\\n break;\\n case '0003': // get working height response, push to Read only configs\\n let workheight = (HexToFloat32(message.data)).toFixed(2);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"workheight\\\", workheight);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.WorkHeightRead,\\n 'value': workheight\\n });\\n configsToAck.push(configIds.ReadFromDevice.WorkHeightRead);\\n break;\\n case '0004': // Time interval set acknowledge -> AEROSENSE;ACK-TIMEINT;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-TIMEINT\\\");\\n }\\n break;\\n case '0005': // get timeout response, push to Read only configs\\n let timeout = HexToInt(message.data);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"timeout\\\", timeout);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.TimeLimitRead,\\n 'value': timeout\\n });\\n configsToAck.push(configIds.ReadFromDevice.TimeLimitRead);\\n break;\\n case '0006': // working distance set acknowledge -> AEROSENSE;ACK-WORKRANGE;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-WORKRANGE\\\");\\n }\\n break;\\n case '0007': // response to workrange request, push to Read only configs\\n let workrange = HexToFloat32(message.data).toFixed(2);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"workrange\\\", workrange);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.WorkRangeRead,\\n 'value': workrange\\n });\\n configsToAck.push(configIds.ReadFromDevice.WorkRangeRead);\\n break;\\n //case '0008': // does not exist.\\n case '0009': // Fall detected ->AEROSENSE;FALL;<>;<>;<>;\\n // parse positions\\n let posx = HexToFloat32(message.data.slice(0, 8)).toFixed(2);\\n let posy = HexToFloat32(message.data.slice(8, 16)).toFixed(2);\\n // create message\\n let fall_message = \\\"AEROSENSE;FALL;\\\" + serverParams.Imei + \\\";\\\" + posx + \\\";\\\" + posy + \\\";\\\"\\n sendMessageToLocalhost(fall_message);\\n AddValue(codeValues, \\\"toSend\\\", fall_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n // send ack\\n let fall_response_hex = message.header + \\\"00000006000900000001\\\";\\n AddValue(codeValues, \\\"ack\\\", fall_response_hex);\\n break;\\n case '000a': //invade detection alert -> AEROSENSE;INVADE;<>;\\n let invade_message = \\\"AEROSENSE;INVADE;\\\" + serverParams.Imei + \\\";\\\"\\n sendMessageToLocalhost(invade_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"toSend\\\", invade_message);\\n //send ack\\n let invade_response_hex = message.header + \\\"00000006000a00000001\\\";\\n AddValue(codeValues, \\\"ack\\\", invade_response_hex);\\n break;\\n case '000b': //heatmap received -> NOT IN USE AEROSENSE;HEATMAP;<>;\\n let heatmap_message = \\\"AEROSENSE;HEATMAP;\\\" + serverParams.Imei + \\\";\\\"\\n sendMessageToLocalhost(heatmap_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"toSend\\\", heatmap_message);\\n // send switch off heatmap command\\n let heatmap_response_hex = message.header + \\\"00000006000c00000000\\\"\\n AddValue(codeValues, \\\"ack\\\", heatmap_response_hex);\\n break;\\n case '000c': //set enable heatmap ack -> AEROSENSE;ACK-HEATMAP;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-HEATMAP\\\");\\n }\\n break;\\n case '000d': // receive heatmap collect state, push to readonly configs\\n let heatmap_enabled = parseInt(message.data) == 1;\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"heatmap_enabled\\\", heatmap_enabled);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.EnableHeatMapRead,\\n 'value': heatmap_enabled ? 'true' : 'false'\\n });\\n configsToAck.push(configIds.ReadFromDevice.EnableHeatMapRead);\\n break;\\n case '000e': // Invade Detection set acknowledge AEROSENSE;ACK-INVADE;<>;\\n if (HexToInt(message.data) == 1) {\\n ack_config(\\\"ACK-INVADE\\\");\\n }\\n break;\\n case '000f': // receive invade detection state, push to readonly configs\\n let invade_state = parseInt(message.data) == 1;\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"invade_enabled\\\", invade_state);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.InvadeDetectionRead,\\n 'value': invade_state ? 'true' : 'false'\\n });\\n configsToAck.push(configIds.ReadFromDevice.InvadeDetectionRead);\\n break;\\n case '0010': // position update received -> AEROSENSE;DIST-POS;<>;>;<>;\\n let x = HexToFloat32(message.data.slice(8, 16)).toFixed(2);\\n let y = HexToFloat32(message.data.slice(16, 24)).toFixed(2);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"pos_x\\\", x);\\n AddValue(codeValues, \\\"pos_y\\\", y);\\n let position_message = \\\"AEROSENSE;DIST-POS;\\\" + serverParams.Imei + \\\";\\\" + x + \\\";\\\" + y + \\\";\\\";\\n sendMessageToLocalhost(position_message);\\n //no ack as positions resent regularly\\n break;\\n case '0011': // ack negative fall detection\\n // parse positions\\n let posx_neg = HexToFloat32(message.data.slice(0, 8)).toFixed(2);\\n let posy_neg = HexToFloat32(message.data.slice(8, 16)).toFixed(2);\\n // create message\\n let negfall_message = \\\"AEROSENSE;NEGFALL;\\\" + serverParams.Imei + \\\";\\\" + posx_neg + \\\";\\\" + posy_neg + \\\";\\\"\\n sendMessageToLocalhost(negfall_message);\\n AddValue(codeValues, \\\"toSend\\\", negfall_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n // send ack\\n let negfall_response_hex = message.header + \\\"00000006001100000001\\\";\\n AddValue(codeValues, \\\"ack\\\", negfall_response_hex);\\n break;\\n case '0012': // reconnect message\\n message.radar_id = message.data.slice(2);\\n imei = message.radar_id;\\n const response_reconnect_OK = \\\"00000006001200000001\\\";\\n ack = message.header + response_reconnect_OK;\\n AddValue(codeValues, \\\"ack\\\", ack);\\n AddValue(codeValues, \\\"imei\\\", imei);\\n let reply = \\\"AEROSENSE-ASSOCIATE;\\\" + imei + \\\";\\\" + serverParams.Guid + \\\";\\\"\\n sendMessageToLocalhost(reply);\\n AddValue(codeValues, \\\"toSend\\\", reply);\\n break;\\n case '0013': // firmware version response, push to Read only configs\\n let firmware_version = `${HexToInt(message.data.slice(0,2))}.${HexToInt(message.data.slice(2,4))}.${HexToInt(message.data.slice(4,6))}.${HexToInt(message.data.slice(6,8))}`; // just raw hex for now\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"firmware_ver\\\", firmware_version);\\n // update firmware and lastTimeread fields\\n AddValue(configsToUpdate, configIds.ReadFromDevice.FirmwareRead, firmware_version);\\n AddValue(configsToUpdate, configIds.ReadFromDevice.LastDateTimeRead, moment().format('YYYY/MM/DD, HH:mm:ss'))\\n configsToAck.push(configIds.ReadFromDevice.ReadAll);\\n configsToAck.push(configIds.ReadFromDevice.FirmwareRead);\\n configsToAck.push(configIds.ReadFromDevice.LastDateTimeRead);\\n // internal ack config\\n // ack_config(\\\"ACK-VERSION\\\");\\n // update LastDateTimeRead\\n // trigger getting all other values\\n AddValue(configsToSend, configIds.ReadFromDevice.WorkHeightRead, 1.6);\\n break;\\n case '0014': // Radar reset received\\n if (message.data == '0d0d0d0d') { // message must contein this value according to docs\\n let reset_message = \\\"AEROSENSE;USERRESET;\\\" + serverParams.Imei + \\\";\\\";\\n sendMessageToLocalhost(reset_message);\\n AddValue(codeValues, \\\"toSend\\\", reset_message);\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n }\\n // no ack\\n break;\\n case '0015': // Enable Machine learning set acknowledge AEROSENSE;ACK-MACHINELEARN;<>;\\n ack_config(\\\"ACK-MACHINELEARN\\\");\\n break;\\n case '0016': // receive machine learning state, not in use\\n let machinelearning_state = parseInt(message.data) == 1;\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n AddValue(codeValues, \\\"machinelearning_enabled\\\", machinelearning_state);\\n configsToUpdate.push({\\n 'code': configIds.ReadFromDevice.EnableMachineLearningRead,\\n 'value': machinelearning_state ? 'true' : 'false'\\n });\\n configsToAck.push(configIds.ReadFromDevice.EnableMachineLearningRead);\\n break;\\n default:\\n imei = serverParams.Imei;\\n AddValue(codeValues, \\\"imei\\\", imei);\\n AddValue(codeValues, \\\"Error\\\", \\\"Unhandled message received of type: \\\" + message.function);\\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 }\\n return {\\n 'output': dataToReceiver\\n }\\n //---------------------HELPERS START----------------------------\\n function ack_config(ack_command) {\\n if (serverParams.Imei != null) {\\n AddValue(codeValues, \\\"imei\\\", serverParams.Imei);\\n let ack_message = \\\"AEROSENSE;\\\" + ack_command + \\\";\\\" + serverParams.Imei + \\\";\\\";\\n AddValue(codeValues, \\\"toSend\\\", ack_message);\\n sendMessageToLocalhost(ack_message);\\n } else { //only used for debugging\\n AddValue(codeValues, \\\"imei\\\", \\\"6796c41dc6e44e3db8d1cadce00abe6b\\\");\\n AddValue(codeValues, \\\"error\\\", \\\"serverParams do not contain Imei!\\\")\\n }\\n }\\n\\n function AddValue(msgArray, p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n msgArray.push(cvpair);\\n }\\n\\n function sendMessageToLocalhost(str) {\\n if (localTesting) {\\n console.log(\\\"Sending message to server: \\\" + str);\\n } else {\\n var server = '127.0.0.1';\\n var c = createConnection(5678, server);\\n c.write(`${str}`);\\n c.end();\\n }\\n }\\n\\n function createConnection(port, server) {\\n c = net.createConnection(port, server);\\n c.on('error', function(error) {\\n c = createConnection(port, server);\\n });\\n return c;\\n }\\n //---------------------HELPERS END----------------------------\\n //---------------------CONVERTERS START----------------------------\\n /**\\n * Convert hex string to integer\\n * @param {String} hex_string hex string\\n * @returns Integer number\\n */\\n function HexToInt(hex_string) {\\n return parseInt(hex_string, 16);\\n }\\n\\n function HexToFloat32(hex_string) {\\n let int = parseInt(hex_string, 16);\\n if (int > 0 || int < 0) {\\n var sign = (int >>> 31) ? -1 : 1;\\n var exp = (int >>> 23 & 0xff) - 127;\\n var mantissa = ((int & 0x7fffff) + 0x800000).toString(2);\\n var float32 = 0\\n for (i = 0; i < mantissa.length; i += 1) {\\n float32 += parseInt(mantissa[i]) ? Math.pow(2, exp) : 0;\\n exp--\\n }\\n return float32 * sign;\\n } else {\\n return 0;\\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(msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\n // map output to global var\\n dataToReceiver = return_values.output;\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1689162937}]}],"Groups":[{"Id":4207,"Parent":null,"Name":"Feature","Json":"{\"description\":\"All AeroSense Features\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"ProtocolActionObjects":[]},{"Id":4208,"Parent":{"Id":4207,"Name":"Feature","Json":{"description":"All AeroSense Features","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":4208,"Name":"RadarSettings","Json":{"description":"Configuration for Radar Unit.","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":4524,"Name":"ReadFromDevice","Json":{"description":"Contains values downloaded from the device.","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":4800,"Name":"No activity monitor","Json":{"description":"Send alarms when no activity is detected.","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"RadarSettings","Json":"{\"description\":\"Configuration for Radar Unit.\",\"columns\":2,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"ProtocolActionObjects":[]},{"Id":4524,"Parent":{"Id":4207,"Name":"Feature","Json":{"description":"All AeroSense Features","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":4208,"Name":"RadarSettings","Json":{"description":"Configuration for Radar Unit.","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":4524,"Name":"ReadFromDevice","Json":{"description":"Contains values downloaded from the device.","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":4800,"Name":"No activity monitor","Json":{"description":"Send alarms when no activity is detected.","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"ReadFromDevice","Json":"{\"description\":\"Contains values downloaded from the device.\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"ProtocolActionObjects":[]},{"Id":4800,"Parent":{"Id":4207,"Name":"Feature","Json":{"description":"All AeroSense Features","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":4208,"Name":"RadarSettings","Json":{"description":"Configuration for Radar Unit.","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":4524,"Name":"ReadFromDevice","Json":{"description":"Contains values downloaded from the device.","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":4800,"Name":"No activity monitor","Json":{"description":"Send alarms when no activity is detected.","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"No activity monitor","Json":"{\"description\":\"Send alarms when no activity is detected.\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"ProtocolActionObjects":[]}],"GroupParams":[{"Id":7396,"Group":{"Id":4208,"Name":"RadarSettings","Json":{"description":"Configuration for Radar Unit.","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":4207,"Name":"Feature","Json":{"description":"All AeroSense Features","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":4524,"Name":"ReadFromDevice","Json":{"description":"Contains values downloaded from the device.","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":4800,"Name":"No activity monitor","Json":{"description":"Send alarms when no activity is detected.","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":"Show RadarSettings","Json":"{\"name\":\"Show RadarSettings\",\"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":[],"Tags":[]},{"Id":6619,"Group":{"Id":4208,"Name":"RadarSettings","Json":{"description":"Configuration for Radar Unit.","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":4207,"Name":"Feature","Json":{"description":"All AeroSense Features","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":4524,"Name":"ReadFromDevice","Json":{"description":"Contains values downloaded from the device.","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":4800,"Name":"No activity monitor","Json":{"description":"Send alarms when no activity is detected.","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":"StopSendingRealtimePos","Json":"{\"name\":\"StopSendingRealtimePos\",\"default\":\"\",\"description\":\"Stop sending realtime positions.\",\"type\":\"button\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":true,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":7}","Default":"","Command":null,"ProtocolActionObjects":[],"Tags":[]},{"Id":6618,"Group":{"Id":4208,"Name":"RadarSettings","Json":{"description":"Configuration for Radar Unit.","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":4207,"Name":"Feature","Json":{"description":"All AeroSense Features","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":4524,"Name":"ReadFromDevice","Json":{"description":"Contains values downloaded from the device.","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":4800,"Name":"No activity monitor","Json":{"description":"Send alarms when no activity is detected.","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":"StartSendingRealtimePos","Json":"{\"name\":\"StartSendingRealtimePos\",\"default\":\"\",\"description\":\"Start sending realtime positions\",\"type\":\"button\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":true,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":6}","Default":"","Command":null,"ProtocolActionObjects":[],"Tags":[]},{"Id":6617,"Group":{"Id":4208,"Name":"RadarSettings","Json":{"description":"Configuration for Radar Unit.","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":4207,"Name":"Feature","Json":{"description":"All AeroSense Features","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":4524,"Name":"ReadFromDevice","Json":{"description":"Contains values downloaded from the device.","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":4800,"Name":"No activity monitor","Json":{"description":"Send alarms when no activity is detected.","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":"EnableHeatmap","Json":"{\"name\":\"EnableHeatmap\",\"default\":\"true\",\"description\":\"Enable heatmap images.\",\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":true,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Currently not supported. Please switch off.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"true","Command":null,"ProtocolActionObjects":[],"Tags":[]},{"Id":6292,"Group":{"Id":4208,"Name":"RadarSettings","Json":{"description":"Configuration for Radar Unit.","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":4207,"Name":"Feature","Json":{"description":"All AeroSense Features","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":4524,"Name":"ReadFromDevice","Json":{"description":"Contains values downloaded from the device.","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":4800,"Name":"No activity monitor","Json":{"description":"Send alarms when no activity is detected.","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":"EnableMachineLearning","Json":"{\"name\":\"EnableMachineLearning\",\"default\":\"false\",\"description\":\"Turn on machine learning algorythm.\",\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"The machine learning algorithm is to further reduce the false alerts of fall detection for better user experiences. However, it may result in lower accuracy in certain scenarios.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":4}","Default":"true","Command":null,"ProtocolActionObjects":[],"Tags":[]},{"Id":6291,"Group":{"Id":4208,"Name":"RadarSettings","Json":{"description":"Configuration for Radar Unit.","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":4207,"Name":"Feature","Json":{"description":"All AeroSense Features","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":4524,"Name":"ReadFromDevice","Json":{"description":"Contains values downloaded from the device.","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":4800,"Name":"No activity monitor","Json":{"description":"Send alarms when no activity is detected.","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":"InvadeDetection","Json":"{\"name\":\"InvadeDetection\",\"default\":\"true\",\"description\":\"Enable activity monitoring feature.\",\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":5}","Default":"true","Command":null,"ProtocolActionObjects":[],"Tags":[]},{"Id":6290,"Group":{"Id":4208,"Name":"RadarSettings","Json":{"description":"Configuration for Radar Unit.","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":4207,"Name":"Feature","Json":{"description":"All AeroSense Features","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":4524,"Name":"ReadFromDevice","Json":{"description":"Contains values downloaded from the device.","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":4800,"Name":"No activity monitor","Json":{"description":"Send alarms when no activity is detected.","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":"TimeInterval","Json":"{\"name\":\"TimeInterval\",\"default\":\"\",\"description\":\"Time interval to trigger the fall detection (in seconds).\",\"type\":\"number\",\"suffix\":\"s\",\"prefix\":null,\"min\":30,\"max\":300,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":2}","Default":"","Command":null,"ProtocolActionObjects":[],"Tags":[]},{"Id":6289,"Group":{"Id":4208,"Name":"RadarSettings","Json":{"description":"Configuration for Radar Unit.","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":4207,"Name":"Feature","Json":{"description":"All AeroSense Features","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":4524,"Name":"ReadFromDevice","Json":{"description":"Contains values downloaded from the device.","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":4800,"Name":"No activity monitor","Json":{"description":"Send alarms when no activity is detected.","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":"WorkHeight","Json":"{\"name\":\"WorkHeight\",\"default\":\"\",\"description\":\"Set the mounted height of radar unit.\",\"type\":\"number\",\"suffix\":null,\"prefix\":null,\"min\":1.4,\"max\":2.2,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":0}","Default":"","Command":null,"ProtocolActionObjects":[],"Tags":[]},{"Id":5802,"Group":{"Id":4208,"Name":"RadarSettings","Json":{"description":"Configuration for Radar Unit.","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":4207,"Name":"Feature","Json":{"description":"All AeroSense Features","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":4524,"Name":"ReadFromDevice","Json":{"description":"Contains values downloaded from the device.","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":4800,"Name":"No activity monitor","Json":{"description":"Send alarms when no activity is detected.","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":"WorkRange","Json":"{\"name\":\"WorkRange\",\"default\":\"\",\"description\":\"Set the work range of the sensor\",\"type\":\"number\",\"suffix\":null,\"prefix\":null,\"min\":0.5,\"max\":7,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":1}","Default":"","Command":null,"ProtocolActionObjects":[],"Tags":[]},{"Id":6621,"Group":{"Id":4524,"Name":"ReadFromDevice","Json":{"description":"Contains values downloaded from the device.","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":4207,"Name":"Feature","Json":{"description":"All AeroSense Features","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":4208,"Name":"RadarSettings","Json":{"description":"Configuration for Radar Unit.","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":4800,"Name":"No activity monitor","Json":{"description":"Send alarms when no activity is detected.","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":"WorkRangeRead","Json":"{\"name\":\"WorkRangeRead\",\"default\":\"\",\"description\":\"Workrange as read from the device.\",\"type\":\"number\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":4}","Default":"","Command":null,"ProtocolActionObjects":[],"Tags":[]},{"Id":6624,"Group":{"Id":4524,"Name":"ReadFromDevice","Json":{"description":"Contains values downloaded from the device.","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":4207,"Name":"Feature","Json":{"description":"All AeroSense Features","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":4208,"Name":"RadarSettings","Json":{"description":"Configuration for Radar Unit.","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":4800,"Name":"No activity monitor","Json":{"description":"Send alarms when no activity is detected.","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":"ReadAll","Json":"{\"name\":\"ReadAll\",\"default\":\"\",\"description\":\"Read values from Device.\",\"type\":\"button\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":6624,\"Group\":{\"Id\":4524,\"Name\":\"ReadFromDevice\",\"Json\":{\"description\":\"Contains values downloaded from the device.\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"ReadAll\",\"Json\":\"{\\\"name\\\":\\\"ReadAll\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Read values from Device.\\\",\\\"type\\\":\\\"button\\\",\\\"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\":[],\"Tags\":[]}","Timestamp":1688729222},{"Type":0,"NewValue":"{\"Id\":6624,\"Group\":{\"Id\":4524,\"Name\":\"ReadFromDevice\",\"Json\":{\"description\":\"Contains values downloaded from the device.\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"ReadAll\",\"Json\":\"{\\\"name\\\":\\\"ReadAll\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Read values from Device.\\\",\\\"type\\\":\\\"button\\\",\\\"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\":{\"Id\":3058,\"Protocol\":{\"Id\":160,\"Code\":\"AeroSense\",\"Version\":\"0.2\",\"FirmwareVersion\":\"\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"GetAll\",\"TemplateSMS\":null,\"Template\":null,\"AckTemplate\":null,\"Operation\":\"// configs to send on all read only items\\n// they will turn amber\\n// on return ack individual items\\n// auto ack read all button\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":false,\"HexString\":false,\"SendAttempts\":1,\"Order\":null},\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1688729227},{"Type":1,"NewValue":"{\"Id\":6624,\"Group\":{\"Id\":4524,\"Name\":\"ReadFromDevice\",\"Json\":{\"description\":\"Contains values downloaded from the device.\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"ReadAll\",\"Json\":\"{\\\"name\\\":\\\"ReadAll\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Read values from Device.\\\",\\\"type\\\":\\\"button\\\",\\\"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\":[],\"Tags\":[]}","Timestamp":1688998381},{"Type":0,"NewValue":"{\"Id\":6624,\"Group\":{\"Id\":4524,\"Name\":\"ReadFromDevice\",\"Json\":{\"description\":\"Contains values downloaded from the device.\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"ReadAll\",\"Json\":\"{\\\"name\\\":\\\"ReadAll\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Read values from Device.\\\",\\\"type\\\":\\\"button\\\",\\\"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\":{\"Id\":2704,\"Protocol\":{\"Id\":160,\"Code\":\"AeroSense\",\"Version\":\"0.2\",\"FirmwareVersion\":\"\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"GetFirmware\",\"TemplateSMS\":null,\"Template\":\"1201000200000000000000000006001300000000\",\"AckTemplate\":null,\"Operation\":\"// write your code here...\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":1,\"Order\":null},\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1688998387},{"Type":2,"NewValue":"{\"Id\":6624,\"Group\":{\"Id\":4524,\"Name\":\"ReadFromDevice\",\"Json\":{\"description\":\"Contains values downloaded from the device.\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"ReadAll\",\"Json\":\"{\\\"name\\\":\\\"ReadAll\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Read values from Device.\\\",\\\"type\\\":\\\"button\\\",\\\"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\":{\"Id\":3058,\"Protocol\":{\"Id\":160,\"Code\":\"AeroSense\",\"Version\":\"0.2\",\"FirmwareVersion\":\"\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"GetAll\",\"TemplateSMS\":null,\"Template\":null,\"AckTemplate\":null,\"Operation\":\"var msg = []\\nvar configs = [];\\nvar configsToSend = [];\\nvar configsToAck = [];\\nconfigsToAck.push(configIds.ReadFromDevice.ReadAll);\\n// let data = '00000000';\\n// if (params.RadarSettings.InvadeDetection == 'true') {\\n// data = '00000001'\\n// }\\n// AddValue(\\\"value\\\", data);\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n //configs: configs,\\n configsToAck: configsToAck\\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\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":false,\"SendAttempts\":1,\"Order\":null},\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1688998390},{"Type":1,"NewValue":"{\"Id\":6624,\"Group\":{\"Id\":4524,\"Name\":\"ReadFromDevice\",\"Json\":{\"description\":\"Contains values downloaded from the device.\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"ReadAll\",\"Json\":\"{\\\"name\\\":\\\"ReadAll\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Read values from Device.\\\",\\\"type\\\":\\\"button\\\",\\\"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\":[],\"Tags\":[]}","Timestamp":1689773141},{"Type":0,"NewValue":"{\"Id\":6624,\"Group\":{\"Id\":4524,\"Name\":\"ReadFromDevice\",\"Json\":{\"description\":\"Contains values downloaded from the device.\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"ReadAll\",\"Json\":\"{\\\"name\\\":\\\"ReadAll\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Read values from Device.\\\",\\\"type\\\":\\\"button\\\",\\\"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\":{\"Id\":2821,\"Protocol\":{\"Id\":160,\"Code\":\"AeroSense\",\"Version\":\"0.2\",\"FirmwareVersion\":\"\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"GetEnableHeatMap\",\"TemplateSMS\":null,\"Template\":\"1201000200000000000000000006000d00000000\",\"AckTemplate\":null,\"Operation\":\"// write your code here...\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":null},\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1689773145},{"Type":0,"NewValue":"{\"Id\":6624,\"Group\":{\"Id\":4524,\"Name\":\"ReadFromDevice\",\"Json\":{\"description\":\"Contains values downloaded from the device.\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"ReadAll\",\"Json\":\"{\\\"name\\\":\\\"ReadAll\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Read values from Device.\\\",\\\"type\\\":\\\"button\\\",\\\"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\":{\"Id\":2822,\"Protocol\":{\"Id\":160,\"Code\":\"AeroSense\",\"Version\":\"0.2\",\"FirmwareVersion\":\"\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"GetEnableMachineLearning\",\"TemplateSMS\":null,\"Template\":\"1201000200000000000000000006001600000000\",\"AckTemplate\":null,\"Operation\":\"// write your code here...\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":true,\"SendAttempts\":4,\"Order\":null},\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1689773149}],"Tags":[]},{"Id":6623,"Group":{"Id":4524,"Name":"ReadFromDevice","Json":{"description":"Contains values downloaded from the device.","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":4207,"Name":"Feature","Json":{"description":"All AeroSense Features","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":4208,"Name":"RadarSettings","Json":{"description":"Configuration for Radar Unit.","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":4800,"Name":"No activity monitor","Json":{"description":"Send alarms when no activity is detected.","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":"TimeLimitRead","Json":"{\"name\":\"TimeLimitRead\",\"default\":\"\",\"description\":\"Timelimit read from the device (s).\",\"type\":\"number\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":true,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":5}","Default":"","Command":null,"ProtocolActionObjects":[],"Tags":[]},{"Id":6622,"Group":{"Id":4524,"Name":"ReadFromDevice","Json":{"description":"Contains values downloaded from the device.","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":4207,"Name":"Feature","Json":{"description":"All AeroSense Features","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":4208,"Name":"RadarSettings","Json":{"description":"Configuration for Radar Unit.","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":4800,"Name":"No activity monitor","Json":{"description":"Send alarms when no activity is detected.","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":"WorkHeightRead","Json":"{\"name\":\"WorkHeightRead\",\"default\":\"\",\"description\":\"Workheight read from the device.\",\"type\":\"number\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":6622,\"Group\":{\"Id\":4524,\"Name\":\"ReadFromDevice\",\"Json\":{\"description\":\"Contains values downloaded from the device.\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"WorkHeightRead\",\"Json\":\"{\\\"name\\\":\\\"WorkHeightRead\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Workheight read from the device.\\\",\\\"type\\\":\\\"number\\\",\\\"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\":[],\"Tags\":[]}","Timestamp":1689162205}],"Tags":[]},{"Id":7397,"Group":{"Id":4524,"Name":"ReadFromDevice","Json":{"description":"Contains values downloaded from the device.","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":4207,"Name":"Feature","Json":{"description":"All AeroSense Features","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":4208,"Name":"RadarSettings","Json":{"description":"Configuration for Radar Unit.","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":4800,"Name":"No activity monitor","Json":{"description":"Send alarms when no activity is detected.","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":"LastDateTimeRead","Json":"{\"name\":\"LastDateTimeRead\",\"default\":\"\",\"description\":\"Date time of last parameter read.\",\"type\":\"datetime\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":1}","Default":"","Command":null,"ProtocolActionObjects":[],"Tags":[]},{"Id":6625,"Group":{"Id":4524,"Name":"ReadFromDevice","Json":{"description":"Contains values downloaded from the device.","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":4207,"Name":"Feature","Json":{"description":"All AeroSense Features","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":4208,"Name":"RadarSettings","Json":{"description":"Configuration for Radar Unit.","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":4800,"Name":"No activity monitor","Json":{"description":"Send alarms when no activity is detected.","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":"FirmwareRead","Json":"{\"name\":\"FirmwareRead\",\"default\":\"\",\"description\":\"Firmware read from the device.\",\"type\":\"text\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"Tags":[]},{"Id":6798,"Group":{"Id":4524,"Name":"ReadFromDevice","Json":{"description":"Contains values downloaded from the device.","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":4207,"Name":"Feature","Json":{"description":"All AeroSense Features","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":4208,"Name":"RadarSettings","Json":{"description":"Configuration for Radar Unit.","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":4800,"Name":"No activity monitor","Json":{"description":"Send alarms when no activity is detected.","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":"EnableHeatMapRead","Json":"{\"name\":\"EnableHeatMapRead\",\"default\":\"\",\"description\":\"Enable Heatmap state read from device.\",\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":6}","Default":"false","Command":null,"ProtocolActionObjects":[],"Tags":[]},{"Id":6797,"Group":{"Id":4524,"Name":"ReadFromDevice","Json":{"description":"Contains values downloaded from the device.","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":4207,"Name":"Feature","Json":{"description":"All AeroSense Features","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":4208,"Name":"RadarSettings","Json":{"description":"Configuration for Radar Unit.","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":4800,"Name":"No activity monitor","Json":{"description":"Send alarms when no activity is detected.","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":"InvadeDetectionRead","Json":"{\"name\":\"InvadeDetectionRead\",\"default\":\"false\",\"description\":\"Activity monitoring state read from device.\",\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":8}","Default":"true","Command":null,"ProtocolActionObjects":[],"Tags":[]},{"Id":6796,"Group":{"Id":4524,"Name":"ReadFromDevice","Json":{"description":"Contains values downloaded from the device.","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":4207,"Name":"Feature","Json":{"description":"All AeroSense Features","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":4208,"Name":"RadarSettings","Json":{"description":"Configuration for Radar Unit.","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":4800,"Name":"No activity monitor","Json":{"description":"Send alarms when no activity is detected.","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":"EnableMachineLearningRead","Json":"{\"name\":\"EnableMachineLearningRead\",\"default\":\"false\",\"description\":\"Enable Machine Learning state read from device.\",\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":7}","Default":"true","Command":null,"ProtocolActionObjects":[],"Tags":[]},{"Id":7394,"Group":{"Id":4800,"Name":"No activity monitor","Json":{"description":"Send alarms when no activity is detected.","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":4207,"Name":"Feature","Json":{"description":"All AeroSense Features","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":4208,"Name":"RadarSettings","Json":{"description":"Configuration for Radar Unit.","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":4524,"Name":"ReadFromDevice","Json":{"description":"Contains values downloaded from the device.","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 No activity monitor","Json":"{\"name\":\"Enable Disable No activity monitor\",\"default\":\"true\",\"description\":\"Enable no Activity Monitor\",\"type\":\"enable\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"If enabled server will send alerts when no activity is detected for the timespan set.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"true","Command":null,"ProtocolActionObjects":[],"Tags":[]},{"Id":7395,"Group":{"Id":4800,"Name":"No activity monitor","Json":{"description":"Send alarms when no activity is detected.","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":4207,"Name":"Feature","Json":{"description":"All AeroSense Features","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":4208,"Name":"RadarSettings","Json":{"description":"Configuration for Radar Unit.","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":4524,"Name":"ReadFromDevice","Json":{"description":"Contains values downloaded from the device.","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":"No Activity","Json":"{\"name\":\"No Activity\",\"default\":\"\",\"description\":\"No Activity Interval (minutes)\",\"type\":\"number\",\"suffix\":null,\"prefix\":null,\"min\":1,\"max\":60,\"futureOnly\":false,\"integerOnly\":true,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Set the no activity monitor to send an alert if no message has been received for the time frame set in minutes.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"Tags":[]},{"Id":6624,"Group":{"Id":4524,"Name":"ReadFromDevice","Json":{"description":"Contains values downloaded from the device.","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"ReadAll","Json":"{\"name\":\"ReadAll\",\"default\":\"\",\"description\":\"Read values from Device.\",\"type\":\"button\",\"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":{"Id":3058,"Protocol":{"Id":160,"Code":"AeroSense","Version":"0.2","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"GetAll","TemplateSMS":null,"Template":null,"AckTemplate":null,"Operation":"// configs to send on all read only items\n// they will turn amber\n// on return ack individual items\n// auto ack read all button","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":false,"HexString":false,"SendAttempts":1,"Order":null},"ProtocolActionObjects":[],"Tags":[]},{"Id":6624,"Group":{"Id":4524,"Name":"ReadFromDevice","Json":{"description":"Contains values downloaded from the device.","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"ReadAll","Json":"{\"name\":\"ReadAll\",\"default\":\"\",\"description\":\"Read values from Device.\",\"type\":\"button\",\"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":{"Id":2704,"Protocol":{"Id":160,"Code":"AeroSense","Version":"0.2","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"GetFirmware","TemplateSMS":null,"Template":"1201000200000000000000000006001300000000","AckTemplate":null,"Operation":"// write your code here...","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":1,"Order":null},"ProtocolActionObjects":[],"Tags":[]},{"Id":6624,"Group":{"Id":4524,"Name":"ReadFromDevice","Json":{"description":"Contains values downloaded from the device.","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"ReadAll","Json":"{\"name\":\"ReadAll\",\"default\":\"\",\"description\":\"Read values from Device.\",\"type\":\"button\",\"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":{"Id":2821,"Protocol":{"Id":160,"Code":"AeroSense","Version":"0.2","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"GetEnableHeatMap","TemplateSMS":null,"Template":"1201000200000000000000000006000d00000000","AckTemplate":null,"Operation":"// write your code here...","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":null},"ProtocolActionObjects":[],"Tags":[]},{"Id":6624,"Group":{"Id":4524,"Name":"ReadFromDevice","Json":{"description":"Contains values downloaded from the device.","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"ReadAll","Json":"{\"name\":\"ReadAll\",\"default\":\"\",\"description\":\"Read values from Device.\",\"type\":\"button\",\"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":{"Id":2822,"Protocol":{"Id":160,"Code":"AeroSense","Version":"0.2","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"GetEnableMachineLearning","TemplateSMS":null,"Template":"1201000200000000000000000006001600000000","AckTemplate":null,"Operation":"// write your code here...","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":true,"SendAttempts":4,"Order":null},"ProtocolActionObjects":[],"Tags":[]}],"ProtocolChanges":[{"Version":"0.2","UserName":"Sean-Admin","Resource":"GroupParam","Name":"ReadAll","Message":"(Update) (ReadAll) setting getAll command\n","Timestamp":1688729222},{"Version":"0.2","UserName":"Sean-Admin","Resource":"GroupParam","Name":"ReadAll","Message":"Associate groupParam ReadAll to command GetAll","Timestamp":1688729227},{"Version":"0.2","UserName":"Sean-Admin","Resource":"Command","Name":"GetAll","Message":"(Update) (GetAll) set GetAllto Ack","Timestamp":1688729273},{"Version":"0.2","UserName":"Sean-Admin","Resource":"Command","Name":"GetAll","Message":"(Update) (GetAll) Direct ack for GetAll button","Timestamp":1688729504},{"Version":"0.2","UserName":"Sean-Admin","Resource":"Command","Name":"GetAll","Message":"(Update) (GetAll) trying different ack","Timestamp":1688732397},{"Version":"0.2","UserName":"Sean-Admin","Resource":"GroupParam","Name":"ReadAll","Message":"(Update) (ReadAll) ReadAll to GetFirmware","Timestamp":1688998381},{"Version":"0.2","UserName":"Sean-Admin","Resource":"GroupParam","Name":"ReadAll","Message":"Associate groupParam ReadAll to command GetFirmware","Timestamp":1688998387},{"Version":"0.2","UserName":"Sean-Admin","Resource":"GroupParam","Name":"ReadAll","Message":"Dissociate groupParam ReadAll from command GetAll","Timestamp":1688998390},{"Version":"0.2","UserName":"Sean-Admin","Resource":"Operation","Name":"AeroSense","Message":"(Update) (AeroSense) ReadAll ack development\n","Timestamp":1689160500},{"Version":"0.2","UserName":"Sean-Admin","Resource":"Operation","Name":"AeroSense","Message":"(Update) (AeroSense) ReadAll ack\n","Timestamp":1689160878},{"Version":"0.2","UserName":"Sean-Admin","Resource":"Operation","Name":"AeroSense","Message":"(Update) (AeroSense) ReadAll ack","Timestamp":1689161014},{"Version":"0.2","UserName":"Sean-Admin","Resource":"Command","Name":"GetWorkHeight","Message":"(Update) (GetWorkHeight) readall ack","Timestamp":1689161144},{"Version":"0.2","UserName":"Sean-Admin","Resource":"Operation","Name":"AeroSense","Message":"(Update) (AeroSense) ReadAll ack sendconfig test","Timestamp":1689161661},{"Version":"0.2","UserName":"Sean-Admin","Resource":"Operation","Name":"AeroSense","Message":"(Update) (AeroSense) testing configsToSend","Timestamp":1689162094},{"Version":"0.2","UserName":"Sean-Admin","Resource":"GroupParam","Name":"WorkHeightRead","Message":"(Update) (WorkHeightRead) testing sendconfig","Timestamp":1689162205},{"Version":"0.2","UserName":"Sean-Admin","Resource":"Operation","Name":"AeroSense","Message":"(Update) (AeroSense) sendconfig test","Timestamp":1689162388},{"Version":"0.2","UserName":"Sean-Admin","Resource":"Operation","Name":"AeroSense","Message":"(Update) (AeroSense) configsToSend test","Timestamp":1689162745},{"Version":"0.2","UserName":"Sean-Admin","Resource":"Operation","Name":"AeroSense","Message":"(Update) (AeroSense) reverting configsToSend","Timestamp":1689162937},{"Version":"0.2","UserName":"Sean-Admin","Resource":"MessageType","Name":"COMM-LOG","Message":"(Delete) (COMM-LOG)","Timestamp":1689772836},{"Version":"0.2","UserName":"Sean-Admin","Resource":"GroupParam","Name":"ReadAll","Message":"(Update) (ReadAll) enabling all read commands","Timestamp":1689773141},{"Version":"0.2","UserName":"Sean-Admin","Resource":"GroupParam","Name":"ReadAll","Message":"Associate groupParam ReadAll to command GetEnableHeatMap","Timestamp":1689773145},{"Version":"0.2","UserName":"Sean-Admin","Resource":"GroupParam","Name":"ReadAll","Message":"Associate groupParam ReadAll to command GetEnableMachineLearning","Timestamp":1689773149}],"ProtocolActionObjects":[],"Tags":[]} \ No newline at end of file