diff --git a/vga b/vga index 21b1e04..f42aeb5 100644 --- a/vga +++ b/vga @@ -1 +1 @@ -{"Id":206,"Name":null,"Description":null,"FirmwareVersion":"","InProgress":false,"MessageTypes":[{"Id":6005,"Code":"MACB","Name":null,"MessageCode":null,"NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"VGA-<>;<>;mid=<>;MACB=<>,<>;LOTH=<>,<>,<>,<>,<>,<>;NET=<>;BATP=<>;BATPB=<>;TEMPB=<>;TIME=<>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<>;OK;[0a]","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":true,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^VGA-[^;]*;[^;;]*;mid=[^;;]*;MACB=[^,;]*,[^;,]*;LOTH=[^,;]*,[^,,]*,[^,,]*,[^,,]*,[^,,]*,[^;,]*;NET=[^;;]*;BATP=[^;;]*;BATPB=[^;;]*;TEMPB=[^;;]*;TIME=[^;;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6006,"Code":"CYC","Name":null,"MessageCode":null,"NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":true,"Type":0,"Template":"VGA-<>;<>;mid=<>;CYC;LOTH=<>,<>,<>,<>,<>,<>;NET=<>;BATP=<>;BATPB=<>;TEMPB=<>;TIME=<>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<>;OK;[0a]","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":true,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^VGA-[^;]*;[^;;]*;mid=[^;;]*;CYC;LOTH=[^,;]*,[^,,]*,[^,,]*,[^,,]*,[^,,]*,[^;,]*;NET=[^;;]*;BATP=[^;;]*;BATPB=[^;;]*;TEMPB=[^;;]*;TIME=[^;;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":6006,\"Code\":\"CYC\",\"Name\":null,\"MessageCode\":\"CYC\",\"NeedAck\":true,\"IsAck\":false,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":true,\"Type\":0,\"Template\":\"VGA-<>;<>;mid=<>;CYC;LOTH=<>,<>,<>,<>,<>,<>;NET=<>;BATP=<>;BATPB=<>;TEMPB=<>;TIME=<>;\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":\"ACK-MSG;<>;OK;[0a]\",\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":true,\"ScaipH\":false,\"DoNotSendCommands\":false,\"Command\":null,\"CacheImei\":false,\"RegEx\":\"^VGA-[^;]*;[^;;]*;mid=[^;;]*;CYC;LOTH=[^,;]*,[^,,]*,[^,,]*,[^,,]*,[^,,]*,[^;,]*;NET=[^;;]*;BATP=[^;;]*;BATPB=[^;;]*;TEMPB=[^;;]*;TIME=[^;;]*;\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1712654533}],"Tags":[]},{"Id":6007,"Code":"ENC","Name":"Encrypted","MessageCode":null,"NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"VGA-<>;<>;mid=<>;enc=<>;$$","HasTemplateGlobal":false,"ResponseTemplate":"<>","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":true,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^VGA-[^;]*;[^;;]*;mid=[^;;]*;enc=[^;;]*;$","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6008,"Code":"PWRF","Name":"Power off","MessageCode":null,"NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"VGA-<>;<>;mid=<>;PWRF;LOTH=<>,<>,<>,<>,<>,<>;NET=<>;BATP=<>;BATPB=<>;TEMPB=<>;TIME=<>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<>;OK;[0a]","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":true,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^VGA-[^;]*;[^;;]*;mid=[^;;]*;PWRF;LOTH=[^,;]*,[^,,]*,[^,,]*,[^,,]*,[^,,]*,[^;,]*;NET=[^;;]*;BATP=[^;;]*;BATPB=[^;;]*;TEMPB=[^;;]*;TIME=[^;;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6009,"Code":"PWRN","Name":"Power on","MessageCode":null,"NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"VGA-<>;<>;mid=<>;PWRN;LOTH=<>,<>,<>,<>,<>,<>;NET=<>;BATP=<>;BATPB=<>;TEMPB=<>;TIME=<>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<>;OK;[0a]","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":true,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^VGA-[^;]*;[^;;]*;mid=[^;;]*;PWRN;LOTH=[^,;]*,[^,,]*,[^,,]*,[^,,]*,[^,,]*,[^;,]*;NET=[^;;]*;BATP=[^;;]*;BATPB=[^;;]*;TEMPB=[^;;]*;TIME=[^;;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6010,"Code":"ALNM","Name":null,"MessageCode":null,"NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":1,"Template":"VGA-<>;<>;mid=<>;ALNM;LOTH=<>,<>,<>,<>,<>,<>;NET=<>;BATP=<>;BATPB=<>;TEMPB=<>;TIME=<>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<>;OK;[0a]","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":true,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^VGA-[^;]*;[^;;]*;mid=[^;;]*;ALNM;LOTH=[^,;]*,[^,,]*,[^,,]*,[^,,]*,[^,,]*,[^;,]*;NET=[^;;]*;BATP=[^;;]*;BATPB=[^;;]*;TEMPB=[^;;]*;TIME=[^;;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6011,"Code":"BATCN","Name":null,"MessageCode":null,"NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"VGA-<>;<>;mid=<>;BATCN;LOTH=<>,<>,<>,<>,<>,<>;NET=<>;BATP=<>;BATPB=<>;TEMPB=<>;TIME=<>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<>;OK;[0a]","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":true,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^VGA-[^;]*;[^;;]*;mid=[^;;]*;BATCN;LOTH=[^,;]*,[^,,]*,[^,,]*,[^,,]*,[^,,]*,[^;,]*;NET=[^;;]*;BATP=[^;;]*;BATPB=[^;;]*;TEMPB=[^;;]*;TIME=[^;;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6012,"Code":"BATCF","Name":null,"MessageCode":null,"NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"VGA-<>;<>;mid=<>;BATCF;LOTH=<>,<>,<>,<>,<>,<>;NET=<>;BATP=<>;BATPB=<>;TEMPB=<>;TIME=<>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<>;OK;[0a]","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":true,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^VGA-[^;]*;[^;;]*;mid=[^;;]*;BATCF;LOTH=[^,;]*,[^,,]*,[^,,]*,[^,,]*,[^,,]*,[^;,]*;NET=[^;;]*;BATP=[^;;]*;BATPB=[^;;]*;TEMPB=[^;;]*;TIME=[^;;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6013,"Code":"BATE","Name":null,"MessageCode":null,"NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":2,"Template":"VGA-<>;<>;mid=<>;BATE;LOTH=<>,<>,<>,<>,<>,<>;NET=<>;BATP=<>;BATPB=<>;TEMPB=<>;TIME=<>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<>;OK;[0a]","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":true,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^VGA-[^;]*;[^;;]*;mid=[^;;]*;BATE;LOTH=[^,;]*,[^,,]*,[^,,]*,[^,,]*,[^,,]*,[^;,]*;NET=[^;;]*;BATP=[^;;]*;BATPB=[^;;]*;TEMPB=[^;;]*;TIME=[^;;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6014,"Code":"BATL","Name":"Battery Low","MessageCode":null,"NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"VGA-<>;<>;mid=<>;BATL;LOTH=<>,<>,<>,<>,<>,<>;NET=<>;BATP=<>;BATPB=<>;TEMPB=<>;TIME=<>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<>;OK;[0a]","TemplateGlobal":"","LongConnection":false,"HexString":false,"AckFirst":true,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^VGA-[^;]*;[^;;]*;mid=[^;;]*;BATL;LOTH=[^,;]*,[^,,]*,[^,,]*,[^,,]*,[^,,]*,[^;,]*;NET=[^;;]*;BATP=[^;;]*;BATPB=[^;;]*;TEMPB=[^;;]*;TIME=[^;;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6015,"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":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"\\+RESP:NACT,[^,]*,[^\\$,]*\\$","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6016,"Code":"completed","Name":"ACK command","MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"ACK-CMD;<>;<>;OK;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^ACK-CMD;[^;]*;[^;;]*;OK;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6017,"Code":"received","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"ACK-CMD;<>;<>;RCVD;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^ACK-CMD;[^;]*;[^;;]*;RCVD;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6018,"Code":"error","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"ACK-CMD;<>;<>;ERR;<>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^ACK-CMD;[^;]*;[^;;]*;ERR;[^;;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6019,"Code":"DISCONB","Name":null,"MessageCode":null,"NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":2,"Template":"VGA-<>;<>;mid=<>;DISCONB;LOTH=<>,<>,<>,<>,<>,<>;NET=<>;BATP=<>;BATPB=<>;TEMPB=<>;TIME=<>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<>;OK;[0a]","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":true,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^VGA-[^;]*;[^;;]*;mid=[^;;]*;DISCONB;LOTH=[^,;]*,[^,,]*,[^,,]*,[^,,]*,[^,,]*,[^;,]*;NET=[^;;]*;BATP=[^;;]*;BATPB=[^;;]*;TEMPB=[^;;]*;TIME=[^;;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6020,"Code":"IS_ACTIVATED","Name":null,"MessageCode":null,"NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"VGA-<>;<>;mid=<>;IS_ACTIVATED;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<>;OK;[0a]","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":true,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^VGA-[^;]*;[^;;]*;mid=[^;;]*;IS_ACTIVATED;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6021,"Code":"ALTAM","Name":null,"MessageCode":null,"NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":1,"Template":"VGA-<>;<>;mid=<>;ALTAM;LOTH=<>,<>,<>,<>,<>,<>;NET=<>;BATP=<>;BATPB=<>;TEMPB=<>;TIME=<>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<>;OK;[0a]","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":true,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^VGA-[^;]*;[^;;]*;mid=[^;;]*;ALTAM;LOTH=[^,;]*,[^,,]*,[^,,]*,[^,,]*,[^,,]*,[^;,]*;NET=[^;;]*;BATP=[^;;]*;BATPB=[^;;]*;TEMPB=[^;;]*;TIME=[^;;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6022,"Code":"ATEMPB","Name":null,"MessageCode":null,"NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":1,"Template":"VGA-<>;<>;mid=<>;ATEMPB;LOTH=<>,<>,<>,<>,<>,<>;NET=<>;BATP=<>;BATPB=<>;TEMPB=<>;TIME=<>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<>;OK;[0a]","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":true,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^VGA-[^;]*;[^;;]*;mid=[^;;]*;ATEMPB;LOTH=[^,;]*,[^,,]*,[^,,]*,[^,,]*,[^,,]*,[^;,]*;NET=[^;;]*;BATP=[^;;]*;BATPB=[^;;]*;TEMPB=[^;;]*;TIME=[^;;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6023,"Code":"ALNMB","Name":null,"MessageCode":null,"NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":1,"Template":"VGA-<>;<>;mid=<>;ALNMB;LOTH=<>,<>,<>,<>,<>,<>;NET=<>;BATP=<>;BATPB=<>;TEMPB=<>;TIME=<>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<>;OK;[0a]","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":true,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^VGA-[^;]*;[^;;]*;mid=[^;;]*;ALNMB;LOTH=[^,;]*,[^,,]*,[^,,]*,[^,,]*,[^,,]*,[^;,]*;NET=[^;;]*;BATP=[^;;]*;BATPB=[^;;]*;TEMPB=[^;;]*;TIME=[^;;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6024,"Code":"BATEB","Name":null,"MessageCode":null,"NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":2,"Template":"VGA-<>;<>;mid=<>;BATEB;LOTH=<>,<>,<>,<>,<>,<>;NET=<>;BATP=<>;BATPB=<>;TEMPB=<>;TIME=<>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<>;OK;[0a]","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":true,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^VGA-[^;]*;[^;;]*;mid=[^;;]*;BATEB;LOTH=[^,;]*,[^,,]*,[^,,]*,[^,,]*,[^,,]*,[^;,]*;NET=[^;;]*;BATP=[^;;]*;BATPB=[^;;]*;TEMPB=[^;;]*;TIME=[^;;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6025,"Code":"BATLB","Name":null,"MessageCode":null,"NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"VGA-<>;<>;mid=<>;BATLB;LOTH=<>,<>,<>,<>,<>,<>;NET=<>;BATP=<>;BATPB=<>;TEMPB=<>;TIME=<>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<>;OK;[0a]","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":true,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^VGA-[^;]*;[^;;]*;mid=[^;;]*;BATLB;LOTH=[^,;]*,[^,,]*,[^,,]*,[^,,]*,[^,,]*,[^;,]*;NET=[^;;]*;BATP=[^;;]*;BATPB=[^;;]*;TEMPB=[^;;]*;TIME=[^;;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6026,"Code":"COMM","Name":null,"MessageCode":null,"NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"<<->>VGA-001-Invent<<->>\"Imei\":\"<>\",<<->>","HasTemplateGlobal":false,"ResponseTemplate":"OK","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":true,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^[^ ]*VGA-001-Invent[^ ]*\"Imei\":\"[^\"]*\",[^ ]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6027,"Code":"REGISTER","Name":null,"MessageCode":null,"NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"VGA-<>;<>;mid=<>;REGISTER=<>,<>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<>;OK;[0a]","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":true,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^VGA-[^;]*;[^;;]*;mid=[^;;]*;REGISTER=[^,;]*,[^;,]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6028,"Code":"CREATE","Name":null,"MessageCode":null,"NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"VGA-<>;<>;mid=<>;CREATE=<>,<>,<>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<>;OK;[0a]","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^VGA-[^;]*;[^;;]*;mid=[^;;]*;CREATE=[^,;]*,[^,,]*,[^;,]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6029,"Code":"COMM","Name":null,"MessageCode":null,"NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"<<->>\"Imei\":\"<>\"<<->>","HasTemplateGlobal":false,"ResponseTemplate":"OK","TemplateGlobal":"<<->>VGV-001-Invent<<->>","LongConnection":false,"HexString":false,"AckFirst":true,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^[^ ]*\"Imei\":\"[^\"]*\"[^ ]*","RegExGlobal":"^[^ ]*VGV-001-Invent[^ ]*","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6030,"Code":"CONNB","Name":null,"MessageCode":null,"NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"VGA-<>;<>;mid=<>;CONNB;LOTH=<>,<>,<>,<>,<>,<>;NET=<>;BATP=<>;BATPB=<>;TEMPB=<>;TIME=<>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<>;OK;[0a]","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":true,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^VGA-[^;]*;[^;;]*;mid=[^;;]*;CONNB;LOTH=[^,;]*,[^,,]*,[^,,]*,[^,,]*,[^,,]*,[^;,]*;NET=[^;;]*;BATP=[^;;]*;BATPB=[^;;]*;TEMPB=[^;;]*;TIME=[^;;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6031,"Code":"NOTEREAD","Name":null,"MessageCode":null,"NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"VGA-<>;<>;mid=<>;NOTEREAD=<>;LOTH=<>,<>,<>,<>,<>,<>;NET=<>;BATP=<>;BATPB=<>;TEMPB=<>;TIME=<>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<>;OK;[0a]","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":true,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^VGA-[^;]*;[^;;]*;mid=[^;;]*;NOTEREAD=[^;;]*;LOTH=[^,;]*,[^,,]*,[^,,]*,[^,,]*,[^,,]*,[^;,]*;NET=[^;;]*;BATP=[^;;]*;BATPB=[^;;]*;TEMPB=[^;;]*;TIME=[^;;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6032,"Code":"ALLDATA","Name":null,"MessageCode":"INFO","NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"VGA-<>;<>;mid=<>;ALLDATA=<>;LOTH=<>,<>,<>,<>,<>,<>;NET=<>;BATP=<>;BATPB=<>;TEMPB=<>;TIME=<>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<>;OK;[0a]","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^VGA-[^;]*;[^;;]*;mid=[^;;]*;ALLDATA=[^;;]*;LOTH=[^,;]*,[^,,]*,[^,,]*,[^,,]*,[^,,]*,[^;,]*;NET=[^;;]*;BATP=[^;;]*;BATPB=[^;;]*;TEMPB=[^;;]*;TIME=[^;;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":6032,\"Code\":\"ALLDATA\",\"Name\":null,\"MessageCode\":\"INFO\",\"NeedAck\":true,\"IsAck\":false,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"VGA-<>;<>;mid=<>;ALLDATA=<>;LOTH=<>,<>,<>,<>,<>,<>;NET=<>;BATP=<>;BATPB=<>;TEMPB=<>;TIME=<>;\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":\"ACK-MSG;<>;OK;[0a]\",\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":true,\"Command\":null,\"CacheImei\":false,\"RegEx\":\"^VGA-[^;]*;[^;;]*;mid=[^;;]*;ALLDATA=[^;;]*;LOTH=[^,;]*,[^,,]*,[^,,]*,[^,,]*,[^,,]*,[^;,]*;NET=[^;;]*;BATP=[^;;]*;BATPB=[^;;]*;TEMPB=[^;;]*;TIME=[^;;]*;\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1710246258},{"Type":1,"NewValue":"{\"Id\":6032,\"Code\":\"ALLDATA\",\"Name\":null,\"MessageCode\":\"INFO\",\"NeedAck\":true,\"IsAck\":false,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"VGA-<>;<>;mid=<>;ALLDATA=<>;LOTH=<>,<>,<>,<>,<>,<>;NET=<>;BATP=<>;BATPB=<>;TEMPB=<>;TIME=<>;\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":\"ACK-MSG;<>;OK;[0a]\",\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":true,\"Command\":null,\"CacheImei\":false,\"RegEx\":\"^VGA-[^;]*;[^;;]*;mid=[^;;]*;ALLDATA=[^;;]*;LOTH=[^,;]*,[^,,]*,[^,,]*,[^,,]*,[^,,]*,[^;,]*;NET=[^;;]*;BATP=[^;;]*;BATPB=[^;;]*;TEMPB=[^;;]*;TIME=[^;;]*;\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1712654568}],"Tags":[]},{"Id":7433,"Code":"GETPWB","Name":null,"MessageCode":"GETPWB","NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"VGA-<>;<>;mid=<>;GETPWB=<>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-PW;<>;<>;LF","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^VGA-[^;]*;[^;;]*;mid=[^;;]*;GETPWB=[^;;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":7433,\"Code\":\"GETPWB\",\"Name\":null,\"MessageCode\":\"GETPWB\",\"NeedAck\":true,\"IsAck\":false,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"VGA-<>;<>;mid=<>;GETPWB=<>;\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":\"ACK-PW;<>;<>;LF\",\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":false,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":null,\"CacheImei\":false,\"RegEx\":\"^VGA-[^;]*;[^;;]*;mid=[^;;]*;GETPWB=[^;;]*;\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1741968756},{"Type":1,"NewValue":"{\"Id\":7433,\"Code\":\"GETPWB\",\"Name\":null,\"MessageCode\":\"GETPWB\",\"NeedAck\":true,\"IsAck\":false,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"VGA-<>;<>;mid=<>;GETPWB=<>;\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":\"ACK-PW;<>;<>;LF\",\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":true,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":null,\"CacheImei\":false,\"RegEx\":\"^VGA-[^;]*;[^;;]*;mid=[^;;]*;GETPWB=[^;;]*;\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1742312695}],"Tags":[]},{"Id":7903,"Code":"INFO-GETPWB","Name":null,"MessageCode":"INFO","NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"VGA-<>;<>;mid=<>;GETPWB=<>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-PW;<>;<>;LF","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^VGA-[^;]*;[^;;]*;mid=[^;;]*;GETPWB=[^;;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":7903,\"Code\":\"INFO-GETPWB\",\"Name\":null,\"MessageCode\":\"INFO\",\"NeedAck\":true,\"IsAck\":false,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"VGA-<>;<>;mid=<>;GETPWB=<>;\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":\"ACK-PW;<>;<>;LF\",\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":true,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":null,\"CacheImei\":false,\"RegEx\":\"^VGA-[^;]*;[^;;]*;mid=[^;;]*;GETPWB=[^;;]*;\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1742382959},{"Type":1,"NewValue":"{\"Id\":7903,\"Code\":\"INFO-GETPWB\",\"Name\":null,\"MessageCode\":\"INFO\",\"NeedAck\":true,\"IsAck\":false,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"VGA-<>;<>;mid=<>;GETPWB=<>;\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":\"ACK-PW;<>;<>;OK;[0a]\",\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":true,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":null,\"CacheImei\":false,\"RegEx\":\"^VGA-[^;]*;[^;;]*;mid=[^;;]*;GETPWB=[^;;]*;\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1742386996},{"Type":1,"NewValue":"{\"Id\":7903,\"Code\":\"INFO-GETPWB\",\"Name\":null,\"MessageCode\":\"INFO\",\"NeedAck\":true,\"IsAck\":false,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"VGA-<>;<>;mid=<>;GETPWB=<>;\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":\"ACK-PW;<>;<>;OK;[0a]\",\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":true,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":null,\"CacheImei\":false,\"RegEx\":\"^VGA-[^;]*;[^;;]*;mid=[^;;]*;GETPWB=[^;;]*;\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1744202928},{"Type":1,"NewValue":"{\"Id\":7903,\"Code\":\"INFO-GETPWB\",\"Name\":null,\"MessageCode\":\"INFO\",\"NeedAck\":true,\"IsAck\":false,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"VGA-<>;<>;mid=<>;GETPWB=<>;\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":\"ACK-PW;<>;<>;OK;[0a]\",\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":true,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":null,\"CacheImei\":false,\"RegEx\":\"^VGA-[^;]*;[^;;]*;mid=[^;;]*;GETPWB=[^;;]*;\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1744203836}],"Tags":[]}],"Commands":[{"Id":4122,"Name":"Cycle Interval","TemplateSMS":"VGCMD-001;<>;<>;","Template":"VGCMD-001;<>;<>;[0a]","AckTemplate":null,"Operation":"var command = \"CYCCONFIG=\" + params.CycleInterval.CycleInterval;\nvar configs = [];\nvar configsSMS = []; // for sms template\nsequenceNumber = (new Date().getTime()).toString(36);\nvar part1 = \"update=\" + sequenceNumber;\nconst _crypto = require('crypto');\nif (params.Password.Password === \"\") {\n var password = serverParams.Imei;\n} else {\n var password = params.Password.Password;\n}\nif (params.Password.encryption === \"true\") {\n var part2 = encrypt(command, part1, password);\n} else {\n var part2 = command;\n}\nAddValue(\"part1\", part1);\nAddValue(\"part2\", part2);\nAddValue(\"sequenceNumber\", sequenceNumber);\nAddValueSMS(\"part1\", part1); //for sms template\nAddValueSMS(\"part2\", part2); // for sms template\nAddValueSMS(\"sequenceNumber\", sequenceNumber); // for sms template\nvar commandConfigs = {\n template: \"main\",\n configs: configs,\n configsSMS: configsSMS //for sms template\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValueSMS(p1, p2) { //function for sms template\n var cvpair = {\n code: p1,\n value: p2\n };\n configsSMS.push(cvpair);\n}\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction encrypt(text, mid, password) {\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\n const iv = _crypto.randomBytes(16); // random initialization vector\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\n // set the cipher\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\n // encrypt text\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\n // generate output ( encrypted text )\n return Buffer.concat([iv, encrypted]).toString('base64');\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":false,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4122,\"Name\":\"Cycle Interval\",\"TemplateSMS\":\"VGCMD-001;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"var command = \\\"CYCCONFIG=\\\" + params.CycleInterval.CycleInterval;\\nvar configs = [];\\nvar configsSMS = []; // for sms template\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nconst _crypto = require('crypto');\\nvar password = params.Password.Password;\\nif (password === \\\"\\\") {\\n var part2 = command;\\n} else {\\n var part2 = \\\"enc=\\\" + encrypt(command, part1, password);\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nAddValueSMS(\\\"part1\\\", part1); //for sms template\\nAddValueSMS(\\\"part2\\\", part2); // for sms template\\nAddValueSMS(\\\"sequenceNumber\\\", sequenceNumber); // for sms template\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs,\\n configsSMS: configsSMS //for sms template\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValueSMS(p1, p2) { //function for sms template\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configsSMS.push(cvpair);\\n}\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716290163}],"Tags":[]},{"Id":4121,"Name":"Device Activated","TemplateSMS":"OCA-CMD;<>;<>;","Template":"VGCMD-001;<>;<>;[0a]","AckTemplate":null,"Operation":"var command = \"ACTIVATED_FAIL=Unkonwn Failure.\";\nif (params.DeviceConfig.IVActivated == \"true\") {\n command = \"ACTIVATED_OK\";\n} else {\n command = \"ACTIVATED_FAIL=\" + params.DeviceConfig.IVActivatedFailMessage;\n}\nvar configs = [];\nsequenceNumber = (new Date().getTime()).toString(36);\nvar part1 = \"update=\" + sequenceNumber;\nconst _crypto = require('crypto');\nif (params.Password.Password === \"\") {\n var password = serverParams.Imei;\n} else {\n var password = params.Password.Password;\n}\nif (params.Password.encryption === \"true\") {\n var part2 = encrypt(command, part1, password);\n} else {\n var part2 = command;\n}\nAddValue(\"part1\", part1);\nAddValue(\"part2\", part2);\nAddValue(\"sequenceNumber\", sequenceNumber);\nvar commandConfigs = {\n template: \"main\",\n configs: configs\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction encrypt(text, mid, password) {\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\n const iv = _crypto.randomBytes(16); // random initialization vector\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\n // set the cipher\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\n // encrypt text\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\n // generate output ( encrypted text )\n return Buffer.concat([iv, encrypted]).toString('base64');\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":false,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4121,\"Name\":\"Device Activated\",\"TemplateSMS\":\"OCA-CMD;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"var command = \\\"ACTIVATED_FAIL=Unkonwn Failure.\\\";\\nif (params.DeviceConfig.IVActivated == \\\"true\\\") {\\n command = \\\"ACTIVATED_OK\\\";\\n} else {\\n command = \\\"ACTIVATED_FAIL=\\\" + params.DeviceConfig.IVActivatedFailMessage;\\n}\\nvar configs = [];\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nconst _crypto = require('crypto');\\nvar password = params.Password.Password;\\nif (password === \\\"\\\") {\\n var part2 = command;\\n} else {\\n var part2 = \\\"enc=\\\" + encrypt(command, part1, password);\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716290183},{"Type":1,"NewValue":"{\"Id\":4121,\"Name\":\"Device Activated\",\"TemplateSMS\":\"OCA-CMD;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"var command = \\\"ACTIVATED_FAIL=Unkonwn Failure.\\\";\\nif (params.DeviceConfig.IVActivated == \\\"true\\\") {\\n command = \\\"ACTIVATED_OK\\\";\\n} else {\\n command = \\\"ACTIVATED_FAIL=\\\" + params.DeviceConfig.IVActivatedFailMessage;\\n}\\nvar configs = [];\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nconst _crypto = require('crypto');\\nvar password = params.Password.Password;\\nif (password === \\\"\\\") {\\n var part2 = command;\\n} else {\\n var part2 = \\\"enc=\\\" + encrypt(command, part1, password);\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1718098112}],"Tags":[]},{"Id":4120,"Name":"Reset Bracelet","TemplateSMS":"OCA-CMD;<>;<>;","Template":"VGCMD-001;<>;<>;[0a]","AckTemplate":null,"Operation":"let command = \"RESETB\";\nvar configs = [];\nvar configsSMS = []; // for sms template\nsequenceNumber = (new Date().getTime()).toString(36);\nvar part1 = \"update=\" + sequenceNumber;\nconst _crypto = require('crypto');\nif (params.Password.Password === \"\") {\n var password = serverParams.Imei;\n} else {\n var password = params.Password.Password;\n}\nif (params.Password.encryption === \"true\") {\n var part2 = encrypt(command, part1, password);\n} else {\n var part2 = command;\n}\nAddValue(\"part1\", part1);\nAddValue(\"part2\", part2);\nAddValue(\"sequenceNumber\", sequenceNumber);\nAddValueSMS(\"part1\", part1); //for sms template\nAddValueSMS(\"part2\", part2); // for sms template\nAddValueSMS(\"sequenceNumber\", sequenceNumber); // for sms template\nvar commandConfigs = {\n template: \"main\",\n configs: configs,\n configsSMS: configsSMS //for sms template\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction AddValueSMS(p1, p2) { //function for sms template\n var cvpair = {\n code: p1,\n value: p2\n };\n configsSMS.push(cvpair);\n}\n\nfunction encrypt(text, mid, password) {\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\n const iv = _crypto.randomBytes(16); // random initialization vector\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\n // set the cipher\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\n // encrypt text\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\n // generate output ( encrypted text )\n return Buffer.concat([iv, encrypted]).toString('base64');\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":false,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4120,\"Name\":\"Reset Bracelet\",\"TemplateSMS\":\"OCA-CMD;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"let command = \\\"RESETB\\\";\\nvar configs = [];\\nvar configsSMS = []; // for sms template\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nconst _crypto = require('crypto');\\nvar password = params.Password.Password;\\nif (password === \\\"\\\") {\\n var part2 = command;\\n} else {\\n var part2 = \\\"enc=\\\" + encrypt(command, part1, password);\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nAddValueSMS(\\\"part1\\\", part1); //for sms template\\nAddValueSMS(\\\"part2\\\", part2); // for sms template\\nAddValueSMS(\\\"sequenceNumber\\\", sequenceNumber); // for sms template\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs,\\n configsSMS: configsSMS //for sms template\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction AddValueSMS(p1, p2) { //function for sms template\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configsSMS.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716290345}],"Tags":[]},{"Id":4119,"Name":"Set Config Enable","TemplateSMS":"VGCMD-001;<>;<>;","Template":"VGCMD-001;<>;<>;[0a]","AckTemplate":null,"Operation":"// write your code here...\nif (params.DeviceConfig.ConfigMode == \"true\") {\n enableConfig = 1;\n} else {\n enableConfig = \"0\";\n}\nvar command = \"CONFIG=\" + enableConfig;\nvar configs = [];\nvar configsSMS = []; // for sms template\nsequenceNumber = (new Date().getTime()).toString(36);\nvar part1 = \"update=\" + sequenceNumber;\nconst _crypto = require('crypto');\nif (params.Password.Password === \"\") {\n var password = serverParams.Imei;\n} else {\n var password = params.Password.Password;\n}\nif (params.Password.encryption === \"true\") {\n var part2 = encrypt(command, part1, password);\n} else {\n var part2 = command;\n}\nAddValue(\"part1\", part1);\nAddValue(\"part2\", part2);\nAddValue(\"sequenceNumber\", sequenceNumber);\nAddValueSMS(\"part1\", part1); //for sms template\nAddValueSMS(\"part2\", part2); // for sms template\nAddValueSMS(\"sequenceNumber\", sequenceNumber); // for sms template\nvar commandConfigs = {\n template: \"main\",\n configs: configs,\n configsSMS: configsSMS //for sms template\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValueSMS(p1, p2) { //function for sms template\n var cvpair = {\n code: p1,\n value: p2\n };\n configsSMS.push(cvpair);\n}\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction encrypt(text, mid, password) {\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\n const iv = _crypto.randomBytes(16); // random initialization vector\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\n // set the cipher\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\n // encrypt text\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\n // generate output ( encrypted text )\n return Buffer.concat([iv, encrypted]).toString('base64');\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":false,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4119,\"Name\":\"Set Config Enable\",\"TemplateSMS\":\"VGCMD-001;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"// write your code here...\\nif (params.DeviceConfig.ConfigMode == \\\"true\\\") {\\n enableConfig = 1;\\n} else {\\n enableConfig = \\\"0\\\";\\n}\\nvar command = \\\"CONFIG=\\\" + enableConfig;\\nvar configs = [];\\nvar configsSMS = []; // for sms template\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nconst _crypto = require('crypto');\\nvar password = params.Password.Password;\\nif (password === \\\"\\\") {\\n var part2 = command;\\n} else {\\n var part2 = \\\"enc=\\\" + encrypt(command, part1, password);\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nAddValueSMS(\\\"part1\\\", part1); //for sms template\\nAddValueSMS(\\\"part2\\\", part2); // for sms template\\nAddValueSMS(\\\"sequenceNumber\\\", sequenceNumber); // for sms template\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs,\\n configsSMS: configsSMS //for sms template\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValueSMS(p1, p2) { //function for sms template\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configsSMS.push(cvpair);\\n}\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716290410}],"Tags":[]},{"Id":4118,"Name":"NonMovement","TemplateSMS":"VGCMD-001;<>;<>;","Template":"VGCMD-001;<>;<>;[0a]","AckTemplate":null,"Operation":"if (params.NonMovement.EnableDisableNonMovement == \"true\") {\n var state = 1;\n} else {\n var state = \"0\";\n}\nvar command = \"ALNM=\" + state + \",\" + params.NonMovement.period;\nvar configs = [];\nvar configsSMS = []; // for sms template\nsequenceNumber = (new Date().getTime()).toString(36);\nvar part1 = \"update=\" + sequenceNumber;\nconst _crypto = require('crypto');\nif (params.Password.Password === \"\") {\n var password = serverParams.Imei;\n} else {\n var password = params.Password.Password;\n}\nif (params.Password.encryption === \"true\") {\n var part2 = encrypt(command, part1, password);\n} else {\n var part2 = command;\n}\nAddValue(\"part1\", part1);\nAddValue(\"part2\", part2);\nAddValue(\"sequenceNumber\", sequenceNumber);\nAddValueSMS(\"part1\", part1); //for sms template\nAddValueSMS(\"part2\", part2); // for sms template\nAddValueSMS(\"sequenceNumber\", sequenceNumber); // for sms template\nvar commandConfigs = {\n template: \"main\",\n configs: configs,\n configsSMS: configsSMS //for sms template\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction AddValueSMS(p1, p2) { //function for sms template\n var cvpair = {\n code: p1,\n value: p2\n };\n configsSMS.push(cvpair);\n}\n\nfunction encrypt(text, mid, password) {\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\n const iv = _crypto.randomBytes(16); // random initialization vector\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\n // set the cipher\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\n // encrypt text\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\n // generate output ( encrypted text )\n return Buffer.concat([iv, encrypted]).toString('base64');\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":false,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4118,\"Name\":\"NonMovement\",\"TemplateSMS\":\"VGCMD-001;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"if (params.NonMovement.EnableDisableNonMovement == \\\"true\\\") {\\n var state = 1;\\n} else {\\n var state = \\\"0\\\";\\n}\\nvar command = \\\"ALNM=\\\" + state + \\\",\\\" + params.NonMovement.period;\\nvar configs = [];\\nvar configsSMS = []; // for sms template\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nconst _crypto = require('crypto');\\nvar password = params.Password.Password;\\nif (password === \\\"\\\") {\\n var part2 = command;\\n} else {\\n var part2 = \\\"enc=\\\" + encrypt(command, part1, password);\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nAddValueSMS(\\\"part1\\\", part1); //for sms template\\nAddValueSMS(\\\"part2\\\", part2); // for sms template\\nAddValueSMS(\\\"sequenceNumber\\\", sequenceNumber); // for sms template\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs,\\n configsSMS: configsSMS //for sms template\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction AddValueSMS(p1, p2) { //function for sms template\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configsSMS.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716290205}],"Tags":[]},{"Id":4117,"Name":"SetLTEParam Bracelet","TemplateSMS":"OCA-CMD;<>;<>;","Template":"VGCMD-001;<>;<>;[0a]","AckTemplate":null,"Operation":"let command = \"LTEPAR=\" + params.Bracelet.LTEParam;\nvar configs = [];\nvar configsSMS = []; // for sms template\nsequenceNumber = (new Date().getTime()).toString(36);\nvar part1 = \"update=\" + sequenceNumber;\nconst _crypto = require('crypto');\nif (params.Password.Password === \"\") {\n var password = serverParams.Imei;\n} else {\n var password = params.Password.Password;\n}\nif (params.Password.encryption === \"true\") {\n var part2 = encrypt(command, part1, password);\n} else {\n var part2 = command;\n}\nAddValue(\"part1\", part1);\nAddValue(\"part2\", part2);\nAddValue(\"sequenceNumber\", sequenceNumber);\nAddValueSMS(\"part1\", part1); //for sms template\nAddValueSMS(\"part2\", part2); // for sms template\nAddValueSMS(\"sequenceNumber\", sequenceNumber); // for sms template\nvar commandConfigs = {\n template: \"main\",\n configs: configs,\n configsSMS: configsSMS //for sms template\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction AddValueSMS(p1, p2) { //function for sms template\n var cvpair = {\n code: p1,\n value: p2\n };\n configsSMS.push(cvpair);\n}\n\nfunction encrypt(text, mid, password) {\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\n const iv = _crypto.randomBytes(16); // random initialization vector\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\n // set the cipher\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\n // encrypt text\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\n // generate output ( encrypted text )\n return Buffer.concat([iv, encrypted]).toString('base64');\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":false,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4117,\"Name\":\"SetLTEParam Bracelet\",\"TemplateSMS\":\"OCA-CMD;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"let command = \\\"LTEPAR=\\\" + params.Bracelet.LTEParam;\\nvar configs = [];\\nvar configsSMS = []; // for sms template\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nconst _crypto = require('crypto');\\nvar password = params.Password.Password;\\nif (password === \\\"\\\") {\\n var part2 = command;\\n} else {\\n var part2 = \\\"enc=\\\" + encrypt(command, part1, password);\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nAddValueSMS(\\\"part1\\\", part1); //for sms template\\nAddValueSMS(\\\"part2\\\", part2); // for sms template\\nAddValueSMS(\\\"sequenceNumber\\\", sequenceNumber); // for sms template\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs,\\n configsSMS: configsSMS //for sms template\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction AddValueSMS(p1, p2) { //function for sms template\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configsSMS.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716290549}],"Tags":[]},{"Id":4116,"Name":"SetCommonParam Bracelet","TemplateSMS":"OCA-CMD;<>;<>;","Template":"VGCMD-001;<>;<>;[0a]","AckTemplate":null,"Operation":"let command = \"COMPAR=\" + params.Bracelet.CommonParam;\nvar configs = [];\nvar configsSMS = []; // for sms template\nsequenceNumber = (new Date().getTime()).toString(36);\nvar part1 = \"update=\" + sequenceNumber;\nconst _crypto = require('crypto');\nif (params.Password.Password === \"\") {\n var password = serverParams.Imei;\n} else {\n var password = params.Password.Password;\n}\nif (params.Password.encryption === \"true\") {\n var part2 = encrypt(command, part1, password);\n} else {\n var part2 = command;\n}\nAddValue(\"part1\", part1);\nAddValue(\"part2\", part2);\nAddValue(\"sequenceNumber\", sequenceNumber);\nAddValueSMS(\"part1\", part1); //for sms template\nAddValueSMS(\"part2\", part2); // for sms template\nAddValueSMS(\"sequenceNumber\", sequenceNumber); // for sms template\nvar commandConfigs = {\n template: \"main\",\n configs: configs,\n configsSMS: configsSMS //for sms template\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction AddValueSMS(p1, p2) { //function for sms template\n var cvpair = {\n code: p1,\n value: p2\n };\n configsSMS.push(cvpair);\n}\n\nfunction encrypt(text, mid, password) {\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\n const iv = _crypto.randomBytes(16); // random initialization vector\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\n // set the cipher\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\n // encrypt text\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\n // generate output ( encrypted text )\n return Buffer.concat([iv, encrypted]).toString('base64');\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":false,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4116,\"Name\":\"SetCommonParam Bracelet\",\"TemplateSMS\":\"OCA-CMD;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"let command = \\\"COMPAR=\\\" + params.Bracelet.CommonParam;\\nvar configs = [];\\nvar configsSMS = []; // for sms template\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nconst _crypto = require('crypto');\\nvar password = params.Password.Password;\\nif (password === \\\"\\\") {\\n var part2 = command;\\n} else {\\n var part2 = \\\"enc=\\\" + encrypt(command, part1, password);\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nAddValueSMS(\\\"part1\\\", part1); //for sms template\\nAddValueSMS(\\\"part2\\\", part2); // for sms template\\nAddValueSMS(\\\"sequenceNumber\\\", sequenceNumber); // for sms template\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs,\\n configsSMS: configsSMS //for sms template\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction AddValueSMS(p1, p2) { //function for sms template\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configsSMS.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716290530}],"Tags":[]},{"Id":4115,"Name":"Battery Charging Alert","TemplateSMS":"VGCMD-001;<>;<>;","Template":"VGCMD-001;<>;<>;[0a]","AckTemplate":null,"Operation":"// write your code here...\nif (params.Batteryalerts.EnableBatteryChargingAlerts == \"true\") {\n batCharging = 1;\n} else {\n batCharging = \"0\";\n}\nvar command = \"BATC=\" + batCharging;\nvar configs = [];\nvar configsSMS = []; // for sms template\nsequenceNumber = (new Date().getTime()).toString(36);\nvar part1 = \"update=\" + sequenceNumber;\nconst _crypto = require('crypto');\nif (params.Password.Password === \"\") {\n var password = serverParams.Imei;\n} else {\n var password = params.Password.Password;\n}\nif (params.Password.encryption === \"true\") {\n var part2 = encrypt(command, part1, password);\n} else {\n var part2 = command;\n}\nAddValue(\"part1\", part1);\nAddValue(\"part2\", part2);\nAddValue(\"sequenceNumber\", sequenceNumber);\nAddValueSMS(\"part1\", part1); //for sms template\nAddValueSMS(\"part2\", part2); // for sms template\nAddValueSMS(\"sequenceNumber\", sequenceNumber); // for sms template\nvar commandConfigs = {\n template: \"main\",\n configs: configs,\n configsSMS: configsSMS //for sms template\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValueSMS(p1, p2) { //function for sms template\n var cvpair = {\n code: p1,\n value: p2\n };\n configsSMS.push(cvpair);\n}\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction encrypt(text, mid, password) {\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\n const iv = _crypto.randomBytes(16); // random initialization vector\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\n // set the cipher\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\n // encrypt text\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\n // generate output ( encrypted text )\n return Buffer.concat([iv, encrypted]).toString('base64');\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":false,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4115,\"Name\":\"Battery Charging Alert\",\"TemplateSMS\":\"VGCMD-001;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"// write your code here...\\nif (params.Batteryalerts.EnableBatteryChargingAlerts == \\\"true\\\") {\\n batCharging = 1;\\n} else {\\n batCharging = \\\"0\\\";\\n}\\nvar command = \\\"BATC=\\\" + batCharging;\\nvar configs = [];\\nvar configsSMS = []; // for sms template\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nconst _crypto = require('crypto');\\nvar password = params.Password.Password;\\nif (password === \\\"\\\") {\\n var part2 = command;\\n} else {\\n var part2 = \\\"enc=\\\" + encrypt(command, part1, password);\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nAddValueSMS(\\\"part1\\\", part1); //for sms template\\nAddValueSMS(\\\"part2\\\", part2); // for sms template\\nAddValueSMS(\\\"sequenceNumber\\\", sequenceNumber); // for sms template\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs,\\n configsSMS: configsSMS //for sms template\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValueSMS(p1, p2) { //function for sms template\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configsSMS.push(cvpair);\\n}\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716290008}],"Tags":[]},{"Id":4114,"Name":"Battery Low Alert Setting","TemplateSMS":"VGCMD-001;<>;<>;","Template":"VGCMD-001;<>;<>;[0a]","AckTemplate":null,"Operation":"if (params.Batteryalerts.EnableBatteryLowAlert == \"true\") {\n endis = 1;\n} else {\n endis = \"0\";\n}\nvar command = \"BATAL=\" + endis + \",\" + params.Batteryalerts.BatteryLowThreshold;\nvar configs = [];\nvar configsSMS = []; // for sms template\nsequenceNumber = (new Date().getTime()).toString(36);\nvar part1 = \"update=\" + sequenceNumber;\nconst _crypto = require('crypto');\nif (params.Password.Password === \"\") {\n var password = serverParams.Imei;\n} else {\n var password = params.Password.Password;\n}\nif (params.Password.encryption === \"true\") {\n var part2 = encrypt(command, part1, password);\n} else {\n var part2 = command;\n}\nAddValue(\"part1\", part1);\nAddValue(\"part2\", part2);\nAddValue(\"sequenceNumber\", sequenceNumber);\nAddValueSMS(\"part1\", part1); //for sms template\nAddValueSMS(\"part2\", part2); // for sms template\nAddValueSMS(\"sequenceNumber\", sequenceNumber); // for sms template\nvar commandConfigs = {\n template: \"main\",\n configs: configs,\n configsSMS: configsSMS //for sms template\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValueSMS(p1, p2) { //function for sms template\n var cvpair = {\n code: p1,\n value: p2\n };\n configsSMS.push(cvpair);\n}\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction encrypt(text, mid, password) {\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\n const iv = _crypto.randomBytes(16); // random initialization vector\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\n // set the cipher\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\n // encrypt text\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\n // generate output ( encrypted text )\n return Buffer.concat([iv, encrypted]).toString('base64');\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":false,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4114,\"Name\":\"Battery Low Alert Setting\",\"TemplateSMS\":\"VGCMD-001;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"if (params.Batteryalerts.EnableBatteryLowAlert == \\\"true\\\") {\\n endis = 1;\\n} else {\\n endis = \\\"0\\\";\\n}\\nvar command = \\\"BATAL=\\\" + endis + \\\",\\\" + params.Batteryalerts.BatteryLowThreshold;\\nvar configs = [];\\nvar configsSMS = []; // for sms template\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nconst _crypto = require('crypto');\\nvar password = params.Password.Password;\\nif (password === \\\"\\\") {\\n var part2 = command;\\n} else {\\n var part2 = \\\"enc=\\\" + encrypt(command, part1, password);\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nAddValueSMS(\\\"part1\\\", part1); //for sms template\\nAddValueSMS(\\\"part2\\\", part2); // for sms template\\nAddValueSMS(\\\"sequenceNumber\\\", sequenceNumber); // for sms template\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs,\\n configsSMS: configsSMS //for sms template\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValueSMS(p1, p2) { //function for sms template\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configsSMS.push(cvpair);\\n}\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716290124}],"Tags":[]},{"Id":4113,"Name":"Real Time Locate","TemplateSMS":"VGCMD-001;<>;<>;","Template":"VGCMD-001;<>;<>;[0a]","AckTemplate":null,"Operation":"var command = \"POSN\";\nvar configs = [];\nsequenceNumber = (new Date().getTime()).toString(36);\nvar part1 = \"request=\" + sequenceNumber;\nconst _crypto = require('crypto');\nif (params.Password.Password === \"\") {\n var password = serverParams.Imei;\n} else {\n var password = params.Password.Password;\n}\nif (params.Password.encryption === \"true\") {\n var part2 = encrypt(command, part1, password);\n} else {\n var part2 = command;\n}\nAddValue(\"part1\", part1);\nAddValue(\"part2\", part2);\nAddValue(\"sequenceNumber\", sequenceNumber);\nvar commandConfigs = {\n template: \"main\",\n configs: configs\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction encrypt(text, mid, password) {\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\n const iv = _crypto.randomBytes(16); // random initialization vector\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\n // set the cipher\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\n // encrypt text\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\n // generate output ( encrypted text )\n return Buffer.concat([iv, encrypted]).toString('base64');\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":false,"Order":null,"SendAttempts":1,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4113,\"Name\":\"Real Time Locate\",\"TemplateSMS\":\"VGCMD-001;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"var command = \\\"POSN\\\";\\nvar configs = [];\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"request=\\\" + sequenceNumber;\\nconst _crypto = require('crypto');\\nvar password = params.Password.Password;\\nif (password === \\\"\\\") {\\n var part2 = command;\\n} else {\\n var part2 = \\\"enc=\\\" + encrypt(command, part1, password);\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":1,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716290253}],"Tags":[]},{"Id":4112,"Name":"Battery Critical Alert Setting","TemplateSMS":"VGCMD-001;<>;<>;","Template":"VGCMD-001;<>;<>;[0a]","AckTemplate":null,"Operation":"// write your code here...\nif (params.Batteryalerts.EnableBatteryCriticalAlert == \"true\") {\n endis = 1;\n} else {\n endis = \"0\";\n}\nvar command = \"BATAC=\" + endis + \",\" + params.Batteryalerts.BatteryCriticalThreshold;\nvar configs = [];\nvar configsSMS = []; // for sms template\nsequenceNumber = (new Date().getTime()).toString(36);\nvar part1 = \"update=\" + sequenceNumber;\nconst _crypto = require('crypto');\nif (params.Password.Password === \"\") {\n var password = serverParams.Imei;\n} else {\n var password = params.Password.Password;\n}\nif (params.Password.encryption === \"true\") {\n var part2 = encrypt(command, part1, password);\n} else {\n var part2 = command;\n}\nAddValue(\"part1\", part1);\nAddValue(\"part2\", part2);\nAddValue(\"sequenceNumber\", sequenceNumber);\nAddValueSMS(\"part1\", part1); //for sms template\nAddValueSMS(\"part2\", part2); // for sms template\nAddValueSMS(\"sequenceNumber\", sequenceNumber); // for sms template\nvar commandConfigs = {\n template: \"main\",\n configs: configs,\n configsSMS: configsSMS //for sms template\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValueSMS(p1, p2) { //function for sms template\n var cvpair = {\n code: p1,\n value: p2\n };\n configsSMS.push(cvpair);\n}\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction encrypt(text, mid, password) {\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\n const iv = _crypto.randomBytes(16); // random initialization vector\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\n // set the cipher\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\n // encrypt text\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\n // generate output ( encrypted text )\n return Buffer.concat([iv, encrypted]).toString('base64');\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":false,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4112,\"Name\":\"Battery Critical Alert Setting\",\"TemplateSMS\":\"VGCMD-001;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"// write your code here...\\nif (params.Batteryalerts.EnableBatteryCriticalAlert == \\\"true\\\") {\\n endis = 1;\\n} else {\\n endis = \\\"0\\\";\\n}\\nvar command = \\\"BATAC=\\\" + endis + \\\",\\\" + params.Batteryalerts.BatteryCriticalThreshold;\\nvar configs = [];\\nvar configsSMS = []; // for sms template\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nconst _crypto = require('crypto');\\nvar password = params.Password.Password;\\nif (password === \\\"\\\") {\\n var part2 = command;\\n} else {\\n var part2 = \\\"enc=\\\" + encrypt(command, part1, password);\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nAddValueSMS(\\\"part1\\\", part1); //for sms template\\nAddValueSMS(\\\"part2\\\", part2); // for sms template\\nAddValueSMS(\\\"sequenceNumber\\\", sequenceNumber); // for sms template\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs,\\n configsSMS: configsSMS //for sms template\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValueSMS(p1, p2) { //function for sms template\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configsSMS.push(cvpair);\\n}\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716290093}],"Tags":[]},{"Id":4111,"Name":"Send Notification","TemplateSMS":"OCA-CMD;<>;<>;","Template":"VGCMD-001;<>;<>;[0a]","AckTemplate":null,"Operation":"var command = \"NOTE=\" + params.Note.Message;\nvar configs = [];\nvar configsSMS = []; // for sms template\nsequenceNumber = (new Date().getTime()).toString(36);\nvar part1 = \"update=\" + sequenceNumber;\nconst _crypto = require('crypto');\nif (params.Password.Password === \"\") {\n var password = serverParams.Imei;\n} else {\n var password = params.Password.Password;\n}\nif (params.Password.encryption === \"true\") {\n var part2 = encrypt(command, part1, password);\n} else {\n var part2 = command;\n}\nAddValue(\"part1\", part1);\nAddValue(\"part2\", part2);\nAddValue(\"sequenceNumber\", sequenceNumber);\nAddValueSMS(\"part1\", part1); //for sms template\nAddValueSMS(\"part2\", part2); // for sms template\nAddValueSMS(\"sequenceNumber\", sequenceNumber); // for sms template\nvar commandConfigs = {\n template: \"main\",\n configs: configs,\n configsSMS: configsSMS //for sms template\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction AddValueSMS(p1, p2) { //function for sms template\n var cvpair = {\n code: p1,\n value: p2\n };\n configsSMS.push(cvpair);\n}\n\nfunction encrypt(text, mid, password) {\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\n const iv = _crypto.randomBytes(16); // random initialization vector\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\n // set the cipher\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\n // encrypt text\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\n // generate output ( encrypted text )\n return Buffer.concat([iv, encrypted]).toString('base64');\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":false,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4111,\"Name\":\"Send Notification\",\"TemplateSMS\":\"OCA-CMD;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"var command = \\\"NOTE=\\\" + params.Note.Message;\\nvar configs = [];\\nvar configsSMS = []; // for sms template\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nconst _crypto = require('crypto');\\nvar password = params.Password.Password;\\nif (password === \\\"\\\") {\\n var part2 = command;\\n} else {\\n var part2 = \\\"enc=\\\" + encrypt(command, part1, password);\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nAddValueSMS(\\\"part1\\\", part1); //for sms template\\nAddValueSMS(\\\"part2\\\", part2); // for sms template\\nAddValueSMS(\\\"sequenceNumber\\\", sequenceNumber); // for sms template\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs,\\n configsSMS: configsSMS //for sms template\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction AddValueSMS(p1, p2) { //function for sms template\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configsSMS.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716290378}],"Tags":[]},{"Id":4110,"Name":"Reboot Bracelet","TemplateSMS":"OCA-CMD;<>;<>;","Template":"VGCMD-001;<>;<>;[0a]","AckTemplate":null,"Operation":"let command = \"REBOOTB\";\nvar configs = [];\nvar configsSMS = []; // for sms template\nsequenceNumber = (new Date().getTime()).toString(36);\nvar part1 = \"update=\" + sequenceNumber;\nconst _crypto = require('crypto');\nif (params.Password.Password === \"\") {\n var password = serverParams.Imei;\n} else {\n var password = params.Password.Password;\n}\nif (params.Password.encryption === \"true\") {\n var part2 = encrypt(command, part1, password);\n} else {\n var part2 = command;\n}\nAddValue(\"part1\", part1);\nAddValue(\"part2\", part2);\nAddValue(\"sequenceNumber\", sequenceNumber);\nAddValueSMS(\"part1\", part1); //for sms template\nAddValueSMS(\"part2\", part2); // for sms template\nAddValueSMS(\"sequenceNumber\", sequenceNumber); // for sms template\nvar commandConfigs = {\n template: \"main\",\n configs: configs,\n configsSMS: configsSMS //for sms template\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction AddValueSMS(p1, p2) { //function for sms template\n var cvpair = {\n code: p1,\n value: p2\n };\n configsSMS.push(cvpair);\n}\n\nfunction encrypt(text, mid, password) {\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\n const iv = _crypto.randomBytes(16); // random initialization vector\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\n // set the cipher\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\n // encrypt text\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\n // generate output ( encrypted text )\n return Buffer.concat([iv, encrypted]).toString('base64');\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":false,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4110,\"Name\":\"Reboot Bracelet\",\"TemplateSMS\":\"OCA-CMD;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"let command = \\\"REBOOTB\\\";\\nvar configs = [];\\nvar configsSMS = []; // for sms template\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nconst _crypto = require('crypto');\\nvar password = params.Password.Password;\\nif (password === \\\"\\\") {\\n var part2 = command;\\n} else {\\n var part2 = \\\"enc=\\\" + encrypt(command, part1, password);\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nAddValueSMS(\\\"part1\\\", part1); //for sms template\\nAddValueSMS(\\\"part2\\\", part2); // for sms template\\nAddValueSMS(\\\"sequenceNumber\\\", sequenceNumber); // for sms template\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs,\\n configsSMS: configsSMS //for sms template\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction AddValueSMS(p1, p2) { //function for sms template\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configsSMS.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716290275}],"Tags":[]},{"Id":4109,"Name":"SetBattery Bracelet","TemplateSMS":"OCA-CMD;<>;<>;","Template":"VGCMD-001;<>;<>;[0a]","AckTemplate":null,"Operation":"let command = \"BATBC=\" + params.Bracelet.LowBattery + \",\" + params.Bracelet.CriticalBattery;\nvar configs = [];\nvar configsSMS = []; // for sms template\nsequenceNumber = (new Date().getTime()).toString(36);\nvar part1 = \"update=\" + sequenceNumber;\nconst _crypto = require('crypto');\nif (params.Password.Password === \"\") {\n var password = serverParams.Imei;\n} else {\n var password = params.Password.Password;\n}\nif (params.Password.encryption === \"true\") {\n var part2 = encrypt(command, part1, password);\n} else {\n var part2 = command;\n}\nAddValue(\"part1\", part1);\nAddValue(\"part2\", part2);\nAddValue(\"sequenceNumber\", sequenceNumber);\nAddValueSMS(\"part1\", part1); //for sms template\nAddValueSMS(\"part2\", part2); // for sms template\nAddValueSMS(\"sequenceNumber\", sequenceNumber); // for sms template\nvar commandConfigs = {\n template: \"main\",\n configs: configs,\n configsSMS: configsSMS //for sms template\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction AddValueSMS(p1, p2) { //function for sms template\n var cvpair = {\n code: p1,\n value: p2\n };\n configsSMS.push(cvpair);\n}\n\nfunction encrypt(text, mid, password) {\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\n const iv = _crypto.randomBytes(16); // random initialization vector\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\n // set the cipher\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\n // encrypt text\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\n // generate output ( encrypted text )\n return Buffer.concat([iv, encrypted]).toString('base64');\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":false,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4109,\"Name\":\"SetBattery Bracelet\",\"TemplateSMS\":\"OCA-CMD;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"let command = \\\"BATBC=\\\" + params.Bracelet.LowBattery + \\\",\\\" + params.Bracelet.CriticalBattery;\\nvar configs = [];\\nvar configsSMS = []; // for sms template\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nconst _crypto = require('crypto');\\nvar password = params.Password.Password;\\nif (password === \\\"\\\") {\\n var part2 = command;\\n} else {\\n var part2 = \\\"enc=\\\" + encrypt(command, part1, password);\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nAddValueSMS(\\\"part1\\\", part1); //for sms template\\nAddValueSMS(\\\"part2\\\", part2); // for sms template\\nAddValueSMS(\\\"sequenceNumber\\\", sequenceNumber); // for sms template\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs,\\n configsSMS: configsSMS //for sms template\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction AddValueSMS(p1, p2) { //function for sms template\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configsSMS.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716290471}],"Tags":[]},{"Id":4108,"Name":"SetTemp Bracelet","TemplateSMS":"OCA-CMD;<>;<>;","Template":"VGCMD-001;<>;<>;[0a]","AckTemplate":null,"Operation":"let command = \"TEMPBC=\" + params.Bracelet.LowTemp + \",\" + params.Bracelet.HighTemp;\nvar configs = [];\nvar configsSMS = []; // for sms template\nsequenceNumber = (new Date().getTime()).toString(36);\nvar part1 = \"update=\" + sequenceNumber;\nconst _crypto = require('crypto');\nif (params.Password.Password === \"\") {\n var password = serverParams.Imei;\n} else {\n var password = params.Password.Password;\n}\nif (params.Password.encryption === \"true\") {\n var part2 = encrypt(command, part1, password);\n} else {\n var part2 = command;\n}\nAddValue(\"part1\", part1);\nAddValue(\"part2\", part2);\nAddValue(\"sequenceNumber\", sequenceNumber);\nAddValueSMS(\"part1\", part1); //for sms template\nAddValueSMS(\"part2\", part2); // for sms template\nAddValueSMS(\"sequenceNumber\", sequenceNumber); // for sms template\nvar commandConfigs = {\n template: \"main\",\n configs: configs,\n configsSMS: configsSMS //for sms template\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction AddValueSMS(p1, p2) { //function for sms template\n var cvpair = {\n code: p1,\n value: p2\n };\n configsSMS.push(cvpair);\n}\n\nfunction encrypt(text, mid, password) {\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\n const iv = _crypto.randomBytes(16); // random initialization vector\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\n // set the cipher\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\n // encrypt text\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\n // generate output ( encrypted text )\n return Buffer.concat([iv, encrypted]).toString('base64');\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":false,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4108,\"Name\":\"SetTemp Bracelet\",\"TemplateSMS\":\"OCA-CMD;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"let command = \\\"TEMPBC=\\\" + params.Bracelet.LowTemp + \\\",\\\" + params.Bracelet.HighTemp;\\nvar configs = [];\\nvar configsSMS = []; // for sms template\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nconst _crypto = require('crypto');\\nvar password = params.Password.Password;\\nif (password === \\\"\\\") {\\n var part2 = command;\\n} else {\\n var part2 = \\\"enc=\\\" + encrypt(command, part1, password);\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nAddValueSMS(\\\"part1\\\", part1); //for sms template\\nAddValueSMS(\\\"part2\\\", part2); // for sms template\\nAddValueSMS(\\\"sequenceNumber\\\", sequenceNumber); // for sms template\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs,\\n configsSMS: configsSMS //for sms template\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction AddValueSMS(p1, p2) { //function for sms template\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configsSMS.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716290568}],"Tags":[]},{"Id":4107,"Name":"Set Password","TemplateSMS":"OCA-CMD;<>;<>;","Template":"VGCMD-001;<>;<>;[0a]","AckTemplate":null,"Operation":"var command = \"PW=\" + params.Password.Password;\nvar configs = [];\nvar configsSMS = []; // for sms template\nsequenceNumber = (new Date().getTime()).toString(36);\nvar part1 = \"update=\" + sequenceNumber;\nconst _crypto = require('crypto');\nif (params.Password.Password === \"\") {\n var password = serverParams.Imei;\n} else {\n // var password = params.Password.Password;\n // use old password if it has been changed to send password update\n let new_password = params.Password.Password;\n let old_password = params.Password.PasswordOld;\n if (new_password === old_password) {\n var password = new_password;\n } else {\n var password = old_password;\n }\n}\nif (params.Password.encryption === \"true\") {\n var part2 = encrypt(command, part1, password);\n} else {\n var part2 = command;\n}\nAddValue(\"part1\", part1);\nAddValue(\"part2\", part2);\nAddValue(\"sequenceNumber\", sequenceNumber);\nAddValueSMS(\"part1\", part1); //for sms template\nAddValueSMS(\"part2\", part2); // for sms template\nAddValueSMS(\"sequenceNumber\", sequenceNumber); // for sms template\nvar commandConfigs = {\n template: \"main\",\n configs: configs,\n configsSMS: configsSMS //for sms template\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction AddValueSMS(p1, p2) { //function for sms template\n var cvpair = {\n code: p1,\n value: p2\n };\n configsSMS.push(cvpair);\n}\n\nfunction encrypt(text, mid, password) {\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\n const iv = _crypto.randomBytes(16); // random initialization vector\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\n // set the cipher\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\n // encrypt text\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\n // generate output ( encrypted text )\n return Buffer.concat([iv, encrypted]).toString('base64');\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":false,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4107,\"Name\":\"Set Password\",\"TemplateSMS\":\"OCA-CMD;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"var command = \\\"PW=\\\" + params.Password.Password;\\nvar configs = [];\\nvar configsSMS = []; // for sms template\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nconst _crypto = require('crypto');\\n// always use IMEI for encryption\\nvar password = serverParams.Imei;\\nvar part2 = \\\"enc=\\\" + encrypt(command, part1, password);\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nAddValueSMS(\\\"part1\\\", part1); //for sms template\\nAddValueSMS(\\\"part2\\\", part2); // for sms template\\nAddValueSMS(\\\"sequenceNumber\\\", sequenceNumber); // for sms template\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs,\\n configsSMS: configsSMS //for sms template\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction AddValueSMS(p1, p2) { //function for sms template\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configsSMS.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716290661}],"Tags":[]},{"Id":4106,"Name":"Set Bracelet Password","TemplateSMS":"OCA-CMD;<>;<>;","Template":"VGCMD-001;<>;<>;[0a]","AckTemplate":null,"Operation":"var command = \"BRAPW=\" + params.Password.BraceletPW;\nvar configs = [];\nvar configsSMS = []; // for sms template\nsequenceNumber = (new Date().getTime()).toString(36);\nvar part1 = \"update=\" + sequenceNumber;\nconst _crypto = require('crypto');\nif (params.Password.Password === \"\") {\n var password = serverParams.Imei;\n} else {\n var password = params.Password.Password;\n}\nif (params.Password.encryption === \"true\") {\n var part2 = encrypt(command, part1, password);\n} else {\n var part2 = command;\n}\nAddValue(\"part1\", part1);\nAddValue(\"part2\", part2);\nAddValue(\"sequenceNumber\", sequenceNumber);\nAddValueSMS(\"part1\", part1); //for sms template\nAddValueSMS(\"part2\", part2); // for sms template\nAddValueSMS(\"sequenceNumber\", sequenceNumber); // for sms template\nvar commandConfigs = {\n template: \"main\",\n configs: configs,\n configsSMS: configsSMS //for sms template\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction AddValueSMS(p1, p2) { //function for sms template\n var cvpair = {\n code: p1,\n value: p2\n };\n configsSMS.push(cvpair);\n}\n\nfunction encrypt(text, mid, password) {\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\n const iv = _crypto.randomBytes(16); // random initialization vector\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\n // set the cipher\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\n // encrypt text\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\n // generate output ( encrypted text )\n return Buffer.concat([iv, encrypted]).toString('base64');\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":false,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4106,\"Name\":\"Set Bracelet Password\",\"TemplateSMS\":\"OCA-CMD;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"var command = \\\"BRAPW=\\\" + params.Password.BraceletPW;\\nvar configs = [];\\nvar configsSMS = []; // for sms template\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nconst _crypto = require('crypto');\\nvar password = params.Password.Password;\\nif (password === \\\"\\\") {\\n var part2 = command;\\n} else {\\n var part2 = \\\"enc=\\\" + encrypt(command, part1, password);\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nAddValueSMS(\\\"part1\\\", part1); //for sms template\\nAddValueSMS(\\\"part2\\\", part2); // for sms template\\nAddValueSMS(\\\"sequenceNumber\\\", sequenceNumber); // for sms template\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs,\\n configsSMS: configsSMS //for sms template\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction AddValueSMS(p1, p2) { //function for sms template\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configsSMS.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716290394}],"Tags":[]},{"Id":4105,"Name":"Set Server","TemplateSMS":"","Template":"VGCMD-001;<>;<>;","AckTemplate":null,"Operation":"var configs = [];\r\nsequenceNumber = (new Date().getTime()).toString(36);\r\nvar part1 = \"update=\" + sequenceNumber;\r\nvar command = \"IP=\" + params.SetServer.SetPrimaryServer + ',' + params.SetServer.SetSecondaryServer;\r\nconst _crypto = require('crypto');\r\nif (params.Password.Password === \"\") {\r\n var password = serverParams.Imei;\r\n} else {\r\n var password = params.Password.Password;\r\n}\r\nif (params.Password.encryption === \"true\") {\r\n var part2 = encrypt(command, part1, password);\r\n} else {\r\n var part2 = command;\r\n}\r\nAddValue(\"part1\", part1);\r\nAddValue(\"part2\", part2);\r\nAddValue(\"sequenceNumber\", sequenceNumber);\r\nvar commandConfigs = {\r\n template: \"main\",\r\n configs: configs\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configs.push(cvpair);\r\n}\r\n\r\nfunction encrypt(text, mid, password) {\r\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\r\n const iv = _crypto.randomBytes(16); // random initialization vector\r\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\r\n // set the cipher\r\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\r\n // encrypt text\r\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\r\n // generate output ( encrypted text )\r\n return Buffer.concat([iv, encrypted]).toString('base64');\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":2,"HasAck":true,"HexString":false,"Order":null,"SendAttempts":1,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4105,\"Name\":\"Set Server\",\"TemplateSMS\":\"\",\"Template\":\"VGCMD-001;<>;<>;\",\"AckTemplate\":null,\"Operation\":\"var configs = [];\\r\\nsequenceNumber = (new Date().getTime()).toString(36);\\r\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\r\\nvar command = \\\"IP=\\\" + params.SetServer.SetPrimaryServer + ',' + params.SetServer.SetSecondaryServer;\\r\\nconst _crypto = require('crypto');\\r\\nvar password = params.Password.Password;\\r\\nif (password === \\\"\\\") {\\r\\n var part2 = command;\\r\\n} else {\\r\\n var part2 = \\\"enc=\\\" + encrypt(command, part1, password);\\r\\n}\\r\\nAddValue(\\\"part1\\\", part1);\\r\\nAddValue(\\\"part2\\\", part2);\\r\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\r\\nvar commandConfigs = {\\r\\n template: \\\"main\\\",\\r\\n configs: configs\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n\\r\\nfunction AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction encrypt(text, mid, password) {\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n const iv = _crypto.randomBytes(16); // random initialization vector\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n // set the cipher\\r\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\r\\n // encrypt text\\r\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\r\\n // generate output ( encrypted text )\\r\\n return Buffer.concat([iv, encrypted]).toString('base64');\\r\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":2,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":1,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716290452}],"Tags":[]},{"Id":4104,"Name":"Reset Device","TemplateSMS":"","Template":"VGCMD-001;<>;<>;","AckTemplate":null,"Operation":"var configs = [];\nsequenceNumber = (new Date().getTime()).toString(36);\nvar part1 = \"update=\" + sequenceNumber;\nvar command = \"RESET\";\nconst _crypto = require('crypto');\nif (params.Password.Password === \"\") {\n var password = serverParams.Imei;\n} else {\n var password = params.Password.Password;\n}\nif (params.Password.encryption === \"true\") {\n var part2 = encrypt(command, part1, password);\n} else {\n var part2 = command;\n}\nAddValue(\"part1\", part1);\nAddValue(\"part2\", part2);\nAddValue(\"sequenceNumber\", sequenceNumber);\nvar commandConfigs = {\n template: \"main\",\n configs: configs\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction encrypt(text, mid, password) {\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\n const iv = _crypto.randomBytes(16); // random initialization vector\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\n // set the cipher\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\n // encrypt text\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\n // generate output ( encrypted text )\n return Buffer.concat([iv, encrypted]).toString('base64');\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":2,"HasAck":true,"HexString":false,"Order":null,"SendAttempts":1,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4104,\"Name\":\"Reset Device\",\"TemplateSMS\":\"\",\"Template\":\"VGCMD-001;<>;<>;\",\"AckTemplate\":null,\"Operation\":\"var configs = [];\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nvar command = \\\"RESET\\\";\\nconst _crypto = require('crypto');\\nvar password = params.Password.Password;\\nif (password === \\\"\\\") {\\n var part2 = command;\\n} else {\\n var part2 = \\\"enc=\\\" + encrypt(command, part1, password);\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":2,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":1,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716290362}],"Tags":[]},{"Id":4103,"Name":"PowerOff Bracelet","TemplateSMS":"OCA-CMD;<>;<>;","Template":"VGCMD-001;<>;<>;[0a]","AckTemplate":null,"Operation":"let command = \"PWRFB\";\nvar configs = [];\nvar configsSMS = []; // for sms template\nsequenceNumber = (new Date().getTime()).toString(36);\nvar part1 = \"update=\" + sequenceNumber;\nconst _crypto = require('crypto');\nif (params.Password.Password === \"\") {\n var password = serverParams.Imei;\n} else {\n var password = params.Password.Password;\n}\nif (params.Password.encryption === \"true\") {\n var part2 = encrypt(command, part1, password);\n} else {\n var part2 = command;\n}\nAddValue(\"part1\", part1);\nAddValue(\"part2\", part2);\nAddValue(\"sequenceNumber\", sequenceNumber);\nAddValueSMS(\"part1\", part1); //for sms template\nAddValueSMS(\"part2\", part2); // for sms template\nAddValueSMS(\"sequenceNumber\", sequenceNumber); // for sms template\nvar commandConfigs = {\n template: \"main\",\n configs: configs,\n configsSMS: configsSMS //for sms template\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction AddValueSMS(p1, p2) { //function for sms template\n var cvpair = {\n code: p1,\n value: p2\n };\n configsSMS.push(cvpair);\n}\n\nfunction encrypt(text, mid, password) {\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\n const iv = _crypto.randomBytes(16); // random initialization vector\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\n // set the cipher\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\n // encrypt text\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\n // generate output ( encrypted text )\n return Buffer.concat([iv, encrypted]).toString('base64');\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":false,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4103,\"Name\":\"PowerOff Bracelet\",\"TemplateSMS\":\"OCA-CMD;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"let command = \\\"PWRFB\\\";\\nvar configs = [];\\nvar configsSMS = []; // for sms template\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nconst _crypto = require('crypto');\\nvar password = params.Password.Password;\\nif (password === \\\"\\\") {\\n var part2 = command;\\n} else {\\n var part2 = \\\"enc=\\\" + encrypt(command, part1, password);\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nAddValueSMS(\\\"part1\\\", part1); //for sms template\\nAddValueSMS(\\\"part2\\\", part2); // for sms template\\nAddValueSMS(\\\"sequenceNumber\\\", sequenceNumber); // for sms template\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs,\\n configsSMS: configsSMS //for sms template\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction AddValueSMS(p1, p2) { //function for sms template\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configsSMS.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716290233}],"Tags":[]},{"Id":4102,"Name":"SetCloudParam Bracelet","TemplateSMS":"OCA-CMD;<>;<>;","Template":"VGCMD-001;<>;<>;[0a]","AckTemplate":null,"Operation":"let command = \"CLDPAR=\" + params.Bracelet.CloudParam;\nvar configs = [];\nvar configsSMS = []; // for sms template\nsequenceNumber = (new Date().getTime()).toString(36);\nvar part1 = \"update=\" + sequenceNumber;\nconst _crypto = require('crypto');\nif (params.Password.Password === \"\") {\n var password = serverParams.Imei;\n} else {\n var password = params.Password.Password;\n}\nif (params.Password.encryption === \"true\") {\n var part2 = encrypt(command, part1, password);\n} else {\n var part2 = command;\n}\nAddValue(\"part1\", part1);\nAddValue(\"part2\", part2);\nAddValue(\"sequenceNumber\", sequenceNumber);\nAddValueSMS(\"part1\", part1); //for sms template\nAddValueSMS(\"part2\", part2); // for sms template\nAddValueSMS(\"sequenceNumber\", sequenceNumber); // for sms template\nvar commandConfigs = {\n template: \"main\",\n configs: configs,\n configsSMS: configsSMS //for sms template\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction AddValueSMS(p1, p2) { //function for sms template\n var cvpair = {\n code: p1,\n value: p2\n };\n configsSMS.push(cvpair);\n}\n\nfunction encrypt(text, mid, password) {\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\n const iv = _crypto.randomBytes(16); // random initialization vector\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\n // set the cipher\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\n // encrypt text\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\n // generate output ( encrypted text )\n return Buffer.concat([iv, encrypted]).toString('base64');\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":false,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4102,\"Name\":\"SetCloudParam Bracelet\",\"TemplateSMS\":\"OCA-CMD;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"let command = \\\"CLDPAR=\\\" + params.Bracelet.CloudParam;\\nvar configs = [];\\nvar configsSMS = []; // for sms template\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nconst _crypto = require('crypto');\\nvar password = params.Password.Password;\\nif (password === \\\"\\\") {\\n var part2 = command;\\n} else {\\n var part2 = \\\"enc=\\\" + encrypt(command, part1, password);\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nAddValueSMS(\\\"part1\\\", part1); //for sms template\\nAddValueSMS(\\\"part2\\\", part2); // for sms template\\nAddValueSMS(\\\"sequenceNumber\\\", sequenceNumber); // for sms template\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs,\\n configsSMS: configsSMS //for sms template\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction AddValueSMS(p1, p2) { //function for sms template\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configsSMS.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716290513}],"Tags":[]},{"Id":4101,"Name":"SetBLEParam Bracelet","TemplateSMS":"OCA-CMD;<>;<>;","Template":"VGCMD-001;<>;<>;[0a]","AckTemplate":null,"Operation":"let command = \"BLEPAR=\" + params.Bracelet.BLEParam;\nvar configs = [];\nvar configsSMS = []; // for sms template\nsequenceNumber = (new Date().getTime()).toString(36);\nvar part1 = \"update=\" + sequenceNumber;\nconst _crypto = require('crypto');\nif (params.Password.Password === \"\") {\n var password = serverParams.Imei;\n} else {\n var password = params.Password.Password;\n}\nif (params.Password.encryption === \"true\") {\n var part2 = encrypt(command, part1, password);\n} else {\n var part2 = command;\n}\nAddValue(\"part1\", part1);\nAddValue(\"part2\", part2);\nAddValue(\"sequenceNumber\", sequenceNumber);\nAddValueSMS(\"part1\", part1); //for sms template\nAddValueSMS(\"part2\", part2); // for sms template\nAddValueSMS(\"sequenceNumber\", sequenceNumber); // for sms template\nvar commandConfigs = {\n template: \"main\",\n configs: configs,\n configsSMS: configsSMS //for sms template\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction AddValueSMS(p1, p2) { //function for sms template\n var cvpair = {\n code: p1,\n value: p2\n };\n configsSMS.push(cvpair);\n}\n\nfunction encrypt(text, mid, password) {\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\n const iv = _crypto.randomBytes(16); // random initialization vector\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\n // set the cipher\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\n // encrypt text\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\n // generate output ( encrypted text )\n return Buffer.concat([iv, encrypted]).toString('base64');\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":false,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4101,\"Name\":\"SetBLEParam Bracelet\",\"TemplateSMS\":\"OCA-CMD;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"let command = \\\"BLEPAR=\\\" + params.Bracelet.BLEParam;\\nvar configs = [];\\nvar configsSMS = []; // for sms template\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nconst _crypto = require('crypto');\\nvar password = params.Password.Password;\\nif (password === \\\"\\\") {\\n var part2 = command;\\n} else {\\n var part2 = \\\"enc=\\\" + encrypt(command, part1, password);\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nAddValueSMS(\\\"part1\\\", part1); //for sms template\\nAddValueSMS(\\\"part2\\\", part2); // for sms template\\nAddValueSMS(\\\"sequenceNumber\\\", sequenceNumber); // for sms template\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs,\\n configsSMS: configsSMS //for sms template\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction AddValueSMS(p1, p2) { //function for sms template\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configsSMS.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716290492}],"Tags":[]},{"Id":4123,"Name":"ClearBuffer","TemplateSMS":"VGCMD-001;<>;<>;","Template":"VGCMD-001;<>;<>;[0a]","AckTemplate":null,"Operation":"var configs = [];\nsequenceNumber = (new Date().getTime()).toString(36);\nvar part1 = \"update=\" + sequenceNumber;\nvar command = \"CLRBUF\";\nconst _crypto = require('crypto');\nif (params.Password.Password === \"\") {\n var password = serverParams.Imei;\n} else {\n var password = params.Password.Password;\n}\nif (params.Password.encryption === \"true\") {\n var part2 = encrypt(command, part1, password);\n} else {\n var part2 = command;\n}\nAddValue(\"part1\", part1);\nAddValue(\"part2\", part2);\nAddValue(\"sequenceNumber\", sequenceNumber);\nvar commandConfigs = {\n template: \"main\",\n configs: configs\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction encrypt(text, mid, password) {\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\n const iv = _crypto.randomBytes(16); // random initialization vector\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\n // set the cipher\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\n // encrypt text\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\n // generate output ( encrypted text )\n return Buffer.concat([iv, encrypted]).toString('base64');\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":false,"Order":null,"SendAttempts":1,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":4123,\"Name\":\"ClearBuffer\",\"TemplateSMS\":\"VGCMD-001;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"var configs = [];\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nvar command = \\\"CLRBUF\\\";\\nconst _crypto = require('crypto');\\nif (params.Password.Password === \\\"\\\") {\\n var password = serverParams.Imei;\\n} else {\\n var password = params.Password.Password;\\n}\\nif (params.Password.encryption === \\\"true\\\") {\\n var part2 = encrypt(command, part1, password);\\n} else {\\n var part2 = command;\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":1,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1710246421},{"Type":1,"NewValue":"{\"Id\":4123,\"Name\":\"ClearBuffer\",\"TemplateSMS\":\"VGCMD-001;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"var configs = [];\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nvar command = \\\"CLRBUF\\\";\\nconst _crypto = require('crypto');\\nvar password = params.Password.Password;\\nif (password === \\\"\\\") {\\n var part2 = command;\\n} else {\\n var part2 = \\\"enc=\\\" + encrypt(command, part1, password);\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":1,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716290144}],"Tags":[]},{"Id":4124,"Name":"RequestData","TemplateSMS":"VGCMD-001;<>;<>;","Template":"VGCMD-001;<>;<>;[0a]","AckTemplate":null,"Operation":"var configs = [];\nsequenceNumber = (new Date().getTime()).toString(36);\nvar part1 = \"update=\" + sequenceNumber;\nvar command = \"REQDATA\";\nconst _crypto = require('crypto');\nif (params.Password.Password === \"\") {\n var password = serverParams.Imei;\n} else {\n var password = params.Password.Password;\n}\nif (params.Password.encryption === \"true\") {\n var part2 = encrypt(command, part1, password);\n} else {\n var part2 = command;\n}\nAddValue(\"part1\", part1);\nAddValue(\"part2\", part2);\nAddValue(\"sequenceNumber\", sequenceNumber);\nvar commandConfigs = {\n template: \"main\",\n configs: configs\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction encrypt(text, mid, password) {\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\n const iv = _crypto.randomBytes(16); // random initialization vector\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\n // set the cipher\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\n // encrypt text\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\n // generate output ( encrypted text )\n return Buffer.concat([iv, encrypted]).toString('base64');\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":false,"Order":null,"SendAttempts":1,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":4124,\"Name\":\"RequestData\",\"TemplateSMS\":\"VGCMD-001;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"var configs = [];\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nvar command = \\\"REQDATA\\\";\\nconst _crypto = require('crypto');\\nif (params.Password.Password === \\\"\\\") {\\n var password = serverParams.Imei;\\n} else {\\n var password = params.Password.Password;\\n}\\nif (params.Password.encryption === \\\"true\\\") {\\n var part2 = encrypt(command, part1, password);\\n} else {\\n var part2 = command;\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":1,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1710246477},{"Type":1,"NewValue":"{\"Id\":4124,\"Name\":\"RequestData\",\"TemplateSMS\":\"VGCMD-001;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"var configs = [];\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nvar command = \\\"REQDATA\\\";\\nconst _crypto = require('crypto');\\nvar password = params.Password.Password;\\nif (password === \\\"\\\") {\\n var part2 = command;\\n} else {\\n var part2 = \\\"enc=\\\" + encrypt(command, part1, password);\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":1,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716290305}],"Tags":[]},{"Id":4125,"Name":"RequestLog","TemplateSMS":"VGCMD-001;<>;<>;","Template":"VGCMD-001;<>;<>;[0a]","AckTemplate":null,"Operation":"var configs = [];\nsequenceNumber = (new Date().getTime()).toString(36);\nvar part1 = \"update=\" + sequenceNumber;\nvar command = \"REQLOG\";\nconst _crypto = require('crypto');\nif (params.Password.Password === \"\") {\n var password = serverParams.Imei;\n} else {\n var password = params.Password.Password;\n}\nif (params.Password.encryption === \"true\") {\n var part2 = encrypt(command, part1, password);\n} else {\n var part2 = command;\n}\nAddValue(\"part1\", part1);\nAddValue(\"part2\", part2);\nAddValue(\"sequenceNumber\", sequenceNumber);\nvar commandConfigs = {\n template: \"main\",\n configs: configs\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction encrypt(text, mid, password) {\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\n const iv = _crypto.randomBytes(16); // random initialization vector\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\n // set the cipher\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\n // encrypt text\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\n // generate output ( encrypted text )\n return Buffer.concat([iv, encrypted]).toString('base64');\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":false,"Order":null,"SendAttempts":1,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":4125,\"Name\":\"RequestLog\",\"TemplateSMS\":\"VGCMD-001;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"var configs = [];\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nvar command = \\\"REQLOG\\\";\\nconst _crypto = require('crypto');\\nif (params.Password.Password === \\\"\\\") {\\n var password = serverParams.Imei;\\n} else {\\n var password = params.Password.Password;\\n}\\nif (params.Password.encryption === \\\"true\\\") {\\n var part2 = encrypt(command, part1, password);\\n} else {\\n var part2 = command;\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":1,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1710246526},{"Type":1,"NewValue":"{\"Id\":4125,\"Name\":\"RequestLog\",\"TemplateSMS\":\"VGCMD-001;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"var configs = [];\\nvar starttimestr = params.DeviceConfig.StartTimeLog;\\nvar starttimedate = new Date(starttimestr);\\nstarttimeInt = starttimedate.getTime() / 1000;\\nif (isNaN(starttimeInt)) {\\n starttimeInt = '';\\n}\\nvar endtimestr = params.DeviceConfig.EndTimeLog;\\nvar endtimedate = new Date(endtimestr);\\nendtimeInt = endtimedate.getTime() / 1000;\\nif (isNaN(endtimeInt)) {\\n endtimeInt = '';\\n}\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nvar command = \\\"REQLOG=\\\" + starttimeInt + \\\",\\\" + endtimeInt;\\nconst _crypto = require('crypto');\\nif (params.Password.Password === \\\"\\\") {\\n var password = serverParams.Imei;\\n} else {\\n var password = params.Password.Password;\\n}\\nif (params.Password.encryption === \\\"true\\\") {\\n var part2 = encrypt(command, part1, password);\\n} else {\\n var part2 = command;\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":1,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1714640696},{"Type":1,"NewValue":"{\"Id\":4125,\"Name\":\"RequestLog\",\"TemplateSMS\":\"VGCMD-001;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"var configs = [];\\nvar starttimestr = params.DeviceConfig.StartTimeLog;\\nvar starttimedate = new Date(starttimestr);\\nstarttimeInt = starttimedate.getTime() / 1000;\\nif (isNaN(starttimeInt)) {\\n starttimeInt = '';\\n}\\nvar endtimestr = params.DeviceConfig.EndTimeLog;\\nvar endtimedate = new Date(endtimestr);\\nendtimeInt = endtimedate.getTime() / 1000;\\nif (isNaN(endtimeInt)) {\\n endtimeInt = '';\\n}\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nvar command = \\\"REQLOG=\\\" + starttimeInt + \\\",\\\" + endtimeInt;\\nconst _crypto = require('crypto');\\nvar password = params.Password.Password;\\nif (password === \\\"\\\") {\\n var part2 = command;\\n} else {\\n var part2 = \\\"enc=\\\" + encrypt(command, part1, password);\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":1,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716290326}],"Tags":[]},{"Id":4126,"Name":"Set RTLog Enable","TemplateSMS":"VGCMD-001;<>;<>;","Template":"VGCMD-001;<>;<>;[0a]","AckTemplate":null,"Operation":"// write your code here...\nif (params.DeviceConfig.EnableLogging == \"true\") {\n enableLogging = \"1\";\n} else {\n enableLogging = \"0\";\n}\nvar command = \"RTLOG=\" + enableLogging;\nvar configs = [];\nvar configsSMS = []; // for sms template\nsequenceNumber = (new Date().getTime()).toString(36);\nvar part1 = \"update=\" + sequenceNumber;\nconst _crypto = require('crypto');\nif (params.Password.Password === \"\") {\n var password = serverParams.Imei;\n} else {\n var password = params.Password.Password;\n}\nif (params.Password.encryption === \"true\") {\n var part2 = encrypt(command, part1, password);\n} else {\n var part2 = command;\n}\nAddValue(\"part1\", part1);\nAddValue(\"part2\", part2);\nAddValue(\"sequenceNumber\", sequenceNumber);\nAddValueSMS(\"part1\", part1); //for sms template\nAddValueSMS(\"part2\", part2); // for sms template\nAddValueSMS(\"sequenceNumber\", sequenceNumber); // for sms template\nvar commandConfigs = {\n template: \"main\",\n configs: configs,\n configsSMS: configsSMS //for sms template\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValueSMS(p1, p2) { //function for sms template\n var cvpair = {\n code: p1,\n value: p2\n };\n configsSMS.push(cvpair);\n}\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction encrypt(text, mid, password) {\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\n const iv = _crypto.randomBytes(16); // random initialization vector\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\n // set the cipher\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\n // encrypt text\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\n // generate output ( encrypted text )\n return Buffer.concat([iv, encrypted]).toString('base64');\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":false,"Order":null,"SendAttempts":1,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":4126,\"Name\":\"Set RTLog Enable\",\"TemplateSMS\":\"VGCMD-001;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"// write your code here...\\nif (params.DeviceConfig.EnableLogging == \\\"true\\\") {\\n enableLogging = \\\"1\\\";\\n} else {\\n enableLogging = \\\"0\\\";\\n}\\nvar command = \\\"RTLOG=\\\" + enableLogging;\\nvar configs = [];\\nvar configsSMS = []; // for sms template\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nconst _crypto = require('crypto');\\nif (params.Password.Password === \\\"\\\") {\\n var password = serverParams.Imei;\\n} else {\\n var password = params.Password.Password;\\n}\\nif (params.Password.encryption === \\\"true\\\") {\\n var part2 = encrypt(command, part1, password);\\n} else {\\n var part2 = command;\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nAddValueSMS(\\\"part1\\\", part1); //for sms template\\nAddValueSMS(\\\"part2\\\", part2); // for sms template\\nAddValueSMS(\\\"sequenceNumber\\\", sequenceNumber); // for sms template\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs,\\n configsSMS: configsSMS //for sms template\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValueSMS(p1, p2) { //function for sms template\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configsSMS.push(cvpair);\\n}\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":1,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1710246587},{"Type":1,"NewValue":"{\"Id\":4126,\"Name\":\"Set RTLog Enable\",\"TemplateSMS\":\"VGCMD-001;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"// write your code here...\\nif (params.DeviceConfig.EnableLogging == \\\"true\\\") {\\n enableLogging = \\\"1\\\";\\n} else {\\n enableLogging = \\\"0\\\";\\n}\\nvar command = \\\"RTLOG=\\\" + enableLogging;\\nvar configs = [];\\nvar configsSMS = []; // for sms template\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nconst _crypto = require('crypto');\\nvar password = params.Password.Password;\\nif (password === \\\"\\\") {\\n var part2 = command;\\n} else {\\n var part2 = \\\"enc=\\\" + encrypt(command, part1, password);\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nAddValueSMS(\\\"part1\\\", part1); //for sms template\\nAddValueSMS(\\\"part2\\\", part2); // for sms template\\nAddValueSMS(\\\"sequenceNumber\\\", sequenceNumber); // for sms template\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs,\\n configsSMS: configsSMS //for sms template\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValueSMS(p1, p2) { //function for sms template\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configsSMS.push(cvpair);\\n}\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":1,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716290430}],"Tags":[]}],"Operations":[{"Id":279,"Name":"VGA","Operation":"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\n // Define array to push device data into. This will be put into the msg array at the end.\n var deviceParams = [];\n var configsToSend = [];\n var tasks = [];\n const _crypto = require('crypto');\n // handle ACK\n if (messageTypeCode == \"ACK\") {\n return \"\";\n }\n if (params.encrypted_data) { // encrypted data so needs decrypting\n var password;\n if (params.imei == \"null\") {\n return msg;\n }\n password = params.imei;\n if (configs.Password.Password === \"\") {\n // use imei as default password when not specified\n } else {\n // use the password\n password = configs.Password.Password\n }\n // handle encrypted messages arriving via SMS\n // if (raw.startsWith('esendex')) {\n // raw = raw.split('esendex')[2];\n // encimei = raw.split(';')[1];\n // imei = parseInt(raw.split(';')[1], 36).toString();\n // AddValue('imei', imei);\n // raw = raw.replace(encimei, imei);\n // password = imei;\n // }\n let message = decrypt(raw, password);\n //ToDo: handle errors messages arriving\n // if (message.startsWith(\"error\")) {\n // ack = \"ERR;\" + params.count_number + \";\";\n // msg.push({\n // 'code': 'ack',\n // 'value': ack\n // });\n // console.log(msg);\n // } \n if (message) {\n // send message internally\n sendMessageToLocalhost(message);\n let ack = \"ACK-MSG;\" + params.count_number + \";OK;\\n\"\n AddValue(\"ack\", ack);\n } else {\n ack = \"unknown message\" + \" - \" + serverParams.imei + \" --- \" + raw;\n AddValue(\"ack\", ack);\n }\n } else { // General Oysta Template\n switch (messageTypeLocalCode) {\n case (\"COMM\"):\n process_invent_msg(); //incoming invent commands\n break;\n case (\"MACB\"):\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\n add_params_to_output();\n break;\n case (\"REGISTER\"):\n let ble_mac = params.ble_mac;\n let iccid = params.iccid;\n // write values to readonly settings\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\n // remove this to disable auto-config\n //AddConfig(configIds.DeviceConfig.IVActivated, 'true')\n break;\n case (\"CREATE\"):\n let c_ble_mac = params.ble_mac;\n let c_iccid = params.iccid;\n let new_imei = params.new_imei;\n let c_message = \"VGA-001;\" + new_imei + \";mid=\" + params.count_number + \";REGISTER=\" + c_ble_mac + \",\" + c_iccid + \";\";\n // sendMessageToLocalhost(c_message); \n tasks = [{\n \"name\": \"VGA\" + new_imei,\n \"option\": \"sync\",\n \"type\": \"createDevice\",\n \"payload\": JSON.stringify({\n \"name\": \"VGA\" + new_imei,\n \"imei\": new_imei,\n \"abortOnError\": false,\n \"init\": true\n }),\n \"order\": 1\n }, {\n \"name\": \"Create VGA\" + new_imei,\n \"option\": \"async\",\n \"type\": \"sendMessage\",\n \"payload\": JSON.stringify({\n \"message\": c_message\n }),\n \"order\": 2\n }]\n break;\n default:\n // all other general messages\n // Generate location_accuracy based on raw_accuracy - currently no conversion\n add_params_to_output();\n }\n // add messagetTypeLocal to output for templates\n AddValue('local_message_type', messageTypeLocalCode);\n }\n var msg = {\n 'values': deviceParams,\n };\n if (configsToSend.length > 0) {\n msg.configsToSend = configsToSend\n };\n if (tasks.length > 0) {\n msg.tasks = tasks\n };\n // commit values to receiver processor\n console.log(msg);\n // modify to return the object that contains your data\n return msg;\n\n function add_params_to_output() {\n if (!params.raw_accuracy) {\n AddValue('location_accuracy', 9000);\n } else {\n AddValue('location_accuracy', params.raw_accuracy);\n }\n // generate timestamps if they don't exist\n if (!params.event_time) {\n AddValue('event_time', moment.utc().unix());\n }\n if (!params.location_time) {\n AddValue('event_time', moment.utc().unix());\n }\n //if no lat and long are given, set them to 0, 0\n if (!params.latitude_raw) {\n AddValue('latitude', 0);\n } else {\n AddValue('latitude', params.latitude_raw);\n }\n if (!params.longitude_raw) {\n AddValue('longitude', 0);\n } else {\n AddValue('longitude', params.longitude_raw);\n }\n //if (params.temp_bracelet) {\n // AddValue('oysta_labels', 'DegC');\n // AddValue('single_column_value', params.temp_bracelet);\n //}\n }\n\n function process_invent_msg() {\n const details = JSON.parse(raw);\n // AddValue('imei', details.AppId);\n AddValue('json_in', JSON.stringify(details));\n switch (details.Command) {\n case \"ACTIVATE_OK\":\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\n break;\n case \"ACTIVATE_FAILS\":\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\n break;\n case \"APPSET\":\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\n AddConfig(configIds.Password.Password, details.Data.Password);\n break;\n case \"CONFIG\":\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\n break;\n case \"CGFBR\":\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\n let commonParam = addEscapeChar(details.Data.ComPar);\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\n let cloudParam = addEscapeChar(details.Data.CldPar);\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\n let lteParam = addEscapeChar(details.Data.LtePar);\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\n let bleParam = addEscapeChar(details.Data.BlePar);\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\n break;\n case \"REBOOTB\":\n AddConfig(configIds.Bracelet.Reboot, 'true');\n break;\n case \"PWRFB\":\n AddConfig(configIds.Bracelet.PowerOff, 'true');\n break;\n case \"RESETB\":\n AddConfig(configIds.Bracelet.Reset, 'true');\n break;\n case \"BRAPWUPDATE\":\n AddValue(\"PasswordRecoveryFrom\", details.Data.ImeiOld);\n // get password from old device, then set\n AddConfig(configIds.Password.BraceletPW, \"DoNotChange123\" // replace with recovered password, for test this is DoNotChange123\n )\n break;\n case \"NOTE\":\n let type = details.Data.Type !== undefined ? details.Data.Type : \"TYPE MISSING\";\n let text = details.Data.Text !== undefined ? details.Data.Text : \"Text Missing\";\n text = text.split(\",\").join(\" \");\n let id = details.Data.Id !== undefined ? details.Data.Id : \"Id Missing\";\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\n let value = time + \",\" + type + \",\" + id + \",\" + text;\n AddConfig(configIds.Note.Message, value)\n break;\n }\n }\n\n function addEscapeChar(json) {\n if (json === undefined) {\n return undefined;\n }\n let outStr = \"\";\n let jsonStr = JSON.stringify(json);\n for (let c of jsonStr) {\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\n } else {\n outStr += c;\n }\n };\n return outStr;\n }\n\n function sendMessageToLocalhost(str) {\n if (localTesting) {\n console.log(\"Sending message to local host: \" + str);\n } else {\n var server = 'receiver-tcp';\n var c = createConnection(5678, server);\n c.write(`${str}`);\n c.end();\n }\n AddValue(\"ToLocalhost\", str);\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\n function decrypt(encdata, password) {\n var decrypted;\n var dataarray = encdata.split(\";\");\n if (dataarray.length > 5) {\n return \"\";\n }\n var i;\n var part1 = \"\"; // part1 will hold the type, IMEI and message ID\n if (encdata.startsWith(\"ACK\")) {\n return encdata;\n }\n for (i = 0; i < 3; i++) {\n part1 = part1 + dataarray[i] + \";\";\n }\n var mid = dataarray[2]; // use the message ID to create the salt\n var enctext = dataarray[3].split(\"=\")[1]; // the encypted data\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\n // base64 decoding and extract the iv and encrypted data\n const bData = Buffer.from(enctext, 'base64');\n const iv = bData.slice(0, 16); // initial 16 chars\n const text = bData.slice(16); // all the encrypted data\n // derive key using; 32 byte key length (from salted password and mid)\n // decrypt the data in part2 and add to part1\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\n try {\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\n } catch (err) {\n decrypted = undefined;\n }\n return decrypted;\n }\n\n function encrypt(text, mid, password) {\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\n const iv = _crypto.randomBytes(16); // random initialization vector\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\n // set the cipher\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\n // encrypt text\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\n // generate output ( encrypted text )\n return Buffer.concat([iv, encrypted]).toString('base64');\n }\n\n function AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n deviceParams.push(cvpair);\n }\n\n function AddConfig(configName, newvalue) {\n if (newvalue !== undefined) { // don't add if newvalue is undefined\n var cvpair = {\n 'code': configName,\n 'value': newvalue,\n 'forced': true\n };\n configsToSend.push(cvpair);\n };\n }\n\n function isASCII(str) {\n return /^[\\x00-\\xFF]*$/.test(str);\n }\n}\n// params is not defined locally -> export as module\nif (typeof(params) === 'undefined') {\n module.exports = {\n execute_ops\n }\n} else { // on server use local defined vars\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\n // define global returns\n msg = return_values;\n}","Type":0,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\n // Define array to push device data into. This will be put into the msg array at the end.\\n var deviceParams = [];\\n var configsToSend = [];\\n var tasks = [];\\n const _crypto = require('crypto');\\n // handle ACK\\n if (messageTypeCode == \\\"ACK\\\") {\\n return \\\"\\\";\\n }\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\n var password;\\n if (params.imei == \\\"null\\\") {\\n return msg;\\n }\\n password = params.imei;\\n if (configs.Password.Password === \\\"\\\") {\\n // use imei as default password when not specified\\n } else {\\n // use the password\\n password = configs.Password.Password\\n }\\n // handle encrypted messages arriving via SMS\\n // if (raw.startsWith('esendex')) {\\n // raw = raw.split('esendex')[2];\\n // encimei = raw.split(';')[1];\\n // imei = parseInt(raw.split(';')[1], 36).toString();\\n // AddValue('imei', imei);\\n // raw = raw.replace(encimei, imei);\\n // password = imei;\\n // }\\n let message = decrypt(raw, password);\\n //ToDo: handle errors messages arriving\\n // if (message.startsWith(\\\"error\\\")) {\\n // ack = \\\"ERR;\\\" + params.count_number + \\\";\\\";\\n // msg.push({\\n // 'code': 'ack',\\n // 'value': ack\\n // });\\n // console.log(msg);\\n // } \\n if (message) {\\n // send message internally\\n sendMessageToLocalhost(message);\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\n AddValue(\\\"ack\\\", ack);\\n } else {\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\n AddValue(\\\"ack\\\", ack);\\n }\\n } else { // General Oysta Template\\n switch (messageTypeLocalCode) {\\n case (\\\"COMM\\\"):\\n process_invent_msg(); //incoming invent commands\\n break;\\n case (\\\"MACB\\\"):\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\n add_params_to_output();\\n break;\\n case (\\\"REGISTER\\\"):\\n let ble_mac = params.ble_mac;\\n let iccid = params.iccid;\\n // write values to readonly settings\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\n // remove this to disable auto-config\\n //AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\n break;\\n case (\\\"CREATE\\\"):\\n // temp fix to filter old messages\\n // const cutoff = 1707523200000; //10.2.2024\\n // let message_id_time = parseInt(params.count_number, 36);\\n // if (message_id_time > cutoff){\\n let c_ble_mac = params.ble_mac;\\n let c_iccid = params.iccid;\\n let new_imei = params.new_imei;\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\n // sendMessageToLocalhost(c_message); \\n tasks = [{\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\n \\\"option\\\": \\\"sync\\\",\\n \\\"type\\\": \\\"createDevice\\\",\\n \\\"payload\\\": JSON.stringify({\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\n \\\"imei\\\": new_imei,\\n \\\"abortOnError\\\": false,\\n \\\"init\\\": true\\n }),\\n \\\"order\\\": 1\\n }, {\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\n \\\"option\\\": \\\"async\\\",\\n \\\"type\\\": \\\"sendMessage\\\",\\n \\\"payload\\\": JSON.stringify({\\n \\\"message\\\": c_message\\n }),\\n \\\"order\\\": 2\\n }]\\n // }\\n break;\\n case (\\\"ALLDATA\\\"):\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\n let all_data = JSON.parse(json_str);\\n if (\\\"version\\\" in all_data) {\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\n };\\n break;\\n default:\\n // all other general messages\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\n add_params_to_output();\\n }\\n // add messagetTypeLocal to output for templates\\n AddValue('local_message_type', messageTypeLocalCode);\\n }\\n var msg = {\\n 'values': deviceParams,\\n };\\n if (configsToSend.length > 0) {\\n msg.configsToSend = configsToSend\\n };\\n if (tasks.length > 0) {\\n msg.tasks = tasks\\n };\\n // commit values to receiver processor\\n console.log(msg);\\n // modify to return the object that contains your data\\n return msg;\\n\\n function add_params_to_output() {\\n if (!params.raw_accuracy) {\\n AddValue('location_accuracy', 9000);\\n } else {\\n AddValue('location_accuracy', params.raw_accuracy);\\n }\\n // generate timestamps if they don't exist\\n if (!params.event_time) {\\n AddValue('event_time', moment.utc().unix());\\n }\\n if (!params.location_time) {\\n AddValue('event_time', moment.utc().unix());\\n }\\n //if no lat and long are given, set them to 0, 0\\n if (!params.latitude_raw) {\\n AddValue('latitude', 0);\\n } else {\\n AddValue('latitude', params.latitude_raw);\\n }\\n if (!params.longitude_raw) {\\n AddValue('longitude', 0);\\n } else {\\n AddValue('longitude', params.longitude_raw);\\n }\\n // if (params.temp_bracelet){\\n // AddValue('oysta_labels', 'DegC');\\n // AddValue('single_column_value', params.temp_bracelet);\\n // }\\n }\\n\\n function process_invent_msg() {\\n const details = JSON.parse(raw);\\n // AddValue('imei', details.AppId);\\n AddValue('json_in', JSON.stringify(details));\\n switch (details.Command) {\\n case \\\"ACTIVATE_OK\\\":\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\n break;\\n case \\\"ACTIVATE_FAILS\\\":\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\n break;\\n case \\\"APPSET\\\":\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\n AddConfig(configIds.Password.Password, details.Data.Password);\\n break;\\n case \\\"CONFIG\\\":\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\n break;\\n case \\\"CGFBR\\\":\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\n let commonParam = addEscapeChar(details.Data.ComPar);\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\n let lteParam = addEscapeChar(details.Data.LtePar);\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\n let bleParam = addEscapeChar(details.Data.BlePar);\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\n break;\\n case \\\"REBOOTB\\\":\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\n break;\\n case \\\"PWRFB\\\":\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\n break;\\n case \\\"RESETB\\\":\\n AddConfig(configIds.Bracelet.Reset, 'true');\\n break;\\n case \\\"BRAPWUPDATE\\\":\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\n // get password from old device, then set\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\n )\\n break;\\n case \\\"NOTE\\\":\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\n text = text.split(\\\",\\\").join(\\\" \\\");\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\n AddConfig(configIds.Note.Message, value)\\n break;\\n }\\n }\\n\\n function addEscapeChar(json) {\\n if (json === undefined) {\\n return undefined;\\n }\\n let outStr = \\\"\\\";\\n let jsonStr = JSON.stringify(json);\\n for (let c of jsonStr) {\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\n } else {\\n outStr += c;\\n }\\n };\\n return outStr;\\n }\\n\\n function changeSingleQuoteToDouble(jsonStr) {\\n if (jsonStr === undefined) {\\n return undefined;\\n }\\n let outStr = \\\"\\\";\\n for (let c of jsonStr) {\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\n outStr = outStr + String.fromCharCode(34);\\n } else {\\n outStr += c;\\n }\\n };\\n return outStr;\\n }\\n\\n function sendMessageToLocalhost(str) {\\n if (localTesting) {\\n console.log(\\\"Sending message to local host: \\\" + str);\\n } else {\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\n var c = createConnection(5678, server);\\n c.write(`${str}`);\\n c.end();\\n }\\n AddValue(\\\"ToLocalhost\\\", str);\\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\\n function decrypt(encdata, password) {\\n var decrypted;\\n var dataarray = encdata.split(\\\";\\\");\\n if (dataarray.length > 5) {\\n return \\\"\\\";\\n }\\n var i;\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\n if (encdata.startsWith(\\\"ACK\\\")) {\\n return encdata;\\n }\\n for (i = 0; i < 3; i++) {\\n part1 = part1 + dataarray[i] + \\\";\\\";\\n }\\n var mid = dataarray[2]; // use the message ID to create the salt\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n // base64 decoding and extract the iv and encrypted data\\n const bData = Buffer.from(enctext, 'base64');\\n const iv = bData.slice(0, 16); // initial 16 chars\\n const text = bData.slice(16); // all the encrypted data\\n // derive key using; 32 byte key length (from salted password and mid)\\n // decrypt the data in part2 and add to part1\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\n try {\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\n } catch (err) {\\n decrypted = undefined;\\n }\\n return decrypted;\\n }\\n\\n function encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n }\\n\\n function AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n deviceParams.push(cvpair);\\n }\\n\\n function AddConfig(configName, newvalue) {\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\n var cvpair = {\\n 'code': configName,\\n 'value': newvalue,\\n 'forced': true\\n };\\n configsToSend.push(cvpair);\\n };\\n }\\n\\n function isASCII(str) {\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\n }\\n}\\n// params is not defined locally -> export as module\\nif (typeof(params) === 'undefined') {\\n module.exports = {\\n execute_ops\\n }\\n} else { // on server use local defined vars\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\n // define global returns\\n msg = return_values;\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1710246336},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\n // Define array to push device data into. This will be put into the msg array at the end.\\n var deviceParams = [];\\n var configsToSend = [];\\n var tasks = [];\\n const _crypto = require('crypto');\\n // handle ACK\\n if (messageTypeCode == \\\"ACK\\\") {\\n return \\\"\\\";\\n }\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\n var password;\\n if (params.imei == \\\"null\\\") {\\n return msg;\\n }\\n password = params.imei;\\n if (configs.Password.Password === \\\"\\\") {\\n // use imei as default password when not specified\\n } else {\\n // use the password\\n password = configs.Password.Password\\n }\\n // handle encrypted messages arriving via SMS\\n // if (raw.startsWith('esendex')) {\\n // raw = raw.split('esendex')[2];\\n // encimei = raw.split(';')[1];\\n // imei = parseInt(raw.split(';')[1], 36).toString();\\n // AddValue('imei', imei);\\n // raw = raw.replace(encimei, imei);\\n // password = imei;\\n // }\\n let message = decrypt(raw, password);\\n //ToDo: handle errors messages arriving\\n // if (message.startsWith(\\\"error\\\")) {\\n // ack = \\\"ERR;\\\" + params.count_number + \\\";\\\";\\n // msg.push({\\n // 'code': 'ack',\\n // 'value': ack\\n // });\\n // console.log(msg);\\n // } \\n if (message) {\\n // send message internally\\n sendMessageToLocalhost(message);\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\n AddValue(\\\"ack\\\", ack);\\n } else {\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\n AddValue(\\\"ack\\\", ack);\\n }\\n } else { // General Oysta Template\\n switch (messageTypeLocalCode) {\\n case (\\\"COMM\\\"):\\n process_invent_msg(); //incoming invent commands\\n break;\\n case (\\\"MACB\\\"):\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\n add_params_to_output();\\n break;\\n case (\\\"REGISTER\\\"):\\n let ble_mac = params.ble_mac;\\n let iccid = params.iccid;\\n // write values to readonly settings\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\n // will automtaically Activate on Acceptance\\n if (serverParams.EnvName) {\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\n }\\n }\\n break;\\n case (\\\"CREATE\\\"):\\n // temp fix to filter old messages\\n // const cutoff = 1707523200000; //10.2.2024\\n // let message_id_time = parseInt(params.count_number, 36);\\n // if (message_id_time > cutoff){\\n let c_ble_mac = params.ble_mac;\\n let c_iccid = params.iccid;\\n let new_imei = params.new_imei;\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\n // sendMessageToLocalhost(c_message); \\n tasks = [{\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\n \\\"option\\\": \\\"sync\\\",\\n \\\"type\\\": \\\"createDevice\\\",\\n \\\"payload\\\": JSON.stringify({\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\n \\\"imei\\\": new_imei,\\n \\\"abortOnError\\\": false,\\n \\\"init\\\": true\\n }),\\n \\\"order\\\": 1\\n }, {\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\n \\\"option\\\": \\\"async\\\",\\n \\\"type\\\": \\\"sendMessage\\\",\\n \\\"payload\\\": JSON.stringify({\\n \\\"message\\\": c_message\\n }),\\n \\\"order\\\": 2\\n }]\\n // }\\n break;\\n case (\\\"ALLDATA\\\"):\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\n let all_data = JSON.parse(json_str);\\n if (\\\"version\\\" in all_data) {\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\n };\\n break;\\n default:\\n // all other general messages\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\n add_params_to_output();\\n }\\n // add messagetTypeLocal to output for templates\\n AddValue('local_message_type', messageTypeLocalCode);\\n }\\n var msg = {\\n 'values': deviceParams,\\n };\\n if (configsToSend.length > 0) {\\n msg.configsToSend = configsToSend\\n };\\n if (tasks.length > 0) {\\n msg.tasks = tasks\\n };\\n // commit values to receiver processor\\n console.log(msg);\\n // modify to return the object that contains your data\\n return msg;\\n\\n function add_params_to_output() {\\n if (!params.raw_accuracy) {\\n AddValue('location_accuracy', 9000);\\n } else {\\n AddValue('location_accuracy', params.raw_accuracy);\\n }\\n // generate timestamps if they don't exist\\n if (!params.event_time) {\\n AddValue('event_time', moment.utc().unix());\\n }\\n if (!params.location_time) {\\n AddValue('event_time', moment.utc().unix());\\n }\\n //if no lat and long are given, set them to 0, 0\\n if (!params.latitude_raw) {\\n AddValue('latitude', 0);\\n } else {\\n AddValue('latitude', params.latitude_raw);\\n }\\n if (!params.longitude_raw) {\\n AddValue('longitude', 0);\\n } else {\\n AddValue('longitude', params.longitude_raw);\\n }\\n // if (params.temp_bracelet){\\n // AddValue('oysta_labels', 'DegC');\\n // AddValue('single_column_value', params.temp_bracelet);\\n // }\\n }\\n\\n function process_invent_msg() {\\n const details = JSON.parse(raw);\\n // AddValue('imei', details.AppId);\\n AddValue('json_in', JSON.stringify(details));\\n switch (details.Command) {\\n case \\\"ACTIVATE_OK\\\":\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\n break;\\n case \\\"ACTIVATE_FAILS\\\":\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\n break;\\n case \\\"APPSET\\\":\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\n AddConfig(configIds.Password.Password, details.Data.Password);\\n break;\\n case \\\"CONFIG\\\":\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\n break;\\n case \\\"CGFBR\\\":\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\n let commonParam = addEscapeChar(details.Data.ComPar);\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\n let lteParam = addEscapeChar(details.Data.LtePar);\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\n let bleParam = addEscapeChar(details.Data.BlePar);\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\n break;\\n case \\\"REBOOTB\\\":\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\n break;\\n case \\\"PWRFB\\\":\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\n break;\\n case \\\"RESETB\\\":\\n AddConfig(configIds.Bracelet.Reset, 'true');\\n break;\\n case \\\"BRAPWUPDATE\\\":\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\n // get password from old device, then set\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\n )\\n break;\\n case \\\"NOTE\\\":\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\n text = text.split(\\\",\\\").join(\\\" \\\");\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\n AddConfig(configIds.Note.Message, value)\\n break;\\n }\\n }\\n\\n function addEscapeChar(json) {\\n if (json === undefined) {\\n return undefined;\\n }\\n let outStr = \\\"\\\";\\n let jsonStr = JSON.stringify(json);\\n for (let c of jsonStr) {\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\n } else {\\n outStr += c;\\n }\\n };\\n return outStr;\\n }\\n\\n function changeSingleQuoteToDouble(jsonStr) {\\n if (jsonStr === undefined) {\\n return undefined;\\n }\\n let outStr = \\\"\\\";\\n for (let c of jsonStr) {\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\n outStr = outStr + String.fromCharCode(34);\\n } else {\\n outStr += c;\\n }\\n };\\n return outStr;\\n }\\n\\n function sendMessageToLocalhost(str) {\\n if (localTesting) {\\n console.log(\\\"Sending message to local host: \\\" + str);\\n } else {\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\n var c = createConnection(5678, server);\\n c.write(`${str}`);\\n c.end();\\n }\\n AddValue(\\\"ToLocalhost\\\", str);\\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\\n function decrypt(encdata, password) {\\n var decrypted;\\n var dataarray = encdata.split(\\\";\\\");\\n if (dataarray.length > 5) {\\n return \\\"\\\";\\n }\\n var i;\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\n if (encdata.startsWith(\\\"ACK\\\")) {\\n return encdata;\\n }\\n for (i = 0; i < 3; i++) {\\n part1 = part1 + dataarray[i] + \\\";\\\";\\n }\\n var mid = dataarray[2]; // use the message ID to create the salt\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n // base64 decoding and extract the iv and encrypted data\\n const bData = Buffer.from(enctext, 'base64');\\n const iv = bData.slice(0, 16); // initial 16 chars\\n const text = bData.slice(16); // all the encrypted data\\n // derive key using; 32 byte key length (from salted password and mid)\\n // decrypt the data in part2 and add to part1\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\n try {\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\n } catch (err) {\\n decrypted = undefined;\\n }\\n return decrypted;\\n }\\n\\n function encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n }\\n\\n function AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n deviceParams.push(cvpair);\\n }\\n\\n function AddConfig(configName, newvalue) {\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\n var cvpair = {\\n 'code': configName,\\n 'value': newvalue,\\n 'forced': true\\n };\\n configsToSend.push(cvpair);\\n };\\n }\\n\\n function isASCII(str) {\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\n }\\n}\\n// params is not defined locally -> export as module\\nif (typeof(params) === 'undefined') {\\n module.exports = {\\n execute_ops\\n }\\n} else { // on server use local defined vars\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\n // define global returns\\n msg = return_values;\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1711039145},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\n // Define array to push device data into. This will be put into the msg array at the end.\\n var deviceParams = [];\\n var configsToSend = [];\\n var tasks = [];\\n const _crypto = require('crypto');\\n // handle ACK\\n if (messageTypeCode == \\\"ACK\\\") {\\n return \\\"\\\";\\n }\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\n var password;\\n if (params.imei == \\\"null\\\") {\\n return msg;\\n }\\n password = params.imei;\\n if (configs.Password.Password === \\\"\\\") {\\n // use imei as default password when not specified\\n } else {\\n // use the password\\n password = configs.Password.Password\\n }\\n // handle encrypted messages arriving via SMS\\n // if (raw.startsWith('esendex')) {\\n // raw = raw.split('esendex')[2];\\n // encimei = raw.split(';')[1];\\n // imei = parseInt(raw.split(';')[1], 36).toString();\\n // AddValue('imei', imei);\\n // raw = raw.replace(encimei, imei);\\n // password = imei;\\n // }\\n let message = decrypt(raw, password);\\n //ToDo: handle errors messages arriving\\n // if (message.startsWith(\\\"error\\\")) {\\n // ack = \\\"ERR;\\\" + params.count_number + \\\";\\\";\\n // msg.push({\\n // 'code': 'ack',\\n // 'value': ack\\n // });\\n // console.log(msg);\\n // } \\n if (message) {\\n // send message internally\\n sendMessageToLocalhost(message);\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\n AddValue(\\\"ack\\\", ack);\\n } else {\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\n AddValue(\\\"ack\\\", ack);\\n }\\n } else { // General Oysta Template\\n switch (messageTypeLocalCode) {\\n case (\\\"COMM\\\"):\\n process_invent_msg(); //incoming invent commands\\n break;\\n case (\\\"MACB\\\"):\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\n add_params_to_output();\\n break;\\n case (\\\"REGISTER\\\"):\\n let ble_mac = params.ble_mac;\\n let iccid = params.iccid;\\n // check ICCID is a number\\n if (isNaN(iccid)) {\\n iccid = \\\"invalid ICCID\\\"\\n }\\n // write values to readonly settings\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\n // will automtaically Activate on Acceptance\\n if (serverParams.EnvName) {\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\n }\\n }\\n break;\\n case (\\\"CREATE\\\"):\\n // temp fix to filter old messages\\n // const cutoff = 1707523200000; //10.2.2024\\n // let message_id_time = parseInt(params.count_number, 36);\\n // if (message_id_time > cutoff){\\n let c_ble_mac = params.ble_mac;\\n let c_iccid = params.iccid;\\n let new_imei = params.new_imei;\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\n // sendMessageToLocalhost(c_message); \\n tasks = [{\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\n \\\"option\\\": \\\"sync\\\",\\n \\\"type\\\": \\\"createDevice\\\",\\n \\\"payload\\\": JSON.stringify({\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\n \\\"imei\\\": new_imei,\\n \\\"abortOnError\\\": false,\\n \\\"init\\\": true\\n }),\\n \\\"order\\\": 1\\n }, {\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\n \\\"option\\\": \\\"async\\\",\\n \\\"type\\\": \\\"sendMessage\\\",\\n \\\"payload\\\": JSON.stringify({\\n \\\"message\\\": c_message\\n }),\\n \\\"order\\\": 2\\n }]\\n // }\\n break;\\n case (\\\"ALLDATA\\\"):\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\n let all_data = JSON.parse(json_str);\\n if (\\\"version\\\" in all_data) {\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\n };\\n break;\\n default:\\n // all other general messages\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\n add_params_to_output();\\n }\\n // add messagetTypeLocal to output for templates\\n AddValue('local_message_type', messageTypeLocalCode);\\n }\\n var msg = {\\n 'values': deviceParams,\\n };\\n if (configsToSend.length > 0) {\\n msg.configsToSend = configsToSend\\n };\\n if (tasks.length > 0) {\\n msg.tasks = tasks\\n };\\n // commit values to receiver processor\\n console.log(msg);\\n // modify to return the object that contains your data\\n return msg;\\n\\n function add_params_to_output() {\\n if (!params.raw_accuracy) {\\n AddValue('location_accuracy', 9000);\\n } else {\\n AddValue('location_accuracy', params.raw_accuracy);\\n }\\n // generate timestamps if they don't exist\\n if (!params.event_time) {\\n AddValue('event_time', moment.utc().unix());\\n }\\n if (!params.location_time) {\\n AddValue('event_time', moment.utc().unix());\\n }\\n //if no lat and long are given, set them to 0, 0\\n if (!params.latitude_raw) {\\n AddValue('latitude', 0);\\n } else {\\n AddValue('latitude', params.latitude_raw);\\n }\\n if (!params.longitude_raw) {\\n AddValue('longitude', 0);\\n } else {\\n AddValue('longitude', params.longitude_raw);\\n }\\n // if (params.temp_bracelet){\\n // AddValue('oysta_labels', 'DegC');\\n // AddValue('single_column_value', params.temp_bracelet);\\n // }\\n }\\n\\n function process_invent_msg() {\\n const details = JSON.parse(raw);\\n // AddValue('imei', details.AppId);\\n AddValue('json_in', JSON.stringify(details));\\n switch (details.Command) {\\n case \\\"ACTIVATE_OK\\\":\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\n break;\\n case \\\"ACTIVATE_FAILS\\\":\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\n break;\\n case \\\"APPSET\\\":\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\n AddConfig(configIds.Password.Password, details.Data.Password);\\n break;\\n case \\\"CONFIG\\\":\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\n break;\\n case \\\"CGFBR\\\":\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\n let commonParam = addEscapeChar(details.Data.ComPar);\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\n let lteParam = addEscapeChar(details.Data.LtePar);\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\n let bleParam = addEscapeChar(details.Data.BlePar);\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\n break;\\n case \\\"REBOOTB\\\":\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\n break;\\n case \\\"PWRFB\\\":\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\n break;\\n case \\\"RESETB\\\":\\n AddConfig(configIds.Bracelet.Reset, 'true');\\n break;\\n case \\\"BRAPWUPDATE\\\":\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\n // get password from old device, then set\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\n )\\n break;\\n case \\\"NOTE\\\":\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\n text = text.split(\\\",\\\").join(\\\" \\\");\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\n AddConfig(configIds.Note.Message, value)\\n break;\\n }\\n }\\n\\n function addEscapeChar(json) {\\n if (json === undefined) {\\n return undefined;\\n }\\n let outStr = \\\"\\\";\\n let jsonStr = JSON.stringify(json);\\n for (let c of jsonStr) {\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\n } else {\\n outStr += c;\\n }\\n };\\n return outStr;\\n }\\n\\n function changeSingleQuoteToDouble(jsonStr) {\\n if (jsonStr === undefined) {\\n return undefined;\\n }\\n let outStr = \\\"\\\";\\n for (let c of jsonStr) {\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\n outStr = outStr + String.fromCharCode(34);\\n } else {\\n outStr += c;\\n }\\n };\\n return outStr;\\n }\\n\\n function sendMessageToLocalhost(str) {\\n if (localTesting) {\\n console.log(\\\"Sending message to local host: \\\" + str);\\n } else {\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\n var c = createConnection(5678, server);\\n c.write(`${str}`);\\n c.end();\\n }\\n AddValue(\\\"ToLocalhost\\\", str);\\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\\n function decrypt(encdata, password) {\\n var decrypted;\\n var dataarray = encdata.split(\\\";\\\");\\n if (dataarray.length > 5) {\\n return \\\"\\\";\\n }\\n var i;\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\n if (encdata.startsWith(\\\"ACK\\\")) {\\n return encdata;\\n }\\n for (i = 0; i < 3; i++) {\\n part1 = part1 + dataarray[i] + \\\";\\\";\\n }\\n var mid = dataarray[2]; // use the message ID to create the salt\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n // base64 decoding and extract the iv and encrypted data\\n const bData = Buffer.from(enctext, 'base64');\\n const iv = bData.slice(0, 16); // initial 16 chars\\n const text = bData.slice(16); // all the encrypted data\\n // derive key using; 32 byte key length (from salted password and mid)\\n // decrypt the data in part2 and add to part1\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\n try {\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\n } catch (err) {\\n decrypted = undefined;\\n }\\n return decrypted;\\n }\\n\\n function encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n }\\n\\n function AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n deviceParams.push(cvpair);\\n }\\n\\n function AddConfig(configName, newvalue) {\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\n var cvpair = {\\n 'code': configName,\\n 'value': newvalue,\\n 'forced': true\\n };\\n configsToSend.push(cvpair);\\n };\\n }\\n\\n function isASCII(str) {\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\n }\\n}\\n// params is not defined locally -> export as module\\nif (typeof(params) === 'undefined') {\\n module.exports = {\\n execute_ops\\n }\\n} else { // on server use local defined vars\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\n // define global returns\\n msg = return_values;\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1714651746},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\n // Define array to push device data into. This will be put into the msg array at the end.\\n var deviceParams = [];\\n var configsToSend = [];\\n var tasks = [];\\n const _crypto = require('crypto');\\n // handle ACK\\n if (messageTypeCode == \\\"ACK\\\") {\\n return \\\"\\\";\\n }\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\n var password;\\n if (params.imei == \\\"null\\\") {\\n return msg;\\n }\\n password = params.imei;\\n if (configs.Password.Password === \\\"\\\") {\\n // use imei as default password when not specified\\n } else {\\n // use the password\\n password = configs.Password.Password\\n }\\n // handle encrypted messages arriving via SMS\\n // if (raw.startsWith('esendex')) {\\n // raw = raw.split('esendex')[2];\\n // encimei = raw.split(';')[1];\\n // imei = parseInt(raw.split(';')[1], 36).toString();\\n // AddValue('imei', imei);\\n // raw = raw.replace(encimei, imei);\\n // password = imei;\\n // }\\n let message = decrypt(raw, password);\\n //ToDo: handle errors messages arriving\\n // if (message.startsWith(\\\"error\\\")) {\\n // ack = \\\"ERR;\\\" + params.count_number + \\\";\\\";\\n // msg.push({\\n // 'code': 'ack',\\n // 'value': ack\\n // });\\n // console.log(msg);\\n // } \\n if (message) {\\n // send message internally\\n sendMessageToLocalhost(message);\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\n AddValue(\\\"ack\\\", ack);\\n } else {\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\n AddValue(\\\"ack\\\", ack);\\n }\\n } else { // General Oysta Template\\n switch (messageTypeLocalCode) {\\n case (\\\"COMM\\\"):\\n process_invent_msg(); //incoming invent commands\\n break;\\n case (\\\"MACB\\\"):\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\n add_params_to_output();\\n break;\\n case (\\\"REGISTER\\\"):\\n let ble_mac = params.ble_mac;\\n let iccid = params.iccid;\\n // write values to readonly settings\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\n // will automtaically Activate on Acceptance\\n if (serverParams.EnvName) {\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\n }\\n }\\n break;\\n case (\\\"CREATE\\\"):\\n // temp fix to filter old messages\\n // const cutoff = 1707523200000; //10.2.2024\\n // let message_id_time = parseInt(params.count_number, 36);\\n // if (message_id_time > cutoff){\\n let c_ble_mac = params.ble_mac;\\n let c_iccid = params.iccid;\\n // check ICCID is a number\\n if (isNaN(c_iccid)) {\\n c_iccid = \\\"invalid ICCID\\\"\\n }\\n let new_imei = params.new_imei;\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\n // sendMessageToLocalhost(c_message); \\n tasks = [{\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\n \\\"option\\\": \\\"sync\\\",\\n \\\"type\\\": \\\"createDevice\\\",\\n \\\"payload\\\": JSON.stringify({\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\n \\\"imei\\\": new_imei,\\n \\\"abortOnError\\\": false,\\n \\\"init\\\": true\\n }),\\n \\\"order\\\": 1\\n }, {\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\n \\\"option\\\": \\\"async\\\",\\n \\\"type\\\": \\\"sendMessage\\\",\\n \\\"payload\\\": JSON.stringify({\\n \\\"message\\\": c_message\\n }),\\n \\\"order\\\": 2\\n }]\\n // }\\n break;\\n case (\\\"ALLDATA\\\"):\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\n let all_data = JSON.parse(json_str);\\n if (\\\"version\\\" in all_data) {\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\n };\\n break;\\n default:\\n // all other general messages\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\n add_params_to_output();\\n }\\n // add messagetTypeLocal to output for templates\\n AddValue('local_message_type', messageTypeLocalCode);\\n }\\n var msg = {\\n 'values': deviceParams,\\n };\\n if (configsToSend.length > 0) {\\n msg.configsToSend = configsToSend\\n };\\n if (tasks.length > 0) {\\n msg.tasks = tasks\\n };\\n // commit values to receiver processor\\n console.log(msg);\\n // modify to return the object that contains your data\\n return msg;\\n\\n function add_params_to_output() {\\n if (!params.raw_accuracy) {\\n AddValue('location_accuracy', 9000);\\n } else {\\n AddValue('location_accuracy', params.raw_accuracy);\\n }\\n // generate timestamps if they don't exist\\n if (!params.event_time) {\\n AddValue('event_time', moment.utc().unix());\\n }\\n if (!params.location_time) {\\n AddValue('event_time', moment.utc().unix());\\n }\\n //if no lat and long are given, set them to 0, 0\\n if (!params.latitude_raw) {\\n AddValue('latitude', 0);\\n } else {\\n AddValue('latitude', params.latitude_raw);\\n }\\n if (!params.longitude_raw) {\\n AddValue('longitude', 0);\\n } else {\\n AddValue('longitude', params.longitude_raw);\\n }\\n // if (params.temp_bracelet){\\n // AddValue('oysta_labels', 'DegC');\\n // AddValue('single_column_value', params.temp_bracelet);\\n // }\\n }\\n\\n function process_invent_msg() {\\n const details = JSON.parse(raw);\\n // AddValue('imei', details.AppId);\\n AddValue('json_in', JSON.stringify(details));\\n switch (details.Command) {\\n case \\\"ACTIVATE_OK\\\":\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\n break;\\n case \\\"ACTIVATE_FAILS\\\":\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\n break;\\n case \\\"APPSET\\\":\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\n AddConfig(configIds.Password.Password, details.Data.Password);\\n break;\\n case \\\"CONFIG\\\":\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\n break;\\n case \\\"CGFBR\\\":\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\n let commonParam = addEscapeChar(details.Data.ComPar);\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\n let lteParam = addEscapeChar(details.Data.LtePar);\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\n let bleParam = addEscapeChar(details.Data.BlePar);\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\n break;\\n case \\\"REBOOTB\\\":\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\n break;\\n case \\\"PWRFB\\\":\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\n break;\\n case \\\"RESETB\\\":\\n AddConfig(configIds.Bracelet.Reset, 'true');\\n break;\\n case \\\"BRAPWUPDATE\\\":\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\n // get password from old device, then set\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\n )\\n break;\\n case \\\"NOTE\\\":\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\n text = text.split(\\\",\\\").join(\\\" \\\");\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\n AddConfig(configIds.Note.Message, value)\\n break;\\n }\\n }\\n\\n function addEscapeChar(json) {\\n if (json === undefined) {\\n return undefined;\\n }\\n let outStr = \\\"\\\";\\n let jsonStr = JSON.stringify(json);\\n for (let c of jsonStr) {\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\n } else {\\n outStr += c;\\n }\\n };\\n return outStr;\\n }\\n\\n function changeSingleQuoteToDouble(jsonStr) {\\n if (jsonStr === undefined) {\\n return undefined;\\n }\\n let outStr = \\\"\\\";\\n for (let c of jsonStr) {\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\n outStr = outStr + String.fromCharCode(34);\\n } else {\\n outStr += c;\\n }\\n };\\n return outStr;\\n }\\n\\n function sendMessageToLocalhost(str) {\\n if (localTesting) {\\n console.log(\\\"Sending message to local host: \\\" + str);\\n } else {\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\n var c = createConnection(5678, server);\\n c.write(`${str}`);\\n c.end();\\n }\\n AddValue(\\\"ToLocalhost\\\", str);\\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\\n function decrypt(encdata, password) {\\n var decrypted;\\n var dataarray = encdata.split(\\\";\\\");\\n if (dataarray.length > 5) {\\n return \\\"\\\";\\n }\\n var i;\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\n if (encdata.startsWith(\\\"ACK\\\")) {\\n return encdata;\\n }\\n for (i = 0; i < 3; i++) {\\n part1 = part1 + dataarray[i] + \\\";\\\";\\n }\\n var mid = dataarray[2]; // use the message ID to create the salt\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n // base64 decoding and extract the iv and encrypted data\\n const bData = Buffer.from(enctext, 'base64');\\n const iv = bData.slice(0, 16); // initial 16 chars\\n const text = bData.slice(16); // all the encrypted data\\n // derive key using; 32 byte key length (from salted password and mid)\\n // decrypt the data in part2 and add to part1\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\n try {\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\n } catch (err) {\\n decrypted = undefined;\\n }\\n return decrypted;\\n }\\n\\n function encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n }\\n\\n function AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n deviceParams.push(cvpair);\\n }\\n\\n function AddConfig(configName, newvalue) {\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\n var cvpair = {\\n 'code': configName,\\n 'value': newvalue,\\n 'forced': true\\n };\\n configsToSend.push(cvpair);\\n };\\n }\\n\\n function isASCII(str) {\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\n }\\n}\\n// params is not defined locally -> export as module\\nif (typeof(params) === 'undefined') {\\n module.exports = {\\n execute_ops\\n }\\n} else { // on server use local defined vars\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\n // define global returns\\n msg = return_values;\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1715247045},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\n // Define array to push device data into. This will be put into the msg array at the end.\\n var deviceParams = [];\\n var configsToSend = [];\\n var tasks = [];\\n const _crypto = require('crypto');\\n // handle ACK\\n if (messageTypeCode == \\\"ACK\\\") {\\n return \\\"\\\";\\n }\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\n var password;\\n if (params.imei == \\\"null\\\") {\\n return msg;\\n }\\n password = params.imei;\\n if (configs.Password.Password === \\\"\\\") {\\n // use imei as default password when not specified\\n } else {\\n // use the password\\n password = configs.Password.Password\\n }\\n // handle encrypted messages arriving via SMS\\n // if (raw.startsWith('esendex')) {\\n // raw = raw.split('esendex')[2];\\n // encimei = raw.split(';')[1];\\n // imei = parseInt(raw.split(';')[1], 36).toString();\\n // AddValue('imei', imei);\\n // raw = raw.replace(encimei, imei);\\n // password = imei;\\n // }\\n let message = decrypt(raw, password);\\n //ToDo: handle errors messages arriving\\n // if (message.startsWith(\\\"error\\\")) {\\n // ack = \\\"ERR;\\\" + params.count_number + \\\";\\\";\\n // msg.push({\\n // 'code': 'ack',\\n // 'value': ack\\n // });\\n // console.log(msg);\\n // } \\n if (message) {\\n // send message internally\\n sendMessageToLocalhost(message);\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\n AddValue(\\\"ack\\\", ack);\\n } else {\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\n AddValue(\\\"ack\\\", ack);\\n }\\n } else { // General Oysta Template\\n switch (messageTypeLocalCode) {\\n case (\\\"COMM\\\"):\\n process_invent_msg(); //incoming invent commands\\n break;\\n case (\\\"MACB\\\"):\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\n add_params_to_output();\\n break;\\n case (\\\"REGISTER\\\"):\\n let ble_mac = params.ble_mac;\\n let iccid = params.iccid;\\n // write values to readonly settings\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\n // will automtaically Activate on Acceptance\\n if (serverParams.EnvName) {\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\n }\\n }\\n break;\\n case (\\\"CREATE\\\"):\\n // temp fix to filter old messages\\n // const cutoff = 1707523200000; //10.2.2024\\n // let message_id_time = parseInt(params.count_number, 36);\\n // if (message_id_time > cutoff){\\n let c_ble_mac = params.ble_mac;\\n let c_iccid = params.iccid;\\n // check ICCID is a number\\n if (isNaN(c_iccid)) {\\n c_iccid = \\\"invalid ICCID\\\"\\n }\\n let new_imei = params.new_imei;\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\n // sendMessageToLocalhost(c_message); \\n tasks = [{\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\n \\\"option\\\": \\\"sync\\\",\\n \\\"type\\\": \\\"createDevice\\\",\\n \\\"payload\\\": JSON.stringify({\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\n \\\"imei\\\": new_imei,\\n \\\"abortOnError\\\": false,\\n \\\"init\\\": true\\n }),\\n \\\"order\\\": 1\\n }, {\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\n \\\"option\\\": \\\"async\\\",\\n \\\"type\\\": \\\"sendMessage\\\",\\n \\\"payload\\\": JSON.stringify({\\n \\\"message\\\": c_message\\n }),\\n \\\"order\\\": 2\\n }]\\n // }\\n break;\\n case (\\\"ALLDATA\\\"):\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\n let all_data = JSON.parse(json_str);\\n if (\\\"version\\\" in all_data) {\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\n };\\n if (\\\"restarts\\\" in all_data) {\\n AddConfig(configIds.DeviceConfig.Restarts, all_data.restarts);\\n };\\n if (\\\"mtbr\\\" in all_data) {\\n AddConfig(configIds.DeviceConfig.MTBR, all_data.mtbr);\\n };\\n break;\\n default:\\n // all other general messages\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\n add_params_to_output();\\n }\\n // add messagetTypeLocal to output for templates\\n AddValue('local_message_type', messageTypeLocalCode);\\n }\\n var msg = {\\n 'values': deviceParams,\\n };\\n if (configsToSend.length > 0) {\\n msg.configsToSend = configsToSend\\n };\\n if (tasks.length > 0) {\\n msg.tasks = tasks\\n };\\n // commit values to receiver processor\\n console.log(msg);\\n // modify to return the object that contains your data\\n return msg;\\n\\n function add_params_to_output() {\\n if (!params.raw_accuracy) {\\n AddValue('location_accuracy', 9000);\\n } else {\\n AddValue('location_accuracy', params.raw_accuracy);\\n }\\n // generate timestamps if they don't exist\\n if (!params.event_time) {\\n AddValue('event_time', moment.utc().unix());\\n }\\n if (!params.location_time) {\\n AddValue('event_time', moment.utc().unix());\\n }\\n //if no lat and long are given, set them to 0, 0\\n if (!params.latitude_raw) {\\n AddValue('latitude', 0);\\n } else {\\n AddValue('latitude', params.latitude_raw);\\n }\\n if (!params.longitude_raw) {\\n AddValue('longitude', 0);\\n } else {\\n AddValue('longitude', params.longitude_raw);\\n }\\n // if (params.temp_bracelet){\\n // AddValue('oysta_labels', 'DegC');\\n // AddValue('single_column_value', params.temp_bracelet);\\n // }\\n }\\n\\n function process_invent_msg() {\\n const details = JSON.parse(raw);\\n // AddValue('imei', details.AppId);\\n AddValue('json_in', JSON.stringify(details));\\n switch (details.Command) {\\n case \\\"ACTIVATE_OK\\\":\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\n break;\\n case \\\"ACTIVATE_FAILS\\\":\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\n break;\\n case \\\"APPSET\\\":\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\n AddConfig(configIds.Password.Password, details.Data.Password);\\n break;\\n case \\\"CONFIG\\\":\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\n break;\\n case \\\"CGFBR\\\":\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\n let commonParam = addEscapeChar(details.Data.ComPar);\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\n let lteParam = addEscapeChar(details.Data.LtePar);\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\n let bleParam = addEscapeChar(details.Data.BlePar);\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\n break;\\n case \\\"REBOOTB\\\":\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\n break;\\n case \\\"PWRFB\\\":\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\n break;\\n case \\\"RESETB\\\":\\n AddConfig(configIds.Bracelet.Reset, 'true');\\n break;\\n case \\\"BRAPWUPDATE\\\":\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\n // get password from old device, then set\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\n )\\n break;\\n case \\\"NOTE\\\":\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\n text = text.split(\\\",\\\").join(\\\" \\\");\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\n AddConfig(configIds.Note.Message, value)\\n break;\\n }\\n }\\n\\n function addEscapeChar(json) {\\n if (json === undefined) {\\n return undefined;\\n }\\n let outStr = \\\"\\\";\\n let jsonStr = JSON.stringify(json);\\n for (let c of jsonStr) {\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\n } else {\\n outStr += c;\\n }\\n };\\n return outStr;\\n }\\n\\n function changeSingleQuoteToDouble(jsonStr) {\\n if (jsonStr === undefined) {\\n return undefined;\\n }\\n let outStr = \\\"\\\";\\n for (let c of jsonStr) {\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\n outStr = outStr + String.fromCharCode(34);\\n } else {\\n outStr += c;\\n }\\n };\\n return outStr;\\n }\\n\\n function sendMessageToLocalhost(str) {\\n if (localTesting) {\\n console.log(\\\"Sending message to local host: \\\" + str);\\n } else {\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\n var c = createConnection(5678, server);\\n c.write(`${str}`);\\n c.end();\\n }\\n AddValue(\\\"ToLocalhost\\\", str);\\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\\n function decrypt(encdata, password) {\\n var decrypted;\\n var dataarray = encdata.split(\\\";\\\");\\n if (dataarray.length > 5) {\\n return \\\"\\\";\\n }\\n var i;\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\n if (encdata.startsWith(\\\"ACK\\\")) {\\n return encdata;\\n }\\n for (i = 0; i < 3; i++) {\\n part1 = part1 + dataarray[i] + \\\";\\\";\\n }\\n var mid = dataarray[2]; // use the message ID to create the salt\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n // base64 decoding and extract the iv and encrypted data\\n const bData = Buffer.from(enctext, 'base64');\\n const iv = bData.slice(0, 16); // initial 16 chars\\n const text = bData.slice(16); // all the encrypted data\\n // derive key using; 32 byte key length (from salted password and mid)\\n // decrypt the data in part2 and add to part1\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\n try {\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\n } catch (err) {\\n decrypted = undefined;\\n }\\n return decrypted;\\n }\\n\\n function encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n }\\n\\n function AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n deviceParams.push(cvpair);\\n }\\n\\n function AddConfig(configName, newvalue) {\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\n var cvpair = {\\n 'code': configName,\\n 'value': newvalue,\\n 'forced': true\\n };\\n configsToSend.push(cvpair);\\n };\\n }\\n\\n function isASCII(str) {\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\n }\\n}\\n// params is not defined locally -> export as module\\nif (typeof(params) === 'undefined') {\\n module.exports = {\\n execute_ops\\n }\\n} else { // on server use local defined vars\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\n // define global returns\\n msg = return_values;\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1716206509},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\n // Define array to push device data into. This will be put into the msg array at the end.\\n var deviceParams = [];\\n var configsToSend = [];\\n var tasks = [];\\n const _crypto = require('crypto');\\n // handle ACK\\n if (messageTypeCode == \\\"ACK\\\") {\\n return \\\"\\\";\\n }\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\n var password;\\n if (params.imei == \\\"null\\\") {\\n return msg;\\n }\\n password = params.imei;\\n if (configs.Password.Password === \\\"\\\") {\\n // use imei as default password when not specified\\n } else {\\n // use the password\\n password = configs.Password.Password\\n }\\n // handle encrypted messages arriving via SMS\\n // if (raw.startsWith('esendex')) {\\n // raw = raw.split('esendex')[2];\\n // encimei = raw.split(';')[1];\\n // imei = parseInt(raw.split(';')[1], 36).toString();\\n // AddValue('imei', imei);\\n // raw = raw.replace(encimei, imei);\\n // password = imei;\\n // }\\n let message = decrypt(raw, password);\\n //ToDo: handle errors messages arriving\\n // if (message.startsWith(\\\"error\\\")) {\\n // ack = \\\"ERR;\\\" + params.count_number + \\\";\\\";\\n // msg.push({\\n // 'code': 'ack',\\n // 'value': ack\\n // });\\n // console.log(msg);\\n // } \\n if (message) {\\n // send message internally\\n sendMessageToLocalhost(message);\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\n AddValue(\\\"ack\\\", ack);\\n } else {\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\n AddValue(\\\"ack\\\", ack);\\n }\\n } else { // General Oysta Template\\n switch (messageTypeLocalCode) {\\n case (\\\"COMM\\\"):\\n process_invent_msg(); //incoming invent commands\\n break;\\n case (\\\"MACB\\\"):\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\n add_params_to_output();\\n break;\\n case (\\\"REGISTER\\\"):\\n let ble_mac = params.ble_mac;\\n let iccid = params.iccid;\\n // write values to readonly settings\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\n // will automtaically Activate on Acceptance\\n if (serverParams.EnvName) {\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\n }\\n }\\n break;\\n case (\\\"CREATE\\\"):\\n // temp fix to filter old messages\\n // const cutoff = 1707523200000; //10.2.2024\\n // let message_id_time = parseInt(params.count_number, 36);\\n // if (message_id_time > cutoff){\\n let c_ble_mac = params.ble_mac;\\n let c_iccid = params.iccid;\\n // check ICCID is a number\\n if (isNaN(c_iccid)) {\\n c_iccid = \\\"invalid ICCID\\\"\\n }\\n let new_imei = params.new_imei;\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\n // sendMessageToLocalhost(c_message); \\n tasks = [{\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\n \\\"option\\\": \\\"sync\\\",\\n \\\"type\\\": \\\"createDevice\\\",\\n \\\"payload\\\": JSON.stringify({\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\n \\\"imei\\\": new_imei,\\n \\\"abortOnError\\\": false,\\n \\\"init\\\": true\\n }),\\n \\\"order\\\": 1\\n }, {\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\n \\\"option\\\": \\\"async\\\",\\n \\\"type\\\": \\\"sendMessage\\\",\\n \\\"payload\\\": JSON.stringify({\\n \\\"message\\\": c_message\\n }),\\n \\\"order\\\": 2\\n }]\\n // }\\n break;\\n case (\\\"ALLDATA\\\"):\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\n let all_data = JSON.parse(json_str);\\n if (\\\"version\\\" in all_data) {\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\n };\\n if (\\\"restarts\\\" in all_data) {\\n AddConfig(configIds.DeviceConfig.Restarts, all_data.restarts);\\n };\\n if (\\\"mtbr\\\" in all_data) {\\n AddConfig(configIds.DeviceConfig.MTBR, new Date(all_data.mtbr * 1000).toISOString().substring(11, 19));\\n };\\n break;\\n default:\\n // all other general messages\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\n add_params_to_output();\\n }\\n // add messagetTypeLocal to output for templates\\n AddValue('local_message_type', messageTypeLocalCode);\\n }\\n var msg = {\\n 'values': deviceParams,\\n };\\n if (configsToSend.length > 0) {\\n msg.configsToSend = configsToSend\\n };\\n if (tasks.length > 0) {\\n msg.tasks = tasks\\n };\\n // commit values to receiver processor\\n console.log(msg);\\n // modify to return the object that contains your data\\n return msg;\\n\\n function add_params_to_output() {\\n if (!params.raw_accuracy) {\\n AddValue('location_accuracy', 9000);\\n } else {\\n AddValue('location_accuracy', params.raw_accuracy);\\n }\\n // generate timestamps if they don't exist\\n if (!params.event_time) {\\n AddValue('event_time', moment.utc().unix());\\n }\\n if (!params.location_time) {\\n AddValue('event_time', moment.utc().unix());\\n }\\n //if no lat and long are given, set them to 0, 0\\n if (!params.latitude_raw) {\\n AddValue('latitude', 0);\\n } else {\\n AddValue('latitude', params.latitude_raw);\\n }\\n if (!params.longitude_raw) {\\n AddValue('longitude', 0);\\n } else {\\n AddValue('longitude', params.longitude_raw);\\n }\\n // if (params.temp_bracelet){\\n // AddValue('oysta_labels', 'DegC');\\n // AddValue('single_column_value', params.temp_bracelet);\\n // }\\n }\\n\\n function process_invent_msg() {\\n const details = JSON.parse(raw);\\n // AddValue('imei', details.AppId);\\n AddValue('json_in', JSON.stringify(details));\\n switch (details.Command) {\\n case \\\"ACTIVATE_OK\\\":\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\n break;\\n case \\\"ACTIVATE_FAILS\\\":\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\n break;\\n case \\\"APPSET\\\":\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\n AddConfig(configIds.Password.Password, details.Data.Password);\\n break;\\n case \\\"CONFIG\\\":\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\n break;\\n case \\\"CGFBR\\\":\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\n let commonParam = addEscapeChar(details.Data.ComPar);\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\n let lteParam = addEscapeChar(details.Data.LtePar);\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\n let bleParam = addEscapeChar(details.Data.BlePar);\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\n break;\\n case \\\"REBOOTB\\\":\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\n break;\\n case \\\"PWRFB\\\":\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\n break;\\n case \\\"RESETB\\\":\\n AddConfig(configIds.Bracelet.Reset, 'true');\\n break;\\n case \\\"BRAPWUPDATE\\\":\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\n // get password from old device, then set\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\n )\\n break;\\n case \\\"NOTE\\\":\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\n text = text.split(\\\",\\\").join(\\\" \\\");\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\n AddConfig(configIds.Note.Message, value)\\n break;\\n }\\n }\\n\\n function addEscapeChar(json) {\\n if (json === undefined) {\\n return undefined;\\n }\\n let outStr = \\\"\\\";\\n let jsonStr = JSON.stringify(json);\\n for (let c of jsonStr) {\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\n } else {\\n outStr += c;\\n }\\n };\\n return outStr;\\n }\\n\\n function changeSingleQuoteToDouble(jsonStr) {\\n if (jsonStr === undefined) {\\n return undefined;\\n }\\n let outStr = \\\"\\\";\\n for (let c of jsonStr) {\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\n outStr = outStr + String.fromCharCode(34);\\n } else {\\n outStr += c;\\n }\\n };\\n return outStr;\\n }\\n\\n function sendMessageToLocalhost(str) {\\n if (localTesting) {\\n console.log(\\\"Sending message to local host: \\\" + str);\\n } else {\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\n var c = createConnection(5678, server);\\n c.write(`${str}`);\\n c.end();\\n }\\n AddValue(\\\"ToLocalhost\\\", str);\\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\\n function decrypt(encdata, password) {\\n var decrypted;\\n var dataarray = encdata.split(\\\";\\\");\\n if (dataarray.length > 5) {\\n return \\\"\\\";\\n }\\n var i;\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\n if (encdata.startsWith(\\\"ACK\\\")) {\\n return encdata;\\n }\\n for (i = 0; i < 3; i++) {\\n part1 = part1 + dataarray[i] + \\\";\\\";\\n }\\n var mid = dataarray[2]; // use the message ID to create the salt\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n // base64 decoding and extract the iv and encrypted data\\n const bData = Buffer.from(enctext, 'base64');\\n const iv = bData.slice(0, 16); // initial 16 chars\\n const text = bData.slice(16); // all the encrypted data\\n // derive key using; 32 byte key length (from salted password and mid)\\n // decrypt the data in part2 and add to part1\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\n try {\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\n } catch (err) {\\n decrypted = undefined;\\n }\\n return decrypted;\\n }\\n\\n function encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n }\\n\\n function AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n deviceParams.push(cvpair);\\n }\\n\\n function AddConfig(configName, newvalue) {\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\n var cvpair = {\\n 'code': configName,\\n 'value': newvalue,\\n 'forced': true\\n };\\n configsToSend.push(cvpair);\\n };\\n }\\n\\n function isASCII(str) {\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\n }\\n}\\n// params is not defined locally -> export as module\\nif (typeof(params) === 'undefined') {\\n module.exports = {\\n execute_ops\\n }\\n} else { // on server use local defined vars\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\n // define global returns\\n msg = return_values;\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1716543912},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\n // Define array to push device data into. This will be put into the msg array at the end.\\n var deviceParams = [];\\n var configsToSend = [];\\n var tasks = [];\\n const _crypto = require('crypto');\\n // handle ACK\\n if (messageTypeCode == \\\"ACK\\\") {\\n return \\\"\\\";\\n }\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\n var password;\\n if (params.imei == \\\"null\\\") {\\n return msg;\\n }\\n password = params.imei;\\n if (configs.Password.Password === \\\"\\\") {\\n // use imei as default password when not specified\\n } else {\\n // use the password\\n password = configs.Password.Password\\n }\\n // handle encrypted messages arriving via SMS\\n // if (raw.startsWith('esendex')) {\\n // raw = raw.split('esendex')[2];\\n // encimei = raw.split(';')[1];\\n // imei = parseInt(raw.split(';')[1], 36).toString();\\n // AddValue('imei', imei);\\n // raw = raw.replace(encimei, imei);\\n // password = imei;\\n // }\\n let message = decrypt(raw, password);\\n //ToDo: handle errors messages arriving\\n // if (message.startsWith(\\\"error\\\")) {\\n // ack = \\\"ERR;\\\" + params.count_number + \\\";\\\";\\n // msg.push({\\n // 'code': 'ack',\\n // 'value': ack\\n // });\\n // console.log(msg);\\n // } \\n if (message) {\\n // send message internally\\n sendMessageToLocalhost(message);\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\n AddValue(\\\"ack\\\", ack);\\n } else {\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\n AddValue(\\\"ack\\\", ack);\\n }\\n } else { // General Oysta Template\\n switch (messageTypeLocalCode) {\\n case (\\\"COMM\\\"):\\n process_invent_msg(); //incoming invent commands\\n break;\\n case (\\\"MACB\\\"):\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\n add_params_to_output();\\n break;\\n case \\\"GETPWB\\\": // handle GETPWB message\\n let imei = params.braceletIMEI; // not actually needed ?\\n let mac = params.BLEMAC; // not actually needed ?\\n let BraceletPW = \\\"\\\"; // until we set it from query below\\n if (params.braceletIMEI) {\\n if (serverParams.Password) {\\n BraceletPW = serverParams.Password; // query key value table\\n console.log(BraceletPW); // print for testing reasons\\n AddConfig(configIds.DeviceConfig.BraceletPW, BraceletPW); //this to return the value\\n }\\n } else {\\n //return error\\n }\\n break;\\n case (\\\"REGISTER\\\"):\\n let ble_mac = params.ble_mac;\\n let iccid = params.iccid;\\n // write values to readonly settings\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\n // will automtaically Activate on Acceptance\\n if (serverParams.EnvName) {\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\n }\\n }\\n break;\\n case (\\\"CREATE\\\"):\\n // temp fix to filter old messages\\n // const cutoff = 1707523200000; //10.2.2024\\n // let message_id_time = parseInt(params.count_number, 36);\\n // if (message_id_time > cutoff){\\n let c_ble_mac = params.ble_mac;\\n let c_iccid = params.iccid;\\n // check ICCID is a number\\n if (isNaN(c_iccid)) {\\n c_iccid = \\\"invalid ICCID\\\"\\n }\\n let new_imei = params.new_imei;\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\n // sendMessageToLocalhost(c_message); \\n tasks = [{\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\n \\\"option\\\": \\\"sync\\\",\\n \\\"type\\\": \\\"createDevice\\\",\\n \\\"payload\\\": JSON.stringify({\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\n \\\"imei\\\": new_imei,\\n \\\"abortOnError\\\": false,\\n \\\"init\\\": true\\n }),\\n \\\"order\\\": 1\\n }, {\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\n \\\"option\\\": \\\"async\\\",\\n \\\"type\\\": \\\"sendMessage\\\",\\n \\\"payload\\\": JSON.stringify({\\n \\\"message\\\": c_message\\n }),\\n \\\"order\\\": 2\\n }]\\n // }\\n break;\\n case (\\\"ALLDATA\\\"):\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\n let all_data = JSON.parse(json_str);\\n if (\\\"version\\\" in all_data) {\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\n };\\n if (\\\"restarts\\\" in all_data) {\\n AddConfig(configIds.DeviceConfig.Restarts, all_data.restarts);\\n };\\n if (\\\"mtbr\\\" in all_data) {\\n AddConfig(configIds.DeviceConfig.MTBR, new Date(all_data.mtbr * 1000).toISOString().substring(11, 19));\\n };\\n break;\\n default:\\n // all other general messages\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\n add_params_to_output();\\n }\\n // add messagetTypeLocal to output for templates\\n AddValue('local_message_type', messageTypeLocalCode);\\n }\\n var msg = {\\n 'values': deviceParams,\\n };\\n if (configsToSend.length > 0) {\\n msg.configsToSend = configsToSend\\n };\\n if (tasks.length > 0) {\\n msg.tasks = tasks\\n };\\n // commit values to receiver processor\\n console.log(msg);\\n // modify to return the object that contains your data\\n return msg;\\n\\n function add_params_to_output() {\\n if (!params.raw_accuracy) {\\n AddValue('location_accuracy', 9000);\\n } else {\\n AddValue('location_accuracy', params.raw_accuracy);\\n }\\n // generate timestamps if they don't exist\\n if (!params.event_time) {\\n AddValue('event_time', moment.utc().unix());\\n }\\n if (!params.location_time) {\\n AddValue('event_time', moment.utc().unix());\\n }\\n //if no lat and long are given, set them to 0, 0\\n if (!params.latitude_raw) {\\n AddValue('latitude', 0);\\n } else {\\n AddValue('latitude', params.latitude_raw);\\n }\\n if (!params.longitude_raw) {\\n AddValue('longitude', 0);\\n } else {\\n AddValue('longitude', params.longitude_raw);\\n }\\n // if (params.temp_bracelet){\\n // AddValue('oysta_labels', 'DegC');\\n // AddValue('single_column_value', params.temp_bracelet);\\n // }\\n }\\n\\n function process_invent_msg() {\\n const details = JSON.parse(raw);\\n // AddValue('imei', details.AppId);\\n AddValue('json_in', JSON.stringify(details));\\n switch (details.Command) {\\n case \\\"ACTIVATE_OK\\\":\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\n break;\\n case \\\"ACTIVATE_FAILS\\\":\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\n break;\\n case \\\"APPSET\\\":\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\n AddConfig(configIds.Password.Password, details.Data.Password);\\n break;\\n case \\\"CONFIG\\\":\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\n break;\\n case \\\"CGFBR\\\":\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\n let commonParam = addEscapeChar(details.Data.ComPar);\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\n let lteParam = addEscapeChar(details.Data.LtePar);\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\n let bleParam = addEscapeChar(details.Data.BlePar);\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\n break;\\n case \\\"REBOOTB\\\":\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\n break;\\n case \\\"PWRFB\\\":\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\n break;\\n case \\\"RESETB\\\":\\n AddConfig(configIds.Bracelet.Reset, 'true');\\n break;\\n case \\\"BRAPWUPDATE\\\":\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\n // get password from old device, then set\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\n )\\n break;\\n case \\\"NOTE\\\":\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\n text = text.split(\\\",\\\").join(\\\" \\\");\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\n AddConfig(configIds.Note.Message, value)\\n break;\\n }\\n }\\n\\n function addEscapeChar(json) {\\n if (json === undefined) {\\n return undefined;\\n }\\n let outStr = \\\"\\\";\\n let jsonStr = JSON.stringify(json);\\n for (let c of jsonStr) {\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\n } else {\\n outStr += c;\\n }\\n };\\n return outStr;\\n }\\n\\n function changeSingleQuoteToDouble(jsonStr) {\\n if (jsonStr === undefined) {\\n return undefined;\\n }\\n let outStr = \\\"\\\";\\n for (let c of jsonStr) {\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\n outStr = outStr + String.fromCharCode(34);\\n } else {\\n outStr += c;\\n }\\n };\\n return outStr;\\n }\\n\\n function sendMessageToLocalhost(str) {\\n if (localTesting) {\\n console.log(\\\"Sending message to local host: \\\" + str);\\n } else {\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\n var c = createConnection(5678, server);\\n c.write(`${str}`);\\n c.end();\\n }\\n AddValue(\\\"ToLocalhost\\\", str);\\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\\n function decrypt(encdata, password) {\\n var decrypted;\\n var dataarray = encdata.split(\\\";\\\");\\n if (dataarray.length > 5) {\\n return \\\"\\\";\\n }\\n var i;\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\n if (encdata.startsWith(\\\"ACK\\\")) {\\n return encdata;\\n }\\n for (i = 0; i < 3; i++) {\\n part1 = part1 + dataarray[i] + \\\";\\\";\\n }\\n var mid = dataarray[2]; // use the message ID to create the salt\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n // base64 decoding and extract the iv and encrypted data\\n const bData = Buffer.from(enctext, 'base64');\\n const iv = bData.slice(0, 16); // initial 16 chars\\n const text = bData.slice(16); // all the encrypted data\\n // derive key using; 32 byte key length (from salted password and mid)\\n // decrypt the data in part2 and add to part1\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\n try {\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\n } catch (err) {\\n decrypted = undefined;\\n }\\n return decrypted;\\n }\\n\\n function encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n }\\n\\n function AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n deviceParams.push(cvpair);\\n }\\n\\n function AddConfig(configName, newvalue) {\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\n var cvpair = {\\n 'code': configName,\\n 'value': newvalue,\\n 'forced': true\\n };\\n configsToSend.push(cvpair);\\n };\\n }\\n\\n function isASCII(str) {\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\n }\\n}\\n// params is not defined locally -> export as module\\nif (typeof(params) === 'undefined') {\\n module.exports = {\\n execute_ops\\n }\\n} else { // on server use local defined vars\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\n // define global returns\\n msg = return_values;\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1742311652},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n // Define array to push device data into. This will be put into the msg array at the end.\\r\\n var deviceParams = [];\\r\\n var configsToSend = [];\\r\\n var tasks = [];\\r\\n const _crypto = require('crypto');\\r\\n // handle ACK\\r\\n if (messageTypeCode == \\\"ACK\\\") {\\r\\n return \\\"\\\";\\r\\n }\\r\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\r\\n var password;\\r\\n if (params.imei == \\\"null\\\") {\\r\\n return msg;\\r\\n }\\r\\n password = params.imei;\\r\\n if (configs.Password.Password === \\\"\\\") {\\r\\n // use imei as default password when not specified\\r\\n } else {\\r\\n // use the password\\r\\n password = configs.Password.Password\\r\\n }\\r\\n let message = decrypt(raw, password);\\r\\n if (message) {\\r\\n // send message internally\\r\\n sendMessageToLocalhost(message);\\r\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n } else {\\r\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n }\\r\\n } else { // General Oysta Template\\r\\n switch (messageTypeLocalCode) {\\r\\n case (\\\"COMM\\\"):\\r\\n process_invent_msg(); //incoming invent commands\\r\\n break;\\r\\n case (\\\"MACB\\\"):\\r\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\r\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\r\\n add_params_to_output();\\r\\n break;\\r\\n case \\\"INFO-GETPWB\\\": // handle GETPWB message\\r\\n let imei = params.bracelet_imei; // not actually needed ?\\r\\n //let mac = params.BLEMAC; // not actually needed ?\\r\\n let BraceletPW = \\\"\\\"; // until we set it from query below\\r\\n if (params.braceletIMEI) {\\r\\n if (serverParams.Password) {\\r\\n BraceletPW = serverParams.Password; // query key value table\\r\\n console.log(BraceletPW); // print for testing reasons\\r\\n AddConfig(configIds.DeviceConfig.BraceletPW, BraceletPW); //this to return the value\\r\\n }\\r\\n } else {\\r\\n //return error\\r\\n }\\r\\n break;\\r\\n case (\\\"REGISTER\\\"):\\r\\n let ble_mac = params.ble_mac;\\r\\n let iccid = params.iccid;\\r\\n // write values to readonly settings\\r\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\r\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\r\\n // will automtaically Activate on Acceptance\\r\\n if (serverParams.EnvName) {\\r\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\r\\n }\\r\\n }\\r\\n break;\\r\\n case (\\\"CREATE\\\"):\\r\\n // temp fix to filter old messages\\r\\n // const cutoff = 1707523200000; //10.2.2024\\r\\n // let message_id_time = parseInt(params.count_number, 36);\\r\\n // if (message_id_time > cutoff){\\r\\n let c_ble_mac = params.ble_mac;\\r\\n let c_iccid = params.iccid;\\r\\n let new_imei = params.new_imei;\\r\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\r\\n // sendMessageToLocalhost(c_message); \\r\\n tasks = [{\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"sync\\\",\\r\\n \\\"type\\\": \\\"createDevice\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"imei\\\": new_imei,\\r\\n \\\"abortOnError\\\": false,\\r\\n \\\"init\\\": true\\r\\n }),\\r\\n \\\"order\\\": 1\\r\\n }, {\\r\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"async\\\",\\r\\n \\\"type\\\": \\\"sendMessage\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"message\\\": c_message\\r\\n }),\\r\\n \\\"order\\\": 2\\r\\n }]\\r\\n // }\\r\\n break;\\r\\n case (\\\"ALLDATA\\\"):\\r\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\r\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\r\\n let all_data = JSON.parse(json_str);\\r\\n if (\\\"version\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\r\\n };\\r\\n break;\\r\\n default:\\r\\n // all other general messages\\r\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\r\\n add_params_to_output();\\r\\n }\\r\\n // add messagetTypeLocal to output for templates\\r\\n AddValue('local_message_type', messageTypeLocalCode);\\r\\n }\\r\\n var msg = {\\r\\n 'values': deviceParams,\\r\\n };\\r\\n if (configsToSend.length > 0) {\\r\\n msg.configsToSend = configsToSend\\r\\n };\\r\\n if (tasks.length > 0) {\\r\\n msg.tasks = tasks\\r\\n };\\r\\n // commit values to receiver processor\\r\\n console.log(msg);\\r\\n // modify to return the object that contains your data\\r\\n return msg;\\r\\n\\r\\n function add_params_to_output() {\\r\\n if (!params.raw_accuracy) {\\r\\n AddValue('location_accuracy', 9000);\\r\\n } else {\\r\\n AddValue('location_accuracy', params.raw_accuracy);\\r\\n }\\r\\n // generate timestamps if they don't exist\\r\\n if (!params.event_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n if (!params.location_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n //if no lat and long are given, set them to 0, 0\\r\\n if (!params.latitude_raw) {\\r\\n AddValue('latitude', 0);\\r\\n } else {\\r\\n AddValue('latitude', params.latitude_raw);\\r\\n }\\r\\n if (!params.longitude_raw) {\\r\\n AddValue('longitude', 0);\\r\\n } else {\\r\\n AddValue('longitude', params.longitude_raw);\\r\\n }\\r\\n // if (params.temp_bracelet){\\r\\n // AddValue('oysta_labels', 'DegC');\\r\\n // AddValue('single_column_value', params.temp_bracelet);\\r\\n // }\\r\\n }\\r\\n\\r\\n function process_invent_msg() {\\r\\n const details = JSON.parse(raw);\\r\\n // AddValue('imei', details.AppId);\\r\\n AddValue('json_in', JSON.stringify(details));\\r\\n switch (details.Command) {\\r\\n case \\\"ACTIVATE_OK\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\r\\n break;\\r\\n case \\\"ACTIVATE_FAILS\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\r\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\r\\n break;\\r\\n case \\\"APPSET\\\":\\r\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\r\\n AddConfig(configIds.Password.Password, details.Data.Password);\\r\\n break;\\r\\n case \\\"CONFIG\\\":\\r\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\r\\n break;\\r\\n case \\\"CGFBR\\\":\\r\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\r\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\r\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\r\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\r\\n let commonParam = addEscapeChar(details.Data.ComPar);\\r\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\r\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\r\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\r\\n let lteParam = addEscapeChar(details.Data.LtePar);\\r\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\r\\n let bleParam = addEscapeChar(details.Data.BlePar);\\r\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\r\\n break;\\r\\n case \\\"REBOOTB\\\":\\r\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\r\\n break;\\r\\n case \\\"PWRFB\\\":\\r\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\r\\n break;\\r\\n case \\\"RESETB\\\":\\r\\n AddConfig(configIds.Bracelet.Reset, 'true');\\r\\n break;\\r\\n case \\\"BRAPWUPDATE\\\":\\r\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\r\\n // get password from old device, then set\\r\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\r\\n )\\r\\n break;\\r\\n case \\\"NOTE\\\":\\r\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\r\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\r\\n text = text.split(\\\",\\\").join(\\\" \\\");\\r\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\r\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\r\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\r\\n AddConfig(configIds.Note.Message, value)\\r\\n break;\\r\\n }\\r\\n }\\r\\n\\r\\n function addEscapeChar(json) {\\r\\n if (json === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n let jsonStr = JSON.stringify(json);\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\r\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function changeSingleQuoteToDouble(jsonStr) {\\r\\n if (jsonStr === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\r\\n outStr = outStr + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function sendMessageToLocalhost(str) {\\r\\n if (localTesting) {\\r\\n console.log(\\\"Sending message to local host: \\\" + str);\\r\\n } else {\\r\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\r\\n var c = createConnection(5878, server); // acceptance is 5678 - protocol dev 5878 - dev is 5679 ?\\r\\n c.write(`${str}`);\\r\\n c.end();\\r\\n }\\r\\n AddValue(\\\"ToLocalhost\\\", str);\\r\\n }\\r\\n\\r\\n function createConnection(port, server) {\\r\\n c = net.createConnection(port, server);\\r\\n c.on('error', function(error) {\\r\\n c = createConnection(port, server);\\r\\n });\\r\\n return c;\\r\\n }\\r\\n\\r\\n function decrypt(encdata, password) {\\r\\n var decrypted;\\r\\n var dataarray = encdata.split(\\\";\\\");\\r\\n if (dataarray.length > 5) {\\r\\n return \\\"\\\";\\r\\n }\\r\\n var i;\\r\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\r\\n if (encdata.startsWith(\\\"ACK\\\")) {\\r\\n return encdata;\\r\\n }\\r\\n for (i = 0; i < 3; i++) {\\r\\n part1 = part1 + dataarray[i] + \\\";\\\";\\r\\n }\\r\\n var mid = dataarray[2]; // use the message ID to create the salt\\r\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n // base64 decoding and extract the iv and encrypted data\\r\\n const bData = Buffer.from(enctext, 'base64');\\r\\n const iv = bData.slice(0, 16); // initial 16 chars\\r\\n const text = bData.slice(16); // all the encrypted data\\r\\n // derive key using; 32 byte key length (from salted password and mid)\\r\\n // decrypt the data in part2 and add to part1\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\r\\n try {\\r\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\r\\n } catch (err) {\\r\\n decrypted = undefined;\\r\\n }\\r\\n return decrypted;\\r\\n }\\r\\n\\r\\n function encrypt(text, mid, password) {\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n const iv = _crypto.randomBytes(16); // random initialization vector\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n // set the cipher\\r\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\r\\n // encrypt text\\r\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\r\\n // generate output ( encrypted text )\\r\\n return Buffer.concat([iv, encrypted]).toString('base64');\\r\\n }\\r\\n\\r\\n function AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n deviceParams.push(cvpair);\\r\\n }\\r\\n\\r\\n function AddConfig(configName, newvalue) {\\r\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n var cvpair = {\\r\\n 'code': configName,\\r\\n 'value': newvalue,\\r\\n 'forced': true\\r\\n };\\r\\n configsToSend.push(cvpair);\\r\\n };\\r\\n }\\r\\n\\r\\n function isASCII(str) {\\r\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\r\\n }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n module.exports = {\\r\\n execute_ops\\r\\n }\\r\\n} else { // on server use local defined vars\\r\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n // define global returns\\r\\n msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1742386705},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n // Define array to push device data into. This will be put into the msg array at the end.\\r\\n var deviceParams = [];\\r\\n var configsToSend = [];\\r\\n var tasks = [];\\r\\n const _crypto = require('crypto');\\r\\n // handle ACK\\r\\n if (messageTypeCode == \\\"ACK\\\") {\\r\\n return \\\"\\\";\\r\\n }\\r\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\r\\n var password;\\r\\n if (params.imei == \\\"null\\\") {\\r\\n return msg;\\r\\n }\\r\\n password = params.imei;\\r\\n if (configs.Password.Password === \\\"\\\") {\\r\\n // use imei as default password when not specified\\r\\n } else {\\r\\n // use the password\\r\\n password = configs.Password.Password\\r\\n }\\r\\n let message = decrypt(raw, password);\\r\\n if (message) {\\r\\n // send message internally\\r\\n sendMessageToLocalhost(message);\\r\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n } else {\\r\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n }\\r\\n } else { // General Oysta Template\\r\\n switch (messageTypeLocalCode) {\\r\\n case (\\\"COMM\\\"):\\r\\n process_invent_msg(); //incoming invent commands\\r\\n break;\\r\\n case (\\\"MACB\\\"):\\r\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\r\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\r\\n add_params_to_output();\\r\\n break;\\r\\n case \\\"INFO-GETPWB\\\": // handle GETPWB message\\r\\n //let imei = params.bracelet_imei; // not actually needed ?\\r\\n //let mac = params.BLEMAC; // not actually needed ?\\r\\n let BraceletPW = \\\"\\\"; // until we set it from query below\\r\\n // if(params.bracelet_imei){\\r\\n // if(serverParams.Password){\\r\\n // BraceletPW = serverParams.Password; // query key value table\\r\\n // console.log(BraceletPW); // print for testing reasons\\r\\n // AddConfig(configIds.DeviceConfig.BraceletPW, BraceletPW);//this to return the value\\r\\n // }\\r\\n // }\\r\\n // else {\\r\\n // //return error\\r\\n // }\\r\\n AddValue(\\\"password\\\", \\\"myNewPassword\\\");\\r\\n break;\\r\\n case (\\\"REGISTER\\\"):\\r\\n let ble_mac = params.ble_mac;\\r\\n let iccid = params.iccid;\\r\\n // write values to readonly settings\\r\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\r\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\r\\n // will automtaically Activate on Acceptance\\r\\n if (serverParams.EnvName) {\\r\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\r\\n }\\r\\n }\\r\\n break;\\r\\n case (\\\"CREATE\\\"):\\r\\n // temp fix to filter old messages\\r\\n // const cutoff = 1707523200000; //10.2.2024\\r\\n // let message_id_time = parseInt(params.count_number, 36);\\r\\n // if (message_id_time > cutoff){\\r\\n let c_ble_mac = params.ble_mac;\\r\\n let c_iccid = params.iccid;\\r\\n let new_imei = params.new_imei;\\r\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\r\\n // sendMessageToLocalhost(c_message); \\r\\n tasks = [{\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"sync\\\",\\r\\n \\\"type\\\": \\\"createDevice\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"imei\\\": new_imei,\\r\\n \\\"abortOnError\\\": false,\\r\\n \\\"init\\\": true\\r\\n }),\\r\\n \\\"order\\\": 1\\r\\n }, {\\r\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"async\\\",\\r\\n \\\"type\\\": \\\"sendMessage\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"message\\\": c_message\\r\\n }),\\r\\n \\\"order\\\": 2\\r\\n }]\\r\\n // }\\r\\n break;\\r\\n case (\\\"ALLDATA\\\"):\\r\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\r\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\r\\n let all_data = JSON.parse(json_str);\\r\\n if (\\\"version\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\r\\n };\\r\\n break;\\r\\n default:\\r\\n // all other general messages\\r\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\r\\n add_params_to_output();\\r\\n }\\r\\n // add messagetTypeLocal to output for templates\\r\\n AddValue('local_message_type', messageTypeLocalCode);\\r\\n }\\r\\n var msg = {\\r\\n 'values': deviceParams,\\r\\n };\\r\\n if (configsToSend.length > 0) {\\r\\n msg.configsToSend = configsToSend\\r\\n };\\r\\n if (tasks.length > 0) {\\r\\n msg.tasks = tasks\\r\\n };\\r\\n // commit values to receiver processor\\r\\n console.log(msg);\\r\\n // modify to return the object that contains your data\\r\\n return msg;\\r\\n\\r\\n function add_params_to_output() {\\r\\n if (!params.raw_accuracy) {\\r\\n AddValue('location_accuracy', 9000);\\r\\n } else {\\r\\n AddValue('location_accuracy', params.raw_accuracy);\\r\\n }\\r\\n // generate timestamps if they don't exist\\r\\n if (!params.event_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n if (!params.location_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n //if no lat and long are given, set them to 0, 0\\r\\n if (!params.latitude_raw) {\\r\\n AddValue('latitude', 0);\\r\\n } else {\\r\\n AddValue('latitude', params.latitude_raw);\\r\\n }\\r\\n if (!params.longitude_raw) {\\r\\n AddValue('longitude', 0);\\r\\n } else {\\r\\n AddValue('longitude', params.longitude_raw);\\r\\n }\\r\\n // if (params.temp_bracelet){\\r\\n // AddValue('oysta_labels', 'DegC');\\r\\n // AddValue('single_column_value', params.temp_bracelet);\\r\\n // }\\r\\n }\\r\\n\\r\\n function process_invent_msg() {\\r\\n const details = JSON.parse(raw);\\r\\n // AddValue('imei', details.AppId);\\r\\n AddValue('json_in', JSON.stringify(details));\\r\\n switch (details.Command) {\\r\\n case \\\"ACTIVATE_OK\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\r\\n break;\\r\\n case \\\"ACTIVATE_FAILS\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\r\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\r\\n break;\\r\\n case \\\"APPSET\\\":\\r\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\r\\n AddConfig(configIds.Password.Password, details.Data.Password);\\r\\n break;\\r\\n case \\\"CONFIG\\\":\\r\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\r\\n break;\\r\\n case \\\"CGFBR\\\":\\r\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\r\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\r\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\r\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\r\\n let commonParam = addEscapeChar(details.Data.ComPar);\\r\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\r\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\r\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\r\\n let lteParam = addEscapeChar(details.Data.LtePar);\\r\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\r\\n let bleParam = addEscapeChar(details.Data.BlePar);\\r\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\r\\n break;\\r\\n case \\\"REBOOTB\\\":\\r\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\r\\n break;\\r\\n case \\\"PWRFB\\\":\\r\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\r\\n break;\\r\\n case \\\"RESETB\\\":\\r\\n AddConfig(configIds.Bracelet.Reset, 'true');\\r\\n break;\\r\\n case \\\"BRAPWUPDATE\\\":\\r\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\r\\n // get password from old device, then set\\r\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\r\\n )\\r\\n break;\\r\\n case \\\"NOTE\\\":\\r\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\r\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\r\\n text = text.split(\\\",\\\").join(\\\" \\\");\\r\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\r\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\r\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\r\\n AddConfig(configIds.Note.Message, value)\\r\\n break;\\r\\n }\\r\\n }\\r\\n\\r\\n function addEscapeChar(json) {\\r\\n if (json === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n let jsonStr = JSON.stringify(json);\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\r\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function changeSingleQuoteToDouble(jsonStr) {\\r\\n if (jsonStr === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\r\\n outStr = outStr + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function sendMessageToLocalhost(str) {\\r\\n if (localTesting) {\\r\\n console.log(\\\"Sending message to local host: \\\" + str);\\r\\n } else {\\r\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\r\\n var c = createConnection(5878, server); // acceptance is 5678 - protocol dev 5878 - dev is 5679 ?\\r\\n c.write(`${str}`);\\r\\n c.end();\\r\\n }\\r\\n AddValue(\\\"ToLocalhost\\\", str);\\r\\n }\\r\\n\\r\\n function createConnection(port, server) {\\r\\n c = net.createConnection(port, server);\\r\\n c.on('error', function(error) {\\r\\n c = createConnection(port, server);\\r\\n });\\r\\n return c;\\r\\n }\\r\\n\\r\\n function decrypt(encdata, password) {\\r\\n var decrypted;\\r\\n var dataarray = encdata.split(\\\";\\\");\\r\\n if (dataarray.length > 5) {\\r\\n return \\\"\\\";\\r\\n }\\r\\n var i;\\r\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\r\\n if (encdata.startsWith(\\\"ACK\\\")) {\\r\\n return encdata;\\r\\n }\\r\\n for (i = 0; i < 3; i++) {\\r\\n part1 = part1 + dataarray[i] + \\\";\\\";\\r\\n }\\r\\n var mid = dataarray[2]; // use the message ID to create the salt\\r\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n // base64 decoding and extract the iv and encrypted data\\r\\n const bData = Buffer.from(enctext, 'base64');\\r\\n const iv = bData.slice(0, 16); // initial 16 chars\\r\\n const text = bData.slice(16); // all the encrypted data\\r\\n // derive key using; 32 byte key length (from salted password and mid)\\r\\n // decrypt the data in part2 and add to part1\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\r\\n try {\\r\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\r\\n } catch (err) {\\r\\n decrypted = undefined;\\r\\n }\\r\\n return decrypted;\\r\\n }\\r\\n\\r\\n function encrypt(text, mid, password) {\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n const iv = _crypto.randomBytes(16); // random initialization vector\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n // set the cipher\\r\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\r\\n // encrypt text\\r\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\r\\n // generate output ( encrypted text )\\r\\n return Buffer.concat([iv, encrypted]).toString('base64');\\r\\n }\\r\\n\\r\\n function AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n deviceParams.push(cvpair);\\r\\n }\\r\\n\\r\\n function AddConfig(configName, newvalue) {\\r\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n var cvpair = {\\r\\n 'code': configName,\\r\\n 'value': newvalue,\\r\\n 'forced': true\\r\\n };\\r\\n configsToSend.push(cvpair);\\r\\n };\\r\\n }\\r\\n\\r\\n function isASCII(str) {\\r\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\r\\n }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n module.exports = {\\r\\n execute_ops\\r\\n }\\r\\n} else { // on server use local defined vars\\r\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n // define global returns\\r\\n msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1742387419},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n // Define array to push device data into. This will be put into the msg array at the end.\\r\\n var deviceParams = [];\\r\\n var configsToSend = [];\\r\\n var tasks = [];\\r\\n const _crypto = require('crypto');\\r\\n // handle ACK\\r\\n if (messageTypeCode == \\\"ACK\\\") {\\r\\n return \\\"\\\";\\r\\n }\\r\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\r\\n var password;\\r\\n if (params.imei == \\\"null\\\") {\\r\\n return msg;\\r\\n }\\r\\n password = params.imei;\\r\\n if (configs.Password.Password === \\\"\\\") {\\r\\n // use imei as default password when not specified\\r\\n } else {\\r\\n // use the password\\r\\n password = configs.Password.Password\\r\\n }\\r\\n let message = decrypt(raw, password);\\r\\n if (message) {\\r\\n // send message internally\\r\\n sendMessageToLocalhost(message);\\r\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n } else {\\r\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n }\\r\\n } else { // General Oysta Template\\r\\n switch (messageTypeLocalCode) {\\r\\n case (\\\"COMM\\\"):\\r\\n process_invent_msg(); //incoming invent commands\\r\\n break;\\r\\n case (\\\"MACB\\\"):\\r\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\r\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\r\\n add_params_to_output();\\r\\n break;\\r\\n case \\\"INFO-GETPWB\\\": // handle GETPWB message\\r\\n //let imei = params.bracelet_imei; // not actually needed ?\\r\\n //let mac = params.BLEMAC; // not actually needed ?\\r\\n let BraceletPW = \\\"\\\"; // until we set it from query below\\r\\n // if(params.bracelet_imei){\\r\\n // if(serverParams.Password){\\r\\n // BraceletPW = serverParams.Password; // query key value table\\r\\n // console.log(BraceletPW); // print for testing reasons\\r\\n // AddConfig(configIds.DeviceConfig.BraceletPW, BraceletPW);//this to return the value\\r\\n // }\\r\\n // }\\r\\n // else {\\r\\n // //return error\\r\\n // }\\r\\n AddValue(\\\"password\\\", \\\"myNewPassword\\\");\\r\\n break;\\r\\n case (\\\"REGISTER\\\"):\\r\\n let ble_mac = params.ble_mac;\\r\\n let iccid = params.iccid;\\r\\n // write values to readonly settings\\r\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\r\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\r\\n // will automtaically Activate on Acceptance\\r\\n if (serverParams.EnvName) {\\r\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\r\\n }\\r\\n }\\r\\n break;\\r\\n case (\\\"CREATE\\\"):\\r\\n // temp fix to filter old messages\\r\\n // const cutoff = 1707523200000; //10.2.2024\\r\\n // let message_id_time = parseInt(params.count_number, 36);\\r\\n // if (message_id_time > cutoff){\\r\\n let c_ble_mac = params.ble_mac;\\r\\n let c_iccid = params.iccid;\\r\\n let new_imei = params.new_imei;\\r\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\r\\n // sendMessageToLocalhost(c_message); \\r\\n tasks = [{\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"sync\\\",\\r\\n \\\"type\\\": \\\"createDevice\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"imei\\\": new_imei,\\r\\n \\\"abortOnError\\\": false,\\r\\n \\\"init\\\": true\\r\\n }),\\r\\n \\\"order\\\": 1\\r\\n }, {\\r\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"async\\\",\\r\\n \\\"type\\\": \\\"sendMessage\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"message\\\": c_message\\r\\n }),\\r\\n \\\"order\\\": 2\\r\\n }]\\r\\n // }\\r\\n break;\\r\\n case (\\\"ALLDATA\\\"):\\r\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\r\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\r\\n let all_data = JSON.parse(json_str);\\r\\n if (\\\"version\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\r\\n };\\r\\n break;\\r\\n default:\\r\\n // all other general messages\\r\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\r\\n add_params_to_output();\\r\\n }\\r\\n // add messagetTypeLocal to output for templates\\r\\n AddValue('local_message_type', messageTypeLocalCode);\\r\\n }\\r\\n var msg = {\\r\\n 'values': deviceParams,\\r\\n };\\r\\n if (configsToSend.length > 0) {\\r\\n msg.configsToSend = configsToSend\\r\\n };\\r\\n if (tasks.length > 0) {\\r\\n msg.tasks = tasks\\r\\n };\\r\\n // commit values to receiver processor\\r\\n console.log(msg);\\r\\n // modify to return the object that contains your data\\r\\n return msg;\\r\\n\\r\\n function add_params_to_output() {\\r\\n if (!params.raw_accuracy) {\\r\\n AddValue('location_accuracy', 9000);\\r\\n } else {\\r\\n AddValue('location_accuracy', params.raw_accuracy);\\r\\n }\\r\\n // generate timestamps if they don't exist\\r\\n if (!params.event_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n if (!params.location_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n //if no lat and long are given, set them to 0, 0\\r\\n if (!params.latitude_raw) {\\r\\n AddValue('latitude', 0);\\r\\n } else {\\r\\n AddValue('latitude', params.latitude_raw);\\r\\n }\\r\\n if (!params.longitude_raw) {\\r\\n AddValue('longitude', 0);\\r\\n } else {\\r\\n AddValue('longitude', params.longitude_raw);\\r\\n }\\r\\n // if (params.temp_bracelet){\\r\\n // AddValue('oysta_labels', 'DegC');\\r\\n // AddValue('single_column_value', params.temp_bracelet);\\r\\n // }\\r\\n }\\r\\n\\r\\n function process_invent_msg() {\\r\\n const details = JSON.parse(raw);\\r\\n // AddValue('imei', details.AppId);\\r\\n AddValue('json_in', JSON.stringify(details));\\r\\n switch (details.Command) {\\r\\n case \\\"ACTIVATE_OK\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\r\\n break;\\r\\n case \\\"ACTIVATE_FAILS\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\r\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\r\\n break;\\r\\n case \\\"APPSET\\\":\\r\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\r\\n AddConfig(configIds.Password.Password, details.Data.Password);\\r\\n break;\\r\\n case \\\"CONFIG\\\":\\r\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\r\\n break;\\r\\n case \\\"CGFBR\\\":\\r\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\r\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\r\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\r\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\r\\n let commonParam = addEscapeChar(details.Data.ComPar);\\r\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\r\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\r\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\r\\n let lteParam = addEscapeChar(details.Data.LtePar);\\r\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\r\\n let bleParam = addEscapeChar(details.Data.BlePar);\\r\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\r\\n break;\\r\\n case \\\"REBOOTB\\\":\\r\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\r\\n break;\\r\\n case \\\"PWRFB\\\":\\r\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\r\\n break;\\r\\n case \\\"RESETB\\\":\\r\\n AddConfig(configIds.Bracelet.Reset, 'true');\\r\\n break;\\r\\n case \\\"BRAPWUPDATE\\\":\\r\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\r\\n // get password from old device, then set\\r\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\r\\n )\\r\\n break;\\r\\n case \\\"NOTE\\\":\\r\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\r\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\r\\n text = text.split(\\\",\\\").join(\\\" \\\");\\r\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\r\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\r\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\r\\n AddConfig(configIds.Note.Message, value)\\r\\n break;\\r\\n }\\r\\n }\\r\\n\\r\\n function addEscapeChar(json) {\\r\\n if (json === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n let jsonStr = JSON.stringify(json);\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\r\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function changeSingleQuoteToDouble(jsonStr) {\\r\\n if (jsonStr === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\r\\n outStr = outStr + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function sendMessageToLocalhost(str) {\\r\\n if (localTesting) {\\r\\n console.log(\\\"Sending message to local host: \\\" + str);\\r\\n } else {\\r\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\r\\n var c = createConnection(5878, server); // acceptance is 5678 - protocol dev 5878 - dev is 5679 ?\\r\\n c.write(`${str}`);\\r\\n c.end();\\r\\n }\\r\\n AddValue(\\\"ToLocalhost\\\", str);\\r\\n }\\r\\n\\r\\n function createConnection(port, server) {\\r\\n c = net.createConnection(port, server);\\r\\n c.on('error', function(error) {\\r\\n c = createConnection(port, server);\\r\\n });\\r\\n return c;\\r\\n }\\r\\n\\r\\n function decrypt(encdata, password) {\\r\\n var decrypted;\\r\\n var dataarray = encdata.split(\\\";\\\");\\r\\n if (dataarray.length > 5) {\\r\\n return \\\"\\\";\\r\\n }\\r\\n var i;\\r\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\r\\n if (encdata.startsWith(\\\"ACK\\\")) {\\r\\n return encdata;\\r\\n }\\r\\n for (i = 0; i < 3; i++) {\\r\\n part1 = part1 + dataarray[i] + \\\";\\\";\\r\\n }\\r\\n var mid = dataarray[2]; // use the message ID to create the salt\\r\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n // base64 decoding and extract the iv and encrypted data\\r\\n const bData = Buffer.from(enctext, 'base64');\\r\\n const iv = bData.slice(0, 16); // initial 16 chars\\r\\n const text = bData.slice(16); // all the encrypted data\\r\\n // derive key using; 32 byte key length (from salted password and mid)\\r\\n // decrypt the data in part2 and add to part1\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\r\\n try {\\r\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\r\\n } catch (err) {\\r\\n decrypted = undefined;\\r\\n }\\r\\n return decrypted;\\r\\n }\\r\\n\\r\\n function encrypt(text, mid, password) {\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n const iv = _crypto.randomBytes(16); // random initialization vector\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n // set the cipher\\r\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\r\\n // encrypt text\\r\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\r\\n // generate output ( encrypted text )\\r\\n return Buffer.concat([iv, encrypted]).toString('base64');\\r\\n }\\r\\n\\r\\n function AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n deviceParams.push(cvpair);\\r\\n }\\r\\n\\r\\n function AddConfig(configName, newvalue) {\\r\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n var cvpair = {\\r\\n 'code': configName,\\r\\n 'value': newvalue,\\r\\n 'forced': true\\r\\n };\\r\\n configsToSend.push(cvpair);\\r\\n };\\r\\n }\\r\\n\\r\\n function isASCII(str) {\\r\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\r\\n }\\r\\n\\r\\n function LookupValue(key, type, template) {\\r\\n var cvpair = {\\r\\n key: key, // key to be lookded up\\r\\n type: type, // type of the key\\r\\n template: template // the variable the result will be mapped to\\r\\n };\\r\\n msg.KeyValue = cvpair;\\r\\n }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n module.exports = {\\r\\n execute_ops\\r\\n }\\r\\n} else { // on server use local defined vars\\r\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n // define global returns\\r\\n msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1744200583},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n // Define array to push device data into. This will be put into the msg array at the end.\\r\\n var deviceParams = [];\\r\\n var configsToSend = [];\\r\\n var tasks = [];\\r\\n const _crypto = require('crypto');\\r\\n // handle ACK\\r\\n if (messageTypeCode == \\\"ACK\\\") {\\r\\n return \\\"\\\";\\r\\n }\\r\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\r\\n var password;\\r\\n if (params.imei == \\\"null\\\") {\\r\\n return msg;\\r\\n }\\r\\n password = params.imei;\\r\\n if (configs.Password.Password === \\\"\\\") {\\r\\n // use imei as default password when not specified\\r\\n } else {\\r\\n // use the password\\r\\n password = configs.Password.Password\\r\\n }\\r\\n let message = decrypt(raw, password);\\r\\n if (message) {\\r\\n // send message internally\\r\\n sendMessageToLocalhost(message);\\r\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n } else {\\r\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n }\\r\\n } else { // General Oysta Template\\r\\n switch (messageTypeLocalCode) {\\r\\n case (\\\"COMM\\\"):\\r\\n process_invent_msg(); //incoming invent commands\\r\\n break;\\r\\n case (\\\"MACB\\\"):\\r\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\r\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\r\\n add_params_to_output();\\r\\n break;\\r\\n case \\\"INFO-GETPWB\\\": // handle GETPWB message\\r\\n //let imei = params.bracelet_imei; // not actually needed ?\\r\\n //let mac = params.BLEMAC; // not actually needed ?\\r\\n let BraceletPW = \\\"\\\"; // until we set it from query below\\r\\n // if(params.bracelet_imei){\\r\\n // if(serverParams.Password){\\r\\n // BraceletPW = serverParams.Password; // query key value table\\r\\n // console.log(BraceletPW); // print for testing reasons\\r\\n // AddConfig(configIds.DeviceConfig.BraceletPW, BraceletPW);//this to return the value\\r\\n // }\\r\\n // }\\r\\n // else {\\r\\n // //return error\\r\\n // }\\r\\n //AddValue(\\\"password\\\", \\\"myNewPassword\\\");\\r\\n LookupValue(params.ble_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n break;\\r\\n case (\\\"REGISTER\\\"):\\r\\n let ble_mac = params.ble_mac;\\r\\n let iccid = params.iccid;\\r\\n // write values to readonly settings\\r\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\r\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\r\\n // will automtaically Activate on Acceptance\\r\\n if (serverParams.EnvName) {\\r\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\r\\n }\\r\\n }\\r\\n break;\\r\\n case (\\\"CREATE\\\"):\\r\\n // temp fix to filter old messages\\r\\n // const cutoff = 1707523200000; //10.2.2024\\r\\n // let message_id_time = parseInt(params.count_number, 36);\\r\\n // if (message_id_time > cutoff){\\r\\n let c_ble_mac = params.ble_mac;\\r\\n let c_iccid = params.iccid;\\r\\n let new_imei = params.new_imei;\\r\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\r\\n // sendMessageToLocalhost(c_message); \\r\\n tasks = [{\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"sync\\\",\\r\\n \\\"type\\\": \\\"createDevice\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"imei\\\": new_imei,\\r\\n \\\"abortOnError\\\": false,\\r\\n \\\"init\\\": true\\r\\n }),\\r\\n \\\"order\\\": 1\\r\\n }, {\\r\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"async\\\",\\r\\n \\\"type\\\": \\\"sendMessage\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"message\\\": c_message\\r\\n }),\\r\\n \\\"order\\\": 2\\r\\n }]\\r\\n // }\\r\\n break;\\r\\n case (\\\"ALLDATA\\\"):\\r\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\r\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\r\\n let all_data = JSON.parse(json_str);\\r\\n if (\\\"version\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\r\\n };\\r\\n break;\\r\\n default:\\r\\n // all other general messages\\r\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\r\\n add_params_to_output();\\r\\n }\\r\\n // add messagetTypeLocal to output for templates\\r\\n AddValue('local_message_type', messageTypeLocalCode);\\r\\n }\\r\\n var msg = {\\r\\n 'values': deviceParams,\\r\\n };\\r\\n if (configsToSend.length > 0) {\\r\\n msg.configsToSend = configsToSend\\r\\n };\\r\\n if (tasks.length > 0) {\\r\\n msg.tasks = tasks\\r\\n };\\r\\n // commit values to receiver processor\\r\\n console.log(msg);\\r\\n // modify to return the object that contains your data\\r\\n return msg;\\r\\n\\r\\n function add_params_to_output() {\\r\\n if (!params.raw_accuracy) {\\r\\n AddValue('location_accuracy', 9000);\\r\\n } else {\\r\\n AddValue('location_accuracy', params.raw_accuracy);\\r\\n }\\r\\n // generate timestamps if they don't exist\\r\\n if (!params.event_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n if (!params.location_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n //if no lat and long are given, set them to 0, 0\\r\\n if (!params.latitude_raw) {\\r\\n AddValue('latitude', 0);\\r\\n } else {\\r\\n AddValue('latitude', params.latitude_raw);\\r\\n }\\r\\n if (!params.longitude_raw) {\\r\\n AddValue('longitude', 0);\\r\\n } else {\\r\\n AddValue('longitude', params.longitude_raw);\\r\\n }\\r\\n // if (params.temp_bracelet){\\r\\n // AddValue('oysta_labels', 'DegC');\\r\\n // AddValue('single_column_value', params.temp_bracelet);\\r\\n // }\\r\\n }\\r\\n\\r\\n function process_invent_msg() {\\r\\n const details = JSON.parse(raw);\\r\\n // AddValue('imei', details.AppId);\\r\\n AddValue('json_in', JSON.stringify(details));\\r\\n switch (details.Command) {\\r\\n case \\\"ACTIVATE_OK\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\r\\n break;\\r\\n case \\\"ACTIVATE_FAILS\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\r\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\r\\n break;\\r\\n case \\\"APPSET\\\":\\r\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\r\\n AddConfig(configIds.Password.Password, details.Data.Password);\\r\\n break;\\r\\n case \\\"CONFIG\\\":\\r\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\r\\n break;\\r\\n case \\\"CGFBR\\\":\\r\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\r\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\r\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\r\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\r\\n let commonParam = addEscapeChar(details.Data.ComPar);\\r\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\r\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\r\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\r\\n let lteParam = addEscapeChar(details.Data.LtePar);\\r\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\r\\n let bleParam = addEscapeChar(details.Data.BlePar);\\r\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\r\\n break;\\r\\n case \\\"REBOOTB\\\":\\r\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\r\\n break;\\r\\n case \\\"PWRFB\\\":\\r\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\r\\n break;\\r\\n case \\\"RESETB\\\":\\r\\n AddConfig(configIds.Bracelet.Reset, 'true');\\r\\n break;\\r\\n case \\\"BRAPWUPDATE\\\":\\r\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\r\\n // get password from old device, then set\\r\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\r\\n )\\r\\n break;\\r\\n case \\\"NOTE\\\":\\r\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\r\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\r\\n text = text.split(\\\",\\\").join(\\\" \\\");\\r\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\r\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\r\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\r\\n AddConfig(configIds.Note.Message, value)\\r\\n break;\\r\\n }\\r\\n }\\r\\n\\r\\n function addEscapeChar(json) {\\r\\n if (json === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n let jsonStr = JSON.stringify(json);\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\r\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function changeSingleQuoteToDouble(jsonStr) {\\r\\n if (jsonStr === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\r\\n outStr = outStr + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function sendMessageToLocalhost(str) {\\r\\n if (localTesting) {\\r\\n console.log(\\\"Sending message to local host: \\\" + str);\\r\\n } else {\\r\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\r\\n var c = createConnection(5878, server); // acceptance is 5678 - protocol dev 5878 - dev is 5679 ?\\r\\n c.write(`${str}`);\\r\\n c.end();\\r\\n }\\r\\n AddValue(\\\"ToLocalhost\\\", str);\\r\\n }\\r\\n\\r\\n function createConnection(port, server) {\\r\\n c = net.createConnection(port, server);\\r\\n c.on('error', function(error) {\\r\\n c = createConnection(port, server);\\r\\n });\\r\\n return c;\\r\\n }\\r\\n\\r\\n function decrypt(encdata, password) {\\r\\n var decrypted;\\r\\n var dataarray = encdata.split(\\\";\\\");\\r\\n if (dataarray.length > 5) {\\r\\n return \\\"\\\";\\r\\n }\\r\\n var i;\\r\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\r\\n if (encdata.startsWith(\\\"ACK\\\")) {\\r\\n return encdata;\\r\\n }\\r\\n for (i = 0; i < 3; i++) {\\r\\n part1 = part1 + dataarray[i] + \\\";\\\";\\r\\n }\\r\\n var mid = dataarray[2]; // use the message ID to create the salt\\r\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n // base64 decoding and extract the iv and encrypted data\\r\\n const bData = Buffer.from(enctext, 'base64');\\r\\n const iv = bData.slice(0, 16); // initial 16 chars\\r\\n const text = bData.slice(16); // all the encrypted data\\r\\n // derive key using; 32 byte key length (from salted password and mid)\\r\\n // decrypt the data in part2 and add to part1\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\r\\n try {\\r\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\r\\n } catch (err) {\\r\\n decrypted = undefined;\\r\\n }\\r\\n return decrypted;\\r\\n }\\r\\n\\r\\n function encrypt(text, mid, password) {\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n const iv = _crypto.randomBytes(16); // random initialization vector\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n // set the cipher\\r\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\r\\n // encrypt text\\r\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\r\\n // generate output ( encrypted text )\\r\\n return Buffer.concat([iv, encrypted]).toString('base64');\\r\\n }\\r\\n\\r\\n function AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n deviceParams.push(cvpair);\\r\\n }\\r\\n\\r\\n function AddConfig(configName, newvalue) {\\r\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n var cvpair = {\\r\\n 'code': configName,\\r\\n 'value': newvalue,\\r\\n 'forced': true\\r\\n };\\r\\n configsToSend.push(cvpair);\\r\\n };\\r\\n }\\r\\n\\r\\n function isASCII(str) {\\r\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\r\\n }\\r\\n\\r\\n function LookupValue(key, type, template) {\\r\\n var cvpair = {\\r\\n key: key, // key to be lookded up\\r\\n type: type, // type of the key\\r\\n template: template // the variable the result will be mapped to\\r\\n };\\r\\n msg.KeyValue = cvpair;\\r\\n }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n module.exports = {\\r\\n execute_ops\\r\\n }\\r\\n} else { // on server use local defined vars\\r\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n // define global returns\\r\\n msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1744200792},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n // Define array to push device data into. This will be put into the msg array at the end.\\r\\n var deviceParams = [];\\r\\n var configsToSend = [];\\r\\n var tasks = [];\\r\\n const _crypto = require('crypto');\\r\\n // handle ACK\\r\\n if (messageTypeCode == \\\"ACK\\\") {\\r\\n return \\\"\\\";\\r\\n }\\r\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\r\\n var password;\\r\\n if (params.imei == \\\"null\\\") {\\r\\n return msg;\\r\\n }\\r\\n password = params.imei;\\r\\n if (configs.Password.Password === \\\"\\\") {\\r\\n // use imei as default password when not specified\\r\\n } else {\\r\\n // use the password\\r\\n password = configs.Password.Password\\r\\n }\\r\\n let message = decrypt(raw, password);\\r\\n if (message) {\\r\\n // send message internally\\r\\n sendMessageToLocalhost(message);\\r\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n } else {\\r\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n }\\r\\n } else { // General Oysta Template\\r\\n switch (messageTypeLocalCode) {\\r\\n case (\\\"COMM\\\"):\\r\\n process_invent_msg(); //incoming invent commands\\r\\n break;\\r\\n case (\\\"MACB\\\"):\\r\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\r\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\r\\n add_params_to_output();\\r\\n break;\\r\\n case \\\"INFO-GETPWB\\\": // handle GETPWB message\\r\\n //let imei = params.bracelet_imei; // not actually needed ?\\r\\n //let mac = params.BLEMAC; // not actually needed ?\\r\\n let BraceletPW = \\\"\\\"; // until we set it from query below\\r\\n // if(params.bracelet_imei){\\r\\n // if(serverParams.Password){\\r\\n // BraceletPW = serverParams.Password; // query key value table\\r\\n // console.log(BraceletPW); // print for testing reasons\\r\\n // AddConfig(configIds.DeviceConfig.BraceletPW, BraceletPW);//this to return the value\\r\\n // }\\r\\n // }\\r\\n // else {\\r\\n // //return error\\r\\n // }\\r\\n //AddValue(\\\"password\\\", \\\"myNewPassword\\\");\\r\\n //LookupValue(params.ble_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n LookupValue(\\\"BC572909705E\\\", \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n break;\\r\\n case (\\\"REGISTER\\\"):\\r\\n let ble_mac = params.ble_mac;\\r\\n let iccid = params.iccid;\\r\\n // write values to readonly settings\\r\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\r\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\r\\n // will automtaically Activate on Acceptance\\r\\n if (serverParams.EnvName) {\\r\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\r\\n }\\r\\n }\\r\\n break;\\r\\n case (\\\"CREATE\\\"):\\r\\n // temp fix to filter old messages\\r\\n // const cutoff = 1707523200000; //10.2.2024\\r\\n // let message_id_time = parseInt(params.count_number, 36);\\r\\n // if (message_id_time > cutoff){\\r\\n let c_ble_mac = params.ble_mac;\\r\\n let c_iccid = params.iccid;\\r\\n let new_imei = params.new_imei;\\r\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\r\\n // sendMessageToLocalhost(c_message); \\r\\n tasks = [{\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"sync\\\",\\r\\n \\\"type\\\": \\\"createDevice\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"imei\\\": new_imei,\\r\\n \\\"abortOnError\\\": false,\\r\\n \\\"init\\\": true\\r\\n }),\\r\\n \\\"order\\\": 1\\r\\n }, {\\r\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"async\\\",\\r\\n \\\"type\\\": \\\"sendMessage\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"message\\\": c_message\\r\\n }),\\r\\n \\\"order\\\": 2\\r\\n }]\\r\\n // }\\r\\n break;\\r\\n case (\\\"ALLDATA\\\"):\\r\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\r\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\r\\n let all_data = JSON.parse(json_str);\\r\\n if (\\\"version\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\r\\n };\\r\\n break;\\r\\n default:\\r\\n // all other general messages\\r\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\r\\n add_params_to_output();\\r\\n }\\r\\n // add messagetTypeLocal to output for templates\\r\\n AddValue('local_message_type', messageTypeLocalCode);\\r\\n }\\r\\n var msg = {\\r\\n 'values': deviceParams,\\r\\n };\\r\\n if (configsToSend.length > 0) {\\r\\n msg.configsToSend = configsToSend\\r\\n };\\r\\n if (tasks.length > 0) {\\r\\n msg.tasks = tasks\\r\\n };\\r\\n // commit values to receiver processor\\r\\n console.log(msg);\\r\\n // modify to return the object that contains your data\\r\\n return msg;\\r\\n\\r\\n function add_params_to_output() {\\r\\n if (!params.raw_accuracy) {\\r\\n AddValue('location_accuracy', 9000);\\r\\n } else {\\r\\n AddValue('location_accuracy', params.raw_accuracy);\\r\\n }\\r\\n // generate timestamps if they don't exist\\r\\n if (!params.event_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n if (!params.location_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n //if no lat and long are given, set them to 0, 0\\r\\n if (!params.latitude_raw) {\\r\\n AddValue('latitude', 0);\\r\\n } else {\\r\\n AddValue('latitude', params.latitude_raw);\\r\\n }\\r\\n if (!params.longitude_raw) {\\r\\n AddValue('longitude', 0);\\r\\n } else {\\r\\n AddValue('longitude', params.longitude_raw);\\r\\n }\\r\\n // if (params.temp_bracelet){\\r\\n // AddValue('oysta_labels', 'DegC');\\r\\n // AddValue('single_column_value', params.temp_bracelet);\\r\\n // }\\r\\n }\\r\\n\\r\\n function process_invent_msg() {\\r\\n const details = JSON.parse(raw);\\r\\n // AddValue('imei', details.AppId);\\r\\n AddValue('json_in', JSON.stringify(details));\\r\\n switch (details.Command) {\\r\\n case \\\"ACTIVATE_OK\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\r\\n break;\\r\\n case \\\"ACTIVATE_FAILS\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\r\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\r\\n break;\\r\\n case \\\"APPSET\\\":\\r\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\r\\n AddConfig(configIds.Password.Password, details.Data.Password);\\r\\n break;\\r\\n case \\\"CONFIG\\\":\\r\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\r\\n break;\\r\\n case \\\"CGFBR\\\":\\r\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\r\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\r\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\r\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\r\\n let commonParam = addEscapeChar(details.Data.ComPar);\\r\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\r\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\r\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\r\\n let lteParam = addEscapeChar(details.Data.LtePar);\\r\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\r\\n let bleParam = addEscapeChar(details.Data.BlePar);\\r\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\r\\n break;\\r\\n case \\\"REBOOTB\\\":\\r\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\r\\n break;\\r\\n case \\\"PWRFB\\\":\\r\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\r\\n break;\\r\\n case \\\"RESETB\\\":\\r\\n AddConfig(configIds.Bracelet.Reset, 'true');\\r\\n break;\\r\\n case \\\"BRAPWUPDATE\\\":\\r\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\r\\n // get password from old device, then set\\r\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\r\\n )\\r\\n break;\\r\\n case \\\"NOTE\\\":\\r\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\r\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\r\\n text = text.split(\\\",\\\").join(\\\" \\\");\\r\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\r\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\r\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\r\\n AddConfig(configIds.Note.Message, value)\\r\\n break;\\r\\n }\\r\\n }\\r\\n\\r\\n function addEscapeChar(json) {\\r\\n if (json === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n let jsonStr = JSON.stringify(json);\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\r\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function changeSingleQuoteToDouble(jsonStr) {\\r\\n if (jsonStr === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\r\\n outStr = outStr + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function sendMessageToLocalhost(str) {\\r\\n if (localTesting) {\\r\\n console.log(\\\"Sending message to local host: \\\" + str);\\r\\n } else {\\r\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\r\\n var c = createConnection(5878, server); // acceptance is 5678 - protocol dev 5878 - dev is 5679 ?\\r\\n c.write(`${str}`);\\r\\n c.end();\\r\\n }\\r\\n AddValue(\\\"ToLocalhost\\\", str);\\r\\n }\\r\\n\\r\\n function createConnection(port, server) {\\r\\n c = net.createConnection(port, server);\\r\\n c.on('error', function(error) {\\r\\n c = createConnection(port, server);\\r\\n });\\r\\n return c;\\r\\n }\\r\\n\\r\\n function decrypt(encdata, password) {\\r\\n var decrypted;\\r\\n var dataarray = encdata.split(\\\";\\\");\\r\\n if (dataarray.length > 5) {\\r\\n return \\\"\\\";\\r\\n }\\r\\n var i;\\r\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\r\\n if (encdata.startsWith(\\\"ACK\\\")) {\\r\\n return encdata;\\r\\n }\\r\\n for (i = 0; i < 3; i++) {\\r\\n part1 = part1 + dataarray[i] + \\\";\\\";\\r\\n }\\r\\n var mid = dataarray[2]; // use the message ID to create the salt\\r\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n // base64 decoding and extract the iv and encrypted data\\r\\n const bData = Buffer.from(enctext, 'base64');\\r\\n const iv = bData.slice(0, 16); // initial 16 chars\\r\\n const text = bData.slice(16); // all the encrypted data\\r\\n // derive key using; 32 byte key length (from salted password and mid)\\r\\n // decrypt the data in part2 and add to part1\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\r\\n try {\\r\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\r\\n } catch (err) {\\r\\n decrypted = undefined;\\r\\n }\\r\\n return decrypted;\\r\\n }\\r\\n\\r\\n function encrypt(text, mid, password) {\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n const iv = _crypto.randomBytes(16); // random initialization vector\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n // set the cipher\\r\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\r\\n // encrypt text\\r\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\r\\n // generate output ( encrypted text )\\r\\n return Buffer.concat([iv, encrypted]).toString('base64');\\r\\n }\\r\\n\\r\\n function AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n deviceParams.push(cvpair);\\r\\n }\\r\\n\\r\\n function AddConfig(configName, newvalue) {\\r\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n var cvpair = {\\r\\n 'code': configName,\\r\\n 'value': newvalue,\\r\\n 'forced': true\\r\\n };\\r\\n configsToSend.push(cvpair);\\r\\n };\\r\\n }\\r\\n\\r\\n function isASCII(str) {\\r\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\r\\n }\\r\\n\\r\\n function LookupValue(key, type, template) {\\r\\n var cvpair = {\\r\\n key: key, // key to be lookded up\\r\\n type: type, // type of the key\\r\\n template: template // the variable the result will be mapped to\\r\\n };\\r\\n msg.KeyValue = cvpair;\\r\\n }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n module.exports = {\\r\\n execute_ops\\r\\n }\\r\\n} else { // on server use local defined vars\\r\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n // define global returns\\r\\n msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1744202227},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n // Define array to push device data into. This will be put into the msg array at the end.\\r\\n var deviceParams = [];\\r\\n var configsToSend = [];\\r\\n var tasks = [];\\r\\n msg = {};\\r\\n const _crypto = require('crypto');\\r\\n // handle ACK\\r\\n if (messageTypeCode == \\\"ACK\\\") {\\r\\n return \\\"\\\";\\r\\n }\\r\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\r\\n var password;\\r\\n if (params.imei == \\\"null\\\") {\\r\\n return msg;\\r\\n }\\r\\n password = params.imei;\\r\\n if (configs.Password.Password === \\\"\\\") {\\r\\n // use imei as default password when not specified\\r\\n } else {\\r\\n // use the password\\r\\n password = configs.Password.Password\\r\\n }\\r\\n let message = decrypt(raw, password);\\r\\n if (message) {\\r\\n // send message internally\\r\\n sendMessageToLocalhost(message);\\r\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n } else {\\r\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n }\\r\\n } else { // General Oysta Template\\r\\n switch (messageTypeLocalCode) {\\r\\n case (\\\"COMM\\\"):\\r\\n process_invent_msg(); //incoming invent commands\\r\\n break;\\r\\n case (\\\"MACB\\\"):\\r\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\r\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\r\\n add_params_to_output();\\r\\n break;\\r\\n case \\\"INFO-GETPWB\\\": // handle GETPWB message\\r\\n //let imei = params.bracelet_imei; // not actually needed ?\\r\\n //let mac = params.BLEMAC; // not actually needed ?\\r\\n let BraceletPW = \\\"\\\"; // until we set it from query below\\r\\n // if(params.bracelet_imei){\\r\\n // if(serverParams.Password){\\r\\n // BraceletPW = serverParams.Password; // query key value table\\r\\n // console.log(BraceletPW); // print for testing reasons\\r\\n // AddConfig(configIds.DeviceConfig.BraceletPW, BraceletPW);//this to return the value\\r\\n // }\\r\\n // }\\r\\n // else {\\r\\n // //return error\\r\\n // }\\r\\n //AddValue(\\\"password\\\", \\\"myNewPassword\\\");\\r\\n //LookupValue(params.ble_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n LookupValue(\\\"BC572909705E\\\", \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n break;\\r\\n case (\\\"REGISTER\\\"):\\r\\n let ble_mac = params.ble_mac;\\r\\n let iccid = params.iccid;\\r\\n // write values to readonly settings\\r\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\r\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\r\\n // will automtaically Activate on Acceptance\\r\\n if (serverParams.EnvName) {\\r\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\r\\n }\\r\\n }\\r\\n break;\\r\\n case (\\\"CREATE\\\"):\\r\\n // temp fix to filter old messages\\r\\n // const cutoff = 1707523200000; //10.2.2024\\r\\n // let message_id_time = parseInt(params.count_number, 36);\\r\\n // if (message_id_time > cutoff){\\r\\n let c_ble_mac = params.ble_mac;\\r\\n let c_iccid = params.iccid;\\r\\n let new_imei = params.new_imei;\\r\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\r\\n // sendMessageToLocalhost(c_message); \\r\\n tasks = [{\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"sync\\\",\\r\\n \\\"type\\\": \\\"createDevice\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"imei\\\": new_imei,\\r\\n \\\"abortOnError\\\": false,\\r\\n \\\"init\\\": true\\r\\n }),\\r\\n \\\"order\\\": 1\\r\\n }, {\\r\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"async\\\",\\r\\n \\\"type\\\": \\\"sendMessage\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"message\\\": c_message\\r\\n }),\\r\\n \\\"order\\\": 2\\r\\n }]\\r\\n // }\\r\\n break;\\r\\n case (\\\"ALLDATA\\\"):\\r\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\r\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\r\\n let all_data = JSON.parse(json_str);\\r\\n if (\\\"version\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\r\\n };\\r\\n break;\\r\\n default:\\r\\n // all other general messages\\r\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\r\\n add_params_to_output();\\r\\n }\\r\\n // add messagetTypeLocal to output for templates\\r\\n AddValue('local_message_type', messageTypeLocalCode);\\r\\n }\\r\\n var msg = {\\r\\n 'values': deviceParams,\\r\\n };\\r\\n if (configsToSend.length > 0) {\\r\\n msg.configsToSend = configsToSend\\r\\n };\\r\\n if (tasks.length > 0) {\\r\\n msg.tasks = tasks\\r\\n };\\r\\n // commit values to receiver processor\\r\\n console.log(msg);\\r\\n // modify to return the object that contains your data\\r\\n return msg;\\r\\n\\r\\n function add_params_to_output() {\\r\\n if (!params.raw_accuracy) {\\r\\n AddValue('location_accuracy', 9000);\\r\\n } else {\\r\\n AddValue('location_accuracy', params.raw_accuracy);\\r\\n }\\r\\n // generate timestamps if they don't exist\\r\\n if (!params.event_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n if (!params.location_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n //if no lat and long are given, set them to 0, 0\\r\\n if (!params.latitude_raw) {\\r\\n AddValue('latitude', 0);\\r\\n } else {\\r\\n AddValue('latitude', params.latitude_raw);\\r\\n }\\r\\n if (!params.longitude_raw) {\\r\\n AddValue('longitude', 0);\\r\\n } else {\\r\\n AddValue('longitude', params.longitude_raw);\\r\\n }\\r\\n // if (params.temp_bracelet){\\r\\n // AddValue('oysta_labels', 'DegC');\\r\\n // AddValue('single_column_value', params.temp_bracelet);\\r\\n // }\\r\\n }\\r\\n\\r\\n function process_invent_msg() {\\r\\n const details = JSON.parse(raw);\\r\\n // AddValue('imei', details.AppId);\\r\\n AddValue('json_in', JSON.stringify(details));\\r\\n switch (details.Command) {\\r\\n case \\\"ACTIVATE_OK\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\r\\n break;\\r\\n case \\\"ACTIVATE_FAILS\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\r\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\r\\n break;\\r\\n case \\\"APPSET\\\":\\r\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\r\\n AddConfig(configIds.Password.Password, details.Data.Password);\\r\\n break;\\r\\n case \\\"CONFIG\\\":\\r\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\r\\n break;\\r\\n case \\\"CGFBR\\\":\\r\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\r\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\r\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\r\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\r\\n let commonParam = addEscapeChar(details.Data.ComPar);\\r\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\r\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\r\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\r\\n let lteParam = addEscapeChar(details.Data.LtePar);\\r\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\r\\n let bleParam = addEscapeChar(details.Data.BlePar);\\r\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\r\\n break;\\r\\n case \\\"REBOOTB\\\":\\r\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\r\\n break;\\r\\n case \\\"PWRFB\\\":\\r\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\r\\n break;\\r\\n case \\\"RESETB\\\":\\r\\n AddConfig(configIds.Bracelet.Reset, 'true');\\r\\n break;\\r\\n case \\\"BRAPWUPDATE\\\":\\r\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\r\\n // get password from old device, then set\\r\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\r\\n )\\r\\n break;\\r\\n case \\\"NOTE\\\":\\r\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\r\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\r\\n text = text.split(\\\",\\\").join(\\\" \\\");\\r\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\r\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\r\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\r\\n AddConfig(configIds.Note.Message, value)\\r\\n break;\\r\\n }\\r\\n }\\r\\n\\r\\n function addEscapeChar(json) {\\r\\n if (json === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n let jsonStr = JSON.stringify(json);\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\r\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function changeSingleQuoteToDouble(jsonStr) {\\r\\n if (jsonStr === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\r\\n outStr = outStr + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function sendMessageToLocalhost(str) {\\r\\n if (localTesting) {\\r\\n console.log(\\\"Sending message to local host: \\\" + str);\\r\\n } else {\\r\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\r\\n var c = createConnection(5878, server); // acceptance is 5678 - protocol dev 5878 - dev is 5679 ?\\r\\n c.write(`${str}`);\\r\\n c.end();\\r\\n }\\r\\n AddValue(\\\"ToLocalhost\\\", str);\\r\\n }\\r\\n\\r\\n function createConnection(port, server) {\\r\\n c = net.createConnection(port, server);\\r\\n c.on('error', function(error) {\\r\\n c = createConnection(port, server);\\r\\n });\\r\\n return c;\\r\\n }\\r\\n\\r\\n function decrypt(encdata, password) {\\r\\n var decrypted;\\r\\n var dataarray = encdata.split(\\\";\\\");\\r\\n if (dataarray.length > 5) {\\r\\n return \\\"\\\";\\r\\n }\\r\\n var i;\\r\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\r\\n if (encdata.startsWith(\\\"ACK\\\")) {\\r\\n return encdata;\\r\\n }\\r\\n for (i = 0; i < 3; i++) {\\r\\n part1 = part1 + dataarray[i] + \\\";\\\";\\r\\n }\\r\\n var mid = dataarray[2]; // use the message ID to create the salt\\r\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n // base64 decoding and extract the iv and encrypted data\\r\\n const bData = Buffer.from(enctext, 'base64');\\r\\n const iv = bData.slice(0, 16); // initial 16 chars\\r\\n const text = bData.slice(16); // all the encrypted data\\r\\n // derive key using; 32 byte key length (from salted password and mid)\\r\\n // decrypt the data in part2 and add to part1\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\r\\n try {\\r\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\r\\n } catch (err) {\\r\\n decrypted = undefined;\\r\\n }\\r\\n return decrypted;\\r\\n }\\r\\n\\r\\n function encrypt(text, mid, password) {\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n const iv = _crypto.randomBytes(16); // random initialization vector\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n // set the cipher\\r\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\r\\n // encrypt text\\r\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\r\\n // generate output ( encrypted text )\\r\\n return Buffer.concat([iv, encrypted]).toString('base64');\\r\\n }\\r\\n\\r\\n function AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n deviceParams.push(cvpair);\\r\\n }\\r\\n\\r\\n function AddConfig(configName, newvalue) {\\r\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n var cvpair = {\\r\\n 'code': configName,\\r\\n 'value': newvalue,\\r\\n 'forced': true\\r\\n };\\r\\n configsToSend.push(cvpair);\\r\\n };\\r\\n }\\r\\n\\r\\n function isASCII(str) {\\r\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\r\\n }\\r\\n\\r\\n function LookupValue(key, type, template) {\\r\\n var cvpair = {\\r\\n key: key, // key to be lookded up\\r\\n type: type, // type of the key\\r\\n template: template // the variable the result will be mapped to\\r\\n };\\r\\n msg.KeyValue = cvpair;\\r\\n }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n module.exports = {\\r\\n execute_ops\\r\\n }\\r\\n} else { // on server use local defined vars\\r\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n // define global returns\\r\\n msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1744202554},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n // Define array to push device data into. This will be put into the msg array at the end.\\r\\n var deviceParams = [];\\r\\n var configsToSend = [];\\r\\n var tasks = [];\\r\\n msg = {};\\r\\n const _crypto = require('crypto');\\r\\n // handle ACK\\r\\n if (messageTypeCode == \\\"ACK\\\") {\\r\\n return \\\"\\\";\\r\\n }\\r\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\r\\n var password;\\r\\n if (params.imei == \\\"null\\\") {\\r\\n return msg;\\r\\n }\\r\\n password = params.imei;\\r\\n if (configs.Password.Password === \\\"\\\") {\\r\\n // use imei as default password when not specified\\r\\n } else {\\r\\n // use the password\\r\\n password = configs.Password.Password\\r\\n }\\r\\n let message = decrypt(raw, password);\\r\\n if (message) {\\r\\n // send message internally\\r\\n sendMessageToLocalhost(message);\\r\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n } else {\\r\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n }\\r\\n } else { // General Oysta Template\\r\\n switch (messageTypeLocalCode) {\\r\\n case (\\\"COMM\\\"):\\r\\n process_invent_msg(); //incoming invent commands\\r\\n break;\\r\\n case (\\\"MACB\\\"):\\r\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\r\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\r\\n add_params_to_output();\\r\\n break;\\r\\n case \\\"INFO-GETPWB\\\": // handle GETPWB message\\r\\n //let imei = params.bracelet_imei; // not actually needed ?\\r\\n //let mac = params.BLEMAC; // not actually needed ?\\r\\n AddValue(\\\"mac\\\", params.ble_mac);\\r\\n AddValue(\\\"key\\\", params.key);\\r\\n console.log(\\\"mac: \\\" + params.ble_mac);\\r\\n let BraceletPW = \\\"\\\"; // until we set it from query below\\r\\n // if(params.bracelet_imei){\\r\\n // if(serverParams.Password){\\r\\n // BraceletPW = serverParams.Password; // query key value table\\r\\n // console.log(BraceletPW); // print for testing reasons\\r\\n // AddConfig(configIds.DeviceConfig.BraceletPW, BraceletPW);//this to return the value\\r\\n // }\\r\\n // }\\r\\n // else {\\r\\n // //return error\\r\\n // }\\r\\n //AddValue(\\\"password\\\", \\\"myNewPassword\\\");\\r\\n //LookupValue(params.ble_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n LookupValue(\\\"BC572909705E\\\", \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n if (deviceParams.length > 0) {\\r\\n msg.values = deviceParams\\r\\n };\\r\\n console.log(msg);\\r\\n break;\\r\\n case (\\\"REGISTER\\\"):\\r\\n let ble_mac = params.ble_mac;\\r\\n let iccid = params.iccid;\\r\\n // write values to readonly settings\\r\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\r\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\r\\n // will automtaically Activate on Acceptance\\r\\n if (serverParams.EnvName) {\\r\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\r\\n }\\r\\n }\\r\\n break;\\r\\n case (\\\"CREATE\\\"):\\r\\n // temp fix to filter old messages\\r\\n // const cutoff = 1707523200000; //10.2.2024\\r\\n // let message_id_time = parseInt(params.count_number, 36);\\r\\n // if (message_id_time > cutoff){\\r\\n let c_ble_mac = params.ble_mac;\\r\\n let c_iccid = params.iccid;\\r\\n let new_imei = params.new_imei;\\r\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\r\\n // sendMessageToLocalhost(c_message); \\r\\n tasks = [{\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"sync\\\",\\r\\n \\\"type\\\": \\\"createDevice\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"imei\\\": new_imei,\\r\\n \\\"abortOnError\\\": false,\\r\\n \\\"init\\\": true\\r\\n }),\\r\\n \\\"order\\\": 1\\r\\n }, {\\r\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"async\\\",\\r\\n \\\"type\\\": \\\"sendMessage\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"message\\\": c_message\\r\\n }),\\r\\n \\\"order\\\": 2\\r\\n }]\\r\\n // }\\r\\n break;\\r\\n case (\\\"ALLDATA\\\"):\\r\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\r\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\r\\n let all_data = JSON.parse(json_str);\\r\\n if (\\\"version\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\r\\n };\\r\\n break;\\r\\n default:\\r\\n // all other general messages\\r\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\r\\n add_params_to_output();\\r\\n }\\r\\n // add messagetTypeLocal to output for templates\\r\\n AddValue('local_message_type', messageTypeLocalCode);\\r\\n }\\r\\n var msg = {\\r\\n 'values': deviceParams,\\r\\n };\\r\\n if (configsToSend.length > 0) {\\r\\n msg.configsToSend = configsToSend\\r\\n };\\r\\n if (tasks.length > 0) {\\r\\n msg.tasks = tasks\\r\\n };\\r\\n // commit values to receiver processor\\r\\n console.log(msg);\\r\\n // modify to return the object that contains your data\\r\\n return msg;\\r\\n\\r\\n function add_params_to_output() {\\r\\n if (!params.raw_accuracy) {\\r\\n AddValue('location_accuracy', 9000);\\r\\n } else {\\r\\n AddValue('location_accuracy', params.raw_accuracy);\\r\\n }\\r\\n // generate timestamps if they don't exist\\r\\n if (!params.event_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n if (!params.location_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n //if no lat and long are given, set them to 0, 0\\r\\n if (!params.latitude_raw) {\\r\\n AddValue('latitude', 0);\\r\\n } else {\\r\\n AddValue('latitude', params.latitude_raw);\\r\\n }\\r\\n if (!params.longitude_raw) {\\r\\n AddValue('longitude', 0);\\r\\n } else {\\r\\n AddValue('longitude', params.longitude_raw);\\r\\n }\\r\\n // if (params.temp_bracelet){\\r\\n // AddValue('oysta_labels', 'DegC');\\r\\n // AddValue('single_column_value', params.temp_bracelet);\\r\\n // }\\r\\n }\\r\\n\\r\\n function process_invent_msg() {\\r\\n const details = JSON.parse(raw);\\r\\n // AddValue('imei', details.AppId);\\r\\n AddValue('json_in', JSON.stringify(details));\\r\\n switch (details.Command) {\\r\\n case \\\"ACTIVATE_OK\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\r\\n break;\\r\\n case \\\"ACTIVATE_FAILS\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\r\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\r\\n break;\\r\\n case \\\"APPSET\\\":\\r\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\r\\n AddConfig(configIds.Password.Password, details.Data.Password);\\r\\n break;\\r\\n case \\\"CONFIG\\\":\\r\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\r\\n break;\\r\\n case \\\"CGFBR\\\":\\r\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\r\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\r\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\r\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\r\\n let commonParam = addEscapeChar(details.Data.ComPar);\\r\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\r\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\r\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\r\\n let lteParam = addEscapeChar(details.Data.LtePar);\\r\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\r\\n let bleParam = addEscapeChar(details.Data.BlePar);\\r\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\r\\n break;\\r\\n case \\\"REBOOTB\\\":\\r\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\r\\n break;\\r\\n case \\\"PWRFB\\\":\\r\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\r\\n break;\\r\\n case \\\"RESETB\\\":\\r\\n AddConfig(configIds.Bracelet.Reset, 'true');\\r\\n break;\\r\\n case \\\"BRAPWUPDATE\\\":\\r\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\r\\n // get password from old device, then set\\r\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\r\\n )\\r\\n break;\\r\\n case \\\"NOTE\\\":\\r\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\r\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\r\\n text = text.split(\\\",\\\").join(\\\" \\\");\\r\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\r\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\r\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\r\\n AddConfig(configIds.Note.Message, value)\\r\\n break;\\r\\n }\\r\\n }\\r\\n\\r\\n function addEscapeChar(json) {\\r\\n if (json === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n let jsonStr = JSON.stringify(json);\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\r\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function changeSingleQuoteToDouble(jsonStr) {\\r\\n if (jsonStr === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\r\\n outStr = outStr + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function sendMessageToLocalhost(str) {\\r\\n if (localTesting) {\\r\\n console.log(\\\"Sending message to local host: \\\" + str);\\r\\n } else {\\r\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\r\\n var c = createConnection(5878, server); // acceptance is 5678 - protocol dev 5878 - dev is 5679 ?\\r\\n c.write(`${str}`);\\r\\n c.end();\\r\\n }\\r\\n AddValue(\\\"ToLocalhost\\\", str);\\r\\n }\\r\\n\\r\\n function createConnection(port, server) {\\r\\n c = net.createConnection(port, server);\\r\\n c.on('error', function(error) {\\r\\n c = createConnection(port, server);\\r\\n });\\r\\n return c;\\r\\n }\\r\\n\\r\\n function decrypt(encdata, password) {\\r\\n var decrypted;\\r\\n var dataarray = encdata.split(\\\";\\\");\\r\\n if (dataarray.length > 5) {\\r\\n return \\\"\\\";\\r\\n }\\r\\n var i;\\r\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\r\\n if (encdata.startsWith(\\\"ACK\\\")) {\\r\\n return encdata;\\r\\n }\\r\\n for (i = 0; i < 3; i++) {\\r\\n part1 = part1 + dataarray[i] + \\\";\\\";\\r\\n }\\r\\n var mid = dataarray[2]; // use the message ID to create the salt\\r\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n // base64 decoding and extract the iv and encrypted data\\r\\n const bData = Buffer.from(enctext, 'base64');\\r\\n const iv = bData.slice(0, 16); // initial 16 chars\\r\\n const text = bData.slice(16); // all the encrypted data\\r\\n // derive key using; 32 byte key length (from salted password and mid)\\r\\n // decrypt the data in part2 and add to part1\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\r\\n try {\\r\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\r\\n } catch (err) {\\r\\n decrypted = undefined;\\r\\n }\\r\\n return decrypted;\\r\\n }\\r\\n\\r\\n function encrypt(text, mid, password) {\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n const iv = _crypto.randomBytes(16); // random initialization vector\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n // set the cipher\\r\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\r\\n // encrypt text\\r\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\r\\n // generate output ( encrypted text )\\r\\n return Buffer.concat([iv, encrypted]).toString('base64');\\r\\n }\\r\\n\\r\\n function AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n deviceParams.push(cvpair);\\r\\n }\\r\\n\\r\\n function AddConfig(configName, newvalue) {\\r\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n var cvpair = {\\r\\n 'code': configName,\\r\\n 'value': newvalue,\\r\\n 'forced': true\\r\\n };\\r\\n configsToSend.push(cvpair);\\r\\n };\\r\\n }\\r\\n\\r\\n function isASCII(str) {\\r\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\r\\n }\\r\\n\\r\\n function LookupValue(key, type, template) {\\r\\n var cvpair = {\\r\\n key: key, // key to be lookded up\\r\\n type: type, // type of the key\\r\\n template: template // the variable the result will be mapped to\\r\\n };\\r\\n msg.KeyValue = cvpair;\\r\\n }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n module.exports = {\\r\\n execute_ops\\r\\n }\\r\\n} else { // on server use local defined vars\\r\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n // define global returns\\r\\n msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1744202767},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n // Define array to push device data into. This will be put into the msg array at the end.\\r\\n var deviceParams = [];\\r\\n var configsToSend = [];\\r\\n var tasks = [];\\r\\n msg = {};\\r\\n const _crypto = require('crypto');\\r\\n // handle ACK\\r\\n if (messageTypeCode == \\\"ACK\\\") {\\r\\n return \\\"\\\";\\r\\n }\\r\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\r\\n var password;\\r\\n if (params.imei == \\\"null\\\") {\\r\\n return msg;\\r\\n }\\r\\n password = params.imei;\\r\\n if (configs.Password.Password === \\\"\\\") {\\r\\n // use imei as default password when not specified\\r\\n } else {\\r\\n // use the password\\r\\n password = configs.Password.Password\\r\\n }\\r\\n let message = decrypt(raw, password);\\r\\n if (message) {\\r\\n // send message internally\\r\\n sendMessageToLocalhost(message);\\r\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n } else {\\r\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n }\\r\\n } else { // General Oysta Template\\r\\n switch (messageTypeLocalCode) {\\r\\n case (\\\"COMM\\\"):\\r\\n process_invent_msg(); //incoming invent commands\\r\\n break;\\r\\n case (\\\"MACB\\\"):\\r\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\r\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\r\\n add_params_to_output();\\r\\n break;\\r\\n case \\\"INFO-GETPWB\\\": // handle GETPWB message\\r\\n //let imei = params.bracelet_imei; // not actually needed ?\\r\\n //let mac = params.BLEMAC; // not actually needed ?\\r\\n AddValue(\\\"mac\\\", params.ble_mac);\\r\\n //AddValue(\\\"key\\\", params.key);\\r\\n console.log(\\\"mac: \\\" + params.ble_mac);\\r\\n let BraceletPW = \\\"\\\"; // until we set it from query below\\r\\n // if(params.bracelet_imei){\\r\\n // if(serverParams.Password){\\r\\n // BraceletPW = serverParams.Password; // query key value table\\r\\n // console.log(BraceletPW); // print for testing reasons\\r\\n // AddConfig(configIds.DeviceConfig.BraceletPW, BraceletPW);//this to return the value\\r\\n // }\\r\\n // }\\r\\n // else {\\r\\n // //return error\\r\\n // }\\r\\n //AddValue(\\\"password\\\", \\\"myNewPassword\\\");\\r\\n //LookupValue(params.ble_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n LookupValue(\\\"BC572909705E\\\", \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n if (deviceParams.length > 0) {\\r\\n msg.values = deviceParams\\r\\n };\\r\\n console.log(msg);\\r\\n break;\\r\\n case (\\\"REGISTER\\\"):\\r\\n let ble_mac = params.ble_mac;\\r\\n let iccid = params.iccid;\\r\\n // write values to readonly settings\\r\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\r\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\r\\n // will automtaically Activate on Acceptance\\r\\n if (serverParams.EnvName) {\\r\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\r\\n }\\r\\n }\\r\\n break;\\r\\n case (\\\"CREATE\\\"):\\r\\n // temp fix to filter old messages\\r\\n // const cutoff = 1707523200000; //10.2.2024\\r\\n // let message_id_time = parseInt(params.count_number, 36);\\r\\n // if (message_id_time > cutoff){\\r\\n let c_ble_mac = params.ble_mac;\\r\\n let c_iccid = params.iccid;\\r\\n let new_imei = params.new_imei;\\r\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\r\\n // sendMessageToLocalhost(c_message); \\r\\n tasks = [{\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"sync\\\",\\r\\n \\\"type\\\": \\\"createDevice\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"imei\\\": new_imei,\\r\\n \\\"abortOnError\\\": false,\\r\\n \\\"init\\\": true\\r\\n }),\\r\\n \\\"order\\\": 1\\r\\n }, {\\r\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"async\\\",\\r\\n \\\"type\\\": \\\"sendMessage\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"message\\\": c_message\\r\\n }),\\r\\n \\\"order\\\": 2\\r\\n }]\\r\\n // }\\r\\n break;\\r\\n case (\\\"ALLDATA\\\"):\\r\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\r\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\r\\n let all_data = JSON.parse(json_str);\\r\\n if (\\\"version\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\r\\n };\\r\\n break;\\r\\n default:\\r\\n // all other general messages\\r\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\r\\n add_params_to_output();\\r\\n }\\r\\n // add messagetTypeLocal to output for templates\\r\\n AddValue('local_message_type', messageTypeLocalCode);\\r\\n }\\r\\n var msg = {\\r\\n 'values': deviceParams,\\r\\n };\\r\\n if (configsToSend.length > 0) {\\r\\n msg.configsToSend = configsToSend\\r\\n };\\r\\n if (tasks.length > 0) {\\r\\n msg.tasks = tasks\\r\\n };\\r\\n // commit values to receiver processor\\r\\n console.log(msg);\\r\\n // modify to return the object that contains your data\\r\\n return msg;\\r\\n\\r\\n function add_params_to_output() {\\r\\n if (!params.raw_accuracy) {\\r\\n AddValue('location_accuracy', 9000);\\r\\n } else {\\r\\n AddValue('location_accuracy', params.raw_accuracy);\\r\\n }\\r\\n // generate timestamps if they don't exist\\r\\n if (!params.event_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n if (!params.location_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n //if no lat and long are given, set them to 0, 0\\r\\n if (!params.latitude_raw) {\\r\\n AddValue('latitude', 0);\\r\\n } else {\\r\\n AddValue('latitude', params.latitude_raw);\\r\\n }\\r\\n if (!params.longitude_raw) {\\r\\n AddValue('longitude', 0);\\r\\n } else {\\r\\n AddValue('longitude', params.longitude_raw);\\r\\n }\\r\\n // if (params.temp_bracelet){\\r\\n // AddValue('oysta_labels', 'DegC');\\r\\n // AddValue('single_column_value', params.temp_bracelet);\\r\\n // }\\r\\n }\\r\\n\\r\\n function process_invent_msg() {\\r\\n const details = JSON.parse(raw);\\r\\n // AddValue('imei', details.AppId);\\r\\n AddValue('json_in', JSON.stringify(details));\\r\\n switch (details.Command) {\\r\\n case \\\"ACTIVATE_OK\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\r\\n break;\\r\\n case \\\"ACTIVATE_FAILS\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\r\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\r\\n break;\\r\\n case \\\"APPSET\\\":\\r\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\r\\n AddConfig(configIds.Password.Password, details.Data.Password);\\r\\n break;\\r\\n case \\\"CONFIG\\\":\\r\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\r\\n break;\\r\\n case \\\"CGFBR\\\":\\r\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\r\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\r\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\r\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\r\\n let commonParam = addEscapeChar(details.Data.ComPar);\\r\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\r\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\r\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\r\\n let lteParam = addEscapeChar(details.Data.LtePar);\\r\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\r\\n let bleParam = addEscapeChar(details.Data.BlePar);\\r\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\r\\n break;\\r\\n case \\\"REBOOTB\\\":\\r\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\r\\n break;\\r\\n case \\\"PWRFB\\\":\\r\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\r\\n break;\\r\\n case \\\"RESETB\\\":\\r\\n AddConfig(configIds.Bracelet.Reset, 'true');\\r\\n break;\\r\\n case \\\"BRAPWUPDATE\\\":\\r\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\r\\n // get password from old device, then set\\r\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\r\\n )\\r\\n break;\\r\\n case \\\"NOTE\\\":\\r\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\r\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\r\\n text = text.split(\\\",\\\").join(\\\" \\\");\\r\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\r\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\r\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\r\\n AddConfig(configIds.Note.Message, value)\\r\\n break;\\r\\n }\\r\\n }\\r\\n\\r\\n function addEscapeChar(json) {\\r\\n if (json === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n let jsonStr = JSON.stringify(json);\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\r\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function changeSingleQuoteToDouble(jsonStr) {\\r\\n if (jsonStr === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\r\\n outStr = outStr + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function sendMessageToLocalhost(str) {\\r\\n if (localTesting) {\\r\\n console.log(\\\"Sending message to local host: \\\" + str);\\r\\n } else {\\r\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\r\\n var c = createConnection(5878, server); // acceptance is 5678 - protocol dev 5878 - dev is 5679 ?\\r\\n c.write(`${str}`);\\r\\n c.end();\\r\\n }\\r\\n AddValue(\\\"ToLocalhost\\\", str);\\r\\n }\\r\\n\\r\\n function createConnection(port, server) {\\r\\n c = net.createConnection(port, server);\\r\\n c.on('error', function(error) {\\r\\n c = createConnection(port, server);\\r\\n });\\r\\n return c;\\r\\n }\\r\\n\\r\\n function decrypt(encdata, password) {\\r\\n var decrypted;\\r\\n var dataarray = encdata.split(\\\";\\\");\\r\\n if (dataarray.length > 5) {\\r\\n return \\\"\\\";\\r\\n }\\r\\n var i;\\r\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\r\\n if (encdata.startsWith(\\\"ACK\\\")) {\\r\\n return encdata;\\r\\n }\\r\\n for (i = 0; i < 3; i++) {\\r\\n part1 = part1 + dataarray[i] + \\\";\\\";\\r\\n }\\r\\n var mid = dataarray[2]; // use the message ID to create the salt\\r\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n // base64 decoding and extract the iv and encrypted data\\r\\n const bData = Buffer.from(enctext, 'base64');\\r\\n const iv = bData.slice(0, 16); // initial 16 chars\\r\\n const text = bData.slice(16); // all the encrypted data\\r\\n // derive key using; 32 byte key length (from salted password and mid)\\r\\n // decrypt the data in part2 and add to part1\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\r\\n try {\\r\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\r\\n } catch (err) {\\r\\n decrypted = undefined;\\r\\n }\\r\\n return decrypted;\\r\\n }\\r\\n\\r\\n function encrypt(text, mid, password) {\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n const iv = _crypto.randomBytes(16); // random initialization vector\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n // set the cipher\\r\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\r\\n // encrypt text\\r\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\r\\n // generate output ( encrypted text )\\r\\n return Buffer.concat([iv, encrypted]).toString('base64');\\r\\n }\\r\\n\\r\\n function AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n deviceParams.push(cvpair);\\r\\n }\\r\\n\\r\\n function AddConfig(configName, newvalue) {\\r\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n var cvpair = {\\r\\n 'code': configName,\\r\\n 'value': newvalue,\\r\\n 'forced': true\\r\\n };\\r\\n configsToSend.push(cvpair);\\r\\n };\\r\\n }\\r\\n\\r\\n function isASCII(str) {\\r\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\r\\n }\\r\\n\\r\\n function LookupValue(key, type, template) {\\r\\n var cvpair = {\\r\\n key: key, // key to be lookded up\\r\\n type: type, // type of the key\\r\\n template: template // the variable the result will be mapped to\\r\\n };\\r\\n msg.KeyValue = cvpair;\\r\\n }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n module.exports = {\\r\\n execute_ops\\r\\n }\\r\\n} else { // on server use local defined vars\\r\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n // define global returns\\r\\n msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1744202957},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n // Define array to push device data into. This will be put into the msg array at the end.\\r\\n var deviceParams = [];\\r\\n var configsToSend = [];\\r\\n var tasks = [];\\r\\n msg = {};\\r\\n const _crypto = require('crypto');\\r\\n // handle ACK\\r\\n if (messageTypeCode == \\\"ACK\\\") {\\r\\n return \\\"\\\";\\r\\n }\\r\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\r\\n var password;\\r\\n if (params.imei == \\\"null\\\") {\\r\\n return msg;\\r\\n }\\r\\n password = params.imei;\\r\\n if (configs.Password.Password === \\\"\\\") {\\r\\n // use imei as default password when not specified\\r\\n } else {\\r\\n // use the password\\r\\n password = configs.Password.Password\\r\\n }\\r\\n let message = decrypt(raw, password);\\r\\n if (message) {\\r\\n // send message internally\\r\\n sendMessageToLocalhost(message);\\r\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n } else {\\r\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n }\\r\\n } else { // General Oysta Template\\r\\n switch (messageTypeLocalCode) {\\r\\n case (\\\"COMM\\\"):\\r\\n process_invent_msg(); //incoming invent commands\\r\\n break;\\r\\n case (\\\"MACB\\\"):\\r\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\r\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\r\\n add_params_to_output();\\r\\n break;\\r\\n case \\\"INFO-GETPWB\\\": // handle GETPWB message\\r\\n //let imei = params.bracelet_imei; // not actually needed ?\\r\\n //let mac = params.BLEMAC; // not actually needed ?\\r\\n AddValue(\\\"mac\\\", params.ble_mac);\\r\\n //AddValue(\\\"key\\\", params.key);\\r\\n console.log(\\\"mac: \\\" + params.ble_mac);\\r\\n let BraceletPW = \\\"\\\"; // until we set it from query below\\r\\n // if(params.bracelet_imei){\\r\\n // if(serverParams.Password){\\r\\n // BraceletPW = serverParams.Password; // query key value table\\r\\n // console.log(BraceletPW); // print for testing reasons\\r\\n // AddConfig(configIds.DeviceConfig.BraceletPW, BraceletPW);//this to return the value\\r\\n // }\\r\\n // }\\r\\n // else {\\r\\n // //return error\\r\\n // }\\r\\n //AddValue(\\\"password\\\", \\\"myNewPassword\\\");\\r\\n //LookupValue(params.ble_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n LookupValue(\\\"mac\\\", \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n if (deviceParams.length > 0) {\\r\\n msg.values = deviceParams\\r\\n };\\r\\n console.log(msg);\\r\\n break;\\r\\n case (\\\"REGISTER\\\"):\\r\\n let ble_mac = params.ble_mac;\\r\\n let iccid = params.iccid;\\r\\n // write values to readonly settings\\r\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\r\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\r\\n // will automtaically Activate on Acceptance\\r\\n if (serverParams.EnvName) {\\r\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\r\\n }\\r\\n }\\r\\n break;\\r\\n case (\\\"CREATE\\\"):\\r\\n // temp fix to filter old messages\\r\\n // const cutoff = 1707523200000; //10.2.2024\\r\\n // let message_id_time = parseInt(params.count_number, 36);\\r\\n // if (message_id_time > cutoff){\\r\\n let c_ble_mac = params.ble_mac;\\r\\n let c_iccid = params.iccid;\\r\\n let new_imei = params.new_imei;\\r\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\r\\n // sendMessageToLocalhost(c_message); \\r\\n tasks = [{\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"sync\\\",\\r\\n \\\"type\\\": \\\"createDevice\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"imei\\\": new_imei,\\r\\n \\\"abortOnError\\\": false,\\r\\n \\\"init\\\": true\\r\\n }),\\r\\n \\\"order\\\": 1\\r\\n }, {\\r\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"async\\\",\\r\\n \\\"type\\\": \\\"sendMessage\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"message\\\": c_message\\r\\n }),\\r\\n \\\"order\\\": 2\\r\\n }]\\r\\n // }\\r\\n break;\\r\\n case (\\\"ALLDATA\\\"):\\r\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\r\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\r\\n let all_data = JSON.parse(json_str);\\r\\n if (\\\"version\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\r\\n };\\r\\n break;\\r\\n default:\\r\\n // all other general messages\\r\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\r\\n add_params_to_output();\\r\\n }\\r\\n // add messagetTypeLocal to output for templates\\r\\n AddValue('local_message_type', messageTypeLocalCode);\\r\\n }\\r\\n var msg = {\\r\\n 'values': deviceParams,\\r\\n };\\r\\n if (configsToSend.length > 0) {\\r\\n msg.configsToSend = configsToSend\\r\\n };\\r\\n if (tasks.length > 0) {\\r\\n msg.tasks = tasks\\r\\n };\\r\\n // commit values to receiver processor\\r\\n console.log(msg);\\r\\n // modify to return the object that contains your data\\r\\n return msg;\\r\\n\\r\\n function add_params_to_output() {\\r\\n if (!params.raw_accuracy) {\\r\\n AddValue('location_accuracy', 9000);\\r\\n } else {\\r\\n AddValue('location_accuracy', params.raw_accuracy);\\r\\n }\\r\\n // generate timestamps if they don't exist\\r\\n if (!params.event_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n if (!params.location_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n //if no lat and long are given, set them to 0, 0\\r\\n if (!params.latitude_raw) {\\r\\n AddValue('latitude', 0);\\r\\n } else {\\r\\n AddValue('latitude', params.latitude_raw);\\r\\n }\\r\\n if (!params.longitude_raw) {\\r\\n AddValue('longitude', 0);\\r\\n } else {\\r\\n AddValue('longitude', params.longitude_raw);\\r\\n }\\r\\n // if (params.temp_bracelet){\\r\\n // AddValue('oysta_labels', 'DegC');\\r\\n // AddValue('single_column_value', params.temp_bracelet);\\r\\n // }\\r\\n }\\r\\n\\r\\n function process_invent_msg() {\\r\\n const details = JSON.parse(raw);\\r\\n // AddValue('imei', details.AppId);\\r\\n AddValue('json_in', JSON.stringify(details));\\r\\n switch (details.Command) {\\r\\n case \\\"ACTIVATE_OK\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\r\\n break;\\r\\n case \\\"ACTIVATE_FAILS\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\r\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\r\\n break;\\r\\n case \\\"APPSET\\\":\\r\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\r\\n AddConfig(configIds.Password.Password, details.Data.Password);\\r\\n break;\\r\\n case \\\"CONFIG\\\":\\r\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\r\\n break;\\r\\n case \\\"CGFBR\\\":\\r\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\r\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\r\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\r\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\r\\n let commonParam = addEscapeChar(details.Data.ComPar);\\r\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\r\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\r\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\r\\n let lteParam = addEscapeChar(details.Data.LtePar);\\r\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\r\\n let bleParam = addEscapeChar(details.Data.BlePar);\\r\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\r\\n break;\\r\\n case \\\"REBOOTB\\\":\\r\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\r\\n break;\\r\\n case \\\"PWRFB\\\":\\r\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\r\\n break;\\r\\n case \\\"RESETB\\\":\\r\\n AddConfig(configIds.Bracelet.Reset, 'true');\\r\\n break;\\r\\n case \\\"BRAPWUPDATE\\\":\\r\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\r\\n // get password from old device, then set\\r\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\r\\n )\\r\\n break;\\r\\n case \\\"NOTE\\\":\\r\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\r\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\r\\n text = text.split(\\\",\\\").join(\\\" \\\");\\r\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\r\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\r\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\r\\n AddConfig(configIds.Note.Message, value)\\r\\n break;\\r\\n }\\r\\n }\\r\\n\\r\\n function addEscapeChar(json) {\\r\\n if (json === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n let jsonStr = JSON.stringify(json);\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\r\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function changeSingleQuoteToDouble(jsonStr) {\\r\\n if (jsonStr === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\r\\n outStr = outStr + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function sendMessageToLocalhost(str) {\\r\\n if (localTesting) {\\r\\n console.log(\\\"Sending message to local host: \\\" + str);\\r\\n } else {\\r\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\r\\n var c = createConnection(5878, server); // acceptance is 5678 - protocol dev 5878 - dev is 5679 ?\\r\\n c.write(`${str}`);\\r\\n c.end();\\r\\n }\\r\\n AddValue(\\\"ToLocalhost\\\", str);\\r\\n }\\r\\n\\r\\n function createConnection(port, server) {\\r\\n c = net.createConnection(port, server);\\r\\n c.on('error', function(error) {\\r\\n c = createConnection(port, server);\\r\\n });\\r\\n return c;\\r\\n }\\r\\n\\r\\n function decrypt(encdata, password) {\\r\\n var decrypted;\\r\\n var dataarray = encdata.split(\\\";\\\");\\r\\n if (dataarray.length > 5) {\\r\\n return \\\"\\\";\\r\\n }\\r\\n var i;\\r\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\r\\n if (encdata.startsWith(\\\"ACK\\\")) {\\r\\n return encdata;\\r\\n }\\r\\n for (i = 0; i < 3; i++) {\\r\\n part1 = part1 + dataarray[i] + \\\";\\\";\\r\\n }\\r\\n var mid = dataarray[2]; // use the message ID to create the salt\\r\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n // base64 decoding and extract the iv and encrypted data\\r\\n const bData = Buffer.from(enctext, 'base64');\\r\\n const iv = bData.slice(0, 16); // initial 16 chars\\r\\n const text = bData.slice(16); // all the encrypted data\\r\\n // derive key using; 32 byte key length (from salted password and mid)\\r\\n // decrypt the data in part2 and add to part1\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\r\\n try {\\r\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\r\\n } catch (err) {\\r\\n decrypted = undefined;\\r\\n }\\r\\n return decrypted;\\r\\n }\\r\\n\\r\\n function encrypt(text, mid, password) {\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n const iv = _crypto.randomBytes(16); // random initialization vector\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n // set the cipher\\r\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\r\\n // encrypt text\\r\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\r\\n // generate output ( encrypted text )\\r\\n return Buffer.concat([iv, encrypted]).toString('base64');\\r\\n }\\r\\n\\r\\n function AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n deviceParams.push(cvpair);\\r\\n }\\r\\n\\r\\n function AddConfig(configName, newvalue) {\\r\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n var cvpair = {\\r\\n 'code': configName,\\r\\n 'value': newvalue,\\r\\n 'forced': true\\r\\n };\\r\\n configsToSend.push(cvpair);\\r\\n };\\r\\n }\\r\\n\\r\\n function isASCII(str) {\\r\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\r\\n }\\r\\n\\r\\n function LookupValue(key, type, template) {\\r\\n var cvpair = {\\r\\n key: key, // key to be lookded up\\r\\n type: type, // type of the key\\r\\n template: template // the variable the result will be mapped to\\r\\n };\\r\\n msg.KeyValue = cvpair;\\r\\n }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n module.exports = {\\r\\n execute_ops\\r\\n }\\r\\n} else { // on server use local defined vars\\r\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n // define global returns\\r\\n msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1744203728},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n // Define array to push device data into. This will be put into the msg array at the end.\\r\\n var deviceParams = [];\\r\\n var configsToSend = [];\\r\\n var tasks = [];\\r\\n msg = {};\\r\\n const _crypto = require('crypto');\\r\\n // handle ACK\\r\\n if (messageTypeCode == \\\"ACK\\\") {\\r\\n return \\\"\\\";\\r\\n }\\r\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\r\\n var password;\\r\\n if (params.imei == \\\"null\\\") {\\r\\n return msg;\\r\\n }\\r\\n password = params.imei;\\r\\n if (configs.Password.Password === \\\"\\\") {\\r\\n // use imei as default password when not specified\\r\\n } else {\\r\\n // use the password\\r\\n password = configs.Password.Password\\r\\n }\\r\\n let message = decrypt(raw, password);\\r\\n if (message) {\\r\\n // send message internally\\r\\n sendMessageToLocalhost(message);\\r\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n } else {\\r\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n }\\r\\n } else { // General Oysta Template\\r\\n switch (messageTypeLocalCode) {\\r\\n case (\\\"COMM\\\"):\\r\\n process_invent_msg(); //incoming invent commands\\r\\n break;\\r\\n case (\\\"MACB\\\"):\\r\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\r\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\r\\n add_params_to_output();\\r\\n break;\\r\\n case \\\"INFO-GETPWB\\\": // handle GETPWB message\\r\\n //let imei = params.bracelet_imei; // not actually needed ?\\r\\n //let mac = params.BLEMAC; // not actually needed ?\\r\\n AddValue(\\\"mac\\\", params.bracelet_mac);\\r\\n //AddValue(\\\"key\\\", params.key);\\r\\n console.log(\\\"mac: \\\" + params.bracelet_mac);\\r\\n let BraceletPW = \\\"\\\"; // until we set it from query below\\r\\n // if(params.bracelet_imei){\\r\\n // if(serverParams.Password){\\r\\n // BraceletPW = serverParams.Password; // query key value table\\r\\n // console.log(BraceletPW); // print for testing reasons\\r\\n // AddConfig(configIds.DeviceConfig.BraceletPW, BraceletPW);//this to return the value\\r\\n // }\\r\\n // }\\r\\n // else {\\r\\n // //return error\\r\\n // }\\r\\n //AddValue(\\\"password\\\", \\\"myNewPassword\\\");\\r\\n //LookupValue(params.ble_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n LookupValue(\\\"mac\\\", \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n if (deviceParams.length > 0) {\\r\\n msg.values = deviceParams\\r\\n };\\r\\n console.log(msg);\\r\\n break;\\r\\n case (\\\"REGISTER\\\"):\\r\\n let ble_mac = params.ble_mac;\\r\\n let iccid = params.iccid;\\r\\n // write values to readonly settings\\r\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\r\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\r\\n // will automtaically Activate on Acceptance\\r\\n if (serverParams.EnvName) {\\r\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\r\\n }\\r\\n }\\r\\n break;\\r\\n case (\\\"CREATE\\\"):\\r\\n // temp fix to filter old messages\\r\\n // const cutoff = 1707523200000; //10.2.2024\\r\\n // let message_id_time = parseInt(params.count_number, 36);\\r\\n // if (message_id_time > cutoff){\\r\\n let c_ble_mac = params.ble_mac;\\r\\n let c_iccid = params.iccid;\\r\\n let new_imei = params.new_imei;\\r\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\r\\n // sendMessageToLocalhost(c_message); \\r\\n tasks = [{\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"sync\\\",\\r\\n \\\"type\\\": \\\"createDevice\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"imei\\\": new_imei,\\r\\n \\\"abortOnError\\\": false,\\r\\n \\\"init\\\": true\\r\\n }),\\r\\n \\\"order\\\": 1\\r\\n }, {\\r\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"async\\\",\\r\\n \\\"type\\\": \\\"sendMessage\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"message\\\": c_message\\r\\n }),\\r\\n \\\"order\\\": 2\\r\\n }]\\r\\n // }\\r\\n break;\\r\\n case (\\\"ALLDATA\\\"):\\r\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\r\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\r\\n let all_data = JSON.parse(json_str);\\r\\n if (\\\"version\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\r\\n };\\r\\n break;\\r\\n default:\\r\\n // all other general messages\\r\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\r\\n add_params_to_output();\\r\\n }\\r\\n // add messagetTypeLocal to output for templates\\r\\n AddValue('local_message_type', messageTypeLocalCode);\\r\\n }\\r\\n var msg = {\\r\\n 'values': deviceParams,\\r\\n };\\r\\n if (configsToSend.length > 0) {\\r\\n msg.configsToSend = configsToSend\\r\\n };\\r\\n if (tasks.length > 0) {\\r\\n msg.tasks = tasks\\r\\n };\\r\\n // commit values to receiver processor\\r\\n console.log(msg);\\r\\n // modify to return the object that contains your data\\r\\n return msg;\\r\\n\\r\\n function add_params_to_output() {\\r\\n if (!params.raw_accuracy) {\\r\\n AddValue('location_accuracy', 9000);\\r\\n } else {\\r\\n AddValue('location_accuracy', params.raw_accuracy);\\r\\n }\\r\\n // generate timestamps if they don't exist\\r\\n if (!params.event_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n if (!params.location_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n //if no lat and long are given, set them to 0, 0\\r\\n if (!params.latitude_raw) {\\r\\n AddValue('latitude', 0);\\r\\n } else {\\r\\n AddValue('latitude', params.latitude_raw);\\r\\n }\\r\\n if (!params.longitude_raw) {\\r\\n AddValue('longitude', 0);\\r\\n } else {\\r\\n AddValue('longitude', params.longitude_raw);\\r\\n }\\r\\n // if (params.temp_bracelet){\\r\\n // AddValue('oysta_labels', 'DegC');\\r\\n // AddValue('single_column_value', params.temp_bracelet);\\r\\n // }\\r\\n }\\r\\n\\r\\n function process_invent_msg() {\\r\\n const details = JSON.parse(raw);\\r\\n // AddValue('imei', details.AppId);\\r\\n AddValue('json_in', JSON.stringify(details));\\r\\n switch (details.Command) {\\r\\n case \\\"ACTIVATE_OK\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\r\\n break;\\r\\n case \\\"ACTIVATE_FAILS\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\r\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\r\\n break;\\r\\n case \\\"APPSET\\\":\\r\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\r\\n AddConfig(configIds.Password.Password, details.Data.Password);\\r\\n break;\\r\\n case \\\"CONFIG\\\":\\r\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\r\\n break;\\r\\n case \\\"CGFBR\\\":\\r\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\r\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\r\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\r\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\r\\n let commonParam = addEscapeChar(details.Data.ComPar);\\r\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\r\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\r\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\r\\n let lteParam = addEscapeChar(details.Data.LtePar);\\r\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\r\\n let bleParam = addEscapeChar(details.Data.BlePar);\\r\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\r\\n break;\\r\\n case \\\"REBOOTB\\\":\\r\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\r\\n break;\\r\\n case \\\"PWRFB\\\":\\r\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\r\\n break;\\r\\n case \\\"RESETB\\\":\\r\\n AddConfig(configIds.Bracelet.Reset, 'true');\\r\\n break;\\r\\n case \\\"BRAPWUPDATE\\\":\\r\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\r\\n // get password from old device, then set\\r\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\r\\n )\\r\\n break;\\r\\n case \\\"NOTE\\\":\\r\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\r\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\r\\n text = text.split(\\\",\\\").join(\\\" \\\");\\r\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\r\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\r\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\r\\n AddConfig(configIds.Note.Message, value)\\r\\n break;\\r\\n }\\r\\n }\\r\\n\\r\\n function addEscapeChar(json) {\\r\\n if (json === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n let jsonStr = JSON.stringify(json);\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\r\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function changeSingleQuoteToDouble(jsonStr) {\\r\\n if (jsonStr === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\r\\n outStr = outStr + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function sendMessageToLocalhost(str) {\\r\\n if (localTesting) {\\r\\n console.log(\\\"Sending message to local host: \\\" + str);\\r\\n } else {\\r\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\r\\n var c = createConnection(5878, server); // acceptance is 5678 - protocol dev 5878 - dev is 5679 ?\\r\\n c.write(`${str}`);\\r\\n c.end();\\r\\n }\\r\\n AddValue(\\\"ToLocalhost\\\", str);\\r\\n }\\r\\n\\r\\n function createConnection(port, server) {\\r\\n c = net.createConnection(port, server);\\r\\n c.on('error', function(error) {\\r\\n c = createConnection(port, server);\\r\\n });\\r\\n return c;\\r\\n }\\r\\n\\r\\n function decrypt(encdata, password) {\\r\\n var decrypted;\\r\\n var dataarray = encdata.split(\\\";\\\");\\r\\n if (dataarray.length > 5) {\\r\\n return \\\"\\\";\\r\\n }\\r\\n var i;\\r\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\r\\n if (encdata.startsWith(\\\"ACK\\\")) {\\r\\n return encdata;\\r\\n }\\r\\n for (i = 0; i < 3; i++) {\\r\\n part1 = part1 + dataarray[i] + \\\";\\\";\\r\\n }\\r\\n var mid = dataarray[2]; // use the message ID to create the salt\\r\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n // base64 decoding and extract the iv and encrypted data\\r\\n const bData = Buffer.from(enctext, 'base64');\\r\\n const iv = bData.slice(0, 16); // initial 16 chars\\r\\n const text = bData.slice(16); // all the encrypted data\\r\\n // derive key using; 32 byte key length (from salted password and mid)\\r\\n // decrypt the data in part2 and add to part1\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\r\\n try {\\r\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\r\\n } catch (err) {\\r\\n decrypted = undefined;\\r\\n }\\r\\n return decrypted;\\r\\n }\\r\\n\\r\\n function encrypt(text, mid, password) {\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n const iv = _crypto.randomBytes(16); // random initialization vector\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n // set the cipher\\r\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\r\\n // encrypt text\\r\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\r\\n // generate output ( encrypted text )\\r\\n return Buffer.concat([iv, encrypted]).toString('base64');\\r\\n }\\r\\n\\r\\n function AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n deviceParams.push(cvpair);\\r\\n }\\r\\n\\r\\n function AddConfig(configName, newvalue) {\\r\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n var cvpair = {\\r\\n 'code': configName,\\r\\n 'value': newvalue,\\r\\n 'forced': true\\r\\n };\\r\\n configsToSend.push(cvpair);\\r\\n };\\r\\n }\\r\\n\\r\\n function isASCII(str) {\\r\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\r\\n }\\r\\n\\r\\n function LookupValue(key, type, template) {\\r\\n var cvpair = {\\r\\n key: key, // key to be lookded up\\r\\n type: type, // type of the key\\r\\n template: template // the variable the result will be mapped to\\r\\n };\\r\\n msg.KeyValue = cvpair;\\r\\n }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n module.exports = {\\r\\n execute_ops\\r\\n }\\r\\n} else { // on server use local defined vars\\r\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n // define global returns\\r\\n msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1744203822},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n // Define array to push device data into. This will be put into the msg array at the end.\\r\\n var deviceParams = [];\\r\\n var configsToSend = [];\\r\\n var tasks = [];\\r\\n const _crypto = require('crypto');\\r\\n // handle ACK\\r\\n if (messageTypeCode == \\\"ACK\\\") {\\r\\n return \\\"\\\";\\r\\n }\\r\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\r\\n var password;\\r\\n if (params.imei == \\\"null\\\") {\\r\\n return msg;\\r\\n }\\r\\n password = params.imei;\\r\\n if (configs.Password.Password === \\\"\\\") {\\r\\n // use imei as default password when not specified\\r\\n } else {\\r\\n // use the password\\r\\n password = configs.Password.Password\\r\\n }\\r\\n let message = decrypt(raw, password);\\r\\n if (message) {\\r\\n // send message internally\\r\\n sendMessageToLocalhost(message);\\r\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n } else {\\r\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n }\\r\\n } else { // General Oysta Template\\r\\n switch (messageTypeLocalCode) {\\r\\n case (\\\"COMM\\\"):\\r\\n process_invent_msg(); //incoming invent commands\\r\\n break;\\r\\n case (\\\"MACB\\\"):\\r\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\r\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\r\\n add_params_to_output();\\r\\n break;\\r\\n case \\\"INFO-GETPWB\\\": // handle GETPWB message\\r\\n //let imei = params.bracelet_imei; // not actually needed ?\\r\\n //let mac = params.BLEMAC; // not actually needed ?\\r\\n AddValue(\\\"mac\\\", params.bracelet_mac);\\r\\n //AddValue(\\\"key\\\", params.key);\\r\\n console.log(\\\"mac: \\\" + params.bracelet_mac);\\r\\n let BraceletPW = \\\"\\\"; // until we set it from query below\\r\\n // if(params.bracelet_imei){\\r\\n // if(serverParams.Password){\\r\\n // BraceletPW = serverParams.Password; // query key value table\\r\\n // console.log(BraceletPW); // print for testing reasons\\r\\n // AddConfig(configIds.DeviceConfig.BraceletPW, BraceletPW);//this to return the value\\r\\n // }\\r\\n // }\\r\\n // else {\\r\\n // //return error\\r\\n // }\\r\\n //AddValue(\\\"password\\\", \\\"myNewPassword\\\");\\r\\n //LookupValue(params.ble_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n LookupValue(params.bracelet_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n break;\\r\\n case (\\\"REGISTER\\\"):\\r\\n let ble_mac = params.ble_mac;\\r\\n let iccid = params.iccid;\\r\\n // write values to readonly settings\\r\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\r\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\r\\n // will automtaically Activate on Acceptance\\r\\n if (serverParams.EnvName) {\\r\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\r\\n }\\r\\n }\\r\\n break;\\r\\n case (\\\"CREATE\\\"):\\r\\n // temp fix to filter old messages\\r\\n // const cutoff = 1707523200000; //10.2.2024\\r\\n // let message_id_time = parseInt(params.count_number, 36);\\r\\n // if (message_id_time > cutoff){\\r\\n let c_ble_mac = params.ble_mac;\\r\\n let c_iccid = params.iccid;\\r\\n let new_imei = params.new_imei;\\r\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\r\\n // sendMessageToLocalhost(c_message); \\r\\n tasks = [{\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"sync\\\",\\r\\n \\\"type\\\": \\\"createDevice\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"imei\\\": new_imei,\\r\\n \\\"abortOnError\\\": false,\\r\\n \\\"init\\\": true\\r\\n }),\\r\\n \\\"order\\\": 1\\r\\n }, {\\r\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"async\\\",\\r\\n \\\"type\\\": \\\"sendMessage\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"message\\\": c_message\\r\\n }),\\r\\n \\\"order\\\": 2\\r\\n }]\\r\\n // }\\r\\n break;\\r\\n case (\\\"ALLDATA\\\"):\\r\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\r\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\r\\n let all_data = JSON.parse(json_str);\\r\\n if (\\\"version\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\r\\n };\\r\\n break;\\r\\n default:\\r\\n // all other general messages\\r\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\r\\n add_params_to_output();\\r\\n }\\r\\n // add messagetTypeLocal to output for templates\\r\\n AddValue('local_message_type', messageTypeLocalCode);\\r\\n }\\r\\n var msg = {\\r\\n 'values': deviceParams,\\r\\n };\\r\\n console.log(msg);\\r\\n if (configsToSend.length > 0) {\\r\\n msg.configsToSend = configsToSend\\r\\n };\\r\\n if (tasks.length > 0) {\\r\\n msg.tasks = tasks\\r\\n };\\r\\n // commit values to receiver processor\\r\\n console.log(msg);\\r\\n // modify to return the object that contains your data\\r\\n return msg;\\r\\n\\r\\n function add_params_to_output() {\\r\\n if (!params.raw_accuracy) {\\r\\n AddValue('location_accuracy', 9000);\\r\\n } else {\\r\\n AddValue('location_accuracy', params.raw_accuracy);\\r\\n }\\r\\n // generate timestamps if they don't exist\\r\\n if (!params.event_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n if (!params.location_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n //if no lat and long are given, set them to 0, 0\\r\\n if (!params.latitude_raw) {\\r\\n AddValue('latitude', 0);\\r\\n } else {\\r\\n AddValue('latitude', params.latitude_raw);\\r\\n }\\r\\n if (!params.longitude_raw) {\\r\\n AddValue('longitude', 0);\\r\\n } else {\\r\\n AddValue('longitude', params.longitude_raw);\\r\\n }\\r\\n // if (params.temp_bracelet){\\r\\n // AddValue('oysta_labels', 'DegC');\\r\\n // AddValue('single_column_value', params.temp_bracelet);\\r\\n // }\\r\\n }\\r\\n\\r\\n function process_invent_msg() {\\r\\n const details = JSON.parse(raw);\\r\\n // AddValue('imei', details.AppId);\\r\\n AddValue('json_in', JSON.stringify(details));\\r\\n switch (details.Command) {\\r\\n case \\\"ACTIVATE_OK\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\r\\n break;\\r\\n case \\\"ACTIVATE_FAILS\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\r\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\r\\n break;\\r\\n case \\\"APPSET\\\":\\r\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\r\\n AddConfig(configIds.Password.Password, details.Data.Password);\\r\\n break;\\r\\n case \\\"CONFIG\\\":\\r\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\r\\n break;\\r\\n case \\\"CGFBR\\\":\\r\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\r\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\r\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\r\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\r\\n let commonParam = addEscapeChar(details.Data.ComPar);\\r\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\r\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\r\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\r\\n let lteParam = addEscapeChar(details.Data.LtePar);\\r\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\r\\n let bleParam = addEscapeChar(details.Data.BlePar);\\r\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\r\\n break;\\r\\n case \\\"REBOOTB\\\":\\r\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\r\\n break;\\r\\n case \\\"PWRFB\\\":\\r\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\r\\n break;\\r\\n case \\\"RESETB\\\":\\r\\n AddConfig(configIds.Bracelet.Reset, 'true');\\r\\n break;\\r\\n case \\\"BRAPWUPDATE\\\":\\r\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\r\\n // get password from old device, then set\\r\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\r\\n )\\r\\n break;\\r\\n case \\\"NOTE\\\":\\r\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\r\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\r\\n text = text.split(\\\",\\\").join(\\\" \\\");\\r\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\r\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\r\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\r\\n AddConfig(configIds.Note.Message, value)\\r\\n break;\\r\\n }\\r\\n }\\r\\n\\r\\n function addEscapeChar(json) {\\r\\n if (json === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n let jsonStr = JSON.stringify(json);\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\r\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function changeSingleQuoteToDouble(jsonStr) {\\r\\n if (jsonStr === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\r\\n outStr = outStr + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function sendMessageToLocalhost(str) {\\r\\n if (localTesting) {\\r\\n console.log(\\\"Sending message to local host: \\\" + str);\\r\\n } else {\\r\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\r\\n var c = createConnection(5878, server); // acceptance is 5678 - protocol dev 5878 - dev is 5679 ?\\r\\n c.write(`${str}`);\\r\\n c.end();\\r\\n }\\r\\n AddValue(\\\"ToLocalhost\\\", str);\\r\\n }\\r\\n\\r\\n function createConnection(port, server) {\\r\\n c = net.createConnection(port, server);\\r\\n c.on('error', function(error) {\\r\\n c = createConnection(port, server);\\r\\n });\\r\\n return c;\\r\\n }\\r\\n\\r\\n function decrypt(encdata, password) {\\r\\n var decrypted;\\r\\n var dataarray = encdata.split(\\\";\\\");\\r\\n if (dataarray.length > 5) {\\r\\n return \\\"\\\";\\r\\n }\\r\\n var i;\\r\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\r\\n if (encdata.startsWith(\\\"ACK\\\")) {\\r\\n return encdata;\\r\\n }\\r\\n for (i = 0; i < 3; i++) {\\r\\n part1 = part1 + dataarray[i] + \\\";\\\";\\r\\n }\\r\\n var mid = dataarray[2]; // use the message ID to create the salt\\r\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n // base64 decoding and extract the iv and encrypted data\\r\\n const bData = Buffer.from(enctext, 'base64');\\r\\n const iv = bData.slice(0, 16); // initial 16 chars\\r\\n const text = bData.slice(16); // all the encrypted data\\r\\n // derive key using; 32 byte key length (from salted password and mid)\\r\\n // decrypt the data in part2 and add to part1\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\r\\n try {\\r\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\r\\n } catch (err) {\\r\\n decrypted = undefined;\\r\\n }\\r\\n return decrypted;\\r\\n }\\r\\n\\r\\n function encrypt(text, mid, password) {\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n const iv = _crypto.randomBytes(16); // random initialization vector\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n // set the cipher\\r\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\r\\n // encrypt text\\r\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\r\\n // generate output ( encrypted text )\\r\\n return Buffer.concat([iv, encrypted]).toString('base64');\\r\\n }\\r\\n\\r\\n function AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n deviceParams.push(cvpair);\\r\\n }\\r\\n\\r\\n function AddConfig(configName, newvalue) {\\r\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n var cvpair = {\\r\\n 'code': configName,\\r\\n 'value': newvalue,\\r\\n 'forced': true\\r\\n };\\r\\n configsToSend.push(cvpair);\\r\\n };\\r\\n }\\r\\n\\r\\n function isASCII(str) {\\r\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\r\\n }\\r\\n\\r\\n function LookupValue(key, type, template) {\\r\\n var cvpair = {\\r\\n key: key, // key to be lookded up\\r\\n type: type, // type of the key\\r\\n template: template // the variable the result will be mapped to\\r\\n };\\r\\n msg.KeyValue = cvpair;\\r\\n }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n module.exports = {\\r\\n execute_ops\\r\\n }\\r\\n} else { // on server use local defined vars\\r\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n // define global returns\\r\\n msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1744204411},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n // Define array to push device data into. This will be put into the msg array at the end.\\r\\n var deviceParams = [];\\r\\n var configsToSend = [];\\r\\n var tasks = [];\\r\\n const _crypto = require('crypto');\\r\\n // handle ACK\\r\\n if (messageTypeCode == \\\"ACK\\\") {\\r\\n return \\\"\\\";\\r\\n }\\r\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\r\\n var password;\\r\\n if (params.imei == \\\"null\\\") {\\r\\n return msg;\\r\\n }\\r\\n password = params.imei;\\r\\n if (configs.Password.Password === \\\"\\\") {\\r\\n // use imei as default password when not specified\\r\\n } else {\\r\\n // use the password\\r\\n password = configs.Password.Password\\r\\n }\\r\\n let message = decrypt(raw, password);\\r\\n if (message) {\\r\\n // send message internally\\r\\n sendMessageToLocalhost(message);\\r\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n } else {\\r\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n }\\r\\n } else { // General Oysta Template\\r\\n switch (messageTypeLocalCode) {\\r\\n case (\\\"COMM\\\"):\\r\\n process_invent_msg(); //incoming invent commands\\r\\n break;\\r\\n case (\\\"MACB\\\"):\\r\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\r\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\r\\n add_params_to_output();\\r\\n break;\\r\\n case \\\"INFO-GETPWB\\\": // handle GETPWB message\\r\\n //let imei = params.bracelet_imei; // not actually needed ?\\r\\n //let mac = params.BLEMAC; // not actually needed ?\\r\\n //AddValue(\\\"mac\\\", params.bracelet_mac);\\r\\n //AddValue(\\\"key\\\", params.key);\\r\\n //console.log(\\\"mac: \\\" + params.bracelet_mac);\\r\\n let BraceletPW = \\\"\\\"; // until we set it from query below\\r\\n // if(params.bracelet_imei){\\r\\n // if(serverParams.Password){\\r\\n // BraceletPW = serverParams.Password; // query key value table\\r\\n // console.log(BraceletPW); // print for testing reasons\\r\\n // AddConfig(configIds.DeviceConfig.BraceletPW, BraceletPW);//this to return the value\\r\\n // }\\r\\n // }\\r\\n // else {\\r\\n // //return error\\r\\n // }\\r\\n //AddValue(\\\"password\\\", \\\"myNewPassword\\\");\\r\\n //LookupValue(params.ble_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n LookupValue(params.bracelet_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n break;\\r\\n case (\\\"REGISTER\\\"):\\r\\n let ble_mac = params.ble_mac;\\r\\n let iccid = params.iccid;\\r\\n // write values to readonly settings\\r\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\r\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\r\\n // will automtaically Activate on Acceptance\\r\\n if (serverParams.EnvName) {\\r\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\r\\n }\\r\\n }\\r\\n break;\\r\\n case (\\\"CREATE\\\"):\\r\\n // temp fix to filter old messages\\r\\n // const cutoff = 1707523200000; //10.2.2024\\r\\n // let message_id_time = parseInt(params.count_number, 36);\\r\\n // if (message_id_time > cutoff){\\r\\n let c_ble_mac = params.ble_mac;\\r\\n let c_iccid = params.iccid;\\r\\n let new_imei = params.new_imei;\\r\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\r\\n // sendMessageToLocalhost(c_message); \\r\\n tasks = [{\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"sync\\\",\\r\\n \\\"type\\\": \\\"createDevice\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"imei\\\": new_imei,\\r\\n \\\"abortOnError\\\": false,\\r\\n \\\"init\\\": true\\r\\n }),\\r\\n \\\"order\\\": 1\\r\\n }, {\\r\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"async\\\",\\r\\n \\\"type\\\": \\\"sendMessage\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"message\\\": c_message\\r\\n }),\\r\\n \\\"order\\\": 2\\r\\n }]\\r\\n // }\\r\\n break;\\r\\n case (\\\"ALLDATA\\\"):\\r\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\r\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\r\\n let all_data = JSON.parse(json_str);\\r\\n if (\\\"version\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\r\\n };\\r\\n break;\\r\\n default:\\r\\n // all other general messages\\r\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\r\\n add_params_to_output();\\r\\n }\\r\\n // add messagetTypeLocal to output for templates\\r\\n AddValue('local_message_type', messageTypeLocalCode);\\r\\n }\\r\\n var msg = {\\r\\n 'values': deviceParams,\\r\\n };\\r\\n\\r\\n function LookupValue(key, type, template) {\\r\\n var cvpair = {\\r\\n key: key, // key to be lookded up\\r\\n type: type, // type of the key\\r\\n template: template // the variable the result will be mapped to\\r\\n };\\r\\n msg.KeyValue = cvpair;\\r\\n }\\r\\n if (configsToSend.length > 0) {\\r\\n msg.configsToSend = configsToSend\\r\\n };\\r\\n if (tasks.length > 0) {\\r\\n msg.tasks = tasks\\r\\n };\\r\\n // commit values to receiver processor\\r\\n console.log(msg);\\r\\n // modify to return the object that contains your data\\r\\n return msg;\\r\\n\\r\\n function add_params_to_output() {\\r\\n if (!params.raw_accuracy) {\\r\\n AddValue('location_accuracy', 9000);\\r\\n } else {\\r\\n AddValue('location_accuracy', params.raw_accuracy);\\r\\n }\\r\\n // generate timestamps if they don't exist\\r\\n if (!params.event_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n if (!params.location_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n //if no lat and long are given, set them to 0, 0\\r\\n if (!params.latitude_raw) {\\r\\n AddValue('latitude', 0);\\r\\n } else {\\r\\n AddValue('latitude', params.latitude_raw);\\r\\n }\\r\\n if (!params.longitude_raw) {\\r\\n AddValue('longitude', 0);\\r\\n } else {\\r\\n AddValue('longitude', params.longitude_raw);\\r\\n }\\r\\n // if (params.temp_bracelet){\\r\\n // AddValue('oysta_labels', 'DegC');\\r\\n // AddValue('single_column_value', params.temp_bracelet);\\r\\n // }\\r\\n }\\r\\n\\r\\n function process_invent_msg() {\\r\\n const details = JSON.parse(raw);\\r\\n // AddValue('imei', details.AppId);\\r\\n AddValue('json_in', JSON.stringify(details));\\r\\n switch (details.Command) {\\r\\n case \\\"ACTIVATE_OK\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\r\\n break;\\r\\n case \\\"ACTIVATE_FAILS\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\r\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\r\\n break;\\r\\n case \\\"APPSET\\\":\\r\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\r\\n AddConfig(configIds.Password.Password, details.Data.Password);\\r\\n break;\\r\\n case \\\"CONFIG\\\":\\r\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\r\\n break;\\r\\n case \\\"CGFBR\\\":\\r\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\r\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\r\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\r\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\r\\n let commonParam = addEscapeChar(details.Data.ComPar);\\r\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\r\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\r\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\r\\n let lteParam = addEscapeChar(details.Data.LtePar);\\r\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\r\\n let bleParam = addEscapeChar(details.Data.BlePar);\\r\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\r\\n break;\\r\\n case \\\"REBOOTB\\\":\\r\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\r\\n break;\\r\\n case \\\"PWRFB\\\":\\r\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\r\\n break;\\r\\n case \\\"RESETB\\\":\\r\\n AddConfig(configIds.Bracelet.Reset, 'true');\\r\\n break;\\r\\n case \\\"BRAPWUPDATE\\\":\\r\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\r\\n // get password from old device, then set\\r\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\r\\n )\\r\\n break;\\r\\n case \\\"NOTE\\\":\\r\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\r\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\r\\n text = text.split(\\\",\\\").join(\\\" \\\");\\r\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\r\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\r\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\r\\n AddConfig(configIds.Note.Message, value)\\r\\n break;\\r\\n }\\r\\n }\\r\\n\\r\\n function addEscapeChar(json) {\\r\\n if (json === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n let jsonStr = JSON.stringify(json);\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\r\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function changeSingleQuoteToDouble(jsonStr) {\\r\\n if (jsonStr === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\r\\n outStr = outStr + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function sendMessageToLocalhost(str) {\\r\\n if (localTesting) {\\r\\n console.log(\\\"Sending message to local host: \\\" + str);\\r\\n } else {\\r\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\r\\n var c = createConnection(5878, server); // acceptance is 5678 - protocol dev 5878 - dev is 5679 ?\\r\\n c.write(`${str}`);\\r\\n c.end();\\r\\n }\\r\\n AddValue(\\\"ToLocalhost\\\", str);\\r\\n }\\r\\n\\r\\n function createConnection(port, server) {\\r\\n c = net.createConnection(port, server);\\r\\n c.on('error', function(error) {\\r\\n c = createConnection(port, server);\\r\\n });\\r\\n return c;\\r\\n }\\r\\n\\r\\n function decrypt(encdata, password) {\\r\\n var decrypted;\\r\\n var dataarray = encdata.split(\\\";\\\");\\r\\n if (dataarray.length > 5) {\\r\\n return \\\"\\\";\\r\\n }\\r\\n var i;\\r\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\r\\n if (encdata.startsWith(\\\"ACK\\\")) {\\r\\n return encdata;\\r\\n }\\r\\n for (i = 0; i < 3; i++) {\\r\\n part1 = part1 + dataarray[i] + \\\";\\\";\\r\\n }\\r\\n var mid = dataarray[2]; // use the message ID to create the salt\\r\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n // base64 decoding and extract the iv and encrypted data\\r\\n const bData = Buffer.from(enctext, 'base64');\\r\\n const iv = bData.slice(0, 16); // initial 16 chars\\r\\n const text = bData.slice(16); // all the encrypted data\\r\\n // derive key using; 32 byte key length (from salted password and mid)\\r\\n // decrypt the data in part2 and add to part1\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\r\\n try {\\r\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\r\\n } catch (err) {\\r\\n decrypted = undefined;\\r\\n }\\r\\n return decrypted;\\r\\n }\\r\\n\\r\\n function encrypt(text, mid, password) {\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n const iv = _crypto.randomBytes(16); // random initialization vector\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n // set the cipher\\r\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\r\\n // encrypt text\\r\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\r\\n // generate output ( encrypted text )\\r\\n return Buffer.concat([iv, encrypted]).toString('base64');\\r\\n }\\r\\n\\r\\n function AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n deviceParams.push(cvpair);\\r\\n }\\r\\n\\r\\n function AddConfig(configName, newvalue) {\\r\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n var cvpair = {\\r\\n 'code': configName,\\r\\n 'value': newvalue,\\r\\n 'forced': true\\r\\n };\\r\\n configsToSend.push(cvpair);\\r\\n };\\r\\n }\\r\\n\\r\\n function isASCII(str) {\\r\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\r\\n }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n module.exports = {\\r\\n execute_ops\\r\\n }\\r\\n} else { // on server use local defined vars\\r\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n // define global returns\\r\\n msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1744207495},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n // Define array to push device data into. This will be put into the msg array at the end.\\r\\n var deviceParams = [];\\r\\n var configsToSend = [];\\r\\n var tasks = [];\\r\\n const _crypto = require('crypto');\\r\\n // handle ACK\\r\\n if (messageTypeCode == \\\"ACK\\\") {\\r\\n return \\\"\\\";\\r\\n }\\r\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\r\\n var password;\\r\\n if (params.imei == \\\"null\\\") {\\r\\n return msg;\\r\\n }\\r\\n password = params.imei;\\r\\n if (configs.Password.Password === \\\"\\\") {\\r\\n // use imei as default password when not specified\\r\\n } else {\\r\\n // use the password\\r\\n password = configs.Password.Password\\r\\n }\\r\\n let message = decrypt(raw, password);\\r\\n if (message) {\\r\\n // send message internally\\r\\n sendMessageToLocalhost(message);\\r\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n } else {\\r\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n }\\r\\n } else { // General Oysta Template\\r\\n switch (messageTypeLocalCode) {\\r\\n case (\\\"COMM\\\"):\\r\\n process_invent_msg(); //incoming invent commands\\r\\n break;\\r\\n case (\\\"MACB\\\"):\\r\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\r\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\r\\n add_params_to_output();\\r\\n break;\\r\\n case \\\"INFO-GETPWB\\\": // handle GETPWB message\\r\\n //let imei = params.bracelet_imei; // not actually needed ?\\r\\n //let mac = params.BLEMAC; // not actually needed ?\\r\\n //AddValue(\\\"mac\\\", params.bracelet_mac);\\r\\n //AddValue(\\\"key\\\", params.key);\\r\\n //console.log(\\\"mac: \\\" + params.bracelet_mac);\\r\\n let BraceletPW = \\\"\\\"; // until we set it from query below\\r\\n // if(params.bracelet_imei){\\r\\n // if(serverParams.Password){\\r\\n // BraceletPW = serverParams.Password; // query key value table\\r\\n // console.log(BraceletPW); // print for testing reasons\\r\\n // AddConfig(configIds.DeviceConfig.BraceletPW, BraceletPW);//this to return the value\\r\\n // }\\r\\n // }\\r\\n // else {\\r\\n // //return error\\r\\n // }\\r\\n //AddValue(\\\"password\\\", \\\"myNewPassword\\\");\\r\\n //LookupValue(params.ble_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n LookupValue(params.bracelet_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n break;\\r\\n case (\\\"REGISTER\\\"):\\r\\n let ble_mac = params.ble_mac;\\r\\n let iccid = params.iccid;\\r\\n // write values to readonly settings\\r\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\r\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\r\\n // will automtaically Activate on Acceptance\\r\\n if (serverParams.EnvName) {\\r\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\r\\n }\\r\\n }\\r\\n break;\\r\\n case (\\\"CREATE\\\"):\\r\\n // temp fix to filter old messages\\r\\n // const cutoff = 1707523200000; //10.2.2024\\r\\n // let message_id_time = parseInt(params.count_number, 36);\\r\\n // if (message_id_time > cutoff){\\r\\n let c_ble_mac = params.ble_mac;\\r\\n let c_iccid = params.iccid;\\r\\n let new_imei = params.new_imei;\\r\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\r\\n // sendMessageToLocalhost(c_message); \\r\\n tasks = [{\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"sync\\\",\\r\\n \\\"type\\\": \\\"createDevice\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"imei\\\": new_imei,\\r\\n \\\"abortOnError\\\": false,\\r\\n \\\"init\\\": true\\r\\n }),\\r\\n \\\"order\\\": 1\\r\\n }, {\\r\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"async\\\",\\r\\n \\\"type\\\": \\\"sendMessage\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"message\\\": c_message\\r\\n }),\\r\\n \\\"order\\\": 2\\r\\n }]\\r\\n // }\\r\\n break;\\r\\n case (\\\"ALLDATA\\\"):\\r\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\r\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\r\\n let all_data = JSON.parse(json_str);\\r\\n if (\\\"version\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\r\\n };\\r\\n break;\\r\\n default:\\r\\n // all other general messages\\r\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\r\\n add_params_to_output();\\r\\n }\\r\\n // add messagetTypeLocal to output for templates\\r\\n AddValue('local_message_type', messageTypeLocalCode);\\r\\n }\\r\\n msg = {\\r\\n 'values': deviceParams,\\r\\n };\\r\\n\\r\\n function LookupValue(key, type, template) {\\r\\n var cvpair = {\\r\\n key: key, // key to be lookded up\\r\\n type: type, // type of the key\\r\\n template: template // the variable the result will be mapped to\\r\\n };\\r\\n msg.KeyValue = cvpair;\\r\\n }\\r\\n if (configsToSend.length > 0) {\\r\\n msg.configsToSend = configsToSend\\r\\n };\\r\\n if (tasks.length > 0) {\\r\\n msg.tasks = tasks\\r\\n };\\r\\n // commit values to receiver processor\\r\\n console.log(msg);\\r\\n // modify to return the object that contains your data\\r\\n return msg;\\r\\n\\r\\n function add_params_to_output() {\\r\\n if (!params.raw_accuracy) {\\r\\n AddValue('location_accuracy', 9000);\\r\\n } else {\\r\\n AddValue('location_accuracy', params.raw_accuracy);\\r\\n }\\r\\n // generate timestamps if they don't exist\\r\\n if (!params.event_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n if (!params.location_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n //if no lat and long are given, set them to 0, 0\\r\\n if (!params.latitude_raw) {\\r\\n AddValue('latitude', 0);\\r\\n } else {\\r\\n AddValue('latitude', params.latitude_raw);\\r\\n }\\r\\n if (!params.longitude_raw) {\\r\\n AddValue('longitude', 0);\\r\\n } else {\\r\\n AddValue('longitude', params.longitude_raw);\\r\\n }\\r\\n // if (params.temp_bracelet){\\r\\n // AddValue('oysta_labels', 'DegC');\\r\\n // AddValue('single_column_value', params.temp_bracelet);\\r\\n // }\\r\\n }\\r\\n\\r\\n function process_invent_msg() {\\r\\n const details = JSON.parse(raw);\\r\\n // AddValue('imei', details.AppId);\\r\\n AddValue('json_in', JSON.stringify(details));\\r\\n switch (details.Command) {\\r\\n case \\\"ACTIVATE_OK\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\r\\n break;\\r\\n case \\\"ACTIVATE_FAILS\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\r\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\r\\n break;\\r\\n case \\\"APPSET\\\":\\r\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\r\\n AddConfig(configIds.Password.Password, details.Data.Password);\\r\\n break;\\r\\n case \\\"CONFIG\\\":\\r\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\r\\n break;\\r\\n case \\\"CGFBR\\\":\\r\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\r\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\r\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\r\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\r\\n let commonParam = addEscapeChar(details.Data.ComPar);\\r\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\r\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\r\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\r\\n let lteParam = addEscapeChar(details.Data.LtePar);\\r\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\r\\n let bleParam = addEscapeChar(details.Data.BlePar);\\r\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\r\\n break;\\r\\n case \\\"REBOOTB\\\":\\r\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\r\\n break;\\r\\n case \\\"PWRFB\\\":\\r\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\r\\n break;\\r\\n case \\\"RESETB\\\":\\r\\n AddConfig(configIds.Bracelet.Reset, 'true');\\r\\n break;\\r\\n case \\\"BRAPWUPDATE\\\":\\r\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\r\\n // get password from old device, then set\\r\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\r\\n )\\r\\n break;\\r\\n case \\\"NOTE\\\":\\r\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\r\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\r\\n text = text.split(\\\",\\\").join(\\\" \\\");\\r\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\r\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\r\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\r\\n AddConfig(configIds.Note.Message, value)\\r\\n break;\\r\\n }\\r\\n }\\r\\n\\r\\n function addEscapeChar(json) {\\r\\n if (json === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n let jsonStr = JSON.stringify(json);\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\r\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function changeSingleQuoteToDouble(jsonStr) {\\r\\n if (jsonStr === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\r\\n outStr = outStr + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function sendMessageToLocalhost(str) {\\r\\n if (localTesting) {\\r\\n console.log(\\\"Sending message to local host: \\\" + str);\\r\\n } else {\\r\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\r\\n var c = createConnection(5878, server); // acceptance is 5678 - protocol dev 5878 - dev is 5679 ?\\r\\n c.write(`${str}`);\\r\\n c.end();\\r\\n }\\r\\n AddValue(\\\"ToLocalhost\\\", str);\\r\\n }\\r\\n\\r\\n function createConnection(port, server) {\\r\\n c = net.createConnection(port, server);\\r\\n c.on('error', function(error) {\\r\\n c = createConnection(port, server);\\r\\n });\\r\\n return c;\\r\\n }\\r\\n\\r\\n function decrypt(encdata, password) {\\r\\n var decrypted;\\r\\n var dataarray = encdata.split(\\\";\\\");\\r\\n if (dataarray.length > 5) {\\r\\n return \\\"\\\";\\r\\n }\\r\\n var i;\\r\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\r\\n if (encdata.startsWith(\\\"ACK\\\")) {\\r\\n return encdata;\\r\\n }\\r\\n for (i = 0; i < 3; i++) {\\r\\n part1 = part1 + dataarray[i] + \\\";\\\";\\r\\n }\\r\\n var mid = dataarray[2]; // use the message ID to create the salt\\r\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n // base64 decoding and extract the iv and encrypted data\\r\\n const bData = Buffer.from(enctext, 'base64');\\r\\n const iv = bData.slice(0, 16); // initial 16 chars\\r\\n const text = bData.slice(16); // all the encrypted data\\r\\n // derive key using; 32 byte key length (from salted password and mid)\\r\\n // decrypt the data in part2 and add to part1\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\r\\n try {\\r\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\r\\n } catch (err) {\\r\\n decrypted = undefined;\\r\\n }\\r\\n return decrypted;\\r\\n }\\r\\n\\r\\n function encrypt(text, mid, password) {\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n const iv = _crypto.randomBytes(16); // random initialization vector\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n // set the cipher\\r\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\r\\n // encrypt text\\r\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\r\\n // generate output ( encrypted text )\\r\\n return Buffer.concat([iv, encrypted]).toString('base64');\\r\\n }\\r\\n\\r\\n function AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n deviceParams.push(cvpair);\\r\\n }\\r\\n\\r\\n function AddConfig(configName, newvalue) {\\r\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n var cvpair = {\\r\\n 'code': configName,\\r\\n 'value': newvalue,\\r\\n 'forced': true\\r\\n };\\r\\n configsToSend.push(cvpair);\\r\\n };\\r\\n }\\r\\n\\r\\n function isASCII(str) {\\r\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\r\\n }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n module.exports = {\\r\\n execute_ops\\r\\n }\\r\\n} else { // on server use local defined vars\\r\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n // define global returns\\r\\n msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1744208228},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n // Define array to push device data into. This will be put into the msg array at the end.\\r\\n var deviceParams = [];\\r\\n var configsToSend = [];\\r\\n var tasks = [];\\r\\n const _crypto = require('crypto');\\r\\n // handle ACK\\r\\n if (messageTypeCode == \\\"ACK\\\") {\\r\\n return \\\"\\\";\\r\\n }\\r\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\r\\n var password;\\r\\n if (params.imei == \\\"null\\\") {\\r\\n return msg;\\r\\n }\\r\\n password = params.imei;\\r\\n if (configs.Password.Password === \\\"\\\") {\\r\\n // use imei as default password when not specified\\r\\n } else {\\r\\n // use the password\\r\\n password = configs.Password.Password\\r\\n }\\r\\n let message = decrypt(raw, password);\\r\\n if (message) {\\r\\n // send message internally\\r\\n sendMessageToLocalhost(message);\\r\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n } else {\\r\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n }\\r\\n } else { // General Oysta Template\\r\\n switch (messageTypeLocalCode) {\\r\\n case (\\\"COMM\\\"):\\r\\n process_invent_msg(); //incoming invent commands\\r\\n break;\\r\\n case (\\\"MACB\\\"):\\r\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\r\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\r\\n add_params_to_output();\\r\\n break;\\r\\n case \\\"INFO-GETPWB\\\": // handle GETPWB message\\r\\n //let imei = params.bracelet_imei; // not actually needed ?\\r\\n //let mac = params.BLEMAC; // not actually needed ?\\r\\n AddValue(\\\"mac\\\", params.bracelet_mac);\\r\\n //AddValue(\\\"key\\\", params.key);\\r\\n console.log(\\\"mac: \\\" + params.bracelet_mac);\\r\\n let BraceletPW = \\\"\\\"; // until we set it from query below\\r\\n // if(params.bracelet_imei){\\r\\n // if(serverParams.Password){\\r\\n // BraceletPW = serverParams.Password; // query key value table\\r\\n // console.log(BraceletPW); // print for testing reasons\\r\\n // AddConfig(configIds.DeviceConfig.BraceletPW, BraceletPW);//this to return the value\\r\\n // }\\r\\n // }\\r\\n // else {\\r\\n // //return error\\r\\n // }\\r\\n //AddValue(\\\"password\\\", \\\"myNewPassword\\\");\\r\\n //LookupValue(params.ble_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n LookupValue(params.bracelet_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n break;\\r\\n case (\\\"REGISTER\\\"):\\r\\n let ble_mac = params.ble_mac;\\r\\n let iccid = params.iccid;\\r\\n // write values to readonly settings\\r\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\r\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\r\\n // will automtaically Activate on Acceptance\\r\\n if (serverParams.EnvName) {\\r\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\r\\n }\\r\\n }\\r\\n break;\\r\\n case (\\\"CREATE\\\"):\\r\\n // temp fix to filter old messages\\r\\n // const cutoff = 1707523200000; //10.2.2024\\r\\n // let message_id_time = parseInt(params.count_number, 36);\\r\\n // if (message_id_time > cutoff){\\r\\n let c_ble_mac = params.ble_mac;\\r\\n let c_iccid = params.iccid;\\r\\n let new_imei = params.new_imei;\\r\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\r\\n // sendMessageToLocalhost(c_message); \\r\\n tasks = [{\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"sync\\\",\\r\\n \\\"type\\\": \\\"createDevice\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"imei\\\": new_imei,\\r\\n \\\"abortOnError\\\": false,\\r\\n \\\"init\\\": true\\r\\n }),\\r\\n \\\"order\\\": 1\\r\\n }, {\\r\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"async\\\",\\r\\n \\\"type\\\": \\\"sendMessage\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"message\\\": c_message\\r\\n }),\\r\\n \\\"order\\\": 2\\r\\n }]\\r\\n // }\\r\\n break;\\r\\n case (\\\"ALLDATA\\\"):\\r\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\r\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\r\\n let all_data = JSON.parse(json_str);\\r\\n if (\\\"version\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\r\\n };\\r\\n break;\\r\\n default:\\r\\n // all other general messages\\r\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\r\\n add_params_to_output();\\r\\n }\\r\\n // add messagetTypeLocal to output for templates\\r\\n AddValue('local_message_type', messageTypeLocalCode);\\r\\n }\\r\\n var msg = {\\r\\n 'values': deviceParams,\\r\\n };\\r\\n if (configsToSend.length > 0) {\\r\\n msg.configsToSend = configsToSend\\r\\n };\\r\\n if (tasks.length > 0) {\\r\\n msg.tasks = tasks\\r\\n };\\r\\n // commit values to receiver processor\\r\\n console.log(msg);\\r\\n // modify to return the object that contains your data\\r\\n return msg;\\r\\n\\r\\n function add_params_to_output() {\\r\\n if (!params.raw_accuracy) {\\r\\n AddValue('location_accuracy', 9000);\\r\\n } else {\\r\\n AddValue('location_accuracy', params.raw_accuracy);\\r\\n }\\r\\n // generate timestamps if they don't exist\\r\\n if (!params.event_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n if (!params.location_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n //if no lat and long are given, set them to 0, 0\\r\\n if (!params.latitude_raw) {\\r\\n AddValue('latitude', 0);\\r\\n } else {\\r\\n AddValue('latitude', params.latitude_raw);\\r\\n }\\r\\n if (!params.longitude_raw) {\\r\\n AddValue('longitude', 0);\\r\\n } else {\\r\\n AddValue('longitude', params.longitude_raw);\\r\\n }\\r\\n // if (params.temp_bracelet){\\r\\n // AddValue('oysta_labels', 'DegC');\\r\\n // AddValue('single_column_value', params.temp_bracelet);\\r\\n // }\\r\\n }\\r\\n\\r\\n function process_invent_msg() {\\r\\n const details = JSON.parse(raw);\\r\\n // AddValue('imei', details.AppId);\\r\\n AddValue('json_in', JSON.stringify(details));\\r\\n switch (details.Command) {\\r\\n case \\\"ACTIVATE_OK\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\r\\n break;\\r\\n case \\\"ACTIVATE_FAILS\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\r\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\r\\n break;\\r\\n case \\\"APPSET\\\":\\r\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\r\\n AddConfig(configIds.Password.Password, details.Data.Password);\\r\\n break;\\r\\n case \\\"CONFIG\\\":\\r\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\r\\n break;\\r\\n case \\\"CGFBR\\\":\\r\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\r\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\r\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\r\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\r\\n let commonParam = addEscapeChar(details.Data.ComPar);\\r\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\r\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\r\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\r\\n let lteParam = addEscapeChar(details.Data.LtePar);\\r\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\r\\n let bleParam = addEscapeChar(details.Data.BlePar);\\r\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\r\\n break;\\r\\n case \\\"REBOOTB\\\":\\r\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\r\\n break;\\r\\n case \\\"PWRFB\\\":\\r\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\r\\n break;\\r\\n case \\\"RESETB\\\":\\r\\n AddConfig(configIds.Bracelet.Reset, 'true');\\r\\n break;\\r\\n case \\\"BRAPWUPDATE\\\":\\r\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\r\\n // get password from old device, then set\\r\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\r\\n )\\r\\n break;\\r\\n case \\\"NOTE\\\":\\r\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\r\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\r\\n text = text.split(\\\",\\\").join(\\\" \\\");\\r\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\r\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\r\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\r\\n AddConfig(configIds.Note.Message, value)\\r\\n break;\\r\\n }\\r\\n }\\r\\n\\r\\n function addEscapeChar(json) {\\r\\n if (json === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n let jsonStr = JSON.stringify(json);\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\r\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function changeSingleQuoteToDouble(jsonStr) {\\r\\n if (jsonStr === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\r\\n outStr = outStr + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function sendMessageToLocalhost(str) {\\r\\n if (localTesting) {\\r\\n console.log(\\\"Sending message to local host: \\\" + str);\\r\\n } else {\\r\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\r\\n var c = createConnection(5878, server); // acceptance is 5678 - protocol dev 5878 - dev is 5679 ?\\r\\n c.write(`${str}`);\\r\\n c.end();\\r\\n }\\r\\n AddValue(\\\"ToLocalhost\\\", str);\\r\\n }\\r\\n\\r\\n function createConnection(port, server) {\\r\\n c = net.createConnection(port, server);\\r\\n c.on('error', function(error) {\\r\\n c = createConnection(port, server);\\r\\n });\\r\\n return c;\\r\\n }\\r\\n\\r\\n function decrypt(encdata, password) {\\r\\n var decrypted;\\r\\n var dataarray = encdata.split(\\\";\\\");\\r\\n if (dataarray.length > 5) {\\r\\n return \\\"\\\";\\r\\n }\\r\\n var i;\\r\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\r\\n if (encdata.startsWith(\\\"ACK\\\")) {\\r\\n return encdata;\\r\\n }\\r\\n for (i = 0; i < 3; i++) {\\r\\n part1 = part1 + dataarray[i] + \\\";\\\";\\r\\n }\\r\\n var mid = dataarray[2]; // use the message ID to create the salt\\r\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n // base64 decoding and extract the iv and encrypted data\\r\\n const bData = Buffer.from(enctext, 'base64');\\r\\n const iv = bData.slice(0, 16); // initial 16 chars\\r\\n const text = bData.slice(16); // all the encrypted data\\r\\n // derive key using; 32 byte key length (from salted password and mid)\\r\\n // decrypt the data in part2 and add to part1\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\r\\n try {\\r\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\r\\n } catch (err) {\\r\\n decrypted = undefined;\\r\\n }\\r\\n return decrypted;\\r\\n }\\r\\n\\r\\n function encrypt(text, mid, password) {\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n const iv = _crypto.randomBytes(16); // random initialization vector\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n // set the cipher\\r\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\r\\n // encrypt text\\r\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\r\\n // generate output ( encrypted text )\\r\\n return Buffer.concat([iv, encrypted]).toString('base64');\\r\\n }\\r\\n\\r\\n function AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n deviceParams.push(cvpair);\\r\\n }\\r\\n\\r\\n function AddConfig(configName, newvalue) {\\r\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n var cvpair = {\\r\\n 'code': configName,\\r\\n 'value': newvalue,\\r\\n 'forced': true\\r\\n };\\r\\n configsToSend.push(cvpair);\\r\\n };\\r\\n }\\r\\n\\r\\n function isASCII(str) {\\r\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\r\\n }\\r\\n\\r\\n function LookupValue(key, type, template) {\\r\\n var cvpair = {\\r\\n key: key, // key to be lookded up\\r\\n type: type, // type of the key\\r\\n template: template // the variable the result will be mapped to\\r\\n };\\r\\n msg.KeyValue = cvpair;\\r\\n }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n module.exports = {\\r\\n execute_ops\\r\\n }\\r\\n} else { // on server use local defined vars\\r\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n // define global returns\\r\\n msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1744208434},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n // Define array to push device data into. This will be put into the msg array at the end.\\r\\n var deviceParams = [];\\r\\n var configsToSend = [];\\r\\n var tasks = [];\\r\\n const _crypto = require('crypto');\\r\\n // handle ACK\\r\\n if (messageTypeCode == \\\"ACK\\\") {\\r\\n return \\\"\\\";\\r\\n }\\r\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\r\\n var password;\\r\\n if (params.imei == \\\"null\\\") {\\r\\n return msg;\\r\\n }\\r\\n password = params.imei;\\r\\n if (configs.Password.Password === \\\"\\\") {\\r\\n // use imei as default password when not specified\\r\\n } else {\\r\\n // use the password\\r\\n password = configs.Password.Password\\r\\n }\\r\\n let message = decrypt(raw, password);\\r\\n if (message) {\\r\\n // send message internally\\r\\n sendMessageToLocalhost(message);\\r\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n } else {\\r\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n }\\r\\n } else { // General Oysta Template\\r\\n switch (messageTypeLocalCode) {\\r\\n case (\\\"COMM\\\"):\\r\\n process_invent_msg(); //incoming invent commands\\r\\n break;\\r\\n case (\\\"MACB\\\"):\\r\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\r\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\r\\n add_params_to_output();\\r\\n break;\\r\\n case \\\"INFO-GETPWB\\\": // handle GETPWB message\\r\\n //let imei = params.bracelet_imei; // not actually needed ?\\r\\n //let mac = params.BLEMAC; // not actually needed ?\\r\\n //AddValue(\\\"mac\\\", params.bracelet_mac);\\r\\n //AddValue(\\\"key\\\", params.key);\\r\\n //console.log(\\\"mac: \\\" + params.bracelet_mac);\\r\\n //let BraceletPW = \\\"\\\"; // until we set it from query below\\r\\n // if(params.bracelet_imei){\\r\\n // if(serverParams.Password){\\r\\n // BraceletPW = serverParams.Password; // query key value table\\r\\n // console.log(BraceletPW); // print for testing reasons\\r\\n // AddConfig(configIds.DeviceConfig.BraceletPW, BraceletPW);//this to return the value\\r\\n // }\\r\\n // }\\r\\n // else {\\r\\n // //return error\\r\\n // }\\r\\n //AddValue(\\\"password\\\", \\\"myNewPassword\\\");\\r\\n //LookupValue(params.ble_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n LookupValue(params.bracelet_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n break;\\r\\n case (\\\"REGISTER\\\"):\\r\\n let ble_mac = params.ble_mac;\\r\\n let iccid = params.iccid;\\r\\n // write values to readonly settings\\r\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\r\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\r\\n // will automtaically Activate on Acceptance\\r\\n if (serverParams.EnvName) {\\r\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\r\\n }\\r\\n }\\r\\n break;\\r\\n case (\\\"CREATE\\\"):\\r\\n // temp fix to filter old messages\\r\\n // const cutoff = 1707523200000; //10.2.2024\\r\\n // let message_id_time = parseInt(params.count_number, 36);\\r\\n // if (message_id_time > cutoff){\\r\\n let c_ble_mac = params.ble_mac;\\r\\n let c_iccid = params.iccid;\\r\\n let new_imei = params.new_imei;\\r\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\r\\n // sendMessageToLocalhost(c_message); \\r\\n tasks = [{\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"sync\\\",\\r\\n \\\"type\\\": \\\"createDevice\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"imei\\\": new_imei,\\r\\n \\\"abortOnError\\\": false,\\r\\n \\\"init\\\": true\\r\\n }),\\r\\n \\\"order\\\": 1\\r\\n }, {\\r\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"async\\\",\\r\\n \\\"type\\\": \\\"sendMessage\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"message\\\": c_message\\r\\n }),\\r\\n \\\"order\\\": 2\\r\\n }]\\r\\n // }\\r\\n break;\\r\\n case (\\\"ALLDATA\\\"):\\r\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\r\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\r\\n let all_data = JSON.parse(json_str);\\r\\n if (\\\"version\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\r\\n };\\r\\n break;\\r\\n default:\\r\\n // all other general messages\\r\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\r\\n add_params_to_output();\\r\\n }\\r\\n // add messagetTypeLocal to output for templates\\r\\n AddValue('local_message_type', messageTypeLocalCode);\\r\\n }\\r\\n //var msg = {\\r\\n // 'values': deviceParams,\\r\\n //};\\r\\n if (configsToSend.length > 0) {\\r\\n msg.configsToSend = configsToSend\\r\\n };\\r\\n if (tasks.length > 0) {\\r\\n msg.tasks = tasks\\r\\n };\\r\\n // commit values to receiver processor\\r\\n console.log(msg);\\r\\n // modify to return the object that contains your data\\r\\n return msg;\\r\\n\\r\\n function add_params_to_output() {\\r\\n if (!params.raw_accuracy) {\\r\\n AddValue('location_accuracy', 9000);\\r\\n } else {\\r\\n AddValue('location_accuracy', params.raw_accuracy);\\r\\n }\\r\\n // generate timestamps if they don't exist\\r\\n if (!params.event_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n if (!params.location_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n //if no lat and long are given, set them to 0, 0\\r\\n if (!params.latitude_raw) {\\r\\n AddValue('latitude', 0);\\r\\n } else {\\r\\n AddValue('latitude', params.latitude_raw);\\r\\n }\\r\\n if (!params.longitude_raw) {\\r\\n AddValue('longitude', 0);\\r\\n } else {\\r\\n AddValue('longitude', params.longitude_raw);\\r\\n }\\r\\n // if (params.temp_bracelet){\\r\\n // AddValue('oysta_labels', 'DegC');\\r\\n // AddValue('single_column_value', params.temp_bracelet);\\r\\n // }\\r\\n }\\r\\n\\r\\n function process_invent_msg() {\\r\\n const details = JSON.parse(raw);\\r\\n // AddValue('imei', details.AppId);\\r\\n AddValue('json_in', JSON.stringify(details));\\r\\n switch (details.Command) {\\r\\n case \\\"ACTIVATE_OK\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\r\\n break;\\r\\n case \\\"ACTIVATE_FAILS\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\r\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\r\\n break;\\r\\n case \\\"APPSET\\\":\\r\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\r\\n AddConfig(configIds.Password.Password, details.Data.Password);\\r\\n break;\\r\\n case \\\"CONFIG\\\":\\r\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\r\\n break;\\r\\n case \\\"CGFBR\\\":\\r\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\r\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\r\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\r\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\r\\n let commonParam = addEscapeChar(details.Data.ComPar);\\r\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\r\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\r\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\r\\n let lteParam = addEscapeChar(details.Data.LtePar);\\r\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\r\\n let bleParam = addEscapeChar(details.Data.BlePar);\\r\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\r\\n break;\\r\\n case \\\"REBOOTB\\\":\\r\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\r\\n break;\\r\\n case \\\"PWRFB\\\":\\r\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\r\\n break;\\r\\n case \\\"RESETB\\\":\\r\\n AddConfig(configIds.Bracelet.Reset, 'true');\\r\\n break;\\r\\n case \\\"BRAPWUPDATE\\\":\\r\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\r\\n // get password from old device, then set\\r\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\r\\n )\\r\\n break;\\r\\n case \\\"NOTE\\\":\\r\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\r\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\r\\n text = text.split(\\\",\\\").join(\\\" \\\");\\r\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\r\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\r\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\r\\n AddConfig(configIds.Note.Message, value)\\r\\n break;\\r\\n }\\r\\n }\\r\\n\\r\\n function addEscapeChar(json) {\\r\\n if (json === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n let jsonStr = JSON.stringify(json);\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\r\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function changeSingleQuoteToDouble(jsonStr) {\\r\\n if (jsonStr === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\r\\n outStr = outStr + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function sendMessageToLocalhost(str) {\\r\\n if (localTesting) {\\r\\n console.log(\\\"Sending message to local host: \\\" + str);\\r\\n } else {\\r\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\r\\n var c = createConnection(5878, server); // acceptance is 5678 - protocol dev 5878 - dev is 5679 ?\\r\\n c.write(`${str}`);\\r\\n c.end();\\r\\n }\\r\\n AddValue(\\\"ToLocalhost\\\", str);\\r\\n }\\r\\n\\r\\n function createConnection(port, server) {\\r\\n c = net.createConnection(port, server);\\r\\n c.on('error', function(error) {\\r\\n c = createConnection(port, server);\\r\\n });\\r\\n return c;\\r\\n }\\r\\n\\r\\n function decrypt(encdata, password) {\\r\\n var decrypted;\\r\\n var dataarray = encdata.split(\\\";\\\");\\r\\n if (dataarray.length > 5) {\\r\\n return \\\"\\\";\\r\\n }\\r\\n var i;\\r\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\r\\n if (encdata.startsWith(\\\"ACK\\\")) {\\r\\n return encdata;\\r\\n }\\r\\n for (i = 0; i < 3; i++) {\\r\\n part1 = part1 + dataarray[i] + \\\";\\\";\\r\\n }\\r\\n var mid = dataarray[2]; // use the message ID to create the salt\\r\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n // base64 decoding and extract the iv and encrypted data\\r\\n const bData = Buffer.from(enctext, 'base64');\\r\\n const iv = bData.slice(0, 16); // initial 16 chars\\r\\n const text = bData.slice(16); // all the encrypted data\\r\\n // derive key using; 32 byte key length (from salted password and mid)\\r\\n // decrypt the data in part2 and add to part1\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\r\\n try {\\r\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\r\\n } catch (err) {\\r\\n decrypted = undefined;\\r\\n }\\r\\n return decrypted;\\r\\n }\\r\\n\\r\\n function encrypt(text, mid, password) {\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n const iv = _crypto.randomBytes(16); // random initialization vector\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n // set the cipher\\r\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\r\\n // encrypt text\\r\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\r\\n // generate output ( encrypted text )\\r\\n return Buffer.concat([iv, encrypted]).toString('base64');\\r\\n }\\r\\n\\r\\n function AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n deviceParams.push(cvpair);\\r\\n }\\r\\n\\r\\n function AddConfig(configName, newvalue) {\\r\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n var cvpair = {\\r\\n 'code': configName,\\r\\n 'value': newvalue,\\r\\n 'forced': true\\r\\n };\\r\\n configsToSend.push(cvpair);\\r\\n };\\r\\n }\\r\\n\\r\\n function isASCII(str) {\\r\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\r\\n }\\r\\n\\r\\n function LookupValue(key, type, template) {\\r\\n var cvpair = {\\r\\n key: key, // key to be lookded up\\r\\n type: type, // type of the key\\r\\n template: template // the variable the result will be mapped to\\r\\n };\\r\\n msg.KeyValue = cvpair;\\r\\n }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n module.exports = {\\r\\n execute_ops\\r\\n }\\r\\n} else { // on server use local defined vars\\r\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n // define global returns\\r\\n msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1744208682},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n // Define array to push device data into. This will be put into the msg array at the end.\\r\\n var deviceParams = [];\\r\\n var configsToSend = [];\\r\\n var tasks = [];\\r\\n const _crypto = require('crypto');\\r\\n // handle ACK\\r\\n if (messageTypeCode == \\\"ACK\\\") {\\r\\n return \\\"\\\";\\r\\n }\\r\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\r\\n var password;\\r\\n if (params.imei == \\\"null\\\") {\\r\\n return msg;\\r\\n }\\r\\n password = params.imei;\\r\\n if (configs.Password.Password === \\\"\\\") {\\r\\n // use imei as default password when not specified\\r\\n } else {\\r\\n // use the password\\r\\n password = configs.Password.Password\\r\\n }\\r\\n let message = decrypt(raw, password);\\r\\n if (message) {\\r\\n // send message internally\\r\\n sendMessageToLocalhost(message);\\r\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n } else {\\r\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n }\\r\\n } else { // General Oysta Template\\r\\n switch (messageTypeLocalCode) {\\r\\n case (\\\"COMM\\\"):\\r\\n process_invent_msg(); //incoming invent commands\\r\\n break;\\r\\n case (\\\"MACB\\\"):\\r\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\r\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\r\\n add_params_to_output();\\r\\n break;\\r\\n case \\\"INFO-GETPWB\\\": // handle GETPWB message\\r\\n //let imei = params.bracelet_imei; // not actually needed ?\\r\\n //let mac = params.BLEMAC; // not actually needed ?\\r\\n //AddValue(\\\"mac\\\", params.bracelet_mac);\\r\\n //AddValue(\\\"key\\\", params.key);\\r\\n //console.log(\\\"mac: \\\" + params.bracelet_mac);\\r\\n //let BraceletPW = \\\"\\\"; // until we set it from query below\\r\\n // if(params.bracelet_imei){\\r\\n // if(serverParams.Password){\\r\\n // BraceletPW = serverParams.Password; // query key value table\\r\\n // console.log(BraceletPW); // print for testing reasons\\r\\n // AddConfig(configIds.DeviceConfig.BraceletPW, BraceletPW);//this to return the value\\r\\n // }\\r\\n // }\\r\\n // else {\\r\\n // //return error\\r\\n // }\\r\\n //AddValue(\\\"password\\\", \\\"myNewPassword\\\");\\r\\n //LookupValue(params.ble_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n LookupValue(params.bracelet_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n break;\\r\\n case (\\\"REGISTER\\\"):\\r\\n let ble_mac = params.ble_mac;\\r\\n let iccid = params.iccid;\\r\\n // write values to readonly settings\\r\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\r\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\r\\n // will automtaically Activate on Acceptance\\r\\n if (serverParams.EnvName) {\\r\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\r\\n }\\r\\n }\\r\\n break;\\r\\n case (\\\"CREATE\\\"):\\r\\n // temp fix to filter old messages\\r\\n // const cutoff = 1707523200000; //10.2.2024\\r\\n // let message_id_time = parseInt(params.count_number, 36);\\r\\n // if (message_id_time > cutoff){\\r\\n let c_ble_mac = params.ble_mac;\\r\\n let c_iccid = params.iccid;\\r\\n let new_imei = params.new_imei;\\r\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\r\\n // sendMessageToLocalhost(c_message); \\r\\n tasks = [{\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"sync\\\",\\r\\n \\\"type\\\": \\\"createDevice\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"imei\\\": new_imei,\\r\\n \\\"abortOnError\\\": false,\\r\\n \\\"init\\\": true\\r\\n }),\\r\\n \\\"order\\\": 1\\r\\n }, {\\r\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"async\\\",\\r\\n \\\"type\\\": \\\"sendMessage\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"message\\\": c_message\\r\\n }),\\r\\n \\\"order\\\": 2\\r\\n }]\\r\\n // }\\r\\n break;\\r\\n case (\\\"ALLDATA\\\"):\\r\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\r\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\r\\n let all_data = JSON.parse(json_str);\\r\\n if (\\\"version\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\r\\n };\\r\\n break;\\r\\n default:\\r\\n // all other general messages\\r\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\r\\n add_params_to_output();\\r\\n }\\r\\n // add messagetTypeLocal to output for templates\\r\\n AddValue('local_message_type', messageTypeLocalCode);\\r\\n }\\r\\n var msg = {\\r\\n 'values': deviceParams,\\r\\n };\\r\\n if (configsToSend.length > 0) {\\r\\n msg.configsToSend = configsToSend\\r\\n };\\r\\n if (tasks.length > 0) {\\r\\n msg.tasks = tasks\\r\\n };\\r\\n // commit values to receiver processor\\r\\n console.log(msg);\\r\\n // modify to return the object that contains your data\\r\\n return msg;\\r\\n\\r\\n function add_params_to_output() {\\r\\n if (!params.raw_accuracy) {\\r\\n AddValue('location_accuracy', 9000);\\r\\n } else {\\r\\n AddValue('location_accuracy', params.raw_accuracy);\\r\\n }\\r\\n // generate timestamps if they don't exist\\r\\n if (!params.event_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n if (!params.location_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n //if no lat and long are given, set them to 0, 0\\r\\n if (!params.latitude_raw) {\\r\\n AddValue('latitude', 0);\\r\\n } else {\\r\\n AddValue('latitude', params.latitude_raw);\\r\\n }\\r\\n if (!params.longitude_raw) {\\r\\n AddValue('longitude', 0);\\r\\n } else {\\r\\n AddValue('longitude', params.longitude_raw);\\r\\n }\\r\\n // if (params.temp_bracelet){\\r\\n // AddValue('oysta_labels', 'DegC');\\r\\n // AddValue('single_column_value', params.temp_bracelet);\\r\\n // }\\r\\n }\\r\\n\\r\\n function process_invent_msg() {\\r\\n const details = JSON.parse(raw);\\r\\n // AddValue('imei', details.AppId);\\r\\n AddValue('json_in', JSON.stringify(details));\\r\\n switch (details.Command) {\\r\\n case \\\"ACTIVATE_OK\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\r\\n break;\\r\\n case \\\"ACTIVATE_FAILS\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\r\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\r\\n break;\\r\\n case \\\"APPSET\\\":\\r\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\r\\n AddConfig(configIds.Password.Password, details.Data.Password);\\r\\n break;\\r\\n case \\\"CONFIG\\\":\\r\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\r\\n break;\\r\\n case \\\"CGFBR\\\":\\r\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\r\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\r\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\r\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\r\\n let commonParam = addEscapeChar(details.Data.ComPar);\\r\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\r\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\r\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\r\\n let lteParam = addEscapeChar(details.Data.LtePar);\\r\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\r\\n let bleParam = addEscapeChar(details.Data.BlePar);\\r\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\r\\n break;\\r\\n case \\\"REBOOTB\\\":\\r\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\r\\n break;\\r\\n case \\\"PWRFB\\\":\\r\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\r\\n break;\\r\\n case \\\"RESETB\\\":\\r\\n AddConfig(configIds.Bracelet.Reset, 'true');\\r\\n break;\\r\\n case \\\"BRAPWUPDATE\\\":\\r\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\r\\n // get password from old device, then set\\r\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\r\\n )\\r\\n break;\\r\\n case \\\"NOTE\\\":\\r\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\r\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\r\\n text = text.split(\\\",\\\").join(\\\" \\\");\\r\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\r\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\r\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\r\\n AddConfig(configIds.Note.Message, value)\\r\\n break;\\r\\n }\\r\\n }\\r\\n\\r\\n function addEscapeChar(json) {\\r\\n if (json === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n let jsonStr = JSON.stringify(json);\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\r\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function changeSingleQuoteToDouble(jsonStr) {\\r\\n if (jsonStr === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\r\\n outStr = outStr + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function sendMessageToLocalhost(str) {\\r\\n if (localTesting) {\\r\\n console.log(\\\"Sending message to local host: \\\" + str);\\r\\n } else {\\r\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\r\\n var c = createConnection(5878, server); // acceptance is 5678 - protocol dev 5878 - dev is 5679 ?\\r\\n c.write(`${str}`);\\r\\n c.end();\\r\\n }\\r\\n AddValue(\\\"ToLocalhost\\\", str);\\r\\n }\\r\\n\\r\\n function createConnection(port, server) {\\r\\n c = net.createConnection(port, server);\\r\\n c.on('error', function(error) {\\r\\n c = createConnection(port, server);\\r\\n });\\r\\n return c;\\r\\n }\\r\\n\\r\\n function decrypt(encdata, password) {\\r\\n var decrypted;\\r\\n var dataarray = encdata.split(\\\";\\\");\\r\\n if (dataarray.length > 5) {\\r\\n return \\\"\\\";\\r\\n }\\r\\n var i;\\r\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\r\\n if (encdata.startsWith(\\\"ACK\\\")) {\\r\\n return encdata;\\r\\n }\\r\\n for (i = 0; i < 3; i++) {\\r\\n part1 = part1 + dataarray[i] + \\\";\\\";\\r\\n }\\r\\n var mid = dataarray[2]; // use the message ID to create the salt\\r\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n // base64 decoding and extract the iv and encrypted data\\r\\n const bData = Buffer.from(enctext, 'base64');\\r\\n const iv = bData.slice(0, 16); // initial 16 chars\\r\\n const text = bData.slice(16); // all the encrypted data\\r\\n // derive key using; 32 byte key length (from salted password and mid)\\r\\n // decrypt the data in part2 and add to part1\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\r\\n try {\\r\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\r\\n } catch (err) {\\r\\n decrypted = undefined;\\r\\n }\\r\\n return decrypted;\\r\\n }\\r\\n\\r\\n function encrypt(text, mid, password) {\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n const iv = _crypto.randomBytes(16); // random initialization vector\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n // set the cipher\\r\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\r\\n // encrypt text\\r\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\r\\n // generate output ( encrypted text )\\r\\n return Buffer.concat([iv, encrypted]).toString('base64');\\r\\n }\\r\\n\\r\\n function AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n deviceParams.push(cvpair);\\r\\n }\\r\\n\\r\\n function AddConfig(configName, newvalue) {\\r\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n var cvpair = {\\r\\n 'code': configName,\\r\\n 'value': newvalue,\\r\\n 'forced': true\\r\\n };\\r\\n configsToSend.push(cvpair);\\r\\n };\\r\\n }\\r\\n\\r\\n function isASCII(str) {\\r\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\r\\n }\\r\\n\\r\\n function LookupValue(key, type, template) {\\r\\n var cvpair = {\\r\\n key: key, // key to be lookded up\\r\\n type: type, // type of the key\\r\\n template: template // the variable the result will be mapped to\\r\\n };\\r\\n msg.KeyValue = cvpair;\\r\\n }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n module.exports = {\\r\\n execute_ops\\r\\n }\\r\\n} else { // on server use local defined vars\\r\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n // define global returns\\r\\n msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1744208780},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n // Define array to push device data into. This will be put into the msg array at the end.\\r\\n var deviceParams = [];\\r\\n var configsToSend = [];\\r\\n var tasks = [];\\r\\n const _crypto = require('crypto');\\r\\n // handle ACK\\r\\n if (messageTypeCode == \\\"ACK\\\") {\\r\\n return \\\"\\\";\\r\\n }\\r\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\r\\n var password;\\r\\n if (params.imei == \\\"null\\\") {\\r\\n return msg;\\r\\n }\\r\\n password = params.imei;\\r\\n if (configs.Password.Password === \\\"\\\") {\\r\\n // use imei as default password when not specified\\r\\n } else {\\r\\n // use the password\\r\\n password = configs.Password.Password\\r\\n }\\r\\n let message = decrypt(raw, password);\\r\\n if (message) {\\r\\n // send message internally\\r\\n sendMessageToLocalhost(message);\\r\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n } else {\\r\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n }\\r\\n } else { // General Oysta Template\\r\\n switch (messageTypeLocalCode) {\\r\\n case (\\\"COMM\\\"):\\r\\n process_invent_msg(); //incoming invent commands\\r\\n break;\\r\\n case (\\\"MACB\\\"):\\r\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\r\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\r\\n add_params_to_output();\\r\\n break;\\r\\n case \\\"INFO-GETPWB\\\": // handle GETPWB message\\r\\n //let imei = params.bracelet_imei; // not actually needed ?\\r\\n //let mac = params.BLEMAC; // not actually needed ?\\r\\n //AddValue(\\\"mac\\\", params.bracelet_mac);\\r\\n //AddValue(\\\"key\\\", params.key);\\r\\n //console.log(\\\"mac: \\\" + params.bracelet_mac);\\r\\n //let BraceletPW = \\\"\\\"; // until we set it from query below\\r\\n // if(params.bracelet_imei){\\r\\n // if(serverParams.Password){\\r\\n // BraceletPW = serverParams.Password; // query key value table\\r\\n // console.log(BraceletPW); // print for testing reasons\\r\\n // AddConfig(configIds.DeviceConfig.BraceletPW, BraceletPW);//this to return the value\\r\\n // }\\r\\n // }\\r\\n // else {\\r\\n // //return error\\r\\n // }\\r\\n //AddValue(\\\"password\\\", \\\"myNewPassword\\\");\\r\\n //LookupValue(params.ble_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n LookupValue(params.bracelet_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n break;\\r\\n case (\\\"REGISTER\\\"):\\r\\n let ble_mac = params.ble_mac;\\r\\n let iccid = params.iccid;\\r\\n // write values to readonly settings\\r\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\r\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\r\\n // will automtaically Activate on Acceptance\\r\\n if (serverParams.EnvName) {\\r\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\r\\n }\\r\\n }\\r\\n break;\\r\\n case (\\\"CREATE\\\"):\\r\\n // temp fix to filter old messages\\r\\n // const cutoff = 1707523200000; //10.2.2024\\r\\n // let message_id_time = parseInt(params.count_number, 36);\\r\\n // if (message_id_time > cutoff){\\r\\n let c_ble_mac = params.ble_mac;\\r\\n let c_iccid = params.iccid;\\r\\n let new_imei = params.new_imei;\\r\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\r\\n // sendMessageToLocalhost(c_message); \\r\\n tasks = [{\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"sync\\\",\\r\\n \\\"type\\\": \\\"createDevice\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"imei\\\": new_imei,\\r\\n \\\"abortOnError\\\": false,\\r\\n \\\"init\\\": true\\r\\n }),\\r\\n \\\"order\\\": 1\\r\\n }, {\\r\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"async\\\",\\r\\n \\\"type\\\": \\\"sendMessage\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"message\\\": c_message\\r\\n }),\\r\\n \\\"order\\\": 2\\r\\n }]\\r\\n // }\\r\\n break;\\r\\n case (\\\"ALLDATA\\\"):\\r\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\r\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\r\\n let all_data = JSON.parse(json_str);\\r\\n if (\\\"version\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\r\\n };\\r\\n break;\\r\\n default:\\r\\n // all other general messages\\r\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\r\\n add_params_to_output();\\r\\n }\\r\\n // add messagetTypeLocal to output for templates\\r\\n AddValue('local_message_type', messageTypeLocalCode);\\r\\n }\\r\\n msg = {\\r\\n 'values': deviceParams,\\r\\n };\\r\\n if (configsToSend.length > 0) {\\r\\n msg.configsToSend = configsToSend\\r\\n };\\r\\n if (tasks.length > 0) {\\r\\n msg.tasks = tasks\\r\\n };\\r\\n // commit values to receiver processor\\r\\n console.log(msg);\\r\\n // modify to return the object that contains your data\\r\\n return msg;\\r\\n\\r\\n function add_params_to_output() {\\r\\n if (!params.raw_accuracy) {\\r\\n AddValue('location_accuracy', 9000);\\r\\n } else {\\r\\n AddValue('location_accuracy', params.raw_accuracy);\\r\\n }\\r\\n // generate timestamps if they don't exist\\r\\n if (!params.event_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n if (!params.location_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n //if no lat and long are given, set them to 0, 0\\r\\n if (!params.latitude_raw) {\\r\\n AddValue('latitude', 0);\\r\\n } else {\\r\\n AddValue('latitude', params.latitude_raw);\\r\\n }\\r\\n if (!params.longitude_raw) {\\r\\n AddValue('longitude', 0);\\r\\n } else {\\r\\n AddValue('longitude', params.longitude_raw);\\r\\n }\\r\\n // if (params.temp_bracelet){\\r\\n // AddValue('oysta_labels', 'DegC');\\r\\n // AddValue('single_column_value', params.temp_bracelet);\\r\\n // }\\r\\n }\\r\\n\\r\\n function process_invent_msg() {\\r\\n const details = JSON.parse(raw);\\r\\n // AddValue('imei', details.AppId);\\r\\n AddValue('json_in', JSON.stringify(details));\\r\\n switch (details.Command) {\\r\\n case \\\"ACTIVATE_OK\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\r\\n break;\\r\\n case \\\"ACTIVATE_FAILS\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\r\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\r\\n break;\\r\\n case \\\"APPSET\\\":\\r\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\r\\n AddConfig(configIds.Password.Password, details.Data.Password);\\r\\n break;\\r\\n case \\\"CONFIG\\\":\\r\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\r\\n break;\\r\\n case \\\"CGFBR\\\":\\r\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\r\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\r\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\r\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\r\\n let commonParam = addEscapeChar(details.Data.ComPar);\\r\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\r\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\r\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\r\\n let lteParam = addEscapeChar(details.Data.LtePar);\\r\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\r\\n let bleParam = addEscapeChar(details.Data.BlePar);\\r\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\r\\n break;\\r\\n case \\\"REBOOTB\\\":\\r\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\r\\n break;\\r\\n case \\\"PWRFB\\\":\\r\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\r\\n break;\\r\\n case \\\"RESETB\\\":\\r\\n AddConfig(configIds.Bracelet.Reset, 'true');\\r\\n break;\\r\\n case \\\"BRAPWUPDATE\\\":\\r\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\r\\n // get password from old device, then set\\r\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\r\\n )\\r\\n break;\\r\\n case \\\"NOTE\\\":\\r\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\r\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\r\\n text = text.split(\\\",\\\").join(\\\" \\\");\\r\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\r\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\r\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\r\\n AddConfig(configIds.Note.Message, value)\\r\\n break;\\r\\n }\\r\\n }\\r\\n\\r\\n function addEscapeChar(json) {\\r\\n if (json === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n let jsonStr = JSON.stringify(json);\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\r\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function changeSingleQuoteToDouble(jsonStr) {\\r\\n if (jsonStr === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\r\\n outStr = outStr + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function sendMessageToLocalhost(str) {\\r\\n if (localTesting) {\\r\\n console.log(\\\"Sending message to local host: \\\" + str);\\r\\n } else {\\r\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\r\\n var c = createConnection(5878, server); // acceptance is 5678 - protocol dev 5878 - dev is 5679 ?\\r\\n c.write(`${str}`);\\r\\n c.end();\\r\\n }\\r\\n AddValue(\\\"ToLocalhost\\\", str);\\r\\n }\\r\\n\\r\\n function createConnection(port, server) {\\r\\n c = net.createConnection(port, server);\\r\\n c.on('error', function(error) {\\r\\n c = createConnection(port, server);\\r\\n });\\r\\n return c;\\r\\n }\\r\\n\\r\\n function decrypt(encdata, password) {\\r\\n var decrypted;\\r\\n var dataarray = encdata.split(\\\";\\\");\\r\\n if (dataarray.length > 5) {\\r\\n return \\\"\\\";\\r\\n }\\r\\n var i;\\r\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\r\\n if (encdata.startsWith(\\\"ACK\\\")) {\\r\\n return encdata;\\r\\n }\\r\\n for (i = 0; i < 3; i++) {\\r\\n part1 = part1 + dataarray[i] + \\\";\\\";\\r\\n }\\r\\n var mid = dataarray[2]; // use the message ID to create the salt\\r\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n // base64 decoding and extract the iv and encrypted data\\r\\n const bData = Buffer.from(enctext, 'base64');\\r\\n const iv = bData.slice(0, 16); // initial 16 chars\\r\\n const text = bData.slice(16); // all the encrypted data\\r\\n // derive key using; 32 byte key length (from salted password and mid)\\r\\n // decrypt the data in part2 and add to part1\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\r\\n try {\\r\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\r\\n } catch (err) {\\r\\n decrypted = undefined;\\r\\n }\\r\\n return decrypted;\\r\\n }\\r\\n\\r\\n function encrypt(text, mid, password) {\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n const iv = _crypto.randomBytes(16); // random initialization vector\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n // set the cipher\\r\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\r\\n // encrypt text\\r\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\r\\n // generate output ( encrypted text )\\r\\n return Buffer.concat([iv, encrypted]).toString('base64');\\r\\n }\\r\\n\\r\\n function AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n deviceParams.push(cvpair);\\r\\n }\\r\\n\\r\\n function AddConfig(configName, newvalue) {\\r\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n var cvpair = {\\r\\n 'code': configName,\\r\\n 'value': newvalue,\\r\\n 'forced': true\\r\\n };\\r\\n configsToSend.push(cvpair);\\r\\n };\\r\\n }\\r\\n\\r\\n function isASCII(str) {\\r\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\r\\n }\\r\\n\\r\\n function LookupValue(key, type, template) {\\r\\n var cvpair = {\\r\\n key: key, // key to be lookded up\\r\\n type: type, // type of the key\\r\\n template: template // the variable the result will be mapped to\\r\\n };\\r\\n msg.KeyValue = cvpair;\\r\\n }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n module.exports = {\\r\\n execute_ops\\r\\n }\\r\\n} else { // on server use local defined vars\\r\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n // define global returns\\r\\n msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1744209049},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n // Define array to push device data into. This will be put into the msg array at the end.\\r\\n var deviceParams = [];\\r\\n var configsToSend = [];\\r\\n var tasks = [];\\r\\n const _crypto = require('crypto');\\r\\n // handle ACK\\r\\n if (messageTypeCode == \\\"ACK\\\") {\\r\\n return \\\"\\\";\\r\\n }\\r\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\r\\n var password;\\r\\n if (params.imei == \\\"null\\\") {\\r\\n return msg;\\r\\n }\\r\\n password = params.imei;\\r\\n if (configs.Password.Password === \\\"\\\") {\\r\\n // use imei as default password when not specified\\r\\n } else {\\r\\n // use the password\\r\\n password = configs.Password.Password\\r\\n }\\r\\n let message = decrypt(raw, password);\\r\\n if (message) {\\r\\n // send message internally\\r\\n sendMessageToLocalhost(message);\\r\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n } else {\\r\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n }\\r\\n } else { // General Oysta Template\\r\\n switch (messageTypeLocalCode) {\\r\\n case (\\\"COMM\\\"):\\r\\n process_invent_msg(); //incoming invent commands\\r\\n break;\\r\\n case (\\\"MACB\\\"):\\r\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\r\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\r\\n add_params_to_output();\\r\\n break;\\r\\n case \\\"INFO-GETPWB\\\": // handle GETPWB message\\r\\n //let imei = params.bracelet_imei; // not actually needed ?\\r\\n //let mac = params.BLEMAC; // not actually needed ?\\r\\n //AddValue(\\\"mac\\\", params.bracelet_mac);\\r\\n //AddValue(\\\"key\\\", params.key);\\r\\n //console.log(\\\"mac: \\\" + params.bracelet_mac);\\r\\n //let BraceletPW = \\\"\\\"; // until we set it from query below\\r\\n // if(params.bracelet_imei){\\r\\n // if(serverParams.Password){\\r\\n // BraceletPW = serverParams.Password; // query key value table\\r\\n // console.log(BraceletPW); // print for testing reasons\\r\\n // AddConfig(configIds.DeviceConfig.BraceletPW, BraceletPW);//this to return the value\\r\\n // }\\r\\n // }\\r\\n // else {\\r\\n // //return error\\r\\n // }\\r\\n //AddValue(\\\"password\\\", \\\"myNewPassword\\\");\\r\\n //LookupValue(params.ble_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n LookupValue(params.bracelet_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n break;\\r\\n case (\\\"REGISTER\\\"):\\r\\n let ble_mac = params.ble_mac;\\r\\n let iccid = params.iccid;\\r\\n // write values to readonly settings\\r\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\r\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\r\\n // will automtaically Activate on Acceptance\\r\\n if (serverParams.EnvName) {\\r\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\r\\n }\\r\\n }\\r\\n break;\\r\\n case (\\\"CREATE\\\"):\\r\\n // temp fix to filter old messages\\r\\n // const cutoff = 1707523200000; //10.2.2024\\r\\n // let message_id_time = parseInt(params.count_number, 36);\\r\\n // if (message_id_time > cutoff){\\r\\n let c_ble_mac = params.ble_mac;\\r\\n let c_iccid = params.iccid;\\r\\n let new_imei = params.new_imei;\\r\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\r\\n // sendMessageToLocalhost(c_message); \\r\\n tasks = [{\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"sync\\\",\\r\\n \\\"type\\\": \\\"createDevice\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"imei\\\": new_imei,\\r\\n \\\"abortOnError\\\": false,\\r\\n \\\"init\\\": true\\r\\n }),\\r\\n \\\"order\\\": 1\\r\\n }, {\\r\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"async\\\",\\r\\n \\\"type\\\": \\\"sendMessage\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"message\\\": c_message\\r\\n }),\\r\\n \\\"order\\\": 2\\r\\n }]\\r\\n // }\\r\\n break;\\r\\n case (\\\"ALLDATA\\\"):\\r\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\r\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\r\\n let all_data = JSON.parse(json_str);\\r\\n if (\\\"version\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\r\\n };\\r\\n break;\\r\\n default:\\r\\n // all other general messages\\r\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\r\\n add_params_to_output();\\r\\n }\\r\\n // add messagetTypeLocal to output for templates\\r\\n AddValue('local_message_type', messageTypeLocalCode);\\r\\n }\\r\\n msg = {\\r\\n 'values': deviceParams,\\r\\n KeyValue\\r\\n };\\r\\n if (configsToSend.length > 0) {\\r\\n msg.configsToSend = configsToSend\\r\\n };\\r\\n if (tasks.length > 0) {\\r\\n msg.tasks = tasks\\r\\n };\\r\\n // commit values to receiver processor\\r\\n console.log(msg);\\r\\n // modify to return the object that contains your data\\r\\n return msg;\\r\\n\\r\\n function add_params_to_output() {\\r\\n if (!params.raw_accuracy) {\\r\\n AddValue('location_accuracy', 9000);\\r\\n } else {\\r\\n AddValue('location_accuracy', params.raw_accuracy);\\r\\n }\\r\\n // generate timestamps if they don't exist\\r\\n if (!params.event_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n if (!params.location_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n //if no lat and long are given, set them to 0, 0\\r\\n if (!params.latitude_raw) {\\r\\n AddValue('latitude', 0);\\r\\n } else {\\r\\n AddValue('latitude', params.latitude_raw);\\r\\n }\\r\\n if (!params.longitude_raw) {\\r\\n AddValue('longitude', 0);\\r\\n } else {\\r\\n AddValue('longitude', params.longitude_raw);\\r\\n }\\r\\n // if (params.temp_bracelet){\\r\\n // AddValue('oysta_labels', 'DegC');\\r\\n // AddValue('single_column_value', params.temp_bracelet);\\r\\n // }\\r\\n }\\r\\n\\r\\n function process_invent_msg() {\\r\\n const details = JSON.parse(raw);\\r\\n // AddValue('imei', details.AppId);\\r\\n AddValue('json_in', JSON.stringify(details));\\r\\n switch (details.Command) {\\r\\n case \\\"ACTIVATE_OK\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\r\\n break;\\r\\n case \\\"ACTIVATE_FAILS\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\r\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\r\\n break;\\r\\n case \\\"APPSET\\\":\\r\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\r\\n AddConfig(configIds.Password.Password, details.Data.Password);\\r\\n break;\\r\\n case \\\"CONFIG\\\":\\r\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\r\\n break;\\r\\n case \\\"CGFBR\\\":\\r\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\r\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\r\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\r\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\r\\n let commonParam = addEscapeChar(details.Data.ComPar);\\r\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\r\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\r\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\r\\n let lteParam = addEscapeChar(details.Data.LtePar);\\r\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\r\\n let bleParam = addEscapeChar(details.Data.BlePar);\\r\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\r\\n break;\\r\\n case \\\"REBOOTB\\\":\\r\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\r\\n break;\\r\\n case \\\"PWRFB\\\":\\r\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\r\\n break;\\r\\n case \\\"RESETB\\\":\\r\\n AddConfig(configIds.Bracelet.Reset, 'true');\\r\\n break;\\r\\n case \\\"BRAPWUPDATE\\\":\\r\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\r\\n // get password from old device, then set\\r\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\r\\n )\\r\\n break;\\r\\n case \\\"NOTE\\\":\\r\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\r\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\r\\n text = text.split(\\\",\\\").join(\\\" \\\");\\r\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\r\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\r\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\r\\n AddConfig(configIds.Note.Message, value)\\r\\n break;\\r\\n }\\r\\n }\\r\\n\\r\\n function addEscapeChar(json) {\\r\\n if (json === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n let jsonStr = JSON.stringify(json);\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\r\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function changeSingleQuoteToDouble(jsonStr) {\\r\\n if (jsonStr === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\r\\n outStr = outStr + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function sendMessageToLocalhost(str) {\\r\\n if (localTesting) {\\r\\n console.log(\\\"Sending message to local host: \\\" + str);\\r\\n } else {\\r\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\r\\n var c = createConnection(5878, server); // acceptance is 5678 - protocol dev 5878 - dev is 5679 ?\\r\\n c.write(`${str}`);\\r\\n c.end();\\r\\n }\\r\\n AddValue(\\\"ToLocalhost\\\", str);\\r\\n }\\r\\n\\r\\n function createConnection(port, server) {\\r\\n c = net.createConnection(port, server);\\r\\n c.on('error', function(error) {\\r\\n c = createConnection(port, server);\\r\\n });\\r\\n return c;\\r\\n }\\r\\n\\r\\n function decrypt(encdata, password) {\\r\\n var decrypted;\\r\\n var dataarray = encdata.split(\\\";\\\");\\r\\n if (dataarray.length > 5) {\\r\\n return \\\"\\\";\\r\\n }\\r\\n var i;\\r\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\r\\n if (encdata.startsWith(\\\"ACK\\\")) {\\r\\n return encdata;\\r\\n }\\r\\n for (i = 0; i < 3; i++) {\\r\\n part1 = part1 + dataarray[i] + \\\";\\\";\\r\\n }\\r\\n var mid = dataarray[2]; // use the message ID to create the salt\\r\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n // base64 decoding and extract the iv and encrypted data\\r\\n const bData = Buffer.from(enctext, 'base64');\\r\\n const iv = bData.slice(0, 16); // initial 16 chars\\r\\n const text = bData.slice(16); // all the encrypted data\\r\\n // derive key using; 32 byte key length (from salted password and mid)\\r\\n // decrypt the data in part2 and add to part1\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\r\\n try {\\r\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\r\\n } catch (err) {\\r\\n decrypted = undefined;\\r\\n }\\r\\n return decrypted;\\r\\n }\\r\\n\\r\\n function encrypt(text, mid, password) {\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n const iv = _crypto.randomBytes(16); // random initialization vector\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n // set the cipher\\r\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\r\\n // encrypt text\\r\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\r\\n // generate output ( encrypted text )\\r\\n return Buffer.concat([iv, encrypted]).toString('base64');\\r\\n }\\r\\n\\r\\n function AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n deviceParams.push(cvpair);\\r\\n }\\r\\n\\r\\n function AddConfig(configName, newvalue) {\\r\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n var cvpair = {\\r\\n 'code': configName,\\r\\n 'value': newvalue,\\r\\n 'forced': true\\r\\n };\\r\\n configsToSend.push(cvpair);\\r\\n };\\r\\n }\\r\\n\\r\\n function isASCII(str) {\\r\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\r\\n }\\r\\n\\r\\n function LookupValue(key, type, template) {\\r\\n var cvpair = {\\r\\n key: key, // key to be lookded up\\r\\n type: type, // type of the key\\r\\n template: template // the variable the result will be mapped to\\r\\n };\\r\\n msg.KeyValue = cvpair;\\r\\n }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n module.exports = {\\r\\n execute_ops\\r\\n }\\r\\n} else { // on server use local defined vars\\r\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n // define global returns\\r\\n msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1744209157},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n // Define array to push device data into. This will be put into the msg array at the end.\\r\\n var deviceParams = [];\\r\\n var configsToSend = [];\\r\\n var tasks = [];\\r\\n const _crypto = require('crypto');\\r\\n // handle ACK\\r\\n if (messageTypeCode == \\\"ACK\\\") {\\r\\n return \\\"\\\";\\r\\n }\\r\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\r\\n var password;\\r\\n if (params.imei == \\\"null\\\") {\\r\\n return msg;\\r\\n }\\r\\n password = params.imei;\\r\\n if (configs.Password.Password === \\\"\\\") {\\r\\n // use imei as default password when not specified\\r\\n } else {\\r\\n // use the password\\r\\n password = configs.Password.Password\\r\\n }\\r\\n let message = decrypt(raw, password);\\r\\n if (message) {\\r\\n // send message internally\\r\\n sendMessageToLocalhost(message);\\r\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n } else {\\r\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n }\\r\\n } else { // General Oysta Template\\r\\n switch (messageTypeLocalCode) {\\r\\n case (\\\"COMM\\\"):\\r\\n process_invent_msg(); //incoming invent commands\\r\\n break;\\r\\n case (\\\"MACB\\\"):\\r\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\r\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\r\\n add_params_to_output();\\r\\n break;\\r\\n case \\\"INFO-GETPWB\\\": // handle GETPWB message\\r\\n //let imei = params.bracelet_imei; // not actually needed ?\\r\\n //let mac = params.BLEMAC; // not actually needed ?\\r\\n //AddValue(\\\"mac\\\", params.bracelet_mac);\\r\\n //AddValue(\\\"key\\\", params.key);\\r\\n //console.log(\\\"mac: \\\" + params.bracelet_mac);\\r\\n //let BraceletPW = \\\"\\\"; // until we set it from query below\\r\\n // if(params.bracelet_imei){\\r\\n // if(serverParams.Password){\\r\\n // BraceletPW = serverParams.Password; // query key value table\\r\\n // console.log(BraceletPW); // print for testing reasons\\r\\n // AddConfig(configIds.DeviceConfig.BraceletPW, BraceletPW);//this to return the value\\r\\n // }\\r\\n // }\\r\\n // else {\\r\\n // //return error\\r\\n // }\\r\\n //AddValue(\\\"password\\\", \\\"myNewPassword\\\");\\r\\n //LookupValue(params.ble_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n //LookupValue(params.bracelet_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n break;\\r\\n case (\\\"REGISTER\\\"):\\r\\n let ble_mac = params.ble_mac;\\r\\n let iccid = params.iccid;\\r\\n // write values to readonly settings\\r\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\r\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\r\\n // will automtaically Activate on Acceptance\\r\\n if (serverParams.EnvName) {\\r\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\r\\n }\\r\\n }\\r\\n break;\\r\\n case (\\\"CREATE\\\"):\\r\\n // temp fix to filter old messages\\r\\n // const cutoff = 1707523200000; //10.2.2024\\r\\n // let message_id_time = parseInt(params.count_number, 36);\\r\\n // if (message_id_time > cutoff){\\r\\n let c_ble_mac = params.ble_mac;\\r\\n let c_iccid = params.iccid;\\r\\n let new_imei = params.new_imei;\\r\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\r\\n // sendMessageToLocalhost(c_message); \\r\\n tasks = [{\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"sync\\\",\\r\\n \\\"type\\\": \\\"createDevice\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"imei\\\": new_imei,\\r\\n \\\"abortOnError\\\": false,\\r\\n \\\"init\\\": true\\r\\n }),\\r\\n \\\"order\\\": 1\\r\\n }, {\\r\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"async\\\",\\r\\n \\\"type\\\": \\\"sendMessage\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"message\\\": c_message\\r\\n }),\\r\\n \\\"order\\\": 2\\r\\n }]\\r\\n // }\\r\\n break;\\r\\n case (\\\"ALLDATA\\\"):\\r\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\r\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\r\\n let all_data = JSON.parse(json_str);\\r\\n if (\\\"version\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\r\\n };\\r\\n break;\\r\\n default:\\r\\n // all other general messages\\r\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\r\\n add_params_to_output();\\r\\n }\\r\\n // add messagetTypeLocal to output for templates\\r\\n AddValue('local_message_type', messageTypeLocalCode);\\r\\n }\\r\\n msg = {\\r\\n 'values': deviceParams,\\r\\n KeyValue\\r\\n };\\r\\n if (configsToSend.length > 0) {\\r\\n msg.configsToSend = configsToSend\\r\\n };\\r\\n if (tasks.length > 0) {\\r\\n msg.tasks = tasks\\r\\n };\\r\\n var cvpair = {\\r\\n key: \\\"BC572909705E\\\", // key to be lookded up\\r\\n type: \\\"Bracelet\\\", // type of the key\\r\\n template: \\\"password\\\" // the variable the result will be mapped to\\r\\n };\\r\\n msg.KeyValue = cvpair;\\r\\n // commit values to receiver processor\\r\\n console.log(msg);\\r\\n // modify to return the object that contains your data\\r\\n return msg;\\r\\n\\r\\n function add_params_to_output() {\\r\\n if (!params.raw_accuracy) {\\r\\n AddValue('location_accuracy', 9000);\\r\\n } else {\\r\\n AddValue('location_accuracy', params.raw_accuracy);\\r\\n }\\r\\n // generate timestamps if they don't exist\\r\\n if (!params.event_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n if (!params.location_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n //if no lat and long are given, set them to 0, 0\\r\\n if (!params.latitude_raw) {\\r\\n AddValue('latitude', 0);\\r\\n } else {\\r\\n AddValue('latitude', params.latitude_raw);\\r\\n }\\r\\n if (!params.longitude_raw) {\\r\\n AddValue('longitude', 0);\\r\\n } else {\\r\\n AddValue('longitude', params.longitude_raw);\\r\\n }\\r\\n // if (params.temp_bracelet){\\r\\n // AddValue('oysta_labels', 'DegC');\\r\\n // AddValue('single_column_value', params.temp_bracelet);\\r\\n // }\\r\\n }\\r\\n\\r\\n function process_invent_msg() {\\r\\n const details = JSON.parse(raw);\\r\\n // AddValue('imei', details.AppId);\\r\\n AddValue('json_in', JSON.stringify(details));\\r\\n switch (details.Command) {\\r\\n case \\\"ACTIVATE_OK\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\r\\n break;\\r\\n case \\\"ACTIVATE_FAILS\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\r\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\r\\n break;\\r\\n case \\\"APPSET\\\":\\r\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\r\\n AddConfig(configIds.Password.Password, details.Data.Password);\\r\\n break;\\r\\n case \\\"CONFIG\\\":\\r\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\r\\n break;\\r\\n case \\\"CGFBR\\\":\\r\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\r\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\r\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\r\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\r\\n let commonParam = addEscapeChar(details.Data.ComPar);\\r\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\r\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\r\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\r\\n let lteParam = addEscapeChar(details.Data.LtePar);\\r\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\r\\n let bleParam = addEscapeChar(details.Data.BlePar);\\r\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\r\\n break;\\r\\n case \\\"REBOOTB\\\":\\r\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\r\\n break;\\r\\n case \\\"PWRFB\\\":\\r\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\r\\n break;\\r\\n case \\\"RESETB\\\":\\r\\n AddConfig(configIds.Bracelet.Reset, 'true');\\r\\n break;\\r\\n case \\\"BRAPWUPDATE\\\":\\r\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\r\\n // get password from old device, then set\\r\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\r\\n )\\r\\n break;\\r\\n case \\\"NOTE\\\":\\r\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\r\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\r\\n text = text.split(\\\",\\\").join(\\\" \\\");\\r\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\r\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\r\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\r\\n AddConfig(configIds.Note.Message, value)\\r\\n break;\\r\\n }\\r\\n }\\r\\n\\r\\n function addEscapeChar(json) {\\r\\n if (json === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n let jsonStr = JSON.stringify(json);\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\r\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function changeSingleQuoteToDouble(jsonStr) {\\r\\n if (jsonStr === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\r\\n outStr = outStr + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function sendMessageToLocalhost(str) {\\r\\n if (localTesting) {\\r\\n console.log(\\\"Sending message to local host: \\\" + str);\\r\\n } else {\\r\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\r\\n var c = createConnection(5878, server); // acceptance is 5678 - protocol dev 5878 - dev is 5679 ?\\r\\n c.write(`${str}`);\\r\\n c.end();\\r\\n }\\r\\n AddValue(\\\"ToLocalhost\\\", str);\\r\\n }\\r\\n\\r\\n function createConnection(port, server) {\\r\\n c = net.createConnection(port, server);\\r\\n c.on('error', function(error) {\\r\\n c = createConnection(port, server);\\r\\n });\\r\\n return c;\\r\\n }\\r\\n\\r\\n function decrypt(encdata, password) {\\r\\n var decrypted;\\r\\n var dataarray = encdata.split(\\\";\\\");\\r\\n if (dataarray.length > 5) {\\r\\n return \\\"\\\";\\r\\n }\\r\\n var i;\\r\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\r\\n if (encdata.startsWith(\\\"ACK\\\")) {\\r\\n return encdata;\\r\\n }\\r\\n for (i = 0; i < 3; i++) {\\r\\n part1 = part1 + dataarray[i] + \\\";\\\";\\r\\n }\\r\\n var mid = dataarray[2]; // use the message ID to create the salt\\r\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n // base64 decoding and extract the iv and encrypted data\\r\\n const bData = Buffer.from(enctext, 'base64');\\r\\n const iv = bData.slice(0, 16); // initial 16 chars\\r\\n const text = bData.slice(16); // all the encrypted data\\r\\n // derive key using; 32 byte key length (from salted password and mid)\\r\\n // decrypt the data in part2 and add to part1\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\r\\n try {\\r\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\r\\n } catch (err) {\\r\\n decrypted = undefined;\\r\\n }\\r\\n return decrypted;\\r\\n }\\r\\n\\r\\n function encrypt(text, mid, password) {\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n const iv = _crypto.randomBytes(16); // random initialization vector\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n // set the cipher\\r\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\r\\n // encrypt text\\r\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\r\\n // generate output ( encrypted text )\\r\\n return Buffer.concat([iv, encrypted]).toString('base64');\\r\\n }\\r\\n\\r\\n function AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n deviceParams.push(cvpair);\\r\\n }\\r\\n\\r\\n function AddConfig(configName, newvalue) {\\r\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n var cvpair = {\\r\\n 'code': configName,\\r\\n 'value': newvalue,\\r\\n 'forced': true\\r\\n };\\r\\n configsToSend.push(cvpair);\\r\\n };\\r\\n }\\r\\n\\r\\n function isASCII(str) {\\r\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\r\\n }\\r\\n\\r\\n function LookupValue(key, type, template) {\\r\\n var cvpair = {\\r\\n key: key, // key to be lookded up\\r\\n type: type, // type of the key\\r\\n template: template // the variable the result will be mapped to\\r\\n };\\r\\n msg.KeyValue = cvpair;\\r\\n }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n module.exports = {\\r\\n execute_ops\\r\\n }\\r\\n} else { // on server use local defined vars\\r\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n // define global returns\\r\\n msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1744209596},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n // Define array to push device data into. This will be put into the msg array at the end.\\r\\n var deviceParams = [];\\r\\n var configsToSend = [];\\r\\n var tasks = [];\\r\\n const _crypto = require('crypto');\\r\\n // handle ACK\\r\\n if (messageTypeCode == \\\"ACK\\\") {\\r\\n return \\\"\\\";\\r\\n }\\r\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\r\\n var password;\\r\\n if (params.imei == \\\"null\\\") {\\r\\n return msg;\\r\\n }\\r\\n password = params.imei;\\r\\n if (configs.Password.Password === \\\"\\\") {\\r\\n // use imei as default password when not specified\\r\\n } else {\\r\\n // use the password\\r\\n password = configs.Password.Password\\r\\n }\\r\\n let message = decrypt(raw, password);\\r\\n if (message) {\\r\\n // send message internally\\r\\n sendMessageToLocalhost(message);\\r\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n } else {\\r\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n }\\r\\n } else { // General Oysta Template\\r\\n switch (messageTypeLocalCode) {\\r\\n case (\\\"COMM\\\"):\\r\\n process_invent_msg(); //incoming invent commands\\r\\n break;\\r\\n case (\\\"MACB\\\"):\\r\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\r\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\r\\n add_params_to_output();\\r\\n break;\\r\\n case \\\"INFO-GETPWB\\\": // handle GETPWB message\\r\\n //let imei = params.bracelet_imei; // not actually needed ?\\r\\n //let mac = params.BLEMAC; // not actually needed ?\\r\\n //AddValue(\\\"mac\\\", params.bracelet_mac);\\r\\n //AddValue(\\\"key\\\", params.key);\\r\\n //console.log(\\\"mac: \\\" + params.bracelet_mac);\\r\\n //let BraceletPW = \\\"\\\"; // until we set it from query below\\r\\n // if(params.bracelet_imei){\\r\\n // if(serverParams.Password){\\r\\n // BraceletPW = serverParams.Password; // query key value table\\r\\n // console.log(BraceletPW); // print for testing reasons\\r\\n // AddConfig(configIds.DeviceConfig.BraceletPW, BraceletPW);//this to return the value\\r\\n // }\\r\\n // }\\r\\n // else {\\r\\n // //return error\\r\\n // }\\r\\n //AddValue(\\\"password\\\", \\\"myNewPassword\\\");\\r\\n //LookupValue(params.ble_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n //LookupValue(params.bracelet_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n break;\\r\\n case (\\\"REGISTER\\\"):\\r\\n let ble_mac = params.ble_mac;\\r\\n let iccid = params.iccid;\\r\\n // write values to readonly settings\\r\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\r\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\r\\n // will automtaically Activate on Acceptance\\r\\n if (serverParams.EnvName) {\\r\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\r\\n }\\r\\n }\\r\\n break;\\r\\n case (\\\"CREATE\\\"):\\r\\n // temp fix to filter old messages\\r\\n // const cutoff = 1707523200000; //10.2.2024\\r\\n // let message_id_time = parseInt(params.count_number, 36);\\r\\n // if (message_id_time > cutoff){\\r\\n let c_ble_mac = params.ble_mac;\\r\\n let c_iccid = params.iccid;\\r\\n let new_imei = params.new_imei;\\r\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\r\\n // sendMessageToLocalhost(c_message); \\r\\n tasks = [{\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"sync\\\",\\r\\n \\\"type\\\": \\\"createDevice\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"imei\\\": new_imei,\\r\\n \\\"abortOnError\\\": false,\\r\\n \\\"init\\\": true\\r\\n }),\\r\\n \\\"order\\\": 1\\r\\n }, {\\r\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"async\\\",\\r\\n \\\"type\\\": \\\"sendMessage\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"message\\\": c_message\\r\\n }),\\r\\n \\\"order\\\": 2\\r\\n }]\\r\\n // }\\r\\n break;\\r\\n case (\\\"ALLDATA\\\"):\\r\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\r\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\r\\n let all_data = JSON.parse(json_str);\\r\\n if (\\\"version\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\r\\n };\\r\\n break;\\r\\n default:\\r\\n // all other general messages\\r\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\r\\n add_params_to_output();\\r\\n }\\r\\n // add messagetTypeLocal to output for templates\\r\\n AddValue('local_message_type', messageTypeLocalCode);\\r\\n }\\r\\n msg = {\\r\\n 'values': deviceParams,\\r\\n };\\r\\n if (configsToSend.length > 0) {\\r\\n msg.configsToSend = configsToSend\\r\\n };\\r\\n if (tasks.length > 0) {\\r\\n msg.tasks = tasks\\r\\n };\\r\\n var cvpair = {\\r\\n key: \\\"BC572909705E\\\", // key to be lookded up\\r\\n type: \\\"Bracelet\\\", // type of the key\\r\\n template: \\\"password\\\" // the variable the result will be mapped to\\r\\n };\\r\\n msg.KeyValue = cvpair;\\r\\n // commit values to receiver processor\\r\\n console.log(msg);\\r\\n // modify to return the object that contains your data\\r\\n return msg;\\r\\n\\r\\n function add_params_to_output() {\\r\\n if (!params.raw_accuracy) {\\r\\n AddValue('location_accuracy', 9000);\\r\\n } else {\\r\\n AddValue('location_accuracy', params.raw_accuracy);\\r\\n }\\r\\n // generate timestamps if they don't exist\\r\\n if (!params.event_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n if (!params.location_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n //if no lat and long are given, set them to 0, 0\\r\\n if (!params.latitude_raw) {\\r\\n AddValue('latitude', 0);\\r\\n } else {\\r\\n AddValue('latitude', params.latitude_raw);\\r\\n }\\r\\n if (!params.longitude_raw) {\\r\\n AddValue('longitude', 0);\\r\\n } else {\\r\\n AddValue('longitude', params.longitude_raw);\\r\\n }\\r\\n // if (params.temp_bracelet){\\r\\n // AddValue('oysta_labels', 'DegC');\\r\\n // AddValue('single_column_value', params.temp_bracelet);\\r\\n // }\\r\\n }\\r\\n\\r\\n function process_invent_msg() {\\r\\n const details = JSON.parse(raw);\\r\\n // AddValue('imei', details.AppId);\\r\\n AddValue('json_in', JSON.stringify(details));\\r\\n switch (details.Command) {\\r\\n case \\\"ACTIVATE_OK\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\r\\n break;\\r\\n case \\\"ACTIVATE_FAILS\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\r\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\r\\n break;\\r\\n case \\\"APPSET\\\":\\r\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\r\\n AddConfig(configIds.Password.Password, details.Data.Password);\\r\\n break;\\r\\n case \\\"CONFIG\\\":\\r\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\r\\n break;\\r\\n case \\\"CGFBR\\\":\\r\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\r\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\r\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\r\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\r\\n let commonParam = addEscapeChar(details.Data.ComPar);\\r\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\r\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\r\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\r\\n let lteParam = addEscapeChar(details.Data.LtePar);\\r\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\r\\n let bleParam = addEscapeChar(details.Data.BlePar);\\r\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\r\\n break;\\r\\n case \\\"REBOOTB\\\":\\r\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\r\\n break;\\r\\n case \\\"PWRFB\\\":\\r\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\r\\n break;\\r\\n case \\\"RESETB\\\":\\r\\n AddConfig(configIds.Bracelet.Reset, 'true');\\r\\n break;\\r\\n case \\\"BRAPWUPDATE\\\":\\r\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\r\\n // get password from old device, then set\\r\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\r\\n )\\r\\n break;\\r\\n case \\\"NOTE\\\":\\r\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\r\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\r\\n text = text.split(\\\",\\\").join(\\\" \\\");\\r\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\r\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\r\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\r\\n AddConfig(configIds.Note.Message, value)\\r\\n break;\\r\\n }\\r\\n }\\r\\n\\r\\n function addEscapeChar(json) {\\r\\n if (json === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n let jsonStr = JSON.stringify(json);\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\r\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function changeSingleQuoteToDouble(jsonStr) {\\r\\n if (jsonStr === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\r\\n outStr = outStr + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function sendMessageToLocalhost(str) {\\r\\n if (localTesting) {\\r\\n console.log(\\\"Sending message to local host: \\\" + str);\\r\\n } else {\\r\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\r\\n var c = createConnection(5878, server); // acceptance is 5678 - protocol dev 5878 - dev is 5679 ?\\r\\n c.write(`${str}`);\\r\\n c.end();\\r\\n }\\r\\n AddValue(\\\"ToLocalhost\\\", str);\\r\\n }\\r\\n\\r\\n function createConnection(port, server) {\\r\\n c = net.createConnection(port, server);\\r\\n c.on('error', function(error) {\\r\\n c = createConnection(port, server);\\r\\n });\\r\\n return c;\\r\\n }\\r\\n\\r\\n function decrypt(encdata, password) {\\r\\n var decrypted;\\r\\n var dataarray = encdata.split(\\\";\\\");\\r\\n if (dataarray.length > 5) {\\r\\n return \\\"\\\";\\r\\n }\\r\\n var i;\\r\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\r\\n if (encdata.startsWith(\\\"ACK\\\")) {\\r\\n return encdata;\\r\\n }\\r\\n for (i = 0; i < 3; i++) {\\r\\n part1 = part1 + dataarray[i] + \\\";\\\";\\r\\n }\\r\\n var mid = dataarray[2]; // use the message ID to create the salt\\r\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n // base64 decoding and extract the iv and encrypted data\\r\\n const bData = Buffer.from(enctext, 'base64');\\r\\n const iv = bData.slice(0, 16); // initial 16 chars\\r\\n const text = bData.slice(16); // all the encrypted data\\r\\n // derive key using; 32 byte key length (from salted password and mid)\\r\\n // decrypt the data in part2 and add to part1\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\r\\n try {\\r\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\r\\n } catch (err) {\\r\\n decrypted = undefined;\\r\\n }\\r\\n return decrypted;\\r\\n }\\r\\n\\r\\n function encrypt(text, mid, password) {\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n const iv = _crypto.randomBytes(16); // random initialization vector\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n // set the cipher\\r\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\r\\n // encrypt text\\r\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\r\\n // generate output ( encrypted text )\\r\\n return Buffer.concat([iv, encrypted]).toString('base64');\\r\\n }\\r\\n\\r\\n function AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n deviceParams.push(cvpair);\\r\\n }\\r\\n\\r\\n function AddConfig(configName, newvalue) {\\r\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n var cvpair = {\\r\\n 'code': configName,\\r\\n 'value': newvalue,\\r\\n 'forced': true\\r\\n };\\r\\n configsToSend.push(cvpair);\\r\\n };\\r\\n }\\r\\n\\r\\n function isASCII(str) {\\r\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\r\\n }\\r\\n\\r\\n function LookupValue(key, type, template) {\\r\\n var cvpair = {\\r\\n key: key, // key to be lookded up\\r\\n type: type, // type of the key\\r\\n template: template // the variable the result will be mapped to\\r\\n };\\r\\n msg.KeyValue = cvpair;\\r\\n }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n module.exports = {\\r\\n execute_ops\\r\\n }\\r\\n} else { // on server use local defined vars\\r\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n // define global returns\\r\\n msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1744209665},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n // Define array to push device data into. This will be put into the msg array at the end.\\r\\n var deviceParams = [];\\r\\n var configsToSend = [];\\r\\n var tasks = [];\\r\\n var devicekey = \\\"\\\";\\r\\n const _crypto = require('crypto');\\r\\n // handle ACK\\r\\n if (messageTypeCode == \\\"ACK\\\") {\\r\\n return \\\"\\\";\\r\\n }\\r\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\r\\n var password;\\r\\n if (params.imei == \\\"null\\\") {\\r\\n return msg;\\r\\n }\\r\\n password = params.imei;\\r\\n if (configs.Password.Password === \\\"\\\") {\\r\\n // use imei as default password when not specified\\r\\n } else {\\r\\n // use the password\\r\\n password = configs.Password.Password\\r\\n }\\r\\n let message = decrypt(raw, password);\\r\\n if (message) {\\r\\n // send message internally\\r\\n sendMessageToLocalhost(message);\\r\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n } else {\\r\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n }\\r\\n } else { // General Oysta Template\\r\\n switch (messageTypeLocalCode) {\\r\\n case (\\\"COMM\\\"):\\r\\n process_invent_msg(); //incoming invent commands\\r\\n break;\\r\\n case (\\\"MACB\\\"):\\r\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\r\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\r\\n add_params_to_output();\\r\\n break;\\r\\n case \\\"INFO-GETPWB\\\": // handle GETPWB message\\r\\n //let imei = params.bracelet_imei; // not actually needed ?\\r\\n //let mac = params.BLEMAC; // not actually needed ?\\r\\n //AddValue(\\\"mac\\\", params.bracelet_mac);\\r\\n //AddValue(\\\"key\\\", params.key);\\r\\n //console.log(\\\"mac: \\\" + params.bracelet_mac);\\r\\n //let BraceletPW = \\\"\\\"; // until we set it from query below\\r\\n // if(params.bracelet_imei){\\r\\n // if(serverParams.Password){\\r\\n // BraceletPW = serverParams.Password; // query key value table\\r\\n // console.log(BraceletPW); // print for testing reasons\\r\\n // AddConfig(configIds.DeviceConfig.BraceletPW, BraceletPW);//this to return the value\\r\\n // }\\r\\n // }\\r\\n // else {\\r\\n // //return error\\r\\n // }\\r\\n //AddValue(\\\"password\\\", \\\"myNewPassword\\\");\\r\\n devicekey = params.ble_mac;\\r\\n //LookupValue(params.ble_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n //LookupValue(params.bracelet_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n break;\\r\\n case (\\\"REGISTER\\\"):\\r\\n let ble_mac = params.ble_mac;\\r\\n let iccid = params.iccid;\\r\\n // write values to readonly settings\\r\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\r\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\r\\n // will automtaically Activate on Acceptance\\r\\n if (serverParams.EnvName) {\\r\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\r\\n }\\r\\n }\\r\\n break;\\r\\n case (\\\"CREATE\\\"):\\r\\n // temp fix to filter old messages\\r\\n // const cutoff = 1707523200000; //10.2.2024\\r\\n // let message_id_time = parseInt(params.count_number, 36);\\r\\n // if (message_id_time > cutoff){\\r\\n let c_ble_mac = params.ble_mac;\\r\\n let c_iccid = params.iccid;\\r\\n let new_imei = params.new_imei;\\r\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\r\\n // sendMessageToLocalhost(c_message); \\r\\n tasks = [{\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"sync\\\",\\r\\n \\\"type\\\": \\\"createDevice\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"imei\\\": new_imei,\\r\\n \\\"abortOnError\\\": false,\\r\\n \\\"init\\\": true\\r\\n }),\\r\\n \\\"order\\\": 1\\r\\n }, {\\r\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"async\\\",\\r\\n \\\"type\\\": \\\"sendMessage\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"message\\\": c_message\\r\\n }),\\r\\n \\\"order\\\": 2\\r\\n }]\\r\\n // }\\r\\n break;\\r\\n case (\\\"ALLDATA\\\"):\\r\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\r\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\r\\n let all_data = JSON.parse(json_str);\\r\\n if (\\\"version\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\r\\n };\\r\\n break;\\r\\n default:\\r\\n // all other general messages\\r\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\r\\n add_params_to_output();\\r\\n }\\r\\n // add messagetTypeLocal to output for templates\\r\\n AddValue('local_message_type', messageTypeLocalCode);\\r\\n }\\r\\n msg = {\\r\\n 'values': deviceParams,\\r\\n };\\r\\n if (configsToSend.length > 0) {\\r\\n msg.configsToSend = configsToSend\\r\\n };\\r\\n if (tasks.length > 0) {\\r\\n msg.tasks = tasks\\r\\n };\\r\\n var cvpair = {\\r\\n key: devicekey, // key to be lookded up\\r\\n type: \\\"Bracelet\\\", // type of the key\\r\\n template: \\\"password\\\" // the variable the result will be mapped to\\r\\n };\\r\\n msg.KeyValue = cvpair;\\r\\n // commit values to receiver processor\\r\\n console.log(msg);\\r\\n // modify to return the object that contains your data\\r\\n return msg;\\r\\n\\r\\n function add_params_to_output() {\\r\\n if (!params.raw_accuracy) {\\r\\n AddValue('location_accuracy', 9000);\\r\\n } else {\\r\\n AddValue('location_accuracy', params.raw_accuracy);\\r\\n }\\r\\n // generate timestamps if they don't exist\\r\\n if (!params.event_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n if (!params.location_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n //if no lat and long are given, set them to 0, 0\\r\\n if (!params.latitude_raw) {\\r\\n AddValue('latitude', 0);\\r\\n } else {\\r\\n AddValue('latitude', params.latitude_raw);\\r\\n }\\r\\n if (!params.longitude_raw) {\\r\\n AddValue('longitude', 0);\\r\\n } else {\\r\\n AddValue('longitude', params.longitude_raw);\\r\\n }\\r\\n // if (params.temp_bracelet){\\r\\n // AddValue('oysta_labels', 'DegC');\\r\\n // AddValue('single_column_value', params.temp_bracelet);\\r\\n // }\\r\\n }\\r\\n\\r\\n function process_invent_msg() {\\r\\n const details = JSON.parse(raw);\\r\\n // AddValue('imei', details.AppId);\\r\\n AddValue('json_in', JSON.stringify(details));\\r\\n switch (details.Command) {\\r\\n case \\\"ACTIVATE_OK\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\r\\n break;\\r\\n case \\\"ACTIVATE_FAILS\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\r\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\r\\n break;\\r\\n case \\\"APPSET\\\":\\r\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\r\\n AddConfig(configIds.Password.Password, details.Data.Password);\\r\\n break;\\r\\n case \\\"CONFIG\\\":\\r\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\r\\n break;\\r\\n case \\\"CGFBR\\\":\\r\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\r\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\r\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\r\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\r\\n let commonParam = addEscapeChar(details.Data.ComPar);\\r\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\r\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\r\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\r\\n let lteParam = addEscapeChar(details.Data.LtePar);\\r\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\r\\n let bleParam = addEscapeChar(details.Data.BlePar);\\r\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\r\\n break;\\r\\n case \\\"REBOOTB\\\":\\r\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\r\\n break;\\r\\n case \\\"PWRFB\\\":\\r\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\r\\n break;\\r\\n case \\\"RESETB\\\":\\r\\n AddConfig(configIds.Bracelet.Reset, 'true');\\r\\n break;\\r\\n case \\\"BRAPWUPDATE\\\":\\r\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\r\\n // get password from old device, then set\\r\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\r\\n )\\r\\n break;\\r\\n case \\\"NOTE\\\":\\r\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\r\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\r\\n text = text.split(\\\",\\\").join(\\\" \\\");\\r\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\r\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\r\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\r\\n AddConfig(configIds.Note.Message, value)\\r\\n break;\\r\\n }\\r\\n }\\r\\n\\r\\n function addEscapeChar(json) {\\r\\n if (json === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n let jsonStr = JSON.stringify(json);\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\r\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function changeSingleQuoteToDouble(jsonStr) {\\r\\n if (jsonStr === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\r\\n outStr = outStr + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function sendMessageToLocalhost(str) {\\r\\n if (localTesting) {\\r\\n console.log(\\\"Sending message to local host: \\\" + str);\\r\\n } else {\\r\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\r\\n var c = createConnection(5878, server); // acceptance is 5678 - protocol dev 5878 - dev is 5679 ?\\r\\n c.write(`${str}`);\\r\\n c.end();\\r\\n }\\r\\n AddValue(\\\"ToLocalhost\\\", str);\\r\\n }\\r\\n\\r\\n function createConnection(port, server) {\\r\\n c = net.createConnection(port, server);\\r\\n c.on('error', function(error) {\\r\\n c = createConnection(port, server);\\r\\n });\\r\\n return c;\\r\\n }\\r\\n\\r\\n function decrypt(encdata, password) {\\r\\n var decrypted;\\r\\n var dataarray = encdata.split(\\\";\\\");\\r\\n if (dataarray.length > 5) {\\r\\n return \\\"\\\";\\r\\n }\\r\\n var i;\\r\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\r\\n if (encdata.startsWith(\\\"ACK\\\")) {\\r\\n return encdata;\\r\\n }\\r\\n for (i = 0; i < 3; i++) {\\r\\n part1 = part1 + dataarray[i] + \\\";\\\";\\r\\n }\\r\\n var mid = dataarray[2]; // use the message ID to create the salt\\r\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n // base64 decoding and extract the iv and encrypted data\\r\\n const bData = Buffer.from(enctext, 'base64');\\r\\n const iv = bData.slice(0, 16); // initial 16 chars\\r\\n const text = bData.slice(16); // all the encrypted data\\r\\n // derive key using; 32 byte key length (from salted password and mid)\\r\\n // decrypt the data in part2 and add to part1\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\r\\n try {\\r\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\r\\n } catch (err) {\\r\\n decrypted = undefined;\\r\\n }\\r\\n return decrypted;\\r\\n }\\r\\n\\r\\n function encrypt(text, mid, password) {\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n const iv = _crypto.randomBytes(16); // random initialization vector\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n // set the cipher\\r\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\r\\n // encrypt text\\r\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\r\\n // generate output ( encrypted text )\\r\\n return Buffer.concat([iv, encrypted]).toString('base64');\\r\\n }\\r\\n\\r\\n function AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n deviceParams.push(cvpair);\\r\\n }\\r\\n\\r\\n function AddConfig(configName, newvalue) {\\r\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n var cvpair = {\\r\\n 'code': configName,\\r\\n 'value': newvalue,\\r\\n 'forced': true\\r\\n };\\r\\n configsToSend.push(cvpair);\\r\\n };\\r\\n }\\r\\n\\r\\n function isASCII(str) {\\r\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\r\\n }\\r\\n\\r\\n function LookupValue(key, type, template) {\\r\\n var cvpair = {\\r\\n key: key, // key to be lookded up\\r\\n type: type, // type of the key\\r\\n template: template // the variable the result will be mapped to\\r\\n };\\r\\n msg.KeyValue = cvpair;\\r\\n }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n module.exports = {\\r\\n execute_ops\\r\\n }\\r\\n} else { // on server use local defined vars\\r\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n // define global returns\\r\\n msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1744209781},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n // Define array to push device data into. This will be put into the msg array at the end.\\r\\n var deviceParams = [];\\r\\n var configsToSend = [];\\r\\n var tasks = [];\\r\\n var devicekey = \\\"\\\";\\r\\n const _crypto = require('crypto');\\r\\n // handle ACK\\r\\n if (messageTypeCode == \\\"ACK\\\") {\\r\\n return \\\"\\\";\\r\\n }\\r\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\r\\n var password;\\r\\n if (params.imei == \\\"null\\\") {\\r\\n return msg;\\r\\n }\\r\\n password = params.imei;\\r\\n if (configs.Password.Password === \\\"\\\") {\\r\\n // use imei as default password when not specified\\r\\n } else {\\r\\n // use the password\\r\\n password = configs.Password.Password\\r\\n }\\r\\n let message = decrypt(raw, password);\\r\\n if (message) {\\r\\n // send message internally\\r\\n sendMessageToLocalhost(message);\\r\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n } else {\\r\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n }\\r\\n } else { // General Oysta Template\\r\\n switch (messageTypeLocalCode) {\\r\\n case (\\\"COMM\\\"):\\r\\n process_invent_msg(); //incoming invent commands\\r\\n break;\\r\\n case (\\\"MACB\\\"):\\r\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\r\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\r\\n add_params_to_output();\\r\\n break;\\r\\n case \\\"INFO-GETPWB\\\": // handle GETPWB message\\r\\n //let imei = params.bracelet_imei; // not actually needed ?\\r\\n //let mac = params.BLEMAC; // not actually needed ?\\r\\n //AddValue(\\\"mac\\\", params.bracelet_mac);\\r\\n //AddValue(\\\"key\\\", params.key);\\r\\n //console.log(\\\"mac: \\\" + params.bracelet_mac);\\r\\n //let BraceletPW = \\\"\\\"; // until we set it from query below\\r\\n // if(params.bracelet_imei){\\r\\n // if(serverParams.Password){\\r\\n // BraceletPW = serverParams.Password; // query key value table\\r\\n // console.log(BraceletPW); // print for testing reasons\\r\\n // AddConfig(configIds.DeviceConfig.BraceletPW, BraceletPW);//this to return the value\\r\\n // }\\r\\n // }\\r\\n // else {\\r\\n // //return error\\r\\n // }\\r\\n //AddValue(\\\"password\\\", \\\"myNewPassword\\\");\\r\\n devicekey = \\\"BC57290975BC\\\";\\r\\n //LookupValue(params.ble_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n //LookupValue(params.bracelet_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n break;\\r\\n case (\\\"REGISTER\\\"):\\r\\n let ble_mac = params.ble_mac;\\r\\n let iccid = params.iccid;\\r\\n // write values to readonly settings\\r\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\r\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\r\\n // will automtaically Activate on Acceptance\\r\\n if (serverParams.EnvName) {\\r\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\r\\n }\\r\\n }\\r\\n break;\\r\\n case (\\\"CREATE\\\"):\\r\\n // temp fix to filter old messages\\r\\n // const cutoff = 1707523200000; //10.2.2024\\r\\n // let message_id_time = parseInt(params.count_number, 36);\\r\\n // if (message_id_time > cutoff){\\r\\n let c_ble_mac = params.ble_mac;\\r\\n let c_iccid = params.iccid;\\r\\n let new_imei = params.new_imei;\\r\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\r\\n // sendMessageToLocalhost(c_message); \\r\\n tasks = [{\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"sync\\\",\\r\\n \\\"type\\\": \\\"createDevice\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"imei\\\": new_imei,\\r\\n \\\"abortOnError\\\": false,\\r\\n \\\"init\\\": true\\r\\n }),\\r\\n \\\"order\\\": 1\\r\\n }, {\\r\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"async\\\",\\r\\n \\\"type\\\": \\\"sendMessage\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"message\\\": c_message\\r\\n }),\\r\\n \\\"order\\\": 2\\r\\n }]\\r\\n // }\\r\\n break;\\r\\n case (\\\"ALLDATA\\\"):\\r\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\r\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\r\\n let all_data = JSON.parse(json_str);\\r\\n if (\\\"version\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\r\\n };\\r\\n break;\\r\\n default:\\r\\n // all other general messages\\r\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\r\\n add_params_to_output();\\r\\n }\\r\\n // add messagetTypeLocal to output for templates\\r\\n AddValue('local_message_type', messageTypeLocalCode);\\r\\n }\\r\\n msg = {\\r\\n 'values': deviceParams,\\r\\n };\\r\\n if (configsToSend.length > 0) {\\r\\n msg.configsToSend = configsToSend\\r\\n };\\r\\n if (tasks.length > 0) {\\r\\n msg.tasks = tasks\\r\\n };\\r\\n var cvpair = {\\r\\n key: devicekey, // key to be lookded up\\r\\n type: \\\"Bracelet\\\", // type of the key\\r\\n template: \\\"password\\\" // the variable the result will be mapped to\\r\\n };\\r\\n msg.KeyValue = cvpair;\\r\\n // commit values to receiver processor\\r\\n console.log(msg);\\r\\n // modify to return the object that contains your data\\r\\n return msg;\\r\\n\\r\\n function add_params_to_output() {\\r\\n if (!params.raw_accuracy) {\\r\\n AddValue('location_accuracy', 9000);\\r\\n } else {\\r\\n AddValue('location_accuracy', params.raw_accuracy);\\r\\n }\\r\\n // generate timestamps if they don't exist\\r\\n if (!params.event_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n if (!params.location_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n //if no lat and long are given, set them to 0, 0\\r\\n if (!params.latitude_raw) {\\r\\n AddValue('latitude', 0);\\r\\n } else {\\r\\n AddValue('latitude', params.latitude_raw);\\r\\n }\\r\\n if (!params.longitude_raw) {\\r\\n AddValue('longitude', 0);\\r\\n } else {\\r\\n AddValue('longitude', params.longitude_raw);\\r\\n }\\r\\n // if (params.temp_bracelet){\\r\\n // AddValue('oysta_labels', 'DegC');\\r\\n // AddValue('single_column_value', params.temp_bracelet);\\r\\n // }\\r\\n }\\r\\n\\r\\n function process_invent_msg() {\\r\\n const details = JSON.parse(raw);\\r\\n // AddValue('imei', details.AppId);\\r\\n AddValue('json_in', JSON.stringify(details));\\r\\n switch (details.Command) {\\r\\n case \\\"ACTIVATE_OK\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\r\\n break;\\r\\n case \\\"ACTIVATE_FAILS\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\r\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\r\\n break;\\r\\n case \\\"APPSET\\\":\\r\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\r\\n AddConfig(configIds.Password.Password, details.Data.Password);\\r\\n break;\\r\\n case \\\"CONFIG\\\":\\r\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\r\\n break;\\r\\n case \\\"CGFBR\\\":\\r\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\r\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\r\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\r\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\r\\n let commonParam = addEscapeChar(details.Data.ComPar);\\r\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\r\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\r\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\r\\n let lteParam = addEscapeChar(details.Data.LtePar);\\r\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\r\\n let bleParam = addEscapeChar(details.Data.BlePar);\\r\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\r\\n break;\\r\\n case \\\"REBOOTB\\\":\\r\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\r\\n break;\\r\\n case \\\"PWRFB\\\":\\r\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\r\\n break;\\r\\n case \\\"RESETB\\\":\\r\\n AddConfig(configIds.Bracelet.Reset, 'true');\\r\\n break;\\r\\n case \\\"BRAPWUPDATE\\\":\\r\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\r\\n // get password from old device, then set\\r\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\r\\n )\\r\\n break;\\r\\n case \\\"NOTE\\\":\\r\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\r\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\r\\n text = text.split(\\\",\\\").join(\\\" \\\");\\r\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\r\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\r\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\r\\n AddConfig(configIds.Note.Message, value)\\r\\n break;\\r\\n }\\r\\n }\\r\\n\\r\\n function addEscapeChar(json) {\\r\\n if (json === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n let jsonStr = JSON.stringify(json);\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\r\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function changeSingleQuoteToDouble(jsonStr) {\\r\\n if (jsonStr === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\r\\n outStr = outStr + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function sendMessageToLocalhost(str) {\\r\\n if (localTesting) {\\r\\n console.log(\\\"Sending message to local host: \\\" + str);\\r\\n } else {\\r\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\r\\n var c = createConnection(5878, server); // acceptance is 5678 - protocol dev 5878 - dev is 5679 ?\\r\\n c.write(`${str}`);\\r\\n c.end();\\r\\n }\\r\\n AddValue(\\\"ToLocalhost\\\", str);\\r\\n }\\r\\n\\r\\n function createConnection(port, server) {\\r\\n c = net.createConnection(port, server);\\r\\n c.on('error', function(error) {\\r\\n c = createConnection(port, server);\\r\\n });\\r\\n return c;\\r\\n }\\r\\n\\r\\n function decrypt(encdata, password) {\\r\\n var decrypted;\\r\\n var dataarray = encdata.split(\\\";\\\");\\r\\n if (dataarray.length > 5) {\\r\\n return \\\"\\\";\\r\\n }\\r\\n var i;\\r\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\r\\n if (encdata.startsWith(\\\"ACK\\\")) {\\r\\n return encdata;\\r\\n }\\r\\n for (i = 0; i < 3; i++) {\\r\\n part1 = part1 + dataarray[i] + \\\";\\\";\\r\\n }\\r\\n var mid = dataarray[2]; // use the message ID to create the salt\\r\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n // base64 decoding and extract the iv and encrypted data\\r\\n const bData = Buffer.from(enctext, 'base64');\\r\\n const iv = bData.slice(0, 16); // initial 16 chars\\r\\n const text = bData.slice(16); // all the encrypted data\\r\\n // derive key using; 32 byte key length (from salted password and mid)\\r\\n // decrypt the data in part2 and add to part1\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\r\\n try {\\r\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\r\\n } catch (err) {\\r\\n decrypted = undefined;\\r\\n }\\r\\n return decrypted;\\r\\n }\\r\\n\\r\\n function encrypt(text, mid, password) {\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n const iv = _crypto.randomBytes(16); // random initialization vector\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n // set the cipher\\r\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\r\\n // encrypt text\\r\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\r\\n // generate output ( encrypted text )\\r\\n return Buffer.concat([iv, encrypted]).toString('base64');\\r\\n }\\r\\n\\r\\n function AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n deviceParams.push(cvpair);\\r\\n }\\r\\n\\r\\n function AddConfig(configName, newvalue) {\\r\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n var cvpair = {\\r\\n 'code': configName,\\r\\n 'value': newvalue,\\r\\n 'forced': true\\r\\n };\\r\\n configsToSend.push(cvpair);\\r\\n };\\r\\n }\\r\\n\\r\\n function isASCII(str) {\\r\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\r\\n }\\r\\n\\r\\n function LookupValue(key, type, template) {\\r\\n var cvpair = {\\r\\n key: key, // key to be lookded up\\r\\n type: type, // type of the key\\r\\n template: template // the variable the result will be mapped to\\r\\n };\\r\\n msg.KeyValue = cvpair;\\r\\n }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n module.exports = {\\r\\n execute_ops\\r\\n }\\r\\n} else { // on server use local defined vars\\r\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n // define global returns\\r\\n msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1744209893},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n // Define array to push device data into. This will be put into the msg array at the end.\\r\\n var deviceParams = [];\\r\\n var configsToSend = [];\\r\\n var tasks = [];\\r\\n var devicekey = \\\"\\\";\\r\\n const _crypto = require('crypto');\\r\\n // handle ACK\\r\\n if (messageTypeCode == \\\"ACK\\\") {\\r\\n return \\\"\\\";\\r\\n }\\r\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\r\\n var password;\\r\\n if (params.imei == \\\"null\\\") {\\r\\n return msg;\\r\\n }\\r\\n password = params.imei;\\r\\n if (configs.Password.Password === \\\"\\\") {\\r\\n // use imei as default password when not specified\\r\\n } else {\\r\\n // use the password\\r\\n password = configs.Password.Password\\r\\n }\\r\\n let message = decrypt(raw, password);\\r\\n if (message) {\\r\\n // send message internally\\r\\n sendMessageToLocalhost(message);\\r\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n } else {\\r\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n }\\r\\n } else { // General Oysta Template\\r\\n switch (messageTypeLocalCode) {\\r\\n case (\\\"COMM\\\"):\\r\\n process_invent_msg(); //incoming invent commands\\r\\n break;\\r\\n case (\\\"MACB\\\"):\\r\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\r\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\r\\n add_params_to_output();\\r\\n break;\\r\\n case \\\"INFO-GETPWB\\\": // handle GETPWB message\\r\\n //let imei = params.bracelet_imei; // not actually needed ?\\r\\n //let mac = params.BLEMAC; // not actually needed ?\\r\\n //AddValue(\\\"mac\\\", params.bracelet_mac);\\r\\n //AddValue(\\\"key\\\", params.key);\\r\\n //console.log(\\\"mac: \\\" + params.bracelet_mac);\\r\\n //let BraceletPW = \\\"\\\"; // until we set it from query below\\r\\n // if(params.bracelet_imei){\\r\\n // if(serverParams.Password){\\r\\n // BraceletPW = serverParams.Password; // query key value table\\r\\n // console.log(BraceletPW); // print for testing reasons\\r\\n // AddConfig(configIds.DeviceConfig.BraceletPW, BraceletPW);//this to return the value\\r\\n // }\\r\\n // }\\r\\n // else {\\r\\n // //return error\\r\\n // }\\r\\n //AddValue(\\\"password\\\", \\\"myNewPassword\\\");\\r\\n devicekey = params.bracelet_mac;\\r\\n //LookupValue(params.ble_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n //LookupValue(params.bracelet_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n break;\\r\\n case (\\\"REGISTER\\\"):\\r\\n let ble_mac = params.ble_mac;\\r\\n let iccid = params.iccid;\\r\\n // write values to readonly settings\\r\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\r\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\r\\n // will automtaically Activate on Acceptance\\r\\n if (serverParams.EnvName) {\\r\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\r\\n }\\r\\n }\\r\\n break;\\r\\n case (\\\"CREATE\\\"):\\r\\n // temp fix to filter old messages\\r\\n // const cutoff = 1707523200000; //10.2.2024\\r\\n // let message_id_time = parseInt(params.count_number, 36);\\r\\n // if (message_id_time > cutoff){\\r\\n let c_ble_mac = params.ble_mac;\\r\\n let c_iccid = params.iccid;\\r\\n let new_imei = params.new_imei;\\r\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\r\\n // sendMessageToLocalhost(c_message); \\r\\n tasks = [{\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"sync\\\",\\r\\n \\\"type\\\": \\\"createDevice\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"imei\\\": new_imei,\\r\\n \\\"abortOnError\\\": false,\\r\\n \\\"init\\\": true\\r\\n }),\\r\\n \\\"order\\\": 1\\r\\n }, {\\r\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"async\\\",\\r\\n \\\"type\\\": \\\"sendMessage\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"message\\\": c_message\\r\\n }),\\r\\n \\\"order\\\": 2\\r\\n }]\\r\\n // }\\r\\n break;\\r\\n case (\\\"ALLDATA\\\"):\\r\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\r\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\r\\n let all_data = JSON.parse(json_str);\\r\\n if (\\\"version\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\r\\n };\\r\\n break;\\r\\n default:\\r\\n // all other general messages\\r\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\r\\n add_params_to_output();\\r\\n }\\r\\n // add messagetTypeLocal to output for templates\\r\\n AddValue('local_message_type', messageTypeLocalCode);\\r\\n }\\r\\n msg = {\\r\\n 'values': deviceParams,\\r\\n };\\r\\n if (configsToSend.length > 0) {\\r\\n msg.configsToSend = configsToSend\\r\\n };\\r\\n if (tasks.length > 0) {\\r\\n msg.tasks = tasks\\r\\n };\\r\\n var cvpair = {\\r\\n key: devicekey, // key to be lookded up\\r\\n type: \\\"Bracelet\\\", // type of the key\\r\\n template: \\\"password\\\" // the variable the result will be mapped to\\r\\n };\\r\\n msg.KeyValue = cvpair;\\r\\n // commit values to receiver processor\\r\\n console.log(msg);\\r\\n // modify to return the object that contains your data\\r\\n return msg;\\r\\n\\r\\n function add_params_to_output() {\\r\\n if (!params.raw_accuracy) {\\r\\n AddValue('location_accuracy', 9000);\\r\\n } else {\\r\\n AddValue('location_accuracy', params.raw_accuracy);\\r\\n }\\r\\n // generate timestamps if they don't exist\\r\\n if (!params.event_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n if (!params.location_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n //if no lat and long are given, set them to 0, 0\\r\\n if (!params.latitude_raw) {\\r\\n AddValue('latitude', 0);\\r\\n } else {\\r\\n AddValue('latitude', params.latitude_raw);\\r\\n }\\r\\n if (!params.longitude_raw) {\\r\\n AddValue('longitude', 0);\\r\\n } else {\\r\\n AddValue('longitude', params.longitude_raw);\\r\\n }\\r\\n // if (params.temp_bracelet){\\r\\n // AddValue('oysta_labels', 'DegC');\\r\\n // AddValue('single_column_value', params.temp_bracelet);\\r\\n // }\\r\\n }\\r\\n\\r\\n function process_invent_msg() {\\r\\n const details = JSON.parse(raw);\\r\\n // AddValue('imei', details.AppId);\\r\\n AddValue('json_in', JSON.stringify(details));\\r\\n switch (details.Command) {\\r\\n case \\\"ACTIVATE_OK\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\r\\n break;\\r\\n case \\\"ACTIVATE_FAILS\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\r\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\r\\n break;\\r\\n case \\\"APPSET\\\":\\r\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\r\\n AddConfig(configIds.Password.Password, details.Data.Password);\\r\\n break;\\r\\n case \\\"CONFIG\\\":\\r\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\r\\n break;\\r\\n case \\\"CGFBR\\\":\\r\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\r\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\r\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\r\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\r\\n let commonParam = addEscapeChar(details.Data.ComPar);\\r\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\r\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\r\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\r\\n let lteParam = addEscapeChar(details.Data.LtePar);\\r\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\r\\n let bleParam = addEscapeChar(details.Data.BlePar);\\r\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\r\\n break;\\r\\n case \\\"REBOOTB\\\":\\r\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\r\\n break;\\r\\n case \\\"PWRFB\\\":\\r\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\r\\n break;\\r\\n case \\\"RESETB\\\":\\r\\n AddConfig(configIds.Bracelet.Reset, 'true');\\r\\n break;\\r\\n case \\\"BRAPWUPDATE\\\":\\r\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\r\\n // get password from old device, then set\\r\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\r\\n )\\r\\n break;\\r\\n case \\\"NOTE\\\":\\r\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\r\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\r\\n text = text.split(\\\",\\\").join(\\\" \\\");\\r\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\r\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\r\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\r\\n AddConfig(configIds.Note.Message, value)\\r\\n break;\\r\\n }\\r\\n }\\r\\n\\r\\n function addEscapeChar(json) {\\r\\n if (json === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n let jsonStr = JSON.stringify(json);\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\r\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function changeSingleQuoteToDouble(jsonStr) {\\r\\n if (jsonStr === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\r\\n outStr = outStr + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function sendMessageToLocalhost(str) {\\r\\n if (localTesting) {\\r\\n console.log(\\\"Sending message to local host: \\\" + str);\\r\\n } else {\\r\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\r\\n var c = createConnection(5878, server); // acceptance is 5678 - protocol dev 5878 - dev is 5679 ?\\r\\n c.write(`${str}`);\\r\\n c.end();\\r\\n }\\r\\n AddValue(\\\"ToLocalhost\\\", str);\\r\\n }\\r\\n\\r\\n function createConnection(port, server) {\\r\\n c = net.createConnection(port, server);\\r\\n c.on('error', function(error) {\\r\\n c = createConnection(port, server);\\r\\n });\\r\\n return c;\\r\\n }\\r\\n\\r\\n function decrypt(encdata, password) {\\r\\n var decrypted;\\r\\n var dataarray = encdata.split(\\\";\\\");\\r\\n if (dataarray.length > 5) {\\r\\n return \\\"\\\";\\r\\n }\\r\\n var i;\\r\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\r\\n if (encdata.startsWith(\\\"ACK\\\")) {\\r\\n return encdata;\\r\\n }\\r\\n for (i = 0; i < 3; i++) {\\r\\n part1 = part1 + dataarray[i] + \\\";\\\";\\r\\n }\\r\\n var mid = dataarray[2]; // use the message ID to create the salt\\r\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n // base64 decoding and extract the iv and encrypted data\\r\\n const bData = Buffer.from(enctext, 'base64');\\r\\n const iv = bData.slice(0, 16); // initial 16 chars\\r\\n const text = bData.slice(16); // all the encrypted data\\r\\n // derive key using; 32 byte key length (from salted password and mid)\\r\\n // decrypt the data in part2 and add to part1\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\r\\n try {\\r\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\r\\n } catch (err) {\\r\\n decrypted = undefined;\\r\\n }\\r\\n return decrypted;\\r\\n }\\r\\n\\r\\n function encrypt(text, mid, password) {\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n const iv = _crypto.randomBytes(16); // random initialization vector\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n // set the cipher\\r\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\r\\n // encrypt text\\r\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\r\\n // generate output ( encrypted text )\\r\\n return Buffer.concat([iv, encrypted]).toString('base64');\\r\\n }\\r\\n\\r\\n function AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n deviceParams.push(cvpair);\\r\\n }\\r\\n\\r\\n function AddConfig(configName, newvalue) {\\r\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n var cvpair = {\\r\\n 'code': configName,\\r\\n 'value': newvalue,\\r\\n 'forced': true\\r\\n };\\r\\n configsToSend.push(cvpair);\\r\\n };\\r\\n }\\r\\n\\r\\n function isASCII(str) {\\r\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\r\\n }\\r\\n\\r\\n function LookupValue(key, type, template) {\\r\\n var cvpair = {\\r\\n key: key, // key to be lookded up\\r\\n type: type, // type of the key\\r\\n template: template // the variable the result will be mapped to\\r\\n };\\r\\n msg.KeyValue = cvpair;\\r\\n }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n module.exports = {\\r\\n execute_ops\\r\\n }\\r\\n} else { // on server use local defined vars\\r\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n // define global returns\\r\\n msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1744209994},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n // Define array to push device data into. This will be put into the msg array at the end.\\r\\n var deviceParams = [];\\r\\n var configsToSend = [];\\r\\n var tasks = [];\\r\\n //var devicekey = \\\"\\\";\\r\\n const _crypto = require('crypto');\\r\\n // handle ACK\\r\\n if (messageTypeCode == \\\"ACK\\\") {\\r\\n return \\\"\\\";\\r\\n }\\r\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\r\\n var password;\\r\\n if (params.imei == \\\"null\\\") {\\r\\n return msg;\\r\\n }\\r\\n password = params.imei;\\r\\n if (configs.Password.Password === \\\"\\\") {\\r\\n // use imei as default password when not specified\\r\\n } else {\\r\\n // use the password\\r\\n password = configs.Password.Password\\r\\n }\\r\\n let message = decrypt(raw, password);\\r\\n if (message) {\\r\\n // send message internally\\r\\n sendMessageToLocalhost(message);\\r\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n } else {\\r\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n }\\r\\n } else { // General Oysta Template\\r\\n switch (messageTypeLocalCode) {\\r\\n case (\\\"COMM\\\"):\\r\\n process_invent_msg(); //incoming invent commands\\r\\n break;\\r\\n case (\\\"MACB\\\"):\\r\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\r\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\r\\n add_params_to_output();\\r\\n break;\\r\\n case \\\"INFO-GETPWB\\\": // handle GETPWB message\\r\\n //let imei = params.bracelet_imei; // not actually needed ?\\r\\n //let mac = params.BLEMAC; // not actually needed ?\\r\\n //AddValue(\\\"mac\\\", params.bracelet_mac);\\r\\n //AddValue(\\\"key\\\", params.key);\\r\\n //console.log(\\\"mac: \\\" + params.bracelet_mac);\\r\\n //let BraceletPW = \\\"\\\"; // until we set it from query below\\r\\n // if(params.bracelet_imei){\\r\\n // if(serverParams.Password){\\r\\n // BraceletPW = serverParams.Password; // query key value table\\r\\n // console.log(BraceletPW); // print for testing reasons\\r\\n // AddConfig(configIds.DeviceConfig.BraceletPW, BraceletPW);//this to return the value\\r\\n // }\\r\\n // }\\r\\n // else {\\r\\n // //return error\\r\\n // }\\r\\n //AddValue(\\\"password\\\", \\\"myNewPassword\\\");\\r\\n //devicekey = params.bracelet_mac;\\r\\n //LookupValue(params.ble_mac, \\\"Bracelet\\\", \\\"password\\\"); \\r\\n LookupValue(params.bracelet_mac, \\\"Bracelet\\\", \\\"password\\\", msg);\\r\\n break;\\r\\n case (\\\"REGISTER\\\"):\\r\\n let ble_mac = params.ble_mac;\\r\\n let iccid = params.iccid;\\r\\n // write values to readonly settings\\r\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\r\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\r\\n // will automtaically Activate on Acceptance\\r\\n if (serverParams.EnvName) {\\r\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\r\\n }\\r\\n }\\r\\n break;\\r\\n case (\\\"CREATE\\\"):\\r\\n // temp fix to filter old messages\\r\\n // const cutoff = 1707523200000; //10.2.2024\\r\\n // let message_id_time = parseInt(params.count_number, 36);\\r\\n // if (message_id_time > cutoff){\\r\\n let c_ble_mac = params.ble_mac;\\r\\n let c_iccid = params.iccid;\\r\\n let new_imei = params.new_imei;\\r\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\r\\n // sendMessageToLocalhost(c_message); \\r\\n tasks = [{\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"sync\\\",\\r\\n \\\"type\\\": \\\"createDevice\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"imei\\\": new_imei,\\r\\n \\\"abortOnError\\\": false,\\r\\n \\\"init\\\": true\\r\\n }),\\r\\n \\\"order\\\": 1\\r\\n }, {\\r\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"async\\\",\\r\\n \\\"type\\\": \\\"sendMessage\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"message\\\": c_message\\r\\n }),\\r\\n \\\"order\\\": 2\\r\\n }]\\r\\n // }\\r\\n break;\\r\\n case (\\\"ALLDATA\\\"):\\r\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\r\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\r\\n let all_data = JSON.parse(json_str);\\r\\n if (\\\"version\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\r\\n };\\r\\n break;\\r\\n default:\\r\\n // all other general messages\\r\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\r\\n add_params_to_output();\\r\\n }\\r\\n // add messagetTypeLocal to output for templates\\r\\n AddValue('local_message_type', messageTypeLocalCode);\\r\\n }\\r\\n msg = {\\r\\n 'values': deviceParams,\\r\\n };\\r\\n if (configsToSend.length > 0) {\\r\\n msg.configsToSend = configsToSend\\r\\n };\\r\\n if (tasks.length > 0) {\\r\\n msg.tasks = tasks\\r\\n };\\r\\n //var cvpair = {\\r\\n // key: devicekey, // key to be lookded up\\r\\n // type: \\\"Bracelet\\\", // type of the key\\r\\n // template: \\\"password\\\" // the variable the result will be mapped to\\r\\n //};\\r\\n //msg.KeyValue = cvpair;\\r\\n // commit values to receiver processor\\r\\n console.log(msg);\\r\\n // modify to return the object that contains your data\\r\\n return msg;\\r\\n\\r\\n function add_params_to_output() {\\r\\n if (!params.raw_accuracy) {\\r\\n AddValue('location_accuracy', 9000);\\r\\n } else {\\r\\n AddValue('location_accuracy', params.raw_accuracy);\\r\\n }\\r\\n // generate timestamps if they don't exist\\r\\n if (!params.event_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n if (!params.location_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n //if no lat and long are given, set them to 0, 0\\r\\n if (!params.latitude_raw) {\\r\\n AddValue('latitude', 0);\\r\\n } else {\\r\\n AddValue('latitude', params.latitude_raw);\\r\\n }\\r\\n if (!params.longitude_raw) {\\r\\n AddValue('longitude', 0);\\r\\n } else {\\r\\n AddValue('longitude', params.longitude_raw);\\r\\n }\\r\\n // if (params.temp_bracelet){\\r\\n // AddValue('oysta_labels', 'DegC');\\r\\n // AddValue('single_column_value', params.temp_bracelet);\\r\\n // }\\r\\n }\\r\\n\\r\\n function process_invent_msg() {\\r\\n const details = JSON.parse(raw);\\r\\n // AddValue('imei', details.AppId);\\r\\n AddValue('json_in', JSON.stringify(details));\\r\\n switch (details.Command) {\\r\\n case \\\"ACTIVATE_OK\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\r\\n break;\\r\\n case \\\"ACTIVATE_FAILS\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\r\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\r\\n break;\\r\\n case \\\"APPSET\\\":\\r\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\r\\n AddConfig(configIds.Password.Password, details.Data.Password);\\r\\n break;\\r\\n case \\\"CONFIG\\\":\\r\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\r\\n break;\\r\\n case \\\"CGFBR\\\":\\r\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\r\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\r\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\r\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\r\\n let commonParam = addEscapeChar(details.Data.ComPar);\\r\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\r\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\r\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\r\\n let lteParam = addEscapeChar(details.Data.LtePar);\\r\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\r\\n let bleParam = addEscapeChar(details.Data.BlePar);\\r\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\r\\n break;\\r\\n case \\\"REBOOTB\\\":\\r\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\r\\n break;\\r\\n case \\\"PWRFB\\\":\\r\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\r\\n break;\\r\\n case \\\"RESETB\\\":\\r\\n AddConfig(configIds.Bracelet.Reset, 'true');\\r\\n break;\\r\\n case \\\"BRAPWUPDATE\\\":\\r\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\r\\n // get password from old device, then set\\r\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\r\\n )\\r\\n break;\\r\\n case \\\"NOTE\\\":\\r\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\r\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\r\\n text = text.split(\\\",\\\").join(\\\" \\\");\\r\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\r\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\r\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\r\\n AddConfig(configIds.Note.Message, value)\\r\\n break;\\r\\n }\\r\\n }\\r\\n\\r\\n function addEscapeChar(json) {\\r\\n if (json === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n let jsonStr = JSON.stringify(json);\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\r\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function changeSingleQuoteToDouble(jsonStr) {\\r\\n if (jsonStr === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\r\\n outStr = outStr + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function sendMessageToLocalhost(str) {\\r\\n if (localTesting) {\\r\\n console.log(\\\"Sending message to local host: \\\" + str);\\r\\n } else {\\r\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\r\\n var c = createConnection(5878, server); // acceptance is 5678 - protocol dev 5878 - dev is 5679 ?\\r\\n c.write(`${str}`);\\r\\n c.end();\\r\\n }\\r\\n AddValue(\\\"ToLocalhost\\\", str);\\r\\n }\\r\\n\\r\\n function createConnection(port, server) {\\r\\n c = net.createConnection(port, server);\\r\\n c.on('error', function(error) {\\r\\n c = createConnection(port, server);\\r\\n });\\r\\n return c;\\r\\n }\\r\\n\\r\\n function decrypt(encdata, password) {\\r\\n var decrypted;\\r\\n var dataarray = encdata.split(\\\";\\\");\\r\\n if (dataarray.length > 5) {\\r\\n return \\\"\\\";\\r\\n }\\r\\n var i;\\r\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\r\\n if (encdata.startsWith(\\\"ACK\\\")) {\\r\\n return encdata;\\r\\n }\\r\\n for (i = 0; i < 3; i++) {\\r\\n part1 = part1 + dataarray[i] + \\\";\\\";\\r\\n }\\r\\n var mid = dataarray[2]; // use the message ID to create the salt\\r\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n // base64 decoding and extract the iv and encrypted data\\r\\n const bData = Buffer.from(enctext, 'base64');\\r\\n const iv = bData.slice(0, 16); // initial 16 chars\\r\\n const text = bData.slice(16); // all the encrypted data\\r\\n // derive key using; 32 byte key length (from salted password and mid)\\r\\n // decrypt the data in part2 and add to part1\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\r\\n try {\\r\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\r\\n } catch (err) {\\r\\n decrypted = undefined;\\r\\n }\\r\\n return decrypted;\\r\\n }\\r\\n\\r\\n function encrypt(text, mid, password) {\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n const iv = _crypto.randomBytes(16); // random initialization vector\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n // set the cipher\\r\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\r\\n // encrypt text\\r\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\r\\n // generate output ( encrypted text )\\r\\n return Buffer.concat([iv, encrypted]).toString('base64');\\r\\n }\\r\\n\\r\\n function AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n deviceParams.push(cvpair);\\r\\n }\\r\\n\\r\\n function AddConfig(configName, newvalue) {\\r\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n var cvpair = {\\r\\n 'code': configName,\\r\\n 'value': newvalue,\\r\\n 'forced': true\\r\\n };\\r\\n configsToSend.push(cvpair);\\r\\n };\\r\\n }\\r\\n\\r\\n function isASCII(str) {\\r\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\r\\n }\\r\\n\\r\\n function LookupValue(key, type, template, msg) {\\r\\n var cvpair = {\\r\\n key: key, // key to be lookded up\\r\\n type: type, // type of the key\\r\\n template: template // the variable the result will be mapped to\\r\\n };\\r\\n msg.KeyValue = cvpair;\\r\\n }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n module.exports = {\\r\\n execute_ops\\r\\n }\\r\\n} else { // on server use local defined vars\\r\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n // define global returns\\r\\n msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1744210988},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n // Define array to push device data into. This will be put into the msg array at the end.\\r\\n var deviceParams = [];\\r\\n var configsToSend = [];\\r\\n var tasks = [];\\r\\n var devicekey = \\\"\\\";\\r\\n const _crypto = require('crypto');\\r\\n // handle ACK\\r\\n if (messageTypeCode == \\\"ACK\\\") {\\r\\n return \\\"\\\";\\r\\n }\\r\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\r\\n var password;\\r\\n if (params.imei == \\\"null\\\") {\\r\\n return msg;\\r\\n }\\r\\n password = params.imei;\\r\\n if (configs.Password.Password === \\\"\\\") {\\r\\n // use imei as default password when not specified\\r\\n } else {\\r\\n // use the password\\r\\n password = configs.Password.Password\\r\\n }\\r\\n let message = decrypt(raw, password);\\r\\n if (message) {\\r\\n // send message internally\\r\\n sendMessageToLocalhost(message);\\r\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n } else {\\r\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n }\\r\\n } else { // General Oysta Template\\r\\n switch (messageTypeLocalCode) {\\r\\n case (\\\"COMM\\\"):\\r\\n process_invent_msg(); //incoming invent commands\\r\\n break;\\r\\n case (\\\"MACB\\\"):\\r\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\r\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\r\\n add_params_to_output();\\r\\n break;\\r\\n case \\\"INFO-GETPWB\\\": // handle GETPWB message\\r\\n //let imei = params.bracelet_imei; // not actually needed ?\\r\\n //let mac = params.BLEMAC; // not actually needed ?\\r\\n //AddValue(\\\"mac\\\", params.bracelet_mac);\\r\\n //AddValue(\\\"key\\\", params.key);\\r\\n //console.log(\\\"mac: \\\" + params.bracelet_mac);\\r\\n //let BraceletPW = \\\"\\\"; // until we set it from query below\\r\\n // if(params.bracelet_imei){\\r\\n // if(serverParams.Password){\\r\\n // BraceletPW = serverParams.Password; // query key value table\\r\\n // console.log(BraceletPW); // print for testing reasons\\r\\n // AddConfig(configIds.DeviceConfig.BraceletPW, BraceletPW);//this to return the value\\r\\n // }\\r\\n // }\\r\\n // else {\\r\\n // //return error\\r\\n // }\\r\\n //AddValue(\\\"password\\\", \\\"myNewPassword\\\");\\r\\n devicekey = params.bracelet_mac;\\r\\n //LookupValue(params.ble_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n //LookupValue(params.bracelet_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n break;\\r\\n case (\\\"REGISTER\\\"):\\r\\n let ble_mac = params.ble_mac;\\r\\n let iccid = params.iccid;\\r\\n // write values to readonly settings\\r\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\r\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\r\\n // will automtaically Activate on Acceptance\\r\\n if (serverParams.EnvName) {\\r\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\r\\n }\\r\\n }\\r\\n break;\\r\\n case (\\\"CREATE\\\"):\\r\\n // temp fix to filter old messages\\r\\n // const cutoff = 1707523200000; //10.2.2024\\r\\n // let message_id_time = parseInt(params.count_number, 36);\\r\\n // if (message_id_time > cutoff){\\r\\n let c_ble_mac = params.ble_mac;\\r\\n let c_iccid = params.iccid;\\r\\n let new_imei = params.new_imei;\\r\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\r\\n // sendMessageToLocalhost(c_message); \\r\\n tasks = [{\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"sync\\\",\\r\\n \\\"type\\\": \\\"createDevice\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"imei\\\": new_imei,\\r\\n \\\"abortOnError\\\": false,\\r\\n \\\"init\\\": true\\r\\n }),\\r\\n \\\"order\\\": 1\\r\\n }, {\\r\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"async\\\",\\r\\n \\\"type\\\": \\\"sendMessage\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"message\\\": c_message\\r\\n }),\\r\\n \\\"order\\\": 2\\r\\n }]\\r\\n // }\\r\\n break;\\r\\n case (\\\"ALLDATA\\\"):\\r\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\r\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\r\\n let all_data = JSON.parse(json_str);\\r\\n if (\\\"version\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\r\\n };\\r\\n break;\\r\\n default:\\r\\n // all other general messages\\r\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\r\\n add_params_to_output();\\r\\n }\\r\\n // add messagetTypeLocal to output for templates\\r\\n AddValue('local_message_type', messageTypeLocalCode);\\r\\n }\\r\\n msg = {\\r\\n 'values': deviceParams,\\r\\n };\\r\\n if (configsToSend.length > 0) {\\r\\n msg.configsToSend = configsToSend\\r\\n };\\r\\n if (tasks.length > 0) {\\r\\n msg.tasks = tasks\\r\\n };\\r\\n var cvpair = {\\r\\n key: devicekey, // key to be lookded up\\r\\n type: \\\"Bracelet\\\", // type of the key\\r\\n template: \\\"password\\\" // the variable the result will be mapped to\\r\\n };\\r\\n msg.KeyValue = cvpair;\\r\\n // commit values to receiver processor\\r\\n console.log(msg);\\r\\n // modify to return the object that contains your data\\r\\n return msg;\\r\\n\\r\\n function add_params_to_output() {\\r\\n if (!params.raw_accuracy) {\\r\\n AddValue('location_accuracy', 9000);\\r\\n } else {\\r\\n AddValue('location_accuracy', params.raw_accuracy);\\r\\n }\\r\\n // generate timestamps if they don't exist\\r\\n if (!params.event_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n if (!params.location_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n //if no lat and long are given, set them to 0, 0\\r\\n if (!params.latitude_raw) {\\r\\n AddValue('latitude', 0);\\r\\n } else {\\r\\n AddValue('latitude', params.latitude_raw);\\r\\n }\\r\\n if (!params.longitude_raw) {\\r\\n AddValue('longitude', 0);\\r\\n } else {\\r\\n AddValue('longitude', params.longitude_raw);\\r\\n }\\r\\n // if (params.temp_bracelet){\\r\\n // AddValue('oysta_labels', 'DegC');\\r\\n // AddValue('single_column_value', params.temp_bracelet);\\r\\n // }\\r\\n }\\r\\n\\r\\n function process_invent_msg() {\\r\\n const details = JSON.parse(raw);\\r\\n // AddValue('imei', details.AppId);\\r\\n AddValue('json_in', JSON.stringify(details));\\r\\n switch (details.Command) {\\r\\n case \\\"ACTIVATE_OK\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\r\\n break;\\r\\n case \\\"ACTIVATE_FAILS\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\r\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\r\\n break;\\r\\n case \\\"APPSET\\\":\\r\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\r\\n AddConfig(configIds.Password.Password, details.Data.Password);\\r\\n break;\\r\\n case \\\"CONFIG\\\":\\r\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\r\\n break;\\r\\n case \\\"CGFBR\\\":\\r\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\r\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\r\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\r\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\r\\n let commonParam = addEscapeChar(details.Data.ComPar);\\r\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\r\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\r\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\r\\n let lteParam = addEscapeChar(details.Data.LtePar);\\r\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\r\\n let bleParam = addEscapeChar(details.Data.BlePar);\\r\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\r\\n break;\\r\\n case \\\"REBOOTB\\\":\\r\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\r\\n break;\\r\\n case \\\"PWRFB\\\":\\r\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\r\\n break;\\r\\n case \\\"RESETB\\\":\\r\\n AddConfig(configIds.Bracelet.Reset, 'true');\\r\\n break;\\r\\n case \\\"BRAPWUPDATE\\\":\\r\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\r\\n // get password from old device, then set\\r\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\r\\n )\\r\\n break;\\r\\n case \\\"NOTE\\\":\\r\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\r\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\r\\n text = text.split(\\\",\\\").join(\\\" \\\");\\r\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\r\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\r\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\r\\n AddConfig(configIds.Note.Message, value)\\r\\n break;\\r\\n }\\r\\n }\\r\\n\\r\\n function addEscapeChar(json) {\\r\\n if (json === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n let jsonStr = JSON.stringify(json);\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\r\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function changeSingleQuoteToDouble(jsonStr) {\\r\\n if (jsonStr === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\r\\n outStr = outStr + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function sendMessageToLocalhost(str) {\\r\\n if (localTesting) {\\r\\n console.log(\\\"Sending message to local host: \\\" + str);\\r\\n } else {\\r\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\r\\n var c = createConnection(5878, server); // acceptance is 5678 - protocol dev 5878 - dev is 5679 ?\\r\\n c.write(`${str}`);\\r\\n c.end();\\r\\n }\\r\\n AddValue(\\\"ToLocalhost\\\", str);\\r\\n }\\r\\n\\r\\n function createConnection(port, server) {\\r\\n c = net.createConnection(port, server);\\r\\n c.on('error', function(error) {\\r\\n c = createConnection(port, server);\\r\\n });\\r\\n return c;\\r\\n }\\r\\n\\r\\n function decrypt(encdata, password) {\\r\\n var decrypted;\\r\\n var dataarray = encdata.split(\\\";\\\");\\r\\n if (dataarray.length > 5) {\\r\\n return \\\"\\\";\\r\\n }\\r\\n var i;\\r\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\r\\n if (encdata.startsWith(\\\"ACK\\\")) {\\r\\n return encdata;\\r\\n }\\r\\n for (i = 0; i < 3; i++) {\\r\\n part1 = part1 + dataarray[i] + \\\";\\\";\\r\\n }\\r\\n var mid = dataarray[2]; // use the message ID to create the salt\\r\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n // base64 decoding and extract the iv and encrypted data\\r\\n const bData = Buffer.from(enctext, 'base64');\\r\\n const iv = bData.slice(0, 16); // initial 16 chars\\r\\n const text = bData.slice(16); // all the encrypted data\\r\\n // derive key using; 32 byte key length (from salted password and mid)\\r\\n // decrypt the data in part2 and add to part1\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\r\\n try {\\r\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\r\\n } catch (err) {\\r\\n decrypted = undefined;\\r\\n }\\r\\n return decrypted;\\r\\n }\\r\\n\\r\\n function encrypt(text, mid, password) {\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n const iv = _crypto.randomBytes(16); // random initialization vector\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n // set the cipher\\r\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\r\\n // encrypt text\\r\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\r\\n // generate output ( encrypted text )\\r\\n return Buffer.concat([iv, encrypted]).toString('base64');\\r\\n }\\r\\n\\r\\n function AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n deviceParams.push(cvpair);\\r\\n }\\r\\n\\r\\n function AddConfig(configName, newvalue) {\\r\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n var cvpair = {\\r\\n 'code': configName,\\r\\n 'value': newvalue,\\r\\n 'forced': true\\r\\n };\\r\\n configsToSend.push(cvpair);\\r\\n };\\r\\n }\\r\\n\\r\\n function isASCII(str) {\\r\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\r\\n }\\r\\n\\r\\n function LookupValue(key, type, template) {\\r\\n var cvpair = {\\r\\n key: key, // key to be lookded up\\r\\n type: type, // type of the key\\r\\n template: template // the variable the result will be mapped to\\r\\n };\\r\\n msg.KeyValue = cvpair;\\r\\n }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n module.exports = {\\r\\n execute_ops\\r\\n }\\r\\n} else { // on server use local defined vars\\r\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n // define global returns\\r\\n msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1744301752},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\n // Define array to push device data into. This will be put into the msg array at the end.\\n var deviceParams = [];\\n var configsToSend = [];\\n var tasks = [];\\n var keyValueQuery = undefined;\\n const _crypto = require('crypto');\\n // handle ACK\\n if (messageTypeCode == \\\"ACK\\\") {\\n return \\\"\\\";\\n }\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\n var password;\\n if (params.imei == \\\"null\\\") {\\n return msg;\\n }\\n password = params.imei;\\n if (configs.Password.Password === \\\"\\\") {\\n // use imei as default password when not specified\\n } else {\\n // use the password\\n password = configs.Password.Password\\n }\\n let message = decrypt(raw, password);\\n if (message) {\\n // send message internally\\n sendMessageToLocalhost(message);\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\n AddValue(\\\"ack\\\", ack);\\n } else {\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\n AddValue(\\\"ack\\\", ack);\\n }\\n } else { // General Oysta Template\\n switch (messageTypeLocalCode) {\\n case (\\\"COMM\\\"):\\n process_invent_msg(); //incoming invent commands\\n break;\\n case (\\\"MACB\\\"):\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\n add_params_to_output();\\n break;\\n case \\\"INFO-GETPWB\\\": // handle GETPWB message\\n let devicekey = params.bracelet_mac;\\n keyValueQuery = {\\n key: devicekey, // key to be lookded up\\n type: \\\"Bracelet\\\", // type of the key\\n template: \\\"password\\\" // the variable the result will be mapped to\\n };\\n break;\\n case (\\\"REGISTER\\\"):\\n let ble_mac = params.ble_mac;\\n let iccid = params.iccid;\\n // write values to readonly settings\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\n // will automtaically Activate on Acceptance\\n if (serverParams.EnvName) {\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\n }\\n }\\n break;\\n case (\\\"CREATE\\\"):\\n // temp fix to filter old messages\\n // const cutoff = 1707523200000; //10.2.2024\\n // let message_id_time = parseInt(params.count_number, 36);\\n // if (message_id_time > cutoff){\\n let c_ble_mac = params.ble_mac;\\n let c_iccid = params.iccid;\\n let new_imei = params.new_imei;\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\n // sendMessageToLocalhost(c_message); \\n tasks = [{\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\n \\\"option\\\": \\\"sync\\\",\\n \\\"type\\\": \\\"createDevice\\\",\\n \\\"payload\\\": JSON.stringify({\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\n \\\"imei\\\": new_imei,\\n \\\"abortOnError\\\": false,\\n \\\"init\\\": true\\n }),\\n \\\"order\\\": 1\\n }, {\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\n \\\"option\\\": \\\"async\\\",\\n \\\"type\\\": \\\"sendMessage\\\",\\n \\\"payload\\\": JSON.stringify({\\n \\\"message\\\": c_message\\n }),\\n \\\"order\\\": 2\\n }]\\n // }\\n break;\\n case (\\\"ALLDATA\\\"):\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\n let all_data = JSON.parse(json_str);\\n if (\\\"version\\\" in all_data) {\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\n };\\n break;\\n default:\\n // all other general messages\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\n add_params_to_output();\\n }\\n // add messagetTypeLocal to output for templates\\n AddValue('local_message_type', messageTypeLocalCode);\\n }\\n var msg = {\\n 'values': deviceParams,\\n };\\n if (configsToSend.length > 0) {\\n msg.configsToSend = configsToSend\\n };\\n if (tasks.length > 0) {\\n msg.tasks = tasks\\n };\\n if (keyValueQuery) {\\n msg.KeyValue = keyValueQuery\\n }\\n // commit values to receiver processor\\n console.log(msg);\\n // modify to return the object that contains your data\\n return msg;\\n\\n function add_params_to_output() {\\n if (!params.raw_accuracy) {\\n AddValue('location_accuracy', 9000);\\n } else {\\n AddValue('location_accuracy', params.raw_accuracy);\\n }\\n // generate timestamps if they don't exist\\n if (!params.event_time) {\\n AddValue('event_time', moment.utc().unix());\\n }\\n if (!params.location_time) {\\n AddValue('event_time', moment.utc().unix());\\n }\\n //if no lat and long are given, set them to 0, 0\\n if (!params.latitude_raw) {\\n AddValue('latitude', 0);\\n } else {\\n AddValue('latitude', params.latitude_raw);\\n }\\n if (!params.longitude_raw) {\\n AddValue('longitude', 0);\\n } else {\\n AddValue('longitude', params.longitude_raw);\\n }\\n // if (params.temp_bracelet){\\n // AddValue('oysta_labels', 'DegC');\\n // AddValue('single_column_value', params.temp_bracelet);\\n // }\\n }\\n\\n function process_invent_msg() {\\n const details = JSON.parse(raw);\\n // AddValue('imei', details.AppId);\\n AddValue('json_in', JSON.stringify(details));\\n switch (details.Command) {\\n case \\\"ACTIVATE_OK\\\":\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\n break;\\n case \\\"ACTIVATE_FAILS\\\":\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\n break;\\n case \\\"APPSET\\\":\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\n AddConfig(configIds.Password.Password, details.Data.Password);\\n break;\\n case \\\"CONFIG\\\":\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\n break;\\n case \\\"CGFBR\\\":\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\n let commonParam = addEscapeChar(details.Data.ComPar);\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\n let lteParam = addEscapeChar(details.Data.LtePar);\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\n let bleParam = addEscapeChar(details.Data.BlePar);\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\n break;\\n case \\\"REBOOTB\\\":\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\n break;\\n case \\\"PWRFB\\\":\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\n break;\\n case \\\"RESETB\\\":\\n AddConfig(configIds.Bracelet.Reset, 'true');\\n break;\\n case \\\"BRAPWUPDATE\\\":\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\n // get password from old device, then set\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\n )\\n break;\\n case \\\"NOTE\\\":\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\n text = text.split(\\\",\\\").join(\\\" \\\");\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\n AddConfig(configIds.Note.Message, value)\\n break;\\n }\\n }\\n\\n function addEscapeChar(json) {\\n if (json === undefined) {\\n return undefined;\\n }\\n let outStr = \\\"\\\";\\n let jsonStr = JSON.stringify(json);\\n for (let c of jsonStr) {\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\n } else {\\n outStr += c;\\n }\\n };\\n return outStr;\\n }\\n\\n function changeSingleQuoteToDouble(jsonStr) {\\n if (jsonStr === undefined) {\\n return undefined;\\n }\\n let outStr = \\\"\\\";\\n for (let c of jsonStr) {\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\n outStr = outStr + String.fromCharCode(34);\\n } else {\\n outStr += c;\\n }\\n };\\n return outStr;\\n }\\n\\n function sendMessageToLocalhost(str) {\\n if (localTesting) {\\n console.log(\\\"Sending message to local host: \\\" + str);\\n } else {\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\n var c = createConnection(5678, server); // acceptance is 5678 - protocol dev 5878 - dev is 5679 ?\\n c.write(`${str}`);\\n c.end();\\n }\\n AddValue(\\\"ToLocalhost\\\", str);\\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\\n function decrypt(encdata, password) {\\n var decrypted;\\n var dataarray = encdata.split(\\\";\\\");\\n if (dataarray.length > 5) {\\n return \\\"\\\";\\n }\\n var i;\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\n if (encdata.startsWith(\\\"ACK\\\")) {\\n return encdata;\\n }\\n for (i = 0; i < 3; i++) {\\n part1 = part1 + dataarray[i] + \\\";\\\";\\n }\\n var mid = dataarray[2]; // use the message ID to create the salt\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n // base64 decoding and extract the iv and encrypted data\\n const bData = Buffer.from(enctext, 'base64');\\n const iv = bData.slice(0, 16); // initial 16 chars\\n const text = bData.slice(16); // all the encrypted data\\n // derive key using; 32 byte key length (from salted password and mid)\\n // decrypt the data in part2 and add to part1\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\n try {\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\n } catch (err) {\\n decrypted = undefined;\\n }\\n return decrypted;\\n }\\n\\n function encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n }\\n\\n function AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n deviceParams.push(cvpair);\\n }\\n\\n function AddConfig(configName, newvalue) {\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\n var cvpair = {\\n 'code': configName,\\n 'value': newvalue,\\n 'forced': true\\n };\\n configsToSend.push(cvpair);\\n };\\n }\\n\\n function isASCII(str) {\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\n }\\n}\\n// params is not defined locally -> export as module\\nif (typeof(params) === 'undefined') {\\n module.exports = {\\n execute_ops\\n }\\n} else { // on server use local defined vars\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\n // define global returns\\n msg = return_values;\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1747753380},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n // Define array to push device data into. This will be put into the msg array at the end.\\r\\n var deviceParams = [];\\r\\n var configsToSend = [];\\r\\n var tasks = [];\\r\\n var keyValueQuery = undefined;\\r\\n const _crypto = require('crypto');\\r\\n // handle ACK\\r\\n if (messageTypeCode == \\\"ACK\\\") {\\r\\n return \\\"\\\";\\r\\n }\\r\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\r\\n var password;\\r\\n if (params.imei == \\\"null\\\") {\\r\\n return msg;\\r\\n }\\r\\n password = params.imei;\\r\\n if (configs.Password.Password === \\\"\\\") {\\r\\n // use imei as default password when not specified\\r\\n } else {\\r\\n // use the password\\r\\n password = configs.Password.Password\\r\\n }\\r\\n let message = decrypt(raw, password);\\r\\n if (message) {\\r\\n // send message internally\\r\\n sendMessageToLocalhost(message);\\r\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n } else {\\r\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n }\\r\\n } else { // General Oysta Template\\r\\n switch (messageTypeLocalCode) {\\r\\n case (\\\"COMM\\\"):\\r\\n process_invent_msg(); //incoming invent commands\\r\\n break;\\r\\n case (\\\"MACB\\\"):\\r\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\r\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\r\\n add_params_to_output();\\r\\n break;\\r\\n case \\\"INFO-GETPWB\\\": // handle GETPWB message\\r\\n let devicekey = params.bracelet_mac;\\r\\n keyValueQuery = {\\r\\n key: devicekey, // key to be lookded up\\r\\n type: \\\"Bracelet\\\", // type of the key\\r\\n template: \\\"password\\\" // the variable the result will be mapped to\\r\\n };\\r\\n break;\\r\\n case (\\\"REGISTER\\\"):\\r\\n let ble_mac = params.ble_mac;\\r\\n let iccid = params.iccid;\\r\\n // write values to readonly settings\\r\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\r\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\r\\n // will automtaically Activate on Acceptance\\r\\n if (serverParams.EnvName) {\\r\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\r\\n }\\r\\n }\\r\\n break;\\r\\n case (\\\"CREATE\\\"):\\r\\n // temp fix to filter old messages\\r\\n // const cutoff = 1707523200000; //10.2.2024\\r\\n // let message_id_time = parseInt(params.count_number, 36);\\r\\n // if (message_id_time > cutoff){\\r\\n let c_ble_mac = params.ble_mac;\\r\\n let c_iccid = params.iccid;\\r\\n let new_imei = params.new_imei;\\r\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\r\\n // sendMessageToLocalhost(c_message); \\r\\n tasks = [{\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"sync\\\",\\r\\n \\\"type\\\": \\\"createDevice\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"imei\\\": new_imei,\\r\\n \\\"abortOnError\\\": false,\\r\\n \\\"init\\\": true\\r\\n }),\\r\\n \\\"order\\\": 1\\r\\n }, {\\r\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"async\\\",\\r\\n \\\"type\\\": \\\"sendMessage\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"message\\\": c_message\\r\\n }),\\r\\n \\\"order\\\": 2\\r\\n }]\\r\\n // }\\r\\n break;\\r\\n case (\\\"ALLDATA\\\"):\\r\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\r\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\r\\n let all_data = JSON.parse(json_str);\\r\\n if (\\\"version\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\r\\n };\\r\\n if (\\\"backgroundLocation\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.BackgroundLocation, all_data.backgroundLocation);\\r\\n };\\r\\n if (\\\"coarseLocation\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.CoarseLocation, all_data.coarseLocation);\\r\\n };\\r\\n if (\\\"fineLocation\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.FineLocation, all_data.fineLocation);\\r\\n };\\r\\n break;\\r\\n default:\\r\\n // all other general messages\\r\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\r\\n add_params_to_output();\\r\\n }\\r\\n // add messagetTypeLocal to output for templates\\r\\n AddValue('local_message_type', messageTypeLocalCode);\\r\\n }\\r\\n var msg = {\\r\\n 'values': deviceParams,\\r\\n };\\r\\n if (configsToSend.length > 0) {\\r\\n msg.configsToSend = configsToSend\\r\\n };\\r\\n if (tasks.length > 0) {\\r\\n msg.tasks = tasks\\r\\n };\\r\\n if (keyValueQuery) {\\r\\n msg.KeyValue = keyValueQuery\\r\\n }\\r\\n // commit values to receiver processor\\r\\n console.log(msg);\\r\\n // modify to return the object that contains your data\\r\\n return msg;\\r\\n\\r\\n function add_params_to_output() {\\r\\n if (!params.raw_accuracy) {\\r\\n AddValue('location_accuracy', 9000);\\r\\n } else {\\r\\n AddValue('location_accuracy', params.raw_accuracy);\\r\\n }\\r\\n // generate timestamps if they don't exist\\r\\n if (!params.event_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n if (!params.location_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n //if no lat and long are given, set them to 0, 0\\r\\n if (!params.latitude_raw) {\\r\\n AddValue('latitude', 0);\\r\\n } else {\\r\\n AddValue('latitude', params.latitude_raw);\\r\\n }\\r\\n if (!params.longitude_raw) {\\r\\n AddValue('longitude', 0);\\r\\n } else {\\r\\n AddValue('longitude', params.longitude_raw);\\r\\n }\\r\\n // if (params.temp_bracelet){\\r\\n // AddValue('oysta_labels', 'DegC');\\r\\n // AddValue('single_column_value', params.temp_bracelet);\\r\\n // }\\r\\n }\\r\\n\\r\\n function process_invent_msg() {\\r\\n const details = JSON.parse(raw);\\r\\n // AddValue('imei', details.AppId);\\r\\n AddValue('json_in', JSON.stringify(details));\\r\\n switch (details.Command) {\\r\\n case \\\"ACTIVATE_OK\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\r\\n break;\\r\\n case \\\"ACTIVATE_FAILS\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\r\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\r\\n break;\\r\\n case \\\"APPSET\\\":\\r\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\r\\n AddConfig(configIds.Password.Password, details.Data.Password);\\r\\n break;\\r\\n case \\\"CONFIG\\\":\\r\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\r\\n break;\\r\\n case \\\"CGFBR\\\":\\r\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\r\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\r\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\r\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\r\\n let commonParam = addEscapeChar(details.Data.ComPar);\\r\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\r\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\r\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\r\\n let lteParam = addEscapeChar(details.Data.LtePar);\\r\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\r\\n let bleParam = addEscapeChar(details.Data.BlePar);\\r\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\r\\n break;\\r\\n case \\\"REBOOTB\\\":\\r\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\r\\n break;\\r\\n case \\\"PWRFB\\\":\\r\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\r\\n break;\\r\\n case \\\"RESETB\\\":\\r\\n AddConfig(configIds.Bracelet.Reset, 'true');\\r\\n break;\\r\\n case \\\"BRAPWUPDATE\\\":\\r\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\r\\n // get password from old device, then set\\r\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\r\\n )\\r\\n break;\\r\\n case \\\"NOTE\\\":\\r\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\r\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\r\\n text = text.split(\\\",\\\").join(\\\" \\\");\\r\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\r\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\r\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\r\\n AddConfig(configIds.Note.Message, value)\\r\\n break;\\r\\n }\\r\\n }\\r\\n\\r\\n function addEscapeChar(json) {\\r\\n if (json === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n let jsonStr = JSON.stringify(json);\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\r\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function changeSingleQuoteToDouble(jsonStr) {\\r\\n if (jsonStr === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\r\\n outStr = outStr + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function sendMessageToLocalhost(str) {\\r\\n if (localTesting) {\\r\\n console.log(\\\"Sending message to local host: \\\" + str);\\r\\n } else {\\r\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\r\\n var c = createConnection(5678, server); // acceptance is 5678 - protocol dev 5878 - dev is 5679 ?\\r\\n c.write(`${str}`);\\r\\n c.end();\\r\\n }\\r\\n AddValue(\\\"ToLocalhost\\\", str);\\r\\n }\\r\\n\\r\\n function createConnection(port, server) {\\r\\n c = net.createConnection(port, server);\\r\\n c.on('error', function(error) {\\r\\n c = createConnection(port, server);\\r\\n });\\r\\n return c;\\r\\n }\\r\\n\\r\\n function decrypt(encdata, password) {\\r\\n var decrypted;\\r\\n var dataarray = encdata.split(\\\";\\\");\\r\\n if (dataarray.length > 5) {\\r\\n return \\\"\\\";\\r\\n }\\r\\n var i;\\r\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\r\\n if (encdata.startsWith(\\\"ACK\\\")) {\\r\\n return encdata;\\r\\n }\\r\\n for (i = 0; i < 3; i++) {\\r\\n part1 = part1 + dataarray[i] + \\\";\\\";\\r\\n }\\r\\n var mid = dataarray[2]; // use the message ID to create the salt\\r\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n // base64 decoding and extract the iv and encrypted data\\r\\n const bData = Buffer.from(enctext, 'base64');\\r\\n const iv = bData.slice(0, 16); // initial 16 chars\\r\\n const text = bData.slice(16); // all the encrypted data\\r\\n // derive key using; 32 byte key length (from salted password and mid)\\r\\n // decrypt the data in part2 and add to part1\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\r\\n try {\\r\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\r\\n } catch (err) {\\r\\n decrypted = undefined;\\r\\n }\\r\\n return decrypted;\\r\\n }\\r\\n\\r\\n function encrypt(text, mid, password) {\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n const iv = _crypto.randomBytes(16); // random initialization vector\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n // set the cipher\\r\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\r\\n // encrypt text\\r\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\r\\n // generate output ( encrypted text )\\r\\n return Buffer.concat([iv, encrypted]).toString('base64');\\r\\n }\\r\\n\\r\\n function AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n deviceParams.push(cvpair);\\r\\n }\\r\\n\\r\\n function AddConfig(configName, newvalue) {\\r\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n var cvpair = {\\r\\n 'code': configName,\\r\\n 'value': newvalue,\\r\\n 'forced': true\\r\\n };\\r\\n configsToSend.push(cvpair);\\r\\n };\\r\\n }\\r\\n\\r\\n function isASCII(str) {\\r\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\r\\n }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n module.exports = {\\r\\n execute_ops\\r\\n }\\r\\n} else { // on server use local defined vars\\r\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n // define global returns\\r\\n msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1751382743},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n // Define array to push device data into. This will be put into the msg array at the end.\\r\\n var deviceParams = [];\\r\\n var configsToSend = [];\\r\\n var tasks = [];\\r\\n var keyValueQuery = undefined;\\r\\n const _crypto = require('crypto');\\r\\n // handle ACK\\r\\n if (messageTypeCode == \\\"ACK\\\") {\\r\\n return \\\"\\\";\\r\\n }\\r\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\r\\n var password;\\r\\n if (params.imei == \\\"null\\\") {\\r\\n return msg;\\r\\n }\\r\\n password = params.imei;\\r\\n if (configs.Password.Password === \\\"\\\") {\\r\\n // use imei as default password when not specified\\r\\n } else {\\r\\n // use the password\\r\\n password = configs.Password.Password\\r\\n }\\r\\n let message = decrypt(raw, password);\\r\\n if (message) {\\r\\n // send message internally\\r\\n sendMessageToLocalhost(message);\\r\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n } else {\\r\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n }\\r\\n } else { // General Oysta Template\\r\\n switch (messageTypeLocalCode) {\\r\\n case (\\\"COMM\\\"):\\r\\n process_invent_msg(); //incoming invent commands\\r\\n break;\\r\\n case (\\\"MACB\\\"):\\r\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\r\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\r\\n add_params_to_output();\\r\\n break;\\r\\n case \\\"INFO-GETPWB\\\": // handle GETPWB message\\r\\n let devicekey = params.bracelet_mac;\\r\\n keyValueQuery = {\\r\\n key: devicekey, // key to be lookded up\\r\\n type: \\\"Bracelet\\\", // type of the key\\r\\n template: \\\"password\\\" // the variable the result will be mapped to\\r\\n };\\r\\n break;\\r\\n case (\\\"REGISTER\\\"):\\r\\n let ble_mac = params.ble_mac;\\r\\n let iccid = params.iccid;\\r\\n // write values to readonly settings\\r\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\r\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\r\\n // will automtaically Activate on Acceptance\\r\\n if (serverParams.EnvName) {\\r\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\r\\n }\\r\\n }\\r\\n break;\\r\\n case (\\\"CREATE\\\"):\\r\\n // temp fix to filter old messages\\r\\n // const cutoff = 1707523200000; //10.2.2024\\r\\n // let message_id_time = parseInt(params.count_number, 36);\\r\\n // if (message_id_time > cutoff){\\r\\n let c_ble_mac = params.ble_mac;\\r\\n let c_iccid = params.iccid;\\r\\n let new_imei = params.new_imei;\\r\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\r\\n // sendMessageToLocalhost(c_message); \\r\\n tasks = [{\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"sync\\\",\\r\\n \\\"type\\\": \\\"createDevice\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"imei\\\": new_imei,\\r\\n \\\"abortOnError\\\": false,\\r\\n \\\"init\\\": true\\r\\n }),\\r\\n \\\"order\\\": 1\\r\\n }, {\\r\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"async\\\",\\r\\n \\\"type\\\": \\\"sendMessage\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"message\\\": c_message\\r\\n }),\\r\\n \\\"order\\\": 2\\r\\n }]\\r\\n // }\\r\\n break;\\r\\n case (\\\"ALLDATA\\\"):\\r\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\r\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\r\\n let all_data = JSON.parse(json_str);\\r\\n if (\\\"version\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\r\\n };\\r\\n if (\\\"backgroundLocation\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.BackgroundLocation, all_data.backgroundLocation);\\r\\n };\\r\\n if (\\\"coarseLocation\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.CoarseLocation, all_data.coarseLocation);\\r\\n };\\r\\n if (\\\"fineLocation\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.FineLocation, all_data.fineLocation);\\r\\n };\\r\\n if (\\\"restarts\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.Restarts, all_data.restarts);\\r\\n };\\r\\n if (\\\"mtbr\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.MTBR, all_data.mtbr);\\r\\n };\\r\\n break;\\r\\n default:\\r\\n // all other general messages\\r\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\r\\n add_params_to_output();\\r\\n }\\r\\n // add messagetTypeLocal to output for templates\\r\\n AddValue('local_message_type', messageTypeLocalCode);\\r\\n }\\r\\n var msg = {\\r\\n 'values': deviceParams,\\r\\n };\\r\\n if (configsToSend.length > 0) {\\r\\n msg.configsToSend = configsToSend\\r\\n };\\r\\n if (tasks.length > 0) {\\r\\n msg.tasks = tasks\\r\\n };\\r\\n if (keyValueQuery) {\\r\\n msg.KeyValue = keyValueQuery\\r\\n }\\r\\n // commit values to receiver processor\\r\\n console.log(msg);\\r\\n // modify to return the object that contains your data\\r\\n return msg;\\r\\n\\r\\n function add_params_to_output() {\\r\\n if (!params.raw_accuracy) {\\r\\n AddValue('location_accuracy', 9000);\\r\\n } else {\\r\\n AddValue('location_accuracy', params.raw_accuracy);\\r\\n }\\r\\n // generate timestamps if they don't exist\\r\\n if (!params.event_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n if (!params.location_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n //if no lat and long are given, set them to 0, 0\\r\\n if (!params.latitude_raw) {\\r\\n AddValue('latitude', 0);\\r\\n } else {\\r\\n AddValue('latitude', params.latitude_raw);\\r\\n }\\r\\n if (!params.longitude_raw) {\\r\\n AddValue('longitude', 0);\\r\\n } else {\\r\\n AddValue('longitude', params.longitude_raw);\\r\\n }\\r\\n // if (params.temp_bracelet){\\r\\n // AddValue('oysta_labels', 'DegC');\\r\\n // AddValue('single_column_value', params.temp_bracelet);\\r\\n // }\\r\\n }\\r\\n\\r\\n function process_invent_msg() {\\r\\n const details = JSON.parse(raw);\\r\\n // AddValue('imei', details.AppId);\\r\\n AddValue('json_in', JSON.stringify(details));\\r\\n switch (details.Command) {\\r\\n case \\\"ACTIVATE_OK\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\r\\n break;\\r\\n case \\\"ACTIVATE_FAILS\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\r\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\r\\n break;\\r\\n case \\\"APPSET\\\":\\r\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\r\\n AddConfig(configIds.Password.Password, details.Data.Password);\\r\\n break;\\r\\n case \\\"CONFIG\\\":\\r\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\r\\n break;\\r\\n case \\\"CGFBR\\\":\\r\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\r\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\r\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\r\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\r\\n let commonParam = addEscapeChar(details.Data.ComPar);\\r\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\r\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\r\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\r\\n let lteParam = addEscapeChar(details.Data.LtePar);\\r\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\r\\n let bleParam = addEscapeChar(details.Data.BlePar);\\r\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\r\\n break;\\r\\n case \\\"REBOOTB\\\":\\r\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\r\\n break;\\r\\n case \\\"PWRFB\\\":\\r\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\r\\n break;\\r\\n case \\\"RESETB\\\":\\r\\n AddConfig(configIds.Bracelet.Reset, 'true');\\r\\n break;\\r\\n case \\\"BRAPWUPDATE\\\":\\r\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\r\\n // get password from old device, then set\\r\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\r\\n )\\r\\n break;\\r\\n case \\\"NOTE\\\":\\r\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\r\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\r\\n text = text.split(\\\",\\\").join(\\\" \\\");\\r\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\r\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\r\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\r\\n AddConfig(configIds.Note.Message, value)\\r\\n break;\\r\\n }\\r\\n }\\r\\n\\r\\n function addEscapeChar(json) {\\r\\n if (json === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n let jsonStr = JSON.stringify(json);\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\r\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function changeSingleQuoteToDouble(jsonStr) {\\r\\n if (jsonStr === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\r\\n outStr = outStr + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function sendMessageToLocalhost(str) {\\r\\n if (localTesting) {\\r\\n console.log(\\\"Sending message to local host: \\\" + str);\\r\\n } else {\\r\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\r\\n var c = createConnection(5678, server); // acceptance is 5678 - protocol dev 5878 - dev is 5679 ?\\r\\n c.write(`${str}`);\\r\\n c.end();\\r\\n }\\r\\n AddValue(\\\"ToLocalhost\\\", str);\\r\\n }\\r\\n\\r\\n function createConnection(port, server) {\\r\\n c = net.createConnection(port, server);\\r\\n c.on('error', function(error) {\\r\\n c = createConnection(port, server);\\r\\n });\\r\\n return c;\\r\\n }\\r\\n\\r\\n function decrypt(encdata, password) {\\r\\n var decrypted;\\r\\n var dataarray = encdata.split(\\\";\\\");\\r\\n if (dataarray.length > 5) {\\r\\n return \\\"\\\";\\r\\n }\\r\\n var i;\\r\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\r\\n if (encdata.startsWith(\\\"ACK\\\")) {\\r\\n return encdata;\\r\\n }\\r\\n for (i = 0; i < 3; i++) {\\r\\n part1 = part1 + dataarray[i] + \\\";\\\";\\r\\n }\\r\\n var mid = dataarray[2]; // use the message ID to create the salt\\r\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n // base64 decoding and extract the iv and encrypted data\\r\\n const bData = Buffer.from(enctext, 'base64');\\r\\n const iv = bData.slice(0, 16); // initial 16 chars\\r\\n const text = bData.slice(16); // all the encrypted data\\r\\n // derive key using; 32 byte key length (from salted password and mid)\\r\\n // decrypt the data in part2 and add to part1\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\r\\n try {\\r\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\r\\n } catch (err) {\\r\\n decrypted = undefined;\\r\\n }\\r\\n return decrypted;\\r\\n }\\r\\n\\r\\n function encrypt(text, mid, password) {\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n const iv = _crypto.randomBytes(16); // random initialization vector\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n // set the cipher\\r\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\r\\n // encrypt text\\r\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\r\\n // generate output ( encrypted text )\\r\\n return Buffer.concat([iv, encrypted]).toString('base64');\\r\\n }\\r\\n\\r\\n function AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n deviceParams.push(cvpair);\\r\\n }\\r\\n\\r\\n function AddConfig(configName, newvalue) {\\r\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n var cvpair = {\\r\\n 'code': configName,\\r\\n 'value': newvalue,\\r\\n 'forced': true\\r\\n };\\r\\n configsToSend.push(cvpair);\\r\\n };\\r\\n }\\r\\n\\r\\n function isASCII(str) {\\r\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\r\\n }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n module.exports = {\\r\\n execute_ops\\r\\n }\\r\\n} else { // on server use local defined vars\\r\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n // define global returns\\r\\n msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1751555375}]}],"Groups":[{"Id":5624,"Parent":null,"Name":"Settings","Json":"{\"description\":null,\"columns\":2,\"order\":3,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":5625,"Parent":null,"Name":"Admin config","Json":"{ \"description\": \"Admin config\", \"columns\": 2, \"order\": 1, \"listSize\": 1, \"toTranslate\": [ \"name\", \"description\" ]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":5626,"Parent":null,"Name":"Actions","Json":"{\"description\":\"Power off, real time locate etc.\",\"columns\":1,\"order\":4,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":5627,"Parent":null,"Name":"Notification","Json":"{\"description\":null,\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":5628,"Parent":null,"Name":"Not Implemented","Json":"{\"description\":null,\"columns\":1,\"order\":5,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":5629,"Parent":{"Id":5625,"Name":"Admin config","Json":{"description":"Admin config","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[{"Id":5629,"Name":"DeviceConfig","Json":{"description":"Reset the device with default factory values","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]},{"Id":5630,"Name":"Password","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"DeviceConfig","Json":"{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":5630,"Parent":{"Id":5625,"Name":"Admin config","Json":{"description":"Admin config","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[{"Id":5629,"Name":"DeviceConfig","Json":{"description":"Reset the device with default factory values","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]},{"Id":5630,"Name":"Password","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"Password","Json":"{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":5631,"Parent":{"Id":5624,"Name":"Settings","Json":{"description":null,"columns":2,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5631,"Name":"Cycle Interval","Json":{"description":"Define the period for which the device should send regular location updates, and how frequent those updates are.","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5632,"Name":"Battery alerts","Json":{"description":"Battery alerts","columns":1,"order":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5633,"Name":"Bracelet","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"Cycle Interval","Json":"{ \"description\": \"Define the period for which the device should send regular location updates, and how frequent those updates are.\", \"columns\": 1, \"order\": 2, \"listSize\": 1, \"toTranslate\": [ \"name\", \"description\" ]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":5632,"Parent":{"Id":5624,"Name":"Settings","Json":{"description":null,"columns":2,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5631,"Name":"Cycle Interval","Json":{"description":"Define the period for which the device should send regular location updates, and how frequent those updates are.","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5632,"Name":"Battery alerts","Json":{"description":"Battery alerts","columns":1,"order":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5633,"Name":"Bracelet","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"Battery alerts","Json":"{ \"description\": \"Battery alerts\", \"columns\": 1, \"order\": 5, \"toTranslate\": [ \"name\", \"description\" ]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":5633,"Parent":{"Id":5624,"Name":"Settings","Json":{"description":null,"columns":2,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5631,"Name":"Cycle Interval","Json":{"description":"Define the period for which the device should send regular location updates, and how frequent those updates are.","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5632,"Name":"Battery alerts","Json":{"description":"Battery alerts","columns":1,"order":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5633,"Name":"Bracelet","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"Bracelet","Json":"{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":5634,"Parent":{"Id":5628,"Name":"Not Implemented","Json":{"description":null,"columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5634,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5635,"Name":"Non Movement","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5636,"Name":"Real Time Locate","Json":{"description":"Real Time Locate","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5637,"Name":"Set Server","Json":{"description":"Set Server","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]}]},"Name":"No Activity","Json":"{\"description\":\"No Activity\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":5635,"Parent":{"Id":5628,"Name":"Not Implemented","Json":{"description":null,"columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5634,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5635,"Name":"Non Movement","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5636,"Name":"Real Time Locate","Json":{"description":"Real Time Locate","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5637,"Name":"Set Server","Json":{"description":"Set Server","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]}]},"Name":"Non Movement","Json":"{\"description\":\"\",\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":5636,"Parent":{"Id":5628,"Name":"Not Implemented","Json":{"description":null,"columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5634,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5635,"Name":"Non Movement","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5636,"Name":"Real Time Locate","Json":{"description":"Real Time Locate","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5637,"Name":"Set Server","Json":{"description":"Set Server","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]}]},"Name":"Real Time Locate","Json":"{\"description\":\"Real Time Locate\",\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":5637,"Parent":{"Id":5628,"Name":"Not Implemented","Json":{"description":null,"columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5634,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5635,"Name":"Non Movement","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5636,"Name":"Real Time Locate","Json":{"description":"Real Time Locate","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5637,"Name":"Set Server","Json":{"description":"Set Server","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]}]},"Name":"Set Server","Json":"{\"description\":\"Set Server\",\"columns\":1,\"order\":4,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":5638,"Parent":{"Id":5627,"Name":"Notification","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5638,"Name":"Note","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"Note","Json":"{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]}],"GroupParams":[{"Id":9692,"Group":{"Id":5629,"Name":"DeviceConfig","Json":{"description":"Reset the device with default factory values","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5625,"Name":"Admin config","Json":{"description":"Admin config","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[{"Id":5630,"Name":"Password","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]},"Name":"IV ActivatedFailMessage","Json":"{\"name\":\"IV ActivatedFailMessage\",\"default\":\"\",\"description\":\"Reason for Activation Failure\",\"type\":\"text\",\"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\":6}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":9692,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"IV ActivatedFailMessage\",\"Json\":\"{\\\"name\\\":\\\"IV ActivatedFailMessage\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Reason for Activation Failure\\\",\\\"type\\\":\\\"text\\\",\\\"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\\\":7}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1714640806},{"Type":1,"NewValue":"{\"Id\":9692,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"IV ActivatedFailMessage\",\"Json\":\"{\\\"name\\\":\\\"IV ActivatedFailMessage\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Reason for Activation Failure\\\",\\\"type\\\":\\\"text\\\",\\\"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\\\":10}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751967276},{"Type":1,"NewValue":"{\"Id\":9692,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"IV ActivatedFailMessage\",\"Json\":\"{\\\"name\\\":\\\"IV ActivatedFailMessage\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Reason for Activation Failure\\\",\\\"type\\\":\\\"text\\\",\\\"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\\\":9}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751977808},{"Type":1,"NewValue":"{\"Id\":9692,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"IV ActivatedFailMessage\",\"Json\":\"{\\\"name\\\":\\\"IV ActivatedFailMessage\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Reason for Activation Failure\\\",\\\"type\\\":\\\"text\\\",\\\"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\\\":8}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751977963}],"LanguageId":null,"Tags":[]},{"Id":9689,"Group":{"Id":5629,"Name":"DeviceConfig","Json":{"description":"Reset the device with default factory values","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5625,"Name":"Admin config","Json":{"description":"Admin config","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[{"Id":5630,"Name":"Password","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]},"Name":"ICCID","Json":"{\"name\":\"ICCID\",\"default\":\"\",\"description\":\"SIM ICCID\",\"type\":\"text\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"The ICCID of hte phones SIM card.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":4}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":9689,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"ICCID\",\"Json\":\"{\\\"name\\\":\\\"ICCID\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"SIM ICCID\\\",\\\"type\\\":\\\"text\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":true,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"The ICCID of hte phones SIM card.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":5}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1714640798},{"Type":1,"NewValue":"{\"Id\":9689,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"ICCID\",\"Json\":\"{\\\"name\\\":\\\"ICCID\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"SIM ICCID\\\",\\\"type\\\":\\\"text\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":true,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"The ICCID of hte phones SIM card.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":8}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751967270},{"Type":1,"NewValue":"{\"Id\":9689,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"ICCID\",\"Json\":\"{\\\"name\\\":\\\"ICCID\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"SIM ICCID\\\",\\\"type\\\":\\\"text\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":true,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"The ICCID of hte phones SIM card.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":7}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751977804},{"Type":1,"NewValue":"{\"Id\":9689,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"ICCID\",\"Json\":\"{\\\"name\\\":\\\"ICCID\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"SIM ICCID\\\",\\\"type\\\":\\\"text\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":true,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"The ICCID of hte phones SIM card.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":6}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751977958}],"LanguageId":null,"Tags":[]},{"Id":9690,"Group":{"Id":5629,"Name":"DeviceConfig","Json":{"description":"Reset the device with default factory values","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5625,"Name":"Admin config","Json":{"description":"Admin config","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[{"Id":5630,"Name":"Password","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]},"Name":"IV Activated","Json":"{\"name\":\"IV Activated\",\"default\":\"false\",\"description\":\"Invent Activated ok\",\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Flag that is set when the Invent platform has acknowledged the activation of the device.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":5}","Default":"true","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":9690,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"IV Activated\",\"Json\":\"{\\\"name\\\":\\\"IV Activated\\\",\\\"default\\\":\\\"false\\\",\\\"description\\\":\\\"Invent Activated ok\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Flag that is set when the Invent platform has acknowledged the activation of the device.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":6}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1714640801},{"Type":1,"NewValue":"{\"Id\":9690,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"IV Activated\",\"Json\":\"{\\\"name\\\":\\\"IV Activated\\\",\\\"default\\\":\\\"false\\\",\\\"description\\\":\\\"Invent Activated ok\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Flag that is set when the Invent platform has acknowledged the activation of the device.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":9}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751967273},{"Type":1,"NewValue":"{\"Id\":9690,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"IV Activated\",\"Json\":\"{\\\"name\\\":\\\"IV Activated\\\",\\\"default\\\":\\\"false\\\",\\\"description\\\":\\\"Invent Activated ok\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Flag that is set when the Invent platform has acknowledged the activation of the device.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":8}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751977806},{"Type":1,"NewValue":"{\"Id\":9690,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"IV Activated\",\"Json\":\"{\\\"name\\\":\\\"IV Activated\\\",\\\"default\\\":\\\"false\\\",\\\"description\\\":\\\"Invent Activated ok\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Flag that is set when the Invent platform has acknowledged the activation of the device.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":7}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751977961}],"LanguageId":null,"Tags":[]},{"Id":9691,"Group":{"Id":5629,"Name":"DeviceConfig","Json":{"description":"Reset the device with default factory values","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5625,"Name":"Admin config","Json":{"description":"Admin config","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[{"Id":5630,"Name":"Password","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]},"Name":"Config Mode","Json":"{\"name\":\"Config Mode\",\"default\":\"\",\"description\":\"Config Mode\",\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Enables Config mode on in the app to show additional actions and buttons.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":3}","Default":"false","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":9691,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Config Mode\",\"Json\":\"{\\\"name\\\":\\\"Config Mode\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Config Mode\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Enables Config mode on in the app to show additional actions and buttons.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":4}\",\"Default\":\"false\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1714640794},{"Type":1,"NewValue":"{\"Id\":9691,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Config Mode\",\"Json\":\"{\\\"name\\\":\\\"Config Mode\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Config Mode\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Enables Config mode on in the app to show additional actions and buttons.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":5}\",\"Default\":\"false\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751967261},{"Type":1,"NewValue":"{\"Id\":9691,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Config Mode\",\"Json\":\"{\\\"name\\\":\\\"Config Mode\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Config Mode\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Enables Config mode on in the app to show additional actions and buttons.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":4}\",\"Default\":\"false\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751968957}],"LanguageId":null,"Tags":[]},{"Id":9693,"Group":{"Id":5629,"Name":"DeviceConfig","Json":{"description":"Reset the device with default factory values","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5625,"Name":"Admin config","Json":{"description":"Admin config","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[{"Id":5630,"Name":"Password","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]},"Name":"DisableAck","Json":"{\"name\":\"DisableAck\",\"default\":\"\",\"description\":\"Disable Ack\",\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Disable Acks for testing to simulate IntelliCare failure.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":8}","Default":"false","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":9693,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"DisableAck\",\"Json\":\"{\\\"name\\\":\\\"DisableAck\\\",\\\"default\\\":\\\"false\\\",\\\"description\\\":\\\"Disable Ack\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Disable Acks for testing to simulate IntelliCare failure.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1714640747},{"Type":1,"NewValue":"{\"Id\":9693,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"DisableAck\",\"Json\":\"{\\\"name\\\":\\\"DisableAck\\\",\\\"default\\\":\\\"false\\\",\\\"description\\\":\\\"Disable Ack\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Disable Acks for testing to simulate IntelliCare failure.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":9}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1714640819},{"Type":1,"NewValue":"{\"Id\":9693,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"DisableAck\",\"Json\":\"{\\\"name\\\":\\\"DisableAck\\\",\\\"default\\\":\\\"false\\\",\\\"description\\\":\\\"Disable Ack\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Disable Acks for testing to simulate IntelliCare failure.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":13}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751967286},{"Type":1,"NewValue":"{\"Id\":9693,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"DisableAck\",\"Json\":\"{\\\"name\\\":\\\"DisableAck\\\",\\\"default\\\":\\\"false\\\",\\\"description\\\":\\\"Disable Ack\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Disable Acks for testing to simulate IntelliCare failure.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":12}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751977814},{"Type":1,"NewValue":"{\"Id\":9693,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"DisableAck\",\"Json\":\"{\\\"name\\\":\\\"DisableAck\\\",\\\"default\\\":\\\"false\\\",\\\"description\\\":\\\"Disable Ack\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Disable Acks for testing to simulate IntelliCare failure.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":11}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751977969}],"LanguageId":null,"Tags":[]},{"Id":9666,"Group":{"Id":5629,"Name":"DeviceConfig","Json":{"description":"Reset the device with default factory values","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5625,"Name":"Admin config","Json":{"description":"Admin config","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[{"Id":5630,"Name":"Password","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]},"Name":"Reset","Json":"{\"name\":\"Reset\",\"default\":\"\",\"description\":\"Reset Device\",\"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":[{"Type":1,"NewValue":"{\"Id\":9666,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Reset\",\"Json\":\"{\\\"name\\\":\\\"Reset\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Reset Device\\\",\\\"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\\\":8}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1714640812},{"Type":1,"NewValue":"{\"Id\":9666,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Reset\",\"Json\":\"{\\\"name\\\":\\\"Reset\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Reset Device\\\",\\\"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\\\":12}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751967283},{"Type":1,"NewValue":"{\"Id\":9666,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Reset\",\"Json\":\"{\\\"name\\\":\\\"Reset\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Reset Device\\\",\\\"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\\\":11}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751977812},{"Type":1,"NewValue":"{\"Id\":9666,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Reset\",\"Json\":\"{\\\"name\\\":\\\"Reset\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Reset Device\\\",\\\"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\\\":10}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751977967}],"LanguageId":null,"Tags":[]},{"Id":9686,"Group":{"Id":5629,"Name":"DeviceConfig","Json":{"description":"Reset the device with default factory values","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5625,"Name":"Admin config","Json":{"description":"Admin config","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[{"Id":5630,"Name":"Password","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]},"Name":"BLE MAC","Json":"{\"name\":\"BLE MAC\",\"default\":\"\",\"description\":\"Phone BLE MAC address\",\"type\":\"text\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"The Bluetooth MAC address of the phone.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":0}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":9687,"Group":{"Id":5629,"Name":"DeviceConfig","Json":{"description":"Reset the device with default factory values","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5625,"Name":"Admin config","Json":{"description":"Admin config","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[{"Id":5630,"Name":"Password","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]},"Name":"BRA MAC","Json":"{\"name\":\"BRA MAC\",\"default\":\"\",\"description\":\"Bracelet MAC address\",\"type\":\"text\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"The MAC address of the bracelet.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":1}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":9688,"Group":{"Id":5629,"Name":"DeviceConfig","Json":{"description":"Reset the device with default factory values","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5625,"Name":"Admin config","Json":{"description":"Admin config","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[{"Id":5630,"Name":"Password","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]},"Name":"braceletIMEI","Json":"{\"name\":\"braceletIMEI\",\"default\":\"\",\"description\":\"Bracelet IMEI\",\"type\":\"text\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Readonly field containing the bracelet IMEI.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":2}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":9696,"Group":{"Id":5630,"Name":"Password","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5625,"Name":"Admin config","Json":{"description":"Admin config","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[{"Id":5629,"Name":"DeviceConfig","Json":{"description":"Reset the device with default factory values","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"BraceletPW","Json":"{\"name\":\"BraceletPW\",\"default\":\"\",\"description\":\"Bracelet Password\",\"type\":\"text\",\"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\":9696,\"Group\":{\"Id\":5630,\"Name\":\"Password\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"BraceletPW\",\"Json\":\"{\\\"name\\\":\\\"BraceletPW\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Bracelet Password\\\",\\\"type\\\":\\\"text\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":null,\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716290748}],"LanguageId":null,"Tags":[]},{"Id":9694,"Group":{"Id":5630,"Name":"Password","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5625,"Name":"Admin config","Json":{"description":"Admin config","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[{"Id":5629,"Name":"DeviceConfig","Json":{"description":"Reset the device with default factory values","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"encryption","Json":"{\"name\":\"encryption\",\"default\":\"true\",\"description\":\"enable encryption for commands\",\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"true","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":9694,\"Group\":{\"Id\":5630,\"Name\":\"Password\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"encryption\",\"Json\":\"{\\\"name\\\":\\\"encryption\\\",\\\"default\\\":\\\"true\\\",\\\"description\\\":\\\"enable encryption for commands\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":null,\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716290763}],"LanguageId":null,"Tags":[]},{"Id":9695,"Group":{"Id":5630,"Name":"Password","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5625,"Name":"Admin config","Json":{"description":"Admin config","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[{"Id":5629,"Name":"DeviceConfig","Json":{"description":"Reset the device with default factory values","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Password","Json":"{\"name\":\"Password\",\"default\":\"\",\"description\":\"Password\",\"type\":\"text\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Password used to encrypt communication between Device and platform.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":9697,"Group":{"Id":5631,"Name":"Cycle Interval","Json":{"description":"Define the period for which the device should send regular location updates, and how frequent those updates are.","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5624,"Name":"Settings","Json":{"description":null,"columns":2,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5632,"Name":"Battery alerts","Json":{"description":"Battery alerts","columns":1,"order":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5633,"Name":"Bracelet","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Cycle Interval","Json":"{\"name\":\"Cycle Interval\",\"default\":\"\",\"description\":\"Cycle Interval\",\"type\":\"number\",\"suffix\":\"seconds\",\"prefix\":null,\"min\":1,\"max\":1440,\"futureOnly\":false,\"integerOnly\":true,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Frequency of location events, in seconds\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":9685,"Group":{"Id":5632,"Name":"Battery alerts","Json":{"description":"Battery alerts","columns":1,"order":5,"toTranslate":["name","description"]},"Parent":{"Id":5624,"Name":"Settings","Json":{"description":null,"columns":2,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5631,"Name":"Cycle Interval","Json":{"description":"Define the period for which the device should send regular location updates, and how frequent those updates are.","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5633,"Name":"Bracelet","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Battery Low Threshold","Json":"{\"name\":\"Battery Low Threshold\",\"default\":\"100\",\"description\":\"Battery Low Threshold\",\"type\":\"number\",\"suffix\":\"%\",\"prefix\":null,\"min\":1,\"max\":99,\"futureOnly\":false,\"integerOnly\":true,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Percentage at which the device sends a low battery alert\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":3}","Default":"100","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":9701,"Group":{"Id":5632,"Name":"Battery alerts","Json":{"description":"Battery alerts","columns":1,"order":5,"toTranslate":["name","description"]},"Parent":{"Id":5624,"Name":"Settings","Json":{"description":null,"columns":2,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5631,"Name":"Cycle Interval","Json":{"description":"Define the period for which the device should send regular location updates, and how frequent those updates are.","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5633,"Name":"Bracelet","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Enable Battery Critical Alert","Json":"{\"name\":\"Enable Battery Critical Alert\",\"default\":\"true\",\"description\":\"Enable Battery Critical Alert\",\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Sends an Alert when the battery is critically low.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":0}","Default":"true","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":9700,"Group":{"Id":5632,"Name":"Battery alerts","Json":{"description":"Battery alerts","columns":1,"order":5,"toTranslate":["name","description"]},"Parent":{"Id":5624,"Name":"Settings","Json":{"description":null,"columns":2,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5631,"Name":"Cycle Interval","Json":{"description":"Define the period for which the device should send regular location updates, and how frequent those updates are.","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5633,"Name":"Bracelet","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Enable Battery Low Alert","Json":"{\"name\":\"Enable Battery Low Alert\",\"default\":\"true\",\"description\":\"Enable Battery Low Alert\",\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":2}","Default":"true","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":9699,"Group":{"Id":5632,"Name":"Battery alerts","Json":{"description":"Battery alerts","columns":1,"order":5,"toTranslate":["name","description"]},"Parent":{"Id":5624,"Name":"Settings","Json":{"description":null,"columns":2,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5631,"Name":"Cycle Interval","Json":{"description":"Define the period for which the device should send regular location updates, and how frequent those updates are.","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5633,"Name":"Bracelet","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Enable Battery Charging Alerts","Json":"{\"name\":\"Enable Battery Charging Alerts\",\"default\":\"true\",\"description\":\"Enable Alerts when charging.\",\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Alerts will be sent when the users connects or disconnects the device to the charging station.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":4}","Default":"true","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":9698,"Group":{"Id":5632,"Name":"Battery alerts","Json":{"description":"Battery alerts","columns":1,"order":5,"toTranslate":["name","description"]},"Parent":{"Id":5624,"Name":"Settings","Json":{"description":null,"columns":2,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5631,"Name":"Cycle Interval","Json":{"description":"Define the period for which the device should send regular location updates, and how frequent those updates are.","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5633,"Name":"Bracelet","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Battery Critical Threshold","Json":"{\"name\":\"Battery Critical Threshold\",\"default\":\"\",\"description\":\"Battery Critical Threshold\",\"type\":\"number\",\"suffix\":\"%\",\"prefix\":null,\"min\":1,\"max\":99,\"futureOnly\":false,\"integerOnly\":true,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Percentage at which the device sends a critical battery alert\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":1}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":9671,"Group":{"Id":5633,"Name":"Bracelet","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5624,"Name":"Settings","Json":{"description":null,"columns":2,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5631,"Name":"Cycle Interval","Json":{"description":"Define the period for which the device should send regular location updates, and how frequent those updates are.","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5632,"Name":"Battery alerts","Json":{"description":"Battery alerts","columns":1,"order":5,"toTranslate":["name","description"]},"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":"LTEParam","Json":"{\"name\":\"LTEParam\",\"default\":\"\",\"description\":\"LTE Parameters\",\"type\":\"text\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"LTE Parameters as defined by SDK as JSON string.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":10}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":9672,"Group":{"Id":5633,"Name":"Bracelet","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5624,"Name":"Settings","Json":{"description":null,"columns":2,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5631,"Name":"Cycle Interval","Json":{"description":"Define the period for which the device should send regular location updates, and how frequent those updates are.","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5632,"Name":"Battery alerts","Json":{"description":"Battery alerts","columns":1,"order":5,"toTranslate":["name","description"]},"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":"BLEParam","Json":"{\"name\":\"BLEParam\",\"default\":\"\",\"description\":\"BLE Parameters\",\"type\":\"text\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"BLE Parameters as defined in SDK as JSON string.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":8}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":9673,"Group":{"Id":5633,"Name":"Bracelet","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5624,"Name":"Settings","Json":{"description":null,"columns":2,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5631,"Name":"Cycle Interval","Json":{"description":"Define the period for which the device should send regular location updates, and how frequent those updates are.","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5632,"Name":"Battery alerts","Json":{"description":"Battery alerts","columns":1,"order":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Reboot","Json":"{\"name\":\"Reboot\",\"default\":\"\",\"description\":\"Reboot\",\"type\":\"button\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Reboots the bracelet.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":5}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":9674,"Group":{"Id":5633,"Name":"Bracelet","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5624,"Name":"Settings","Json":{"description":null,"columns":2,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5631,"Name":"Cycle Interval","Json":{"description":"Define the period for which the device should send regular location updates, and how frequent those updates are.","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5632,"Name":"Battery alerts","Json":{"description":"Battery alerts","columns":1,"order":5,"toTranslate":["name","description"]},"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":"PowerOff","Json":"{\"name\":\"PowerOff\",\"default\":\"\",\"description\":\"Power Off\",\"type\":\"button\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Power off the bracelet.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":4}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":9675,"Group":{"Id":5633,"Name":"Bracelet","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5624,"Name":"Settings","Json":{"description":null,"columns":2,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5631,"Name":"Cycle Interval","Json":{"description":"Define the period for which the device should send regular location updates, and how frequent those updates are.","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5632,"Name":"Battery alerts","Json":{"description":"Battery alerts","columns":1,"order":5,"toTranslate":["name","description"]},"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":"Reset","Json":"{\"name\":\"Reset\",\"default\":\"\",\"description\":\"Reset\",\"type\":\"button\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Resets the bracelet.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":6}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":9682,"Group":{"Id":5633,"Name":"Bracelet","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5624,"Name":"Settings","Json":{"description":null,"columns":2,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5631,"Name":"Cycle Interval","Json":{"description":"Define the period for which the device should send regular location updates, and how frequent those updates are.","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5632,"Name":"Battery alerts","Json":{"description":"Battery alerts","columns":1,"order":5,"toTranslate":["name","description"]},"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":"HighTemp","Json":"{\"name\":\"HighTemp\",\"default\":\"\",\"description\":\"High Temperature\",\"type\":\"number\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":true,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Temperature above which a temperature alarm will be raised.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":1}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":9684,"Group":{"Id":5633,"Name":"Bracelet","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5624,"Name":"Settings","Json":{"description":null,"columns":2,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5631,"Name":"Cycle Interval","Json":{"description":"Define the period for which the device should send regular location updates, and how frequent those updates are.","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5632,"Name":"Battery alerts","Json":{"description":"Battery alerts","columns":1,"order":5,"toTranslate":["name","description"]},"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":"LowTemp","Json":"{\"name\":\"LowTemp\",\"default\":\"\",\"description\":\"Low Temperature\",\"type\":\"number\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":true,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Threshold below which a temperature alert will be triggered.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":0}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":9667,"Group":{"Id":5633,"Name":"Bracelet","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5624,"Name":"Settings","Json":{"description":null,"columns":2,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5631,"Name":"Cycle Interval","Json":{"description":"Define the period for which the device should send regular location updates, and how frequent those updates are.","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5632,"Name":"Battery alerts","Json":{"description":"Battery alerts","columns":1,"order":5,"toTranslate":["name","description"]},"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":"LowBattery","Json":"{\"name\":\"LowBattery\",\"default\":\"\",\"description\":\"Low Battery Threshold\",\"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\":2}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":9668,"Group":{"Id":5633,"Name":"Bracelet","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5624,"Name":"Settings","Json":{"description":null,"columns":2,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5631,"Name":"Cycle Interval","Json":{"description":"Define the period for which the device should send regular location updates, and how frequent those updates are.","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5632,"Name":"Battery alerts","Json":{"description":"Battery alerts","columns":1,"order":5,"toTranslate":["name","description"]},"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":"CriticalBattery","Json":"{\"name\":\"CriticalBattery\",\"default\":\"\",\"description\":\"Critical Battery Threshold\",\"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\":3}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":9669,"Group":{"Id":5633,"Name":"Bracelet","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5624,"Name":"Settings","Json":{"description":null,"columns":2,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5631,"Name":"Cycle Interval","Json":{"description":"Define the period for which the device should send regular location updates, and how frequent those updates are.","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5632,"Name":"Battery alerts","Json":{"description":"Battery alerts","columns":1,"order":5,"toTranslate":["name","description"]},"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":"CommonParam","Json":"{\"name\":\"CommonParam\",\"default\":\"\",\"description\":\"Common Parameters\",\"type\":\"text\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Common parameters as defined in the SDK as JSON string.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":7}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":9670,"Group":{"Id":5633,"Name":"Bracelet","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5624,"Name":"Settings","Json":{"description":null,"columns":2,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5631,"Name":"Cycle Interval","Json":{"description":"Define the period for which the device should send regular location updates, and how frequent those updates are.","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5632,"Name":"Battery alerts","Json":{"description":"Battery alerts","columns":1,"order":5,"toTranslate":["name","description"]},"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":"CloudParam","Json":"{\"name\":\"CloudParam\",\"default\":\"\",\"description\":\"Cloud Parameters\",\"type\":\"text\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Cloud Parameters as defined by SDK as JSON string.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":9}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":9677,"Group":{"Id":5634,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5628,"Name":"Not Implemented","Json":{"description":null,"columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5635,"Name":"Non Movement","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5636,"Name":"Real Time Locate","Json":{"description":"Real Time Locate","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5637,"Name":"Set Server","Json":{"description":"Set Server","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Enable Disable No Activity","Json":"{\"name\":\"Enable Disable No Activity\",\"default\":\"false\",\"description\":\"Enable Disable No Activity\",\"type\":\"enable\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":null,\"integerOnly\":null,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Enable or disable no activity alerts\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"true","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":9677,\"Group\":{\"Id\":5634,\"Name\":\"No Activity\",\"Json\":{\"description\":\"No Activity\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Enable Disable No Activity\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable No Activity\\\",\\\"default\\\":\\\"true\\\",\\\"description\\\":\\\"Enable Disable No Activity\\\",\\\"type\\\":\\\"enable\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Enable or disable no activity alerts\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716289251}],"LanguageId":null,"Tags":[]},{"Id":9676,"Group":{"Id":5634,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5628,"Name":"Not Implemented","Json":{"description":null,"columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5635,"Name":"Non Movement","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5636,"Name":"Real Time Locate","Json":{"description":"Real Time Locate","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5637,"Name":"Set Server","Json":{"description":"Set Server","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"No Activity","Json":"{\"name\":\"No Activity\",\"default\":\"\",\"description\":\"Set No Activity Events\",\"type\":\"number\",\"suffix\":null,\"prefix\":null,\"min\":5,\"max\":10080,\"futureOnly\":null,\"integerOnly\":true,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Set No Activity Alerts in minutes. If the device does not report in the time frame it triggers a No Activity alert\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":9678,"Group":{"Id":5635,"Name":"Non Movement","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5628,"Name":"Not Implemented","Json":{"description":null,"columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5634,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5636,"Name":"Real Time Locate","Json":{"description":"Real Time Locate","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5637,"Name":"Set Server","Json":{"description":"Set Server","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"period ","Json":"{\"name\":\"period \",\"default\":\"600\",\"description\":\"Period in seconds which defines \\\"non-movement\\\"\",\"type\":\"number\",\"suffix\":null,\"prefix\":null,\"min\":5,\"max\":7200,\"futureOnly\":\"\",\"integerOnly\":true,\"minLength\":null,\"maxLength\":null,\"helpText\":\"\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"600","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":9678,\"Group\":{\"Id\":5635,\"Name\":\"Non Movement\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"period \",\"Json\":\"{\\\"name\\\":\\\"period \\\",\\\"default\\\":\\\"600\\\",\\\"description\\\":\\\"Period in seconds which defines \\\\\\\"non-movement\\\\\\\"\\\",\\\"type\\\":\\\"number\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":5,\\\"max\\\":7200,\\\"futureOnly\\\":false,\\\"integerOnly\\\":true,\\\"isReadOnly\\\":false,\\\"isHidden\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"600\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716289280}],"LanguageId":null,"Tags":[]},{"Id":9679,"Group":{"Id":5635,"Name":"Non Movement","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5628,"Name":"Not Implemented","Json":{"description":null,"columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5634,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5636,"Name":"Real Time Locate","Json":{"description":"Real Time Locate","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5637,"Name":"Set Server","Json":{"description":"Set Server","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Enable Disable NonMovement","Json":"{\"name\":\"Enable Disable NonMovement\",\"default\":\"false\",\"description\":null,\"type\":\"enable\",\"order\":0,\"suffix\":null,\"prefix\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"true","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":9679,\"Group\":{\"Id\":5635,\"Name\":\"Non Movement\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Enable Disable NonMovement\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable NonMovement\\\",\\\"default\\\":\\\"true\\\",\\\"description\\\":null,\\\"type\\\":\\\"enable\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":null,\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716289267}],"LanguageId":null,"Tags":[]},{"Id":9680,"Group":{"Id":5636,"Name":"Real Time Locate","Json":{"description":"Real Time Locate","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5628,"Name":"Not Implemented","Json":{"description":null,"columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5634,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5635,"Name":"Non Movement","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5637,"Name":"Set Server","Json":{"description":"Set Server","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Real Time Locate","Json":"{\"name\":\"Real Time Locate\",\"default\":\"\",\"description\":\"Position Request\",\"type\":\"button\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Real Time Locate\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":9680,\"Group\":{\"Id\":5636,\"Name\":\"Real Time Locate\",\"Json\":{\"description\":\"Real Time Locate\",\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Real Time Locate\",\"Json\":\"{\\\"name\\\":\\\"Real Time Locate\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Position Request\\\",\\\"type\\\":\\\"button\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Real Time Locate\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716289318}],"LanguageId":null,"Tags":[]},{"Id":9683,"Group":{"Id":5637,"Name":"Set Server","Json":{"description":"Set Server","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5628,"Name":"Not Implemented","Json":{"description":null,"columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5634,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5635,"Name":"Non Movement","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5636,"Name":"Real Time Locate","Json":{"description":"Real Time Locate","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]},"Name":"Set Primary Server","Json":"{\"name\":\"Set Primary Server\",\"default\":\"\",\"description\":\"Set Primary Server\",\"type\":\"select\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Select which server you wish the device to communicate to\",\"options\":[{\"label\":\"Production Primary\",\"value\":\"52.232.85.255:5678\"},{\"label\":\"Acceptance Primary\",\"value\":\"52.174.17.77:5678\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"],\"order\":0}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":9683,\"Group\":{\"Id\":5637,\"Name\":\"Set Server\",\"Json\":{\"description\":\"Set Server\",\"columns\":1,\"order\":4,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Set Primary Server\",\"Json\":\"{\\\"name\\\":\\\"Set Primary Server\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Set Primary Server\\\",\\\"type\\\":\\\"select\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Select which server you wish the device to communicate to\\\",\\\"options\\\":[{\\\"value\\\":\\\"52.232.85.255:5678\\\",\\\"label\\\":\\\"Production Primary\\\"},{\\\"value\\\":\\\"52.174.17.77:5678\\\",\\\"label\\\":\\\"Acceptance Primary\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716289362}],"LanguageId":null,"Tags":[]},{"Id":9681,"Group":{"Id":5637,"Name":"Set Server","Json":{"description":"Set Server","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5628,"Name":"Not Implemented","Json":{"description":null,"columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5634,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5635,"Name":"Non Movement","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5636,"Name":"Real Time Locate","Json":{"description":"Real Time Locate","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]},"Name":"Set Secondary Server","Json":"{\"name\":\"Set Secondary Server\",\"default\":\"\",\"description\":\"Select Server\",\"type\":\"select\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[{\"label\":\"Production Secondary\",\"value\":\"52.232.85.255:5678\"},{\"label\":\"Acceptance Secondary\",\"value\":\"52.174.17.77:5678\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"],\"order\":1}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":9681,\"Group\":{\"Id\":5637,\"Name\":\"Set Server\",\"Json\":{\"description\":\"Set Server\",\"columns\":1,\"order\":4,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Set Secondary Server\",\"Json\":\"{\\\"name\\\":\\\"Set Secondary Server\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Select Server\\\",\\\"type\\\":\\\"select\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":null,\\\"options\\\":[{\\\"value\\\":\\\"52.232.85.255:5678\\\",\\\"label\\\":\\\"Production Secondary\\\"},{\\\"value\\\":\\\"52.174.17.77:5678\\\",\\\"label\\\":\\\"Acceptance Secondary\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716289376}],"LanguageId":null,"Tags":[]},{"Id":9702,"Group":{"Id":5638,"Name":"Note","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5627,"Name":"Notification","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Message","Json":"{\"name\":\"Message\",\"default\":\"\",\"description\":\"Message\",\"type\":\"text\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Note as Comma sepearted values with Time(s from epoch), Type (INFO|WARNING|...), ID, Text.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":9703,"Group":{"Id":5629,"Name":"DeviceConfig","Json":{"description":"Reset the device with default factory values","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]},"Name":"Clear Message Buffer","Json":"{\"name\":\"Clear Message Buffer\",\"default\":\"\",\"description\":\"Clear Message Buffer\",\"type\":\"button\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Clears the message buffer of unsent messages.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":9703,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Clear Message Buffer\",\"Json\":\"{\\\"name\\\":\\\"Clear Message Buffer\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Clear Message Buffer\\\",\\\"type\\\":\\\"button\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Clears the message buffer of unsent messages.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1710246641},{"Type":0,"NewValue":"{\"Id\":9703,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Clear Message Buffer\",\"Json\":\"{\\\"name\\\":\\\"Clear Message Buffer\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Clear Message Buffer\\\",\\\"type\\\":\\\"button\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Clears the message buffer of unsent messages.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":{\"Id\":4123,\"Protocol\":{\"Id\":206,\"Code\":\"VGA\",\"Version\":\"0.2\",\"FirmwareVersion\":\"\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"ClearBuffer\",\"TemplateSMS\":\"VGCMD-001;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"var configs = [];\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nvar command = \\\"CLRBUF\\\";\\nconst _crypto = require('crypto');\\nif (params.Password.Password === \\\"\\\") {\\n var password = serverParams.Imei;\\n} else {\\n var password = params.Password.Password;\\n}\\nif (params.Password.encryption === \\\"true\\\") {\\n var part2 = encrypt(command, part1, password);\\n} else {\\n var part2 = command;\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":false,\"SendAttempts\":1,\"Order\":null},\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1710246647},{"Type":1,"NewValue":"{\"Id\":9703,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Clear Message Buffer\",\"Json\":\"{\\\"name\\\":\\\"Clear Message Buffer\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Clear Message Buffer\\\",\\\"type\\\":\\\"button\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Clears the message buffer of unsent messages.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":3}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1714640790}],"LanguageId":null,"Tags":[]},{"Id":9703,"Group":{"Id":5629,"Name":"DeviceConfig","Json":{"description":"Reset the device with default factory values","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]},"Name":"Clear Message Buffer","Json":"{\"name\":\"Clear Message Buffer\",\"default\":\"\",\"description\":\"Clear Message Buffer\",\"type\":\"button\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Clears the message buffer of unsent messages.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":{"Id":4123,"Protocol":{"Id":206,"Code":"VGA","Version":"0.2","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"ClearBuffer","TemplateSMS":"VGCMD-001;<>;<>;","Template":"VGCMD-001;<>;<>;[0a]","AckTemplate":null,"Operation":"var configs = [];\nsequenceNumber = (new Date().getTime()).toString(36);\nvar part1 = \"update=\" + sequenceNumber;\nvar command = \"CLRBUF\";\nconst _crypto = require('crypto');\nif (params.Password.Password === \"\") {\n var password = serverParams.Imei;\n} else {\n var password = params.Password.Password;\n}\nif (params.Password.encryption === \"true\") {\n var part2 = encrypt(command, part1, password);\n} else {\n var part2 = command;\n}\nAddValue(\"part1\", part1);\nAddValue(\"part2\", part2);\nAddValue(\"sequenceNumber\", sequenceNumber);\nvar commandConfigs = {\n template: \"main\",\n configs: configs\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction encrypt(text, mid, password) {\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\n const iv = _crypto.randomBytes(16); // random initialization vector\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\n // set the cipher\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\n // encrypt text\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\n // generate output ( encrypted text )\n return Buffer.concat([iv, encrypted]).toString('base64');\n}","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":false,"SendAttempts":1,"Order":null},"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":9704,"Group":{"Id":5629,"Name":"DeviceConfig","Json":{"description":"Reset the device with default factory values","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]},"Name":"Enable Logging","Json":"{\"name\":\"Enable Logging\",\"default\":\"\",\"description\":\"Enable Realtime logging to Kibana.\",\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"false","Command":null,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":9704,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Enable Logging\",\"Json\":\"{\\\"name\\\":\\\"Enable Logging\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Enable Realtime logging to Kibana.\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":null,\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"false\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1710246708},{"Type":0,"NewValue":"{\"Id\":9704,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Enable Logging\",\"Json\":\"{\\\"name\\\":\\\"Enable Logging\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Enable Realtime logging to Kibana.\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":null,\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"false\",\"Command\":{\"Id\":4126,\"Protocol\":{\"Id\":206,\"Code\":\"VGA\",\"Version\":\"0.2\",\"FirmwareVersion\":\"\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"Set RTLog Enable\",\"TemplateSMS\":\"VGCMD-001;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"// write your code here...\\nif (params.DeviceConfig.EnableLogging == \\\"true\\\") {\\n enableLogging = \\\"1\\\";\\n} else {\\n enableLogging = \\\"0\\\";\\n}\\nvar command = \\\"RTLOG=\\\" + enableLogging;\\nvar configs = [];\\nvar configsSMS = []; // for sms template\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nconst _crypto = require('crypto');\\nif (params.Password.Password === \\\"\\\") {\\n var password = serverParams.Imei;\\n} else {\\n var password = params.Password.Password;\\n}\\nif (params.Password.encryption === \\\"true\\\") {\\n var part2 = encrypt(command, part1, password);\\n} else {\\n var part2 = command;\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nAddValueSMS(\\\"part1\\\", part1); //for sms template\\nAddValueSMS(\\\"part2\\\", part2); // for sms template\\nAddValueSMS(\\\"sequenceNumber\\\", sequenceNumber); // for sms template\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs,\\n configsSMS: configsSMS //for sms template\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValueSMS(p1, p2) { //function for sms template\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configsSMS.push(cvpair);\\n}\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":false,\"SendAttempts\":1,\"Order\":null},\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1710246712},{"Type":1,"NewValue":"{\"Id\":9704,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Enable Logging\",\"Json\":\"{\\\"name\\\":\\\"Enable Logging\\\",\\\"default\\\":\\\"false\\\",\\\"description\\\":\\\"Enable Realtime logging to Kibana.\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":null,\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1714640774},{"Type":1,"NewValue":"{\"Id\":9704,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Enable Logging\",\"Json\":\"{\\\"name\\\":\\\"Enable Logging\\\",\\\"default\\\":\\\"false\\\",\\\"description\\\":\\\"Enable Realtime logging to Kibana.\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":null,\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":10}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1714640824},{"Type":1,"NewValue":"{\"Id\":9704,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Enable Logging\",\"Json\":\"{\\\"name\\\":\\\"Enable Logging\\\",\\\"default\\\":\\\"false\\\",\\\"description\\\":\\\"Enable Realtime logging to Kibana.\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":null,\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":14}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751967289},{"Type":1,"NewValue":"{\"Id\":9704,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Enable Logging\",\"Json\":\"{\\\"name\\\":\\\"Enable Logging\\\",\\\"default\\\":\\\"false\\\",\\\"description\\\":\\\"Enable Realtime logging to Kibana.\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":null,\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":13}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751977816},{"Type":1,"NewValue":"{\"Id\":9704,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Enable Logging\",\"Json\":\"{\\\"name\\\":\\\"Enable Logging\\\",\\\"default\\\":\\\"false\\\",\\\"description\\\":\\\"Enable Realtime logging to Kibana.\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":null,\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":12}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751977971}],"LanguageId":null,"Tags":[]},{"Id":9704,"Group":{"Id":5629,"Name":"DeviceConfig","Json":{"description":"Reset the device with default factory values","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]},"Name":"Enable Logging","Json":"{\"name\":\"Enable Logging\",\"default\":\"\",\"description\":\"Enable Realtime logging to Kibana.\",\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"false","Command":{"Id":4126,"Protocol":{"Id":206,"Code":"VGA","Version":"0.2","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"Set RTLog Enable","TemplateSMS":"VGCMD-001;<>;<>;","Template":"VGCMD-001;<>;<>;[0a]","AckTemplate":null,"Operation":"// write your code here...\nif (params.DeviceConfig.EnableLogging == \"true\") {\n enableLogging = \"1\";\n} else {\n enableLogging = \"0\";\n}\nvar command = \"RTLOG=\" + enableLogging;\nvar configs = [];\nvar configsSMS = []; // for sms template\nsequenceNumber = (new Date().getTime()).toString(36);\nvar part1 = \"update=\" + sequenceNumber;\nconst _crypto = require('crypto');\nif (params.Password.Password === \"\") {\n var password = serverParams.Imei;\n} else {\n var password = params.Password.Password;\n}\nif (params.Password.encryption === \"true\") {\n var part2 = encrypt(command, part1, password);\n} else {\n var part2 = command;\n}\nAddValue(\"part1\", part1);\nAddValue(\"part2\", part2);\nAddValue(\"sequenceNumber\", sequenceNumber);\nAddValueSMS(\"part1\", part1); //for sms template\nAddValueSMS(\"part2\", part2); // for sms template\nAddValueSMS(\"sequenceNumber\", sequenceNumber); // for sms template\nvar commandConfigs = {\n template: \"main\",\n configs: configs,\n configsSMS: configsSMS //for sms template\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValueSMS(p1, p2) { //function for sms template\n var cvpair = {\n code: p1,\n value: p2\n };\n configsSMS.push(cvpair);\n}\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction encrypt(text, mid, password) {\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\n const iv = _crypto.randomBytes(16); // random initialization vector\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\n // set the cipher\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\n // encrypt text\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\n // generate output ( encrypted text )\n return Buffer.concat([iv, encrypted]).toString('base64');\n}","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":false,"SendAttempts":1,"Order":null},"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":9705,"Group":{"Id":5629,"Name":"DeviceConfig","Json":{"description":"Reset the device with default factory values","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]},"Name":"Get Logs","Json":"{\"name\":\"Get Logs\",\"default\":\"\",\"description\":\"Get current Logs from the App.\",\"type\":\"button\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Will send logs directly to Kibana.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":9705,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Get Logs\",\"Json\":\"{\\\"name\\\":\\\"Get Logs\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Get current Logs from the App.\\\",\\\"type\\\":\\\"button\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Will send logs directly to Kibana.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1710246766},{"Type":0,"NewValue":"{\"Id\":9705,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Get Logs\",\"Json\":\"{\\\"name\\\":\\\"Get Logs\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Get current Logs from the App.\\\",\\\"type\\\":\\\"button\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Will send logs directly to Kibana.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":{\"Id\":4125,\"Protocol\":{\"Id\":206,\"Code\":\"VGA\",\"Version\":\"0.2\",\"FirmwareVersion\":\"\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"RequestLog\",\"TemplateSMS\":\"VGCMD-001;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"var configs = [];\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nvar command = \\\"REQLOG\\\";\\nconst _crypto = require('crypto');\\nif (params.Password.Password === \\\"\\\") {\\n var password = serverParams.Imei;\\n} else {\\n var password = params.Password.Password;\\n}\\nif (params.Password.encryption === \\\"true\\\") {\\n var part2 = encrypt(command, part1, password);\\n} else {\\n var part2 = command;\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":false,\"SendAttempts\":1,\"Order\":null},\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1710246770},{"Type":1,"NewValue":"{\"Id\":9705,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Get Logs\",\"Json\":\"{\\\"name\\\":\\\"Get Logs\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Get current Logs from the App.\\\",\\\"type\\\":\\\"button\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Will send logs directly to Kibana.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":12}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1714640834},{"Type":1,"NewValue":"{\"Id\":9705,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Get Logs\",\"Json\":\"{\\\"name\\\":\\\"Get Logs\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Get current Logs from the App.\\\",\\\"type\\\":\\\"button\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Will send logs directly to Kibana.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":12}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1714640848},{"Type":1,"NewValue":"{\"Id\":9705,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Get Logs\",\"Json\":\"{\\\"name\\\":\\\"Get Logs\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Get current Logs from the App.\\\",\\\"type\\\":\\\"button\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Will send logs directly to Kibana.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":11}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1714640888},{"Type":1,"NewValue":"{\"Id\":9705,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Get Logs\",\"Json\":\"{\\\"name\\\":\\\"Get Logs\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Get current Logs from the App.\\\",\\\"type\\\":\\\"button\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Will send logs directly to Kibana.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":15}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751967292},{"Type":1,"NewValue":"{\"Id\":9705,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Get Logs\",\"Json\":\"{\\\"name\\\":\\\"Get Logs\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Get current Logs from the App.\\\",\\\"type\\\":\\\"button\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Will send logs directly to Kibana.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":14}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751977818},{"Type":1,"NewValue":"{\"Id\":9705,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Get Logs\",\"Json\":\"{\\\"name\\\":\\\"Get Logs\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Get current Logs from the App.\\\",\\\"type\\\":\\\"button\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Will send logs directly to Kibana.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":13}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751977973}],"LanguageId":null,"Tags":[]},{"Id":9705,"Group":{"Id":5629,"Name":"DeviceConfig","Json":{"description":"Reset the device with default factory values","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]},"Name":"Get Logs","Json":"{\"name\":\"Get Logs\",\"default\":\"\",\"description\":\"Get current Logs from the App.\",\"type\":\"button\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Will send logs directly to Kibana.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":{"Id":4125,"Protocol":{"Id":206,"Code":"VGA","Version":"0.2","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"RequestLog","TemplateSMS":"VGCMD-001;<>;<>;","Template":"VGCMD-001;<>;<>;[0a]","AckTemplate":null,"Operation":"var configs = [];\nsequenceNumber = (new Date().getTime()).toString(36);\nvar part1 = \"update=\" + sequenceNumber;\nvar command = \"REQLOG\";\nconst _crypto = require('crypto');\nif (params.Password.Password === \"\") {\n var password = serverParams.Imei;\n} else {\n var password = params.Password.Password;\n}\nif (params.Password.encryption === \"true\") {\n var part2 = encrypt(command, part1, password);\n} else {\n var part2 = command;\n}\nAddValue(\"part1\", part1);\nAddValue(\"part2\", part2);\nAddValue(\"sequenceNumber\", sequenceNumber);\nvar commandConfigs = {\n template: \"main\",\n configs: configs\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction encrypt(text, mid, password) {\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\n const iv = _crypto.randomBytes(16); // random initialization vector\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\n // set the cipher\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\n // encrypt text\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\n // generate output ( encrypted text )\n return Buffer.concat([iv, encrypted]).toString('base64');\n}","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":false,"SendAttempts":1,"Order":null},"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":9706,"Group":{"Id":5629,"Name":"DeviceConfig","Json":{"description":"Reset the device with default factory values","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]},"Name":"Request Data","Json":"{\"name\":\"Request Data\",\"default\":\"\",\"description\":\"Request All Data command.\",\"type\":\"button\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Will return version and other settings from the app.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":9706,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Request Data\",\"Json\":\"{\\\"name\\\":\\\"Request Data\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Request All Data command.\\\",\\\"type\\\":\\\"button\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Will return version and other settings from the app.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1710246818},{"Type":0,"NewValue":"{\"Id\":9706,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Request Data\",\"Json\":\"{\\\"name\\\":\\\"Request Data\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Request All Data command.\\\",\\\"type\\\":\\\"button\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Will return version and other settings from the app.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":{\"Id\":4124,\"Protocol\":{\"Id\":206,\"Code\":\"VGA\",\"Version\":\"0.2\",\"FirmwareVersion\":\"\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"RequestData\",\"TemplateSMS\":\"VGCMD-001;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"var configs = [];\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nvar command = \\\"REQDATA\\\";\\nconst _crypto = require('crypto');\\nif (params.Password.Password === \\\"\\\") {\\n var password = serverParams.Imei;\\n} else {\\n var password = params.Password.Password;\\n}\\nif (params.Password.encryption === \\\"true\\\") {\\n var part2 = encrypt(command, part1, password);\\n} else {\\n var part2 = command;\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":false,\"SendAttempts\":1,\"Order\":null},\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1710246823},{"Type":1,"NewValue":"{\"Id\":9706,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Request Data\",\"Json\":\"{\\\"name\\\":\\\"Request Data\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Request All Data command.\\\",\\\"type\\\":\\\"button\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Will return version and other settings from the app.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":15}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716278047},{"Type":1,"NewValue":"{\"Id\":9706,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Request Data\",\"Json\":\"{\\\"name\\\":\\\"Request Data\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Request All Data command.\\\",\\\"type\\\":\\\"button\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Will return version and other settings from the app.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":14}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716278063},{"Type":1,"NewValue":"{\"Id\":9706,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Request Data\",\"Json\":\"{\\\"name\\\":\\\"Request Data\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Request All Data command.\\\",\\\"type\\\":\\\"button\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Will return version and other settings from the app.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":19}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751967304},{"Type":1,"NewValue":"{\"Id\":9706,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Request Data\",\"Json\":\"{\\\"name\\\":\\\"Request Data\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Request All Data command.\\\",\\\"type\\\":\\\"button\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Will return version and other settings from the app.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":18}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751977826}],"LanguageId":null,"Tags":[]},{"Id":9706,"Group":{"Id":5629,"Name":"DeviceConfig","Json":{"description":"Reset the device with default factory values","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]},"Name":"Request Data","Json":"{\"name\":\"Request Data\",\"default\":\"\",\"description\":\"Request All Data command.\",\"type\":\"button\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Will return version and other settings from the app.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":{"Id":4124,"Protocol":{"Id":206,"Code":"VGA","Version":"0.2","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"RequestData","TemplateSMS":"VGCMD-001;<>;<>;","Template":"VGCMD-001;<>;<>;[0a]","AckTemplate":null,"Operation":"var configs = [];\nsequenceNumber = (new Date().getTime()).toString(36);\nvar part1 = \"update=\" + sequenceNumber;\nvar command = \"REQDATA\";\nconst _crypto = require('crypto');\nif (params.Password.Password === \"\") {\n var password = serverParams.Imei;\n} else {\n var password = params.Password.Password;\n}\nif (params.Password.encryption === \"true\") {\n var part2 = encrypt(command, part1, password);\n} else {\n var part2 = command;\n}\nAddValue(\"part1\", part1);\nAddValue(\"part2\", part2);\nAddValue(\"sequenceNumber\", sequenceNumber);\nvar commandConfigs = {\n template: \"main\",\n configs: configs\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction encrypt(text, mid, password) {\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\n const iv = _crypto.randomBytes(16); // random initialization vector\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\n // set the cipher\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\n // encrypt text\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\n // generate output ( encrypted text )\n return Buffer.concat([iv, encrypted]).toString('base64');\n}","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":false,"SendAttempts":1,"Order":null},"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":9707,"Group":{"Id":5629,"Name":"DeviceConfig","Json":{"description":"Reset the device with default factory values","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]},"Name":"Version","Json":"{\"name\":\"Version\",\"default\":\"\",\"description\":\"Current Version of the App.\",\"type\":\"text\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Use Button Request Data to update the field.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":9707,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Version\",\"Json\":\"{\\\"name\\\":\\\"Version\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Current Version of the App.\\\",\\\"type\\\":\\\"text\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Use Button Request Data to update the field.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1710246871},{"Type":1,"NewValue":"{\"Id\":9707,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Version\",\"Json\":\"{\\\"name\\\":\\\"Version\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Current Version of the App.\\\",\\\"type\\\":\\\"text\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Use Button Request Data to update the field.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":15}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1714640853},{"Type":1,"NewValue":"{\"Id\":9707,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Version\",\"Json\":\"{\\\"name\\\":\\\"Version\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Current Version of the App.\\\",\\\"type\\\":\\\"text\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Use Button Request Data to update the field.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":16}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716278051},{"Type":1,"NewValue":"{\"Id\":9707,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Version\",\"Json\":\"{\\\"name\\\":\\\"Version\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Current Version of the App.\\\",\\\"type\\\":\\\"text\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Use Button Request Data to update the field.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":15}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716278066},{"Type":1,"NewValue":"{\"Id\":9707,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Version\",\"Json\":\"{\\\"name\\\":\\\"Version\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Current Version of the App.\\\",\\\"type\\\":\\\"text\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Use Button Request Data to update the field.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":20}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751967308},{"Type":1,"NewValue":"{\"Id\":9707,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Version\",\"Json\":\"{\\\"name\\\":\\\"Version\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Current Version of the App.\\\",\\\"type\\\":\\\"text\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Use Button Request Data to update the field.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":19}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751977829}],"LanguageId":null,"Tags":[]},{"Id":11133,"Group":{"Id":5629,"Name":"DeviceConfig","Json":{"description":"Reset the device with default factory values","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]},"Name":"StartTimeLog","Json":"{\"name\":\"StartTimeLog\",\"default\":\"\",\"description\":\"StartTime for Logs request\",\"type\":\"datetime\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":11133,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"StartTimeLog\",\"Json\":\"{\\\"name\\\":\\\"StartTimeLog\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"StartTime for Logs request\\\",\\\"type\\\":\\\"datetime\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":null,\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1714640506},{"Type":1,"NewValue":"{\"Id\":11133,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"StartTimeLog\",\"Json\":\"{\\\"name\\\":\\\"StartTimeLog\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"StartTime for Logs request\\\",\\\"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\\\":13}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1714640842},{"Type":1,"NewValue":"{\"Id\":11133,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"StartTimeLog\",\"Json\":\"{\\\"name\\\":\\\"StartTimeLog\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"StartTime for Logs request\\\",\\\"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\\\":12}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1714642185},{"Type":1,"NewValue":"{\"Id\":11133,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"StartTimeLog\",\"Json\":\"{\\\"name\\\":\\\"StartTimeLog\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"StartTime for Logs request\\\",\\\"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\\\":17}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751967298},{"Type":1,"NewValue":"{\"Id\":11133,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"StartTimeLog\",\"Json\":\"{\\\"name\\\":\\\"StartTimeLog\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"StartTime for Logs request\\\",\\\"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\\\":16}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751977822}],"LanguageId":null,"Tags":[]},{"Id":11134,"Group":{"Id":5629,"Name":"DeviceConfig","Json":{"description":"Reset the device with default factory values","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]},"Name":"EndTimeLog","Json":"{\"name\":\"EndTimeLog\",\"default\":\"\",\"description\":\"Endtime for log request\",\"type\":\"datetime\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":11134,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"EndTimeLog\",\"Json\":\"{\\\"name\\\":\\\"EndTimeLog\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Endtime for log request\\\",\\\"type\\\":\\\"datetime\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":null,\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1714640554},{"Type":1,"NewValue":"{\"Id\":11134,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"EndTimeLog\",\"Json\":\"{\\\"name\\\":\\\"EndTimeLog\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Endtime for log request\\\",\\\"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\\\":11}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1714640828},{"Type":1,"NewValue":"{\"Id\":11134,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"EndTimeLog\",\"Json\":\"{\\\"name\\\":\\\"EndTimeLog\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Endtime for log request\\\",\\\"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\\\":13}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1714642190},{"Type":1,"NewValue":"{\"Id\":11134,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"EndTimeLog\",\"Json\":\"{\\\"name\\\":\\\"EndTimeLog\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Endtime for log request\\\",\\\"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\\\":18}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751967301},{"Type":1,"NewValue":"{\"Id\":11134,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"EndTimeLog\",\"Json\":\"{\\\"name\\\":\\\"EndTimeLog\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Endtime for log request\\\",\\\"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\\\":17}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751977824}],"LanguageId":null,"Tags":[]},{"Id":11226,"Group":{"Id":5629,"Name":"DeviceConfig","Json":{"description":"Reset the device with default factory values","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]},"Name":"Restarts","Json":"{\"name\":\"Restarts\",\"default\":\"\",\"description\":\"Number of Restarts\",\"type\":\"number\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":true,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"When a BLE lockup is detected the app will restart itself to re-enable BLE.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":11226,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Restarts\",\"Json\":\"{\\\"name\\\":\\\"Restarts\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Number of Restarts\\\",\\\"type\\\":\\\"number\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":true,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"When a BLE lockup is detected the app will restart itself to re-enable BLE.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716204701},{"Type":1,"NewValue":"{\"Id\":11226,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Restarts\",\"Json\":\"{\\\"name\\\":\\\"Restarts\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Number of Restarts\\\",\\\"type\\\":\\\"number\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":true,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"When a BLE lockup is detected the app will restart itself to re-enable BLE.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":17}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716278055},{"Type":1,"NewValue":"{\"Id\":11226,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Restarts\",\"Json\":\"{\\\"name\\\":\\\"Restarts\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Number of Restarts\\\",\\\"type\\\":\\\"number\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":true,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"When a BLE lockup is detected the app will restart itself to re-enable BLE.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":16}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716278069},{"Type":1,"NewValue":"{\"Id\":11226,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Restarts\",\"Json\":\"{\\\"name\\\":\\\"Restarts\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Number of Restarts\\\",\\\"type\\\":\\\"number\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":true,\\\"isReadOnly\\\":true,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"When a BLE lockup is detected the app will restart itself to re-enable BLE.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751552278},{"Type":1,"NewValue":"{\"Id\":11226,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Restarts\",\"Json\":\"{\\\"name\\\":\\\"Restarts\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Number of Restarts\\\",\\\"type\\\":\\\"number\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":true,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"When a BLE lockup is detected the app will restart itself to re-enable BLE.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751636693},{"Type":1,"NewValue":"{\"Id\":11226,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Restarts\",\"Json\":\"{\\\"name\\\":\\\"Restarts\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Number of Restarts\\\",\\\"type\\\":\\\"number\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":true,\\\"isReadOnly\\\":true,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"When a BLE lockup is detected the app will restart itself to re-enable BLE.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751638322},{"Type":1,"NewValue":"{\"Id\":11226,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Restarts\",\"Json\":\"{\\\"name\\\":\\\"Restarts\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Number of Restarts\\\",\\\"type\\\":\\\"number\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":true,\\\"isReadOnly\\\":true,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"When a BLE lockup is detected the app will restart itself to re-enable BLE.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":16}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751967295},{"Type":1,"NewValue":"{\"Id\":11226,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Restarts\",\"Json\":\"{\\\"name\\\":\\\"Restarts\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Number of Restarts\\\",\\\"type\\\":\\\"number\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":true,\\\"isReadOnly\\\":true,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"When a BLE lockup is detected the app will restart itself to re-enable BLE.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":15}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751977820}],"LanguageId":null,"Tags":[]},{"Id":11227,"Group":{"Id":5629,"Name":"DeviceConfig","Json":{"description":"Reset the device with default factory values","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]},"Name":"MTBR","Json":"{\"name\":\"MTBR\",\"default\":\"\",\"description\":\"Mean Time Between Restarts\",\"type\":\"number\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Average time between restarts to fix the BLE issue. Bugger numbers are better.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":11227,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"MTBR\",\"Json\":\"{\\\"name\\\":\\\"MTBR\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Mean Time Between Restarts\\\",\\\"type\\\":\\\"number\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Average time between restarts to fix the BLE issue. Bugger numbers are better.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716204770},{"Type":1,"NewValue":"{\"Id\":11227,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"MTBR\",\"Json\":\"{\\\"name\\\":\\\"MTBR\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Mean Time Between Restarts\\\",\\\"type\\\":\\\"number\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Average time between restarts to fix the BLE issue. Bugger numbers are better.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":14}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716278044},{"Type":1,"NewValue":"{\"Id\":11227,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"MTBR\",\"Json\":\"{\\\"name\\\":\\\"MTBR\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Mean Time Between Restarts\\\",\\\"type\\\":\\\"number\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Average time between restarts to fix the BLE issue. Bugger numbers are better.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":17}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716278072},{"Type":1,"NewValue":"{\"Id\":11227,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"MTBR\",\"Json\":\"{\\\"name\\\":\\\"MTBR\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Mean Time Between Restarts\\\",\\\"type\\\":\\\"time\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Average time between restarts to fix the BLE issue. Bugger numbers are better.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716543699},{"Type":1,"NewValue":"{\"Id\":11227,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"MTBR\",\"Json\":\"{\\\"name\\\":\\\"MTBR\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Mean Time Between Restarts (hh:mm:ss)\\\",\\\"type\\\":\\\"time\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Average time between restarts to fix the BLE issue. Bugger numbers are better.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716543727},{"Type":1,"NewValue":"{\"Id\":11227,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"MTBR\",\"Json\":\"{\\\"name\\\":\\\"MTBR\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Mean Time Between Restarts (hh:mm:ss)\\\",\\\"type\\\":\\\"time\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Average time between restarts to fix the BLE issue. Bugger numbers are better.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":17}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716543763},{"Type":1,"NewValue":"{\"Id\":11227,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"MTBR\",\"Json\":\"{\\\"name\\\":\\\"MTBR\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Mean Time Between Restarts (hh:mm:ss)\\\",\\\"type\\\":\\\"time\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":true,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Average time between restarts to fix the BLE issue. Bugger numbers are better.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751552313},{"Type":1,"NewValue":"{\"Id\":11227,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"MTBR\",\"Json\":\"{\\\"name\\\":\\\"MTBR\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Mean Time Between Restarts (hh:mm:ss)\\\",\\\"type\\\":\\\"time\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":true,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Average time between restarts to fix the BLE issue. Bugger numbers are better.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":11}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751967280},{"Type":1,"NewValue":"{\"Id\":11227,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"MTBR\",\"Json\":\"{\\\"name\\\":\\\"MTBR\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Mean Time Between Restarts (hh:mm:ss)\\\",\\\"type\\\":\\\"time\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":true,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Average time between restarts to fix the BLE issue. Bugger numbers are better.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":10}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751977810},{"Type":1,"NewValue":"{\"Id\":11227,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"MTBR\",\"Json\":\"{\\\"name\\\":\\\"MTBR\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Mean Time Between Restarts (hh:mm:ss)\\\",\\\"type\\\":\\\"time\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":true,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Average time between restarts to fix the BLE issue. Bugger numbers are better.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":9}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751977965}],"LanguageId":null,"Tags":[]},{"Id":12374,"Group":{"Id":5629,"Name":"DeviceConfig","Json":{"description":"Reset the device with default factory values","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]},"Name":"BackgroundLocation","Json":"{\"name\":\"BackgroundLocation\",\"default\":\"\",\"description\":\"BackgroundLocation\",\"type\":\"text\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"BackgroundLocation\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":12374,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"BackgroundLocation\",\"Json\":\"{\\\"name\\\":\\\"BackgroundLocation\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"BackgroundLocation\\\",\\\"type\\\":\\\"text\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"BackgroundLocation\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751374909},{"Type":1,"NewValue":"{\"Id\":12374,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"BackgroundLocation\",\"Json\":\"{\\\"name\\\":\\\"BackgroundLocation\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"BackgroundLocation\\\",\\\"type\\\":\\\"text\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"BackgroundLocation\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":7}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751967267},{"Type":1,"NewValue":"{\"Id\":12374,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"BackgroundLocation\",\"Json\":\"{\\\"name\\\":\\\"BackgroundLocation\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"BackgroundLocation\\\",\\\"type\\\":\\\"text\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"BackgroundLocation\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":20}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751977831}],"LanguageId":null,"Tags":[]},{"Id":12375,"Group":{"Id":5629,"Name":"DeviceConfig","Json":{"description":"Reset the device with default factory values","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]},"Name":"CoarseLocation","Json":"{\"name\":\"CoarseLocation\",\"default\":\"\",\"description\":\"CoarseLocation\",\"type\":\"text\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"CoarseLocation\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":12375,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"CoarseLocation\",\"Json\":\"{\\\"name\\\":\\\"CoarseLocation\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"CoarseLocation\\\",\\\"type\\\":\\\"text\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"CoarseLocation\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751374960},{"Type":1,"NewValue":"{\"Id\":12375,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"CoarseLocation\",\"Json\":\"{\\\"name\\\":\\\"CoarseLocation\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"CoarseLocation\\\",\\\"type\\\":\\\"text\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"CoarseLocation\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":4}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751967258},{"Type":1,"NewValue":"{\"Id\":12375,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"CoarseLocation\",\"Json\":\"{\\\"name\\\":\\\"CoarseLocation\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"CoarseLocation\\\",\\\"type\\\":\\\"text\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"CoarseLocation\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":6}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751968964}],"LanguageId":null,"Tags":[]},{"Id":12376,"Group":{"Id":5629,"Name":"DeviceConfig","Json":{"description":"Reset the device with default factory values","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]},"Name":"FineLocation","Json":"{\"name\":\"FineLocation\",\"default\":\"\",\"description\":\"FineLocation\",\"type\":\"text\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"FineLocation\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":12376,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"FineLocation\",\"Json\":\"{\\\"name\\\":\\\"FineLocation\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"FineLocation\\\",\\\"type\\\":\\\"text\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"FineLocation\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751374992},{"Type":1,"NewValue":"{\"Id\":12376,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"FineLocation\",\"Json\":\"{\\\"name\\\":\\\"FineLocation\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"FineLocation\\\",\\\"type\\\":\\\"text\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"FineLocation\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":6}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751967264},{"Type":1,"NewValue":"{\"Id\":12376,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"FineLocation\",\"Json\":\"{\\\"name\\\":\\\"FineLocation\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"FineLocation\\\",\\\"type\\\":\\\"text\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"FineLocation\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":5}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751968961}],"LanguageId":null,"Tags":[]}],"ProtocolChanges":[{"Version":"0.2","UserName":"Sean-Admin","Resource":"MessageType","Name":"ALLDATA","Message":"(Create) (ALLDATA) add ALLDATA messagetype","Timestamp":1710246258},{"Version":"0.2","UserName":"Sean-Admin","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) Ops update - ALLDATA processing","Timestamp":1710246336},{"Version":"0.2","UserName":"Sean-Admin","Resource":"Command","Name":"ClearBuffer","Message":"(Create) (ClearBuffer) create CLRBUF command","Timestamp":1710246421},{"Version":"0.2","UserName":"Sean-Admin","Resource":"Command","Name":"RequestData","Message":"(Create) (RequestData) create REQDATA command","Timestamp":1710246477},{"Version":"0.2","UserName":"Sean-Admin","Resource":"Command","Name":"RequestLog","Message":"(Create) (RequestLog) create REQLOG command","Timestamp":1710246526},{"Version":"0.2","UserName":"Sean-Admin","Resource":"Command","Name":"Set RTLog Enable","Message":"(Create) (Set RTLog Enable) create RTLOG command","Timestamp":1710246587},{"Version":"0.2","UserName":"Sean-Admin","Resource":"GroupParam","Name":"Clear Message Buffer","Message":"(Create) (Clear Message Buffer) Add ClearBuffer button","Timestamp":1710246641},{"Version":"0.2","UserName":"Sean-Admin","Resource":"GroupParam","Name":"Clear Message Buffer","Message":"Associate groupParam Clear Message Buffer to command ClearBuffer","Timestamp":1710246647},{"Version":"0.2","UserName":"Sean-Admin","Resource":"GroupParam","Name":"Enable Logging","Message":"(Create) (Enable Logging) add RTLog checkbox","Timestamp":1710246708},{"Version":"0.2","UserName":"Sean-Admin","Resource":"GroupParam","Name":"Enable Logging","Message":"Associate groupParam Enable Logging to command Set RTLog Enable","Timestamp":1710246712},{"Version":"0.2","UserName":"Sean-Admin","Resource":"GroupParam","Name":"Get Logs","Message":"(Create) (Get Logs) add Request Log button","Timestamp":1710246766},{"Version":"0.2","UserName":"Sean-Admin","Resource":"GroupParam","Name":"Get Logs","Message":"Associate groupParam Get Logs to command RequestLog","Timestamp":1710246770},{"Version":"0.2","UserName":"Sean-Admin","Resource":"GroupParam","Name":"Request Data","Message":"(Create) (Request Data) add request Data command","Timestamp":1710246818},{"Version":"0.2","UserName":"Sean-Admin","Resource":"GroupParam","Name":"Request Data","Message":"Associate groupParam Request Data to command RequestData","Timestamp":1710246823},{"Version":"0.2","UserName":"Sean-Admin","Resource":"GroupParam","Name":"Version","Message":"(Create) (Version) add version field","Timestamp":1710246871},{"Version":"0.2","UserName":"Sean-Admin","Resource":"Protocol","Name":null,"Message":"version and logging","Timestamp":1710246938},{"Version":"0.3","UserName":"Sean-Admin","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) auto-activate for acceptance","Timestamp":1711039145},{"Version":"0.3","UserName":"Sean-Admin","Resource":"Protocol","Name":null,"Message":"Auto-activate on Acceptance only","Timestamp":1711039692},{"Version":"0.4","UserName":"Sean-Admin","Resource":"MessageType","Name":"CYC","Message":"(Update) (CYC) Fix for CYC location_accuracy","Timestamp":1712654533},{"Version":"0.4","UserName":"Sean-Admin","Resource":"MessageType","Name":"ALLDATA","Message":"(Update) (ALLDATA) Fix for ALLDATA location accuracy","Timestamp":1712654568},{"Version":"0.4","UserName":"Sean-Admin","Resource":"Protocol","Name":null,"Message":"Fox for locatin precision for CYC messages","Timestamp":1712655610},{"Version":"0.5","UserName":"Sean-Admin","Resource":"GroupParam","Name":"StartTimeLog","Message":"(Create) (StartTimeLog) adding starttime to LOGREQ","Timestamp":1714640506},{"Version":"0.5","UserName":"Sean-Admin","Resource":"GroupParam","Name":"EndTimeLog","Message":"(Create) (EndTimeLog) Adding endtime to REQLOG","Timestamp":1714640554},{"Version":"0.5","UserName":"Sean-Admin","Resource":"Command","Name":"RequestLog","Message":"(Update) (RequestLog) add start and endtime to REQLOG command","Timestamp":1714640696},{"Version":"0.5","UserName":"Sean-Admin","Resource":"GroupParam","Name":"DisableAck","Message":"(Update) (DisableAck) hiding unused control","Timestamp":1714640747},{"Version":"0.5","UserName":"Sean-Admin","Resource":"GroupParam","Name":"Enable Logging","Message":"(Update) (Enable Logging) hiding realtime logging as not implemented","Timestamp":1714640774},{"Version":"0.5","UserName":"Sean-Admin","Resource":"GroupParam","Name":"Clear Message Buffer","Message":"(Update) (Clear Message Buffer) Reorder Group Params","Timestamp":1714640790},{"Version":"0.5","UserName":"Sean-Admin","Resource":"GroupParam","Name":"Config Mode","Message":"(Update) (Config Mode) Reorder Group Params","Timestamp":1714640794},{"Version":"0.5","UserName":"Sean-Admin","Resource":"GroupParam","Name":"ICCID","Message":"(Update) (ICCID) Reorder Group Params","Timestamp":1714640798},{"Version":"0.5","UserName":"Sean-Admin","Resource":"GroupParam","Name":"IV Activated","Message":"(Update) (IV Activated) Reorder Group Params","Timestamp":1714640801},{"Version":"0.5","UserName":"Sean-Admin","Resource":"GroupParam","Name":"IV ActivatedFailMessage","Message":"(Update) (IV ActivatedFailMessage) Reorder Group Params","Timestamp":1714640806},{"Version":"0.5","UserName":"Sean-Admin","Resource":"GroupParam","Name":"Reset","Message":"(Update) (Reset) Reorder Group Params","Timestamp":1714640812},{"Version":"0.5","UserName":"Sean-Admin","Resource":"GroupParam","Name":"DisableAck","Message":"(Update) (DisableAck) Reorder Group Params","Timestamp":1714640819},{"Version":"0.5","UserName":"Sean-Admin","Resource":"GroupParam","Name":"Enable Logging","Message":"(Update) (Enable Logging) Reorder Group Params","Timestamp":1714640824},{"Version":"0.5","UserName":"Sean-Admin","Resource":"GroupParam","Name":"EndTimeLog","Message":"(Update) (EndTimeLog) Reorder Group Params","Timestamp":1714640828},{"Version":"0.5","UserName":"Sean-Admin","Resource":"GroupParam","Name":"Get Logs","Message":"(Update) (Get Logs) Reorder Group Params","Timestamp":1714640834},{"Version":"0.5","UserName":"Sean-Admin","Resource":"GroupParam","Name":"StartTimeLog","Message":"(Update) (StartTimeLog) Reorder Group Params","Timestamp":1714640842},{"Version":"0.5","UserName":"Sean-Admin","Resource":"GroupParam","Name":"Get Logs","Message":"(Update) (Get Logs) Reorder Group Params","Timestamp":1714640848},{"Version":"0.5","UserName":"Sean-Admin","Resource":"GroupParam","Name":"Version","Message":"(Update) (Version) Reorder Group Params","Timestamp":1714640853},{"Version":"0.5","UserName":"Sean-Admin","Resource":"GroupParam","Name":"Get Logs","Message":"(Update) (Get Logs) Reorder Group Params","Timestamp":1714640888},{"Version":"0.5","UserName":"Sean-Admin","Resource":"GroupParam","Name":"StartTimeLog","Message":"(Update) (StartTimeLog) Reorder Group Params","Timestamp":1714642185},{"Version":"0.5","UserName":"Sean-Admin","Resource":"GroupParam","Name":"EndTimeLog","Message":"(Update) (EndTimeLog) Reorder Group Params","Timestamp":1714642190},{"Version":"0.5","UserName":"Sean-Admin","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) Check ICCID is a number","Timestamp":1714651746},{"Version":"0.5","UserName":"Sean-Admin","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) Moved ICCID check to CREATE message","Timestamp":1715247045},{"Version":"0.5","UserName":"Sean-Admin","Resource":"Protocol","Name":null,"Message":"Log time ranges, hide unused controls, ICCID filtering","Timestamp":1715255881},{"Version":"0.6","UserName":"Sean-Admin","Resource":"GroupParam","Name":"Restarts","Message":"(Create) (Restarts) Add restarts count read only field","Timestamp":1716204701},{"Version":"0.6","UserName":"Sean-Admin","Resource":"GroupParam","Name":"MTBR","Message":"(Create) (MTBR) Add MTBR field","Timestamp":1716204770},{"Version":"0.6","UserName":"Sean-Admin","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) restarts and mtbr json parsing","Timestamp":1716206509},{"Version":"0.6","UserName":"Sean-Admin","Resource":"GroupParam","Name":"MTBR","Message":"(Update) (MTBR) Reorder Group Params","Timestamp":1716278044},{"Version":"0.6","UserName":"Sean-Admin","Resource":"GroupParam","Name":"Request Data","Message":"(Update) (Request Data) Reorder Group Params","Timestamp":1716278047},{"Version":"0.6","UserName":"Sean-Admin","Resource":"GroupParam","Name":"Version","Message":"(Update) (Version) Reorder Group Params","Timestamp":1716278051},{"Version":"0.6","UserName":"Sean-Admin","Resource":"GroupParam","Name":"Restarts","Message":"(Update) (Restarts) Reorder Group Params","Timestamp":1716278055},{"Version":"0.6","UserName":"Sean-Admin","Resource":"GroupParam","Name":"Request Data","Message":"(Update) (Request Data) Reorder Group Params","Timestamp":1716278063},{"Version":"0.6","UserName":"Sean-Admin","Resource":"GroupParam","Name":"Version","Message":"(Update) (Version) Reorder Group Params","Timestamp":1716278066},{"Version":"0.6","UserName":"Sean-Admin","Resource":"GroupParam","Name":"Restarts","Message":"(Update) (Restarts) Reorder Group Params","Timestamp":1716278069},{"Version":"0.6","UserName":"Sean-Admin","Resource":"GroupParam","Name":"MTBR","Message":"(Update) (MTBR) Reorder Group Params","Timestamp":1716278072},{"Version":"0.6","UserName":"Sean-Admin","Resource":"GroupParam","Name":"Enable Disable No Activity","Message":"(Update) (Enable Disable No Activity) hide unused params","Timestamp":1716289251},{"Version":"0.6","UserName":"Sean-Admin","Resource":"GroupParam","Name":"Enable Disable NonMovement","Message":"(Update) (Enable Disable NonMovement) hide unused params","Timestamp":1716289267},{"Version":"0.6","UserName":"Sean-Admin","Resource":"GroupParam","Name":"period ","Message":"(Update) (period ) hide unused params","Timestamp":1716289280},{"Version":"0.6","UserName":"Sean-Admin","Resource":"GroupParam","Name":"Real Time Locate","Message":"(Update) (Real Time Locate) hide unused params","Timestamp":1716289318},{"Version":"0.6","UserName":"Sean-Admin","Resource":"GroupParam","Name":"Set Primary Server","Message":"(Update) (Set Primary Server) hide unused params","Timestamp":1716289362},{"Version":"0.6","UserName":"Sean-Admin","Resource":"GroupParam","Name":"Set Secondary Server","Message":"(Update) (Set Secondary Server) hide unused params","Timestamp":1716289376},{"Version":"0.6","UserName":"Sean-Admin","Resource":"Command","Name":"Battery Charging Alert","Message":"(Update) (Battery Charging Alert) encryption updates","Timestamp":1716290008},{"Version":"0.6","UserName":"Sean-Admin","Resource":"Command","Name":"Battery Critical Alert Setting","Message":"(Update) (Battery Critical Alert Setting) encryption updates","Timestamp":1716290093},{"Version":"0.6","UserName":"Sean-Admin","Resource":"Command","Name":"Battery Low Alert Setting","Message":"(Update) (Battery Low Alert Setting) encryption updates","Timestamp":1716290124},{"Version":"0.6","UserName":"Sean-Admin","Resource":"Command","Name":"ClearBuffer","Message":"(Update) (ClearBuffer) encryption updates","Timestamp":1716290144},{"Version":"0.6","UserName":"Sean-Admin","Resource":"Command","Name":"Cycle Interval","Message":"(Update) (Cycle Interval) encryption updates","Timestamp":1716290163},{"Version":"0.6","UserName":"Sean-Admin","Resource":"Command","Name":"Device Activated","Message":"(Update) (Device Activated) encryption updates","Timestamp":1716290183},{"Version":"0.6","UserName":"Sean-Admin","Resource":"Command","Name":"NonMovement","Message":"(Update) (NonMovement) encryption updates","Timestamp":1716290205},{"Version":"0.6","UserName":"Sean-Admin","Resource":"Command","Name":"PowerOff Bracelet","Message":"(Update) (PowerOff Bracelet) encryption updates","Timestamp":1716290233},{"Version":"0.6","UserName":"Sean-Admin","Resource":"Command","Name":"Real Time Locate","Message":"(Update) (Real Time Locate) encryption updates","Timestamp":1716290253},{"Version":"0.6","UserName":"Sean-Admin","Resource":"Command","Name":"Reboot Bracelet","Message":"(Update) (Reboot Bracelet) encryption updates","Timestamp":1716290275},{"Version":"0.6","UserName":"Sean-Admin","Resource":"Command","Name":"RequestData","Message":"(Update) (RequestData) encryption updates","Timestamp":1716290305},{"Version":"0.6","UserName":"Sean-Admin","Resource":"Command","Name":"RequestLog","Message":"(Update) (RequestLog) encryption updates","Timestamp":1716290326},{"Version":"0.6","UserName":"Sean-Admin","Resource":"Command","Name":"Reset Bracelet","Message":"(Update) (Reset Bracelet) encryption updates","Timestamp":1716290345},{"Version":"0.6","UserName":"Sean-Admin","Resource":"Command","Name":"Reset Device","Message":"(Update) (Reset Device) encryption updates","Timestamp":1716290362},{"Version":"0.6","UserName":"Sean-Admin","Resource":"Command","Name":"Send Notification","Message":"(Update) (Send Notification) encryption updates","Timestamp":1716290378},{"Version":"0.6","UserName":"Sean-Admin","Resource":"Command","Name":"Set Bracelet Password","Message":"(Update) (Set Bracelet Password) encryption updates","Timestamp":1716290394},{"Version":"0.6","UserName":"Sean-Admin","Resource":"Command","Name":"Set Config Enable","Message":"(Update) (Set Config Enable) encryption updates","Timestamp":1716290410},{"Version":"0.6","UserName":"Sean-Admin","Resource":"Command","Name":"Set RTLog Enable","Message":"(Update) (Set RTLog Enable) encryption updates","Timestamp":1716290430},{"Version":"0.6","UserName":"Sean-Admin","Resource":"Command","Name":"Set Server","Message":"(Update) (Set Server) encryption updates","Timestamp":1716290452},{"Version":"0.6","UserName":"Sean-Admin","Resource":"Command","Name":"SetBattery Bracelet","Message":"(Update) (SetBattery Bracelet) encryption updates","Timestamp":1716290471},{"Version":"0.6","UserName":"Sean-Admin","Resource":"Command","Name":"SetBLEParam Bracelet","Message":"(Update) (SetBLEParam Bracelet) encryption updates","Timestamp":1716290492},{"Version":"0.6","UserName":"Sean-Admin","Resource":"Command","Name":"SetCloudParam Bracelet","Message":"(Update) (SetCloudParam Bracelet) encryption updates","Timestamp":1716290513},{"Version":"0.6","UserName":"Sean-Admin","Resource":"Command","Name":"SetCommonParam Bracelet","Message":"(Update) (SetCommonParam Bracelet) encryption updates","Timestamp":1716290530},{"Version":"0.6","UserName":"Sean-Admin","Resource":"Command","Name":"SetLTEParam Bracelet","Message":"(Update) (SetLTEParam Bracelet) encryption updates","Timestamp":1716290549},{"Version":"0.6","UserName":"Sean-Admin","Resource":"Command","Name":"SetTemp Bracelet","Message":"(Update) (SetTemp Bracelet) encryption updates","Timestamp":1716290568},{"Version":"0.6","UserName":"Sean-Admin","Resource":"Command","Name":"Set Password","Message":"(Update) (Set Password) encryption updates","Timestamp":1716290661},{"Version":"0.6","UserName":"Sean-Admin","Resource":"GroupParam","Name":"BraceletPW","Message":"(Update) (BraceletPW) hide unused params","Timestamp":1716290748},{"Version":"0.6","UserName":"Sean-Admin","Resource":"GroupParam","Name":"encryption","Message":"(Update) (encryption) hide unused params","Timestamp":1716290763},{"Version":"0.6","UserName":"Sean-Admin","Resource":"GroupParam","Name":"MTBR","Message":"(Update) (MTBR) change mtbr to time","Timestamp":1716543699},{"Version":"0.6","UserName":"Sean-Admin","Resource":"GroupParam","Name":"MTBR","Message":"(Update) (MTBR) update label","Timestamp":1716543727},{"Version":"0.6","UserName":"Sean-Admin","Resource":"GroupParam","Name":"MTBR","Message":"(Update) (MTBR) Reorder Group Params","Timestamp":1716543763},{"Version":"0.6","UserName":"Sean-Admin","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) change mtbr int to time","Timestamp":1716543912},{"Version":"0.6","UserName":"Sean-Admin","Resource":"Protocol","Name":null,"Message":"encryption, restarts and MTBR params, tidy up","Timestamp":1716972302},{"Version":"0.7","UserName":"Sean-Admin","Resource":"Command","Name":"Device Activated","Message":"(Update) (Device Activated) Increase Device activated retries to 4","Timestamp":1718098112},{"Version":"0.7","UserName":"Sean-Admin","Resource":"Protocol","Name":null,"Message":"Bump version for protocol-dev","Timestamp":1737376303},{"Version":"0.7","UserName":"Test-Admin","Resource":"MessageType","Name":"GETPWB","Message":"(Create) (GETPWB) 1507891 GETPWB message implementation","Timestamp":1741968756},{"Version":"0.7","UserName":"Test-Admin","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) 1507891-GETPWB message implementation","Timestamp":1742311652},{"Version":"0.7","UserName":"Test-Admin","Resource":"MessageType","Name":"GETPWB","Message":"(Update) (GETPWB) 1507891 GETPWB Message Implementation","Timestamp":1742312695},{"Version":"0.8","UserName":"alex.marsden@theaccessgroup.com","Resource":"MessageType","Name":"INFO-GETPWB","Message":"(Create) (INFO-GETPWB) 1507891 - bracelet password message type","Timestamp":1742382959},{"Version":"0.8","UserName":"alex.marsden@theaccessgroup.com","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) 1507891-getbraceletpassword","Timestamp":1742386705},{"Version":"0.8","UserName":"alex.marsden@theaccessgroup.com","Resource":"MessageType","Name":"INFO-GETPWB","Message":"(Update) (INFO-GETPWB) 1507891-passwordbracelet","Timestamp":1742386996},{"Version":"0.8","UserName":"alex.marsden@theaccessgroup.com","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) 1507891-passwordbracelet","Timestamp":1742387419},{"Version":"0.8","UserName":"alex.marsden@theaccessgroup.com","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) 1507894 changes","Timestamp":1744200583},{"Version":"0.8","UserName":"alex.marsden@theaccessgroup.com","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) 1507894 changes","Timestamp":1744200792},{"Version":"0.8","UserName":"alex.marsden@theaccessgroup.com","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) 1507894 changes","Timestamp":1744202227},{"Version":"0.8","UserName":"alex.marsden@theaccessgroup.com","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) 1507894 changes","Timestamp":1744202554},{"Version":"0.8","UserName":"alex.marsden@theaccessgroup.com","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) changes","Timestamp":1744202767},{"Version":"0.8","UserName":"alex.marsden@theaccessgroup.com","Resource":"MessageType","Name":"INFO-GETPWB","Message":"(Update) (INFO-GETPWB) imei to mac","Timestamp":1744202928},{"Version":"0.8","UserName":"alex.marsden@theaccessgroup.com","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) changes","Timestamp":1744202957},{"Version":"0.8","UserName":"alex.marsden@theaccessgroup.com","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) changes","Timestamp":1744203728},{"Version":"0.8","UserName":"alex.marsden@theaccessgroup.com","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) changes","Timestamp":1744203822},{"Version":"0.8","UserName":"alex.marsden@theaccessgroup.com","Resource":"MessageType","Name":"INFO-GETPWB","Message":"(Update) (INFO-GETPWB) changes","Timestamp":1744203836},{"Version":"0.8","UserName":"alex.marsden@theaccessgroup.com","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) changes","Timestamp":1744204411},{"Version":"0.8","UserName":"gaurav.verma@theaccessgroup.com","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) 1507891 - refactor code to add lookup key valuie","Timestamp":1744207495},{"Version":"0.8","UserName":"gaurav.verma@theaccessgroup.com","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) removed new msg object creation","Timestamp":1744208228},{"Version":"0.8","UserName":"alex.marsden@theaccessgroup.com","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) changes","Timestamp":1744208434},{"Version":"0.8","UserName":"gaurav.verma@theaccessgroup.com","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) commenting msg obj. ","Timestamp":1744208682},{"Version":"0.8","UserName":"gaurav.verma@theaccessgroup.com","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) putting var msg back","Timestamp":1744208780},{"Version":"0.8","UserName":"gaurav.verma@theaccessgroup.com","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) remove var from var msg object","Timestamp":1744209049},{"Version":"0.8","UserName":"gaurav.verma@theaccessgroup.com","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) added key value to msg object","Timestamp":1744209157},{"Version":"0.8","UserName":"gaurav.verma@theaccessgroup.com","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) hardcoded msg key value","Timestamp":1744209596},{"Version":"0.8","UserName":"gaurav.verma@theaccessgroup.com","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) removed key value from msg obj","Timestamp":1744209665},{"Version":"0.8","UserName":"gaurav.verma@theaccessgroup.com","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) using devicekey for key","Timestamp":1744209781},{"Version":"0.8","UserName":"gaurav.verma@theaccessgroup.com","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) device key ","Timestamp":1744209893},{"Version":"0.8","UserName":"alex.marsden@theaccessgroup.com","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) use bracelet_mac variable","Timestamp":1744209994},{"Version":"0.8","UserName":"alex.marsden@theaccessgroup.com","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) refactor msg and device key","Timestamp":1744210988},{"Version":"0.8","UserName":"alex.marsden@theaccessgroup.com","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) changes","Timestamp":1744301752},{"Version":"0.8","UserName":"Sean-Admin","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) only create keyValue query when requesting password","Timestamp":1747753380},{"Version":"0.8","UserName":"Sean-Admin","Resource":"Protocol","Name":null,"Message":"password using secure storage","Timestamp":1751276409},{"Version":"0.9","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"BackgroundLocation","Message":"(Create) (BackgroundLocation) 1705861-addbackgroundlocation-device-config","Timestamp":1751374909},{"Version":"0.9","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"CoarseLocation","Message":"(Create) (CoarseLocation) 1705861-add-coarselocation-device-config","Timestamp":1751374960},{"Version":"0.9","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"FineLocation","Message":"(Create) (FineLocation) 1705861-add-finelocation-device-config","Timestamp":1751374992},{"Version":"0.9","UserName":"alex.marsden@theaccessgroup.com","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) 1705861-vga-ops-script-update","Timestamp":1751382743},{"Version":"0.9","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"Restarts","Message":"(Update) (Restarts) 1740967-alldata-make-restarts-readonly","Timestamp":1751552278},{"Version":"0.9","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"MTBR","Message":"(Update) (MTBR) 1740967-alldata-make-mtbr-readonly","Timestamp":1751552313},{"Version":"0.9","UserName":"alex.marsden@theaccessgroup.com","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) 170967-alldata-add-new-fields-op-script-vga","Timestamp":1751555375},{"Version":"0.9","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"Restarts","Message":"(Update) (Restarts) remove readonly on restarts vga","Timestamp":1751636693},{"Version":"0.9","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"Restarts","Message":"(Update) (Restarts) restarts read only again vga","Timestamp":1751638322},{"Version":"0.9","UserName":"alex.marsden@theaccessgroup.com","Resource":"Protocol","Name":null,"Message":"1740967 - pack for acceptance","Timestamp":1751641886},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"CoarseLocation","Message":"(Update) (CoarseLocation) Reorder Group Params","Timestamp":1751967258},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"Config Mode","Message":"(Update) (Config Mode) Reorder Group Params","Timestamp":1751967261},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"FineLocation","Message":"(Update) (FineLocation) Reorder Group Params","Timestamp":1751967264},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"BackgroundLocation","Message":"(Update) (BackgroundLocation) Reorder Group Params","Timestamp":1751967267},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"ICCID","Message":"(Update) (ICCID) Reorder Group Params","Timestamp":1751967270},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"IV Activated","Message":"(Update) (IV Activated) Reorder Group Params","Timestamp":1751967273},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"IV ActivatedFailMessage","Message":"(Update) (IV ActivatedFailMessage) Reorder Group Params","Timestamp":1751967276},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"MTBR","Message":"(Update) (MTBR) Reorder Group Params","Timestamp":1751967280},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"Reset","Message":"(Update) (Reset) Reorder Group Params","Timestamp":1751967283},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"DisableAck","Message":"(Update) (DisableAck) Reorder Group Params","Timestamp":1751967286},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"Enable Logging","Message":"(Update) (Enable Logging) Reorder Group Params","Timestamp":1751967289},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"Get Logs","Message":"(Update) (Get Logs) Reorder Group Params","Timestamp":1751967292},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"Restarts","Message":"(Update) (Restarts) Reorder Group Params","Timestamp":1751967295},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"StartTimeLog","Message":"(Update) (StartTimeLog) Reorder Group Params","Timestamp":1751967298},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"EndTimeLog","Message":"(Update) (EndTimeLog) Reorder Group Params","Timestamp":1751967301},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"Request Data","Message":"(Update) (Request Data) Reorder Group Params","Timestamp":1751967304},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"Version","Message":"(Update) (Version) Reorder Group Params","Timestamp":1751967308},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"Config Mode","Message":"(Update) (Config Mode) Reorder Group Params","Timestamp":1751968957},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"FineLocation","Message":"(Update) (FineLocation) Reorder Group Params","Timestamp":1751968961},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"CoarseLocation","Message":"(Update) (CoarseLocation) Reorder Group Params","Timestamp":1751968964},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"ICCID","Message":"(Update) (ICCID) Reorder Group Params","Timestamp":1751977804},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"IV Activated","Message":"(Update) (IV Activated) Reorder Group Params","Timestamp":1751977806},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"IV ActivatedFailMessage","Message":"(Update) (IV ActivatedFailMessage) Reorder Group Params","Timestamp":1751977808},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"MTBR","Message":"(Update) (MTBR) Reorder Group Params","Timestamp":1751977810},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"Reset","Message":"(Update) (Reset) Reorder Group Params","Timestamp":1751977812},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"DisableAck","Message":"(Update) (DisableAck) Reorder Group Params","Timestamp":1751977814},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"Enable Logging","Message":"(Update) (Enable Logging) Reorder Group Params","Timestamp":1751977816},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"Get Logs","Message":"(Update) (Get Logs) Reorder Group Params","Timestamp":1751977818},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"Restarts","Message":"(Update) (Restarts) Reorder Group Params","Timestamp":1751977820},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"StartTimeLog","Message":"(Update) (StartTimeLog) Reorder Group Params","Timestamp":1751977822},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"EndTimeLog","Message":"(Update) (EndTimeLog) Reorder Group Params","Timestamp":1751977824},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"Request Data","Message":"(Update) (Request Data) Reorder Group Params","Timestamp":1751977826},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"Version","Message":"(Update) (Version) Reorder Group Params","Timestamp":1751977829},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"BackgroundLocation","Message":"(Update) (BackgroundLocation) Reorder Group Params","Timestamp":1751977831},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"ICCID","Message":"(Update) (ICCID) Reorder Group Params","Timestamp":1751977958},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"IV Activated","Message":"(Update) (IV Activated) Reorder Group Params","Timestamp":1751977961},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"IV ActivatedFailMessage","Message":"(Update) (IV ActivatedFailMessage) Reorder Group Params","Timestamp":1751977963},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"MTBR","Message":"(Update) (MTBR) Reorder Group Params","Timestamp":1751977965},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"Reset","Message":"(Update) (Reset) Reorder Group Params","Timestamp":1751977967},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"DisableAck","Message":"(Update) (DisableAck) Reorder Group Params","Timestamp":1751977969},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"Enable Logging","Message":"(Update) (Enable Logging) Reorder Group Params","Timestamp":1751977971},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"Get Logs","Message":"(Update) (Get Logs) Reorder Group Params","Timestamp":1751977973}],"ProtocolActionObjects":[],"Tags":[{"Id":1957,"Name":"ONeCommandSender","BackendAction":"OneCommandSender","Value":"True"},{"Id":1959,"Name":"PermitDuplicates","BackendAction":"PermitReceiverDublicates","Value":"True"}],"MessageCodes":[{"Name":"Alarm - Movement","Description":"At alert on movement ( not fall)","Code":"ALMOV","CanLiveInsights":false},{"Name":"Alarm-Welfare Check","Description":"Welfare check alarm","Code":"ALW","CanLiveInsights":false},{"Name":"Cycle","Description":"Regular, cyclic, events from a device","Code":"CYC","CanLiveInsights":false},{"Name":"Location - other","Description":"Location - other","Code":"LOCN","CanLiveInsights":false},{"Name":"Acknowledge","Description":"Acknowledgment of a command sent to the device","Code":"ACK","CanLiveInsights":false},{"Name":"Battery Charging - On","Description":"Battery Charging - On","Code":"BATCN","CanLiveInsights":false},{"Name":"Check / keep alive / Heartbeat","Description":"Keep alive / heartbeat signal to maintain a connection ","Code":"CHK","CanLiveInsights":false},{"Name":"Alarm - Amber Alert","Description":"Alarm - Amber Alert","Code":"ALA","CanLiveInsights":false},{"Name":"Alarm – Fall","Description":"Alarm – Fall","Code":"ALF","CanLiveInsights":false},{"Name":"Alarm – Non movement","Description":"Alarm – Non movement","Code":"ALNM","CanLiveInsights":false},{"Name":"Alarm - Smoke","Description":"Alarm - Smoke","Code":"ALSM","CanLiveInsights":false},{"Name":"Alarm - Speed","Description":"Alarm - Speed","Code":"ALSP","CanLiveInsights":false},{"Name":"Alarm – Emergency Cancelled","Description":"Alarm – Emergency Cancelled by the user","Code":"ALSOS-C","CanLiveInsights":false},{"Name":"Battery Charging - off","Description":"Battery Charging - off","Code":"BATCF","CanLiveInsights":false},{"Name":"Battery empty","Description":"Battery empty","Code":"BATE","CanLiveInsights":false},{"Name":"Battery full","Description":"Battery full","Code":"BATF","CanLiveInsights":false},{"Name":"Battery low","Description":"Battery low","Code":"BATL","CanLiveInsights":false},{"Name":"Button Press","Description":"Button Press","Code":"BPRS","CanLiveInsights":false},{"Name":"Ebeacon zone in","Description":"Ebeacon zone in","Code":"EBZI","CanLiveInsights":false},{"Name":"Ebeacon zone out","Description":"Ebeacon zone out","Code":"EBZO","CanLiveInsights":false},{"Name":"Location check in","Description":"Location check in","Code":"LCI","CanLiveInsights":false},{"Name":"Location check out","Description":"Location check out","Code":"LCO","CanLiveInsights":false},{"Name":"Reminder not ok","Description":"Reminder not ok","Code":"MRME","CanLiveInsights":false},{"Name":"No Activity","Description":"No Activity","Code":"NACT","CanLiveInsights":false},{"Name":"Power Off","Description":"Power Off","Code":"PWRF","CanLiveInsights":false},{"Name":"Power On","Description":"Power On","Code":"PWRN","CanLiveInsights":false},{"Name":"Vehicle - Driving hours excess","Description":"Vehicle - Driving hours excess","Code":"VDE","CanLiveInsights":false},{"Name":"Vehicle – Fuel cap","Description":"Vehicle – Fuel cap","Code":"VFC","CanLiveInsights":false},{"Name":"Vehicle - Fuel level","Description":"Vehicle - Fuel level","Code":"VFL","CanLiveInsights":false},{"Name":"Vehicle – Harsh braking","Description":"Vehicle – Harsh braking","Code":"VHB","CanLiveInsights":false},{"Name":"Vehicle – Ignition off","Description":"Vehicle – Ignition off","Code":"VIGF","CanLiveInsights":false},{"Name":"Vehicle – Driver not authorized","Description":"Vehicle – Driver not authorized","Code":"VNA","CanLiveInsights":false},{"Name":"Vehicle – Night driving","Description":"Vehicle – Night driving","Code":"VND","CanLiveInsights":false},{"Name":"Vehicle – Ignition on","Description":"Vehicle – Ignition on","Code":"VIGN","CanLiveInsights":false},{"Name":"Vehicle – Seat belt","Description":"Vehicle – Seat belt","Code":"VSB","CanLiveInsights":false},{"Name":"Zone in","Description":"Zone in","Code":"ZNI","CanLiveInsights":false},{"Name":"Zone out","Description":"Zone out","Code":"ZNO","CanLiveInsights":false},{"Name":"Device Status","Description":"Device Status","Code":"STATUS","CanLiveInsights":false},{"Name":"Real time location ","Description":"Real time location ","Code":"RTL","CanLiveInsights":false},{"Name":"Encoded communication","Description":"Encoded communication","Code":"ENC","CanLiveInsights":false},{"Name":"Proximity","Description":"Proximity alert ","Code":"PROX","CanLiveInsights":false},{"Name":"Dummy - do NOT use ","Description":"Dummy template - should not be used","Code":"DUMMY","CanLiveInsights":false},{"Name":"Battery High","Description":"Battery High","Code":"BATH","CanLiveInsights":false},{"Name":"Location - Set Available","Description":"Location - Set Available","Code":"LSA","CanLiveInsights":false},{"Name":"Location - Set Busy","Description":"Location - Set Busy","Code":"LSB","CanLiveInsights":false},{"Name":"Device information","Description":"General Device Information from the device","Code":"INFO","CanLiveInsights":false},{"Name":"Alarm - Tamper","Description":"Alarm - Device Tamper","Code":"ALTAM","CanLiveInsights":false},{"Name":"Communication ","Description":"General communication, initialisation etc.","Code":"COMM","CanLiveInsights":false},{"Name":"Humidity","Description":"Relative humidity","Code":"RH","CanLiveInsights":false},{"Name":"Temperature","Description":"Temperature","Code":"TEMP","CanLiveInsights":false},{"Name":"Alarm - Temperature","Description":"Alarm - Temperature","Code":"ALTEMP","CanLiveInsights":false},{"Name":"Alarm - Humidity","Description":"Alarm - Relative Humidity","Code":"ALRH","CanLiveInsights":false},{"Name":"Proximity End","Description":"Proximity End","Code":"PROX-E","CanLiveInsights":false},{"Name":"Alarm - PIR","Description":"Alarm - PIR","Code":"ALPIR","CanLiveInsights":false},{"Name":"PIR - Movements","Description":"Number of PIR movements detected in reporting period","Code":"PIRM","CanLiveInsights":false},{"Name":"Battery Report","Description":"Battery Voltage Report","Code":"BATR","CanLiveInsights":false},{"Name":"Alarm - Sim Swap","Description":"Alarm - Sim Swap","Code":"ALSS","CanLiveInsights":false},{"Name":"Mileage","Description":"Mileage","Code":"MIL","CanLiveInsights":false},{"Name":"Intrusion","Description":"Intrusion","Code":"INT","CanLiveInsights":false},{"Name":"No Fix Report","Description":"No fix report","Code":"NFR","CanLiveInsights":false},{"Name":"Switched Off Report","Description":"Switched off report","Code":"SOR","CanLiveInsights":false},{"Name":"End - Shift","Description":"End - Shift","Code":"ENDSH","CanLiveInsights":false},{"Name":"Sleep Mode","Description":"Device comes to sleep mode","Code":"SPM","CanLiveInsights":false},{"Name":"Wake Up Device","Description":"Device Wake Up from SleepMode","Code":"WUD","CanLiveInsights":false},{"Name":"Door Closed","Description":"Door Closed","Code":"DRCL","CanLiveInsights":false},{"Name":"Door Open","Description":"Door Open","Code":"DRO","CanLiveInsights":false},{"Name":"Alarm Door Closed","Description":"Alarm Door Closed","Code":"ALDC","CanLiveInsights":false},{"Name":"Alarm Door Open","Description":"Alarm Door Open","Code":"ALDO","CanLiveInsights":false},{"Name":"Alarm - Amber Alert - Snooze","Description":"Amber Alert Alarm - snoozed by user","Code":"ALA-S","CanLiveInsights":false},{"Name":"Amber Alert - On","Description":"Amber Alert Alarm created by User","Code":"ALA-O","CanLiveInsights":false},{"Name":"Reminder OK","Description":"Reminder OK","Code":"MRMK","CanLiveInsights":false},{"Name":"Message - text","Description":"Message- text","Code":"MSG","CanLiveInsights":false},{"Name":"Start - Shift","Description":"Start- Shift","Code":"STSH","CanLiveInsights":false},{"Name":"Beacon","Description":"Beacon","Code":"BT","CanLiveInsights":false},{"Name":"Alarm - Amber Alert - Cancel","Description":"Amber alert alarm, cancelled by user","Code":"ALA-C","CanLiveInsights":false},{"Name":"Alarm-Impact","Description":"Alarm-Impact","Code":"ALI","CanLiveInsights":false},{"Name":"Reminder Snooze ","Description":"Reminder - snooze","Code":"MRM-S","CanLiveInsights":false},{"Name":"Blood Pressure","Description":"Blood Pressure","Code":"HBP","CanLiveInsights":false},{"Name":"Heart Rate","Description":"Heart Rate","Code":"HRT","CanLiveInsights":false},{"Name":"SELFTEST","Description":"Used for Testing Purposes","Code":"TEST","CanLiveInsights":false},{"Name":"Alarm - Fall Cancelled","Description":"Alarm - Fall Cancelled","Code":"ALF-C","CanLiveInsights":false},{"Name":"Alarm – Non Movement Cancelled","Description":"Alarm – Non movement Cancelled by the user","Code":"ALNM-C","CanLiveInsights":false},{"Name":"Insight","Description":"Insight","Code":"INSIGHT","CanLiveInsights":false},{"Name":"Quantity Drunk","Description":"Quantity of liquid drunk ","Code":"QDRNK","CanLiveInsights":false},{"Name":"Bed - in","Description":"Bed or seat sensor ","Code":"BEDIN","CanLiveInsights":false},{"Name":"Bed - Out","Description":"Bed / seat sensor","Code":"BEDOUT","CanLiveInsights":false},{"Name":"Leak sensor","Description":"Leak detected ","Code":"LEAK","CanLiveInsights":false},{"Name":"Light - Lux","Description":"Light levels - LUX ","Code":"LUX","CanLiveInsights":false},{"Name":"Exited","Description":"Exited","Code":"EXIT","CanLiveInsights":false},{"Name":"Entered","Description":"Entered","Code":"ENTER","CanLiveInsights":false},{"Name":"Answered Door","Description":"Answered Door","Code":"ANSWDR","CanLiveInsights":false},{"Name":"Alarm – Emergency","Description":"Alarm – Emergency","Code":"ALSOS","CanLiveInsights":true},{"Name":"Alarm – Gas","Description":"Alarm – Gas ( carbon monixide, carbon dioxide, propane, butane ) ","Code":"ALG","CanLiveInsights":false},{"Name":"Leak Off","Description":"Leak detection has stopped alerting","Code":"LEAK-OFF","CanLiveInsights":false},{"Name":"Question-Answer","Description":"Question - Answer response","Code":"Q-A","CanLiveInsights":false},{"Name":"Visitor Arrived","Description":"Visitor Arrived","Code":"VISARR","CanLiveInsights":true},{"Name":"Visitor Departed","Description":"Visitor Departed","Code":"VISDEP","CanLiveInsights":true},{"Name":"Docked","Description":"Device placed in docking station","Code":"DOCK-IN","CanLiveInsights":false},{"Name":"Undocked","Description":"Device removed from docking station","Code":"DOCK-OUT","CanLiveInsights":false},{"Name":"Gas concentrarion","Description":"Gas concentrarion (ppm)","Code":"GAS","CanLiveInsights":false},{"Name":"Distance ","Description":"Distance measurement, could be level, proximity etc ","Code":"DIST","CanLiveInsights":false},{"Name":"Alarm Distance","Description":"Alarm on distance measurement, could be level, proximity etc ","Code":"ALDIST","CanLiveInsights":false},{"Name":"Welfare OK","Description":"Welfare check has returned OK","Code":"WELFOK","CanLiveInsights":false},{"Name":"Steps","Description":"Step counter","Code":"STEPS","CanLiveInsights":true},{"Name":"Connection","Description":"Connection","Code":"CON","CanLiveInsights":false},{"Name":"Disconnection","Description":"Disconnect","Code":"DISCON","CanLiveInsights":false},{"Name":"Position By Button","Description":"Position By Button","Code":"PBB","CanLiveInsights":false},{"Name":"Alarm Welfare","Description":"Alert welfare not confirmed","Code":"ALA-W","CanLiveInsights":false},{"Name":"Welfare Timer Starts","Description":"Welfare Check in","Code":"WTS","CanLiveInsights":false},{"Name":"Welfare Stops","Description":"Welfare Check out","Code":"WSTP","CanLiveInsights":false},{"Name":"Alarm Ended","Description":"Alarm finished","Code":"ALA-F","CanLiveInsights":false},{"Name":"BRTH - Breath Rate","Description":"Rate of Breathing per minute","Code":"BRTH","CanLiveInsights":false},{"Name":"Sleep State","Description":"Sleep state ","Code":"SLPSTATE","CanLiveInsights":false},{"Name":"Alarm - Tilt","Description":"Alarm - Tilt Alert","Code":"ALTLT","CanLiveInsights":false},{"Name":"Alert – Fall Suspected","Description":"Alert – Fall Suspected","Code":"ALFS","CanLiveInsights":false}]} \ No newline at end of file +{"Id":206,"Name":null,"Description":null,"FirmwareVersion":"","InProgress":false,"MessageTypes":[{"Id":6005,"Code":"MACB","Name":null,"MessageCode":null,"NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"VGA-<>;<>;mid=<>;MACB=<>,<>;LOTH=<>,<>,<>,<>,<>,<>;NET=<>;BATP=<>;BATPB=<>;TEMPB=<>;TIME=<>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<>;OK;[0a]","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":true,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^VGA-[^;]*;[^;;]*;mid=[^;;]*;MACB=[^,;]*,[^;,]*;LOTH=[^,;]*,[^,,]*,[^,,]*,[^,,]*,[^,,]*,[^;,]*;NET=[^;;]*;BATP=[^;;]*;BATPB=[^;;]*;TEMPB=[^;;]*;TIME=[^;;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6006,"Code":"CYC","Name":null,"MessageCode":null,"NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":true,"Type":0,"Template":"VGA-<>;<>;mid=<>;CYC;LOTH=<>,<>,<>,<>,<>,<>;NET=<>;BATP=<>;BATPB=<>;TEMPB=<>;TIME=<>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<>;OK;[0a]","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":true,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^VGA-[^;]*;[^;;]*;mid=[^;;]*;CYC;LOTH=[^,;]*,[^,,]*,[^,,]*,[^,,]*,[^,,]*,[^;,]*;NET=[^;;]*;BATP=[^;;]*;BATPB=[^;;]*;TEMPB=[^;;]*;TIME=[^;;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":6006,\"Code\":\"CYC\",\"Name\":null,\"MessageCode\":\"CYC\",\"NeedAck\":true,\"IsAck\":false,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":true,\"Type\":0,\"Template\":\"VGA-<>;<>;mid=<>;CYC;LOTH=<>,<>,<>,<>,<>,<>;NET=<>;BATP=<>;BATPB=<>;TEMPB=<>;TIME=<>;\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":\"ACK-MSG;<>;OK;[0a]\",\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":true,\"ScaipH\":false,\"DoNotSendCommands\":false,\"Command\":null,\"CacheImei\":false,\"RegEx\":\"^VGA-[^;]*;[^;;]*;mid=[^;;]*;CYC;LOTH=[^,;]*,[^,,]*,[^,,]*,[^,,]*,[^,,]*,[^;,]*;NET=[^;;]*;BATP=[^;;]*;BATPB=[^;;]*;TEMPB=[^;;]*;TIME=[^;;]*;\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1712654533}],"Tags":[]},{"Id":6007,"Code":"ENC","Name":"Encrypted","MessageCode":null,"NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"VGA-<>;<>;mid=<>;enc=<>;$$","HasTemplateGlobal":false,"ResponseTemplate":"<>","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":true,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^VGA-[^;]*;[^;;]*;mid=[^;;]*;enc=[^;;]*;$","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6008,"Code":"PWRF","Name":"Power off","MessageCode":null,"NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"VGA-<>;<>;mid=<>;PWRF;LOTH=<>,<>,<>,<>,<>,<>;NET=<>;BATP=<>;BATPB=<>;TEMPB=<>;TIME=<>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<>;OK;[0a]","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":true,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^VGA-[^;]*;[^;;]*;mid=[^;;]*;PWRF;LOTH=[^,;]*,[^,,]*,[^,,]*,[^,,]*,[^,,]*,[^;,]*;NET=[^;;]*;BATP=[^;;]*;BATPB=[^;;]*;TEMPB=[^;;]*;TIME=[^;;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6009,"Code":"PWRN","Name":"Power on","MessageCode":null,"NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"VGA-<>;<>;mid=<>;PWRN;LOTH=<>,<>,<>,<>,<>,<>;NET=<>;BATP=<>;BATPB=<>;TEMPB=<>;TIME=<>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<>;OK;[0a]","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":true,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^VGA-[^;]*;[^;;]*;mid=[^;;]*;PWRN;LOTH=[^,;]*,[^,,]*,[^,,]*,[^,,]*,[^,,]*,[^;,]*;NET=[^;;]*;BATP=[^;;]*;BATPB=[^;;]*;TEMPB=[^;;]*;TIME=[^;;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6010,"Code":"ALNM","Name":null,"MessageCode":null,"NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":1,"Template":"VGA-<>;<>;mid=<>;ALNM;LOTH=<>,<>,<>,<>,<>,<>;NET=<>;BATP=<>;BATPB=<>;TEMPB=<>;TIME=<>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<>;OK;[0a]","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":true,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^VGA-[^;]*;[^;;]*;mid=[^;;]*;ALNM;LOTH=[^,;]*,[^,,]*,[^,,]*,[^,,]*,[^,,]*,[^;,]*;NET=[^;;]*;BATP=[^;;]*;BATPB=[^;;]*;TEMPB=[^;;]*;TIME=[^;;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6011,"Code":"BATCN","Name":null,"MessageCode":null,"NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"VGA-<>;<>;mid=<>;BATCN;LOTH=<>,<>,<>,<>,<>,<>;NET=<>;BATP=<>;BATPB=<>;TEMPB=<>;TIME=<>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<>;OK;[0a]","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":true,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^VGA-[^;]*;[^;;]*;mid=[^;;]*;BATCN;LOTH=[^,;]*,[^,,]*,[^,,]*,[^,,]*,[^,,]*,[^;,]*;NET=[^;;]*;BATP=[^;;]*;BATPB=[^;;]*;TEMPB=[^;;]*;TIME=[^;;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6012,"Code":"BATCF","Name":null,"MessageCode":null,"NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"VGA-<>;<>;mid=<>;BATCF;LOTH=<>,<>,<>,<>,<>,<>;NET=<>;BATP=<>;BATPB=<>;TEMPB=<>;TIME=<>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<>;OK;[0a]","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":true,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^VGA-[^;]*;[^;;]*;mid=[^;;]*;BATCF;LOTH=[^,;]*,[^,,]*,[^,,]*,[^,,]*,[^,,]*,[^;,]*;NET=[^;;]*;BATP=[^;;]*;BATPB=[^;;]*;TEMPB=[^;;]*;TIME=[^;;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6013,"Code":"BATE","Name":null,"MessageCode":null,"NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":2,"Template":"VGA-<>;<>;mid=<>;BATE;LOTH=<>,<>,<>,<>,<>,<>;NET=<>;BATP=<>;BATPB=<>;TEMPB=<>;TIME=<>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<>;OK;[0a]","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":true,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^VGA-[^;]*;[^;;]*;mid=[^;;]*;BATE;LOTH=[^,;]*,[^,,]*,[^,,]*,[^,,]*,[^,,]*,[^;,]*;NET=[^;;]*;BATP=[^;;]*;BATPB=[^;;]*;TEMPB=[^;;]*;TIME=[^;;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6014,"Code":"BATL","Name":"Battery Low","MessageCode":null,"NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"VGA-<>;<>;mid=<>;BATL;LOTH=<>,<>,<>,<>,<>,<>;NET=<>;BATP=<>;BATPB=<>;TEMPB=<>;TIME=<>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<>;OK;[0a]","TemplateGlobal":"","LongConnection":false,"HexString":false,"AckFirst":true,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^VGA-[^;]*;[^;;]*;mid=[^;;]*;BATL;LOTH=[^,;]*,[^,,]*,[^,,]*,[^,,]*,[^,,]*,[^;,]*;NET=[^;;]*;BATP=[^;;]*;BATPB=[^;;]*;TEMPB=[^;;]*;TIME=[^;;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6015,"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":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"\\+RESP:NACT,[^,]*,[^\\$,]*\\$","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6016,"Code":"completed","Name":"ACK command","MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"ACK-CMD;<>;<>;OK;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^ACK-CMD;[^;]*;[^;;]*;OK;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6017,"Code":"received","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":true,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"ACK-CMD;<>;<>;RCVD;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^ACK-CMD;[^;]*;[^;;]*;RCVD;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6018,"Code":"error","Name":null,"MessageCode":null,"NeedAck":false,"IsAck":false,"IsFailAck":true,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"ACK-CMD;<>;<>;ERR;<>;","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^ACK-CMD;[^;]*;[^;;]*;ERR;[^;;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6019,"Code":"DISCONB","Name":null,"MessageCode":null,"NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":2,"Template":"VGA-<>;<>;mid=<>;DISCONB;LOTH=<>,<>,<>,<>,<>,<>;NET=<>;BATP=<>;BATPB=<>;TEMPB=<>;TIME=<>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<>;OK;[0a]","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":true,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^VGA-[^;]*;[^;;]*;mid=[^;;]*;DISCONB;LOTH=[^,;]*,[^,,]*,[^,,]*,[^,,]*,[^,,]*,[^;,]*;NET=[^;;]*;BATP=[^;;]*;BATPB=[^;;]*;TEMPB=[^;;]*;TIME=[^;;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6020,"Code":"IS_ACTIVATED","Name":null,"MessageCode":null,"NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"VGA-<>;<>;mid=<>;IS_ACTIVATED;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<>;OK;[0a]","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":true,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^VGA-[^;]*;[^;;]*;mid=[^;;]*;IS_ACTIVATED;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6021,"Code":"ALTAM","Name":null,"MessageCode":null,"NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":1,"Template":"VGA-<>;<>;mid=<>;ALTAM;LOTH=<>,<>,<>,<>,<>,<>;NET=<>;BATP=<>;BATPB=<>;TEMPB=<>;TIME=<>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<>;OK;[0a]","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":true,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^VGA-[^;]*;[^;;]*;mid=[^;;]*;ALTAM;LOTH=[^,;]*,[^,,]*,[^,,]*,[^,,]*,[^,,]*,[^;,]*;NET=[^;;]*;BATP=[^;;]*;BATPB=[^;;]*;TEMPB=[^;;]*;TIME=[^;;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6022,"Code":"ATEMPB","Name":null,"MessageCode":null,"NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":1,"Template":"VGA-<>;<>;mid=<>;ATEMPB;LOTH=<>,<>,<>,<>,<>,<>;NET=<>;BATP=<>;BATPB=<>;TEMPB=<>;TIME=<>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<>;OK;[0a]","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":true,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^VGA-[^;]*;[^;;]*;mid=[^;;]*;ATEMPB;LOTH=[^,;]*,[^,,]*,[^,,]*,[^,,]*,[^,,]*,[^;,]*;NET=[^;;]*;BATP=[^;;]*;BATPB=[^;;]*;TEMPB=[^;;]*;TIME=[^;;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6023,"Code":"ALNMB","Name":null,"MessageCode":null,"NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":1,"Template":"VGA-<>;<>;mid=<>;ALNMB;LOTH=<>,<>,<>,<>,<>,<>;NET=<>;BATP=<>;BATPB=<>;TEMPB=<>;TIME=<>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<>;OK;[0a]","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":true,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^VGA-[^;]*;[^;;]*;mid=[^;;]*;ALNMB;LOTH=[^,;]*,[^,,]*,[^,,]*,[^,,]*,[^,,]*,[^;,]*;NET=[^;;]*;BATP=[^;;]*;BATPB=[^;;]*;TEMPB=[^;;]*;TIME=[^;;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6024,"Code":"BATEB","Name":null,"MessageCode":null,"NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":2,"Template":"VGA-<>;<>;mid=<>;BATEB;LOTH=<>,<>,<>,<>,<>,<>;NET=<>;BATP=<>;BATPB=<>;TEMPB=<>;TIME=<>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<>;OK;[0a]","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":true,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^VGA-[^;]*;[^;;]*;mid=[^;;]*;BATEB;LOTH=[^,;]*,[^,,]*,[^,,]*,[^,,]*,[^,,]*,[^;,]*;NET=[^;;]*;BATP=[^;;]*;BATPB=[^;;]*;TEMPB=[^;;]*;TIME=[^;;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6025,"Code":"BATLB","Name":null,"MessageCode":null,"NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"VGA-<>;<>;mid=<>;BATLB;LOTH=<>,<>,<>,<>,<>,<>;NET=<>;BATP=<>;BATPB=<>;TEMPB=<>;TIME=<>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<>;OK;[0a]","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":true,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^VGA-[^;]*;[^;;]*;mid=[^;;]*;BATLB;LOTH=[^,;]*,[^,,]*,[^,,]*,[^,,]*,[^,,]*,[^;,]*;NET=[^;;]*;BATP=[^;;]*;BATPB=[^;;]*;TEMPB=[^;;]*;TIME=[^;;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6026,"Code":"COMM","Name":null,"MessageCode":null,"NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"<<->>VGA-001-Invent<<->>\"Imei\":\"<>\",<<->>","HasTemplateGlobal":false,"ResponseTemplate":"OK","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":true,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^[^ ]*VGA-001-Invent[^ ]*\"Imei\":\"[^\"]*\",[^ ]*","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6027,"Code":"REGISTER","Name":null,"MessageCode":null,"NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"VGA-<>;<>;mid=<>;REGISTER=<>,<>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<>;OK;[0a]","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":true,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^VGA-[^;]*;[^;;]*;mid=[^;;]*;REGISTER=[^,;]*,[^;,]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6028,"Code":"CREATE","Name":null,"MessageCode":null,"NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"VGA-<>;<>;mid=<>;CREATE=<>,<>,<>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<>;OK;[0a]","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^VGA-[^;]*;[^;;]*;mid=[^;;]*;CREATE=[^,;]*,[^,,]*,[^;,]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6029,"Code":"COMM","Name":null,"MessageCode":null,"NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"<<->>\"Imei\":\"<>\"<<->>","HasTemplateGlobal":false,"ResponseTemplate":"OK","TemplateGlobal":"<<->>VGV-001-Invent<<->>","LongConnection":false,"HexString":false,"AckFirst":true,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^[^ ]*\"Imei\":\"[^\"]*\"[^ ]*","RegExGlobal":"^[^ ]*VGV-001-Invent[^ ]*","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6030,"Code":"CONNB","Name":null,"MessageCode":null,"NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"VGA-<>;<>;mid=<>;CONNB;LOTH=<>,<>,<>,<>,<>,<>;NET=<>;BATP=<>;BATPB=<>;TEMPB=<>;TIME=<>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<>;OK;[0a]","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":true,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^VGA-[^;]*;[^;;]*;mid=[^;;]*;CONNB;LOTH=[^,;]*,[^,,]*,[^,,]*,[^,,]*,[^,,]*,[^;,]*;NET=[^;;]*;BATP=[^;;]*;BATPB=[^;;]*;TEMPB=[^;;]*;TIME=[^;;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6031,"Code":"NOTEREAD","Name":null,"MessageCode":null,"NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"VGA-<>;<>;mid=<>;NOTEREAD=<>;LOTH=<>,<>,<>,<>,<>,<>;NET=<>;BATP=<>;BATPB=<>;TEMPB=<>;TIME=<>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<>;OK;[0a]","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":true,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^VGA-[^;]*;[^;;]*;mid=[^;;]*;NOTEREAD=[^;;]*;LOTH=[^,;]*,[^,,]*,[^,,]*,[^,,]*,[^,,]*,[^;,]*;NET=[^;;]*;BATP=[^;;]*;BATPB=[^;;]*;TEMPB=[^;;]*;TIME=[^;;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":6032,"Code":"ALLDATA","Name":null,"MessageCode":"INFO","NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"VGA-<>;<>;mid=<>;ALLDATA=<>;LOTH=<>,<>,<>,<>,<>,<>;NET=<>;BATP=<>;BATPB=<>;TEMPB=<>;TIME=<>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<>;OK;[0a]","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^VGA-[^;]*;[^;;]*;mid=[^;;]*;ALLDATA=[^;;]*;LOTH=[^,;]*,[^,,]*,[^,,]*,[^,,]*,[^,,]*,[^;,]*;NET=[^;;]*;BATP=[^;;]*;BATPB=[^;;]*;TEMPB=[^;;]*;TIME=[^;;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":6032,\"Code\":\"ALLDATA\",\"Name\":null,\"MessageCode\":\"INFO\",\"NeedAck\":true,\"IsAck\":false,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"VGA-<>;<>;mid=<>;ALLDATA=<>;LOTH=<>,<>,<>,<>,<>,<>;NET=<>;BATP=<>;BATPB=<>;TEMPB=<>;TIME=<>;\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":\"ACK-MSG;<>;OK;[0a]\",\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":true,\"Command\":null,\"CacheImei\":false,\"RegEx\":\"^VGA-[^;]*;[^;;]*;mid=[^;;]*;ALLDATA=[^;;]*;LOTH=[^,;]*,[^,,]*,[^,,]*,[^,,]*,[^,,]*,[^;,]*;NET=[^;;]*;BATP=[^;;]*;BATPB=[^;;]*;TEMPB=[^;;]*;TIME=[^;;]*;\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1710246258},{"Type":1,"NewValue":"{\"Id\":6032,\"Code\":\"ALLDATA\",\"Name\":null,\"MessageCode\":\"INFO\",\"NeedAck\":true,\"IsAck\":false,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"VGA-<>;<>;mid=<>;ALLDATA=<>;LOTH=<>,<>,<>,<>,<>,<>;NET=<>;BATP=<>;BATPB=<>;TEMPB=<>;TIME=<>;\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":\"ACK-MSG;<>;OK;[0a]\",\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":true,\"Command\":null,\"CacheImei\":false,\"RegEx\":\"^VGA-[^;]*;[^;;]*;mid=[^;;]*;ALLDATA=[^;;]*;LOTH=[^,;]*,[^,,]*,[^,,]*,[^,,]*,[^,,]*,[^;,]*;NET=[^;;]*;BATP=[^;;]*;BATPB=[^;;]*;TEMPB=[^;;]*;TIME=[^;;]*;\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1712654568}],"Tags":[]},{"Id":7433,"Code":"GETPWB","Name":null,"MessageCode":"GETPWB","NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"VGA-<>;<>;mid=<>;GETPWB=<>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-PW;<>;<>;LF","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^VGA-[^;]*;[^;;]*;mid=[^;;]*;GETPWB=[^;;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":7433,\"Code\":\"GETPWB\",\"Name\":null,\"MessageCode\":\"GETPWB\",\"NeedAck\":true,\"IsAck\":false,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"VGA-<>;<>;mid=<>;GETPWB=<>;\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":\"ACK-PW;<>;<>;LF\",\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":false,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":null,\"CacheImei\":false,\"RegEx\":\"^VGA-[^;]*;[^;;]*;mid=[^;;]*;GETPWB=[^;;]*;\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1741968756},{"Type":1,"NewValue":"{\"Id\":7433,\"Code\":\"GETPWB\",\"Name\":null,\"MessageCode\":\"GETPWB\",\"NeedAck\":true,\"IsAck\":false,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"VGA-<>;<>;mid=<>;GETPWB=<>;\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":\"ACK-PW;<>;<>;LF\",\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":true,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":null,\"CacheImei\":false,\"RegEx\":\"^VGA-[^;]*;[^;;]*;mid=[^;;]*;GETPWB=[^;;]*;\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1742312695}],"Tags":[]},{"Id":7903,"Code":"INFO-GETPWB","Name":null,"MessageCode":"INFO","NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"VGA-<>;<>;mid=<>;GETPWB=<>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-PW;<>;<>;LF","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^VGA-[^;]*;[^;;]*;mid=[^;;]*;GETPWB=[^;;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":7903,\"Code\":\"INFO-GETPWB\",\"Name\":null,\"MessageCode\":\"INFO\",\"NeedAck\":true,\"IsAck\":false,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"VGA-<>;<>;mid=<>;GETPWB=<>;\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":\"ACK-PW;<>;<>;LF\",\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":true,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":null,\"CacheImei\":false,\"RegEx\":\"^VGA-[^;]*;[^;;]*;mid=[^;;]*;GETPWB=[^;;]*;\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1742382959},{"Type":1,"NewValue":"{\"Id\":7903,\"Code\":\"INFO-GETPWB\",\"Name\":null,\"MessageCode\":\"INFO\",\"NeedAck\":true,\"IsAck\":false,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"VGA-<>;<>;mid=<>;GETPWB=<>;\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":\"ACK-PW;<>;<>;OK;[0a]\",\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":true,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":null,\"CacheImei\":false,\"RegEx\":\"^VGA-[^;]*;[^;;]*;mid=[^;;]*;GETPWB=[^;;]*;\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1742386996},{"Type":1,"NewValue":"{\"Id\":7903,\"Code\":\"INFO-GETPWB\",\"Name\":null,\"MessageCode\":\"INFO\",\"NeedAck\":true,\"IsAck\":false,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"VGA-<>;<>;mid=<>;GETPWB=<>;\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":\"ACK-PW;<>;<>;OK;[0a]\",\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":true,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":null,\"CacheImei\":false,\"RegEx\":\"^VGA-[^;]*;[^;;]*;mid=[^;;]*;GETPWB=[^;;]*;\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1744202928},{"Type":1,"NewValue":"{\"Id\":7903,\"Code\":\"INFO-GETPWB\",\"Name\":null,\"MessageCode\":\"INFO\",\"NeedAck\":true,\"IsAck\":false,\"IsFailAck\":false,\"IsAckHexString\":false,\"NoOperation\":false,\"Type\":0,\"Template\":\"VGA-<>;<>;mid=<>;GETPWB=<>;\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":\"ACK-PW;<>;<>;OK;[0a]\",\"TemplateGlobal\":null,\"LongConnection\":false,\"HexString\":false,\"AckFirst\":false,\"ScaipH\":false,\"DoNotSendCommands\":true,\"ProtocolsLibraryMethod\":null,\"ProtocolsLibraryMethodArgs\":null,\"Command\":null,\"CacheImei\":false,\"RegEx\":\"^VGA-[^;]*;[^;;]*;mid=[^;;]*;GETPWB=[^;;]*;\",\"RegExGlobal\":\"\",\"IsDeviceUpdate\":false,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1744203836}],"Tags":[]}],"Commands":[{"Id":4122,"Name":"Cycle Interval","TemplateSMS":"VGCMD-001;<>;<>;","Template":"VGCMD-001;<>;<>;[0a]","AckTemplate":null,"Operation":"var command = \"CYCCONFIG=\" + params.CycleInterval.CycleInterval;\nvar configs = [];\nvar configsSMS = []; // for sms template\nsequenceNumber = (new Date().getTime()).toString(36);\nvar part1 = \"update=\" + sequenceNumber;\nconst _crypto = require('crypto');\nif (params.Password.Password === \"\") {\n var password = serverParams.Imei;\n} else {\n var password = params.Password.Password;\n}\nif (params.Password.encryption === \"true\") {\n var part2 = encrypt(command, part1, password);\n} else {\n var part2 = command;\n}\nAddValue(\"part1\", part1);\nAddValue(\"part2\", part2);\nAddValue(\"sequenceNumber\", sequenceNumber);\nAddValueSMS(\"part1\", part1); //for sms template\nAddValueSMS(\"part2\", part2); // for sms template\nAddValueSMS(\"sequenceNumber\", sequenceNumber); // for sms template\nvar commandConfigs = {\n template: \"main\",\n configs: configs,\n configsSMS: configsSMS //for sms template\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValueSMS(p1, p2) { //function for sms template\n var cvpair = {\n code: p1,\n value: p2\n };\n configsSMS.push(cvpair);\n}\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction encrypt(text, mid, password) {\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\n const iv = _crypto.randomBytes(16); // random initialization vector\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\n // set the cipher\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\n // encrypt text\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\n // generate output ( encrypted text )\n return Buffer.concat([iv, encrypted]).toString('base64');\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":false,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4122,\"Name\":\"Cycle Interval\",\"TemplateSMS\":\"VGCMD-001;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"var command = \\\"CYCCONFIG=\\\" + params.CycleInterval.CycleInterval;\\nvar configs = [];\\nvar configsSMS = []; // for sms template\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nconst _crypto = require('crypto');\\nvar password = params.Password.Password;\\nif (password === \\\"\\\") {\\n var part2 = command;\\n} else {\\n var part2 = \\\"enc=\\\" + encrypt(command, part1, password);\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nAddValueSMS(\\\"part1\\\", part1); //for sms template\\nAddValueSMS(\\\"part2\\\", part2); // for sms template\\nAddValueSMS(\\\"sequenceNumber\\\", sequenceNumber); // for sms template\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs,\\n configsSMS: configsSMS //for sms template\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValueSMS(p1, p2) { //function for sms template\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configsSMS.push(cvpair);\\n}\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716290163}],"Tags":[]},{"Id":4121,"Name":"Device Activated","TemplateSMS":"OCA-CMD;<>;<>;","Template":"VGCMD-001;<>;<>;[0a]","AckTemplate":null,"Operation":"var command = \"ACTIVATED_FAIL=Unkonwn Failure.\";\nif (params.DeviceConfig.IVActivated == \"true\") {\n command = \"ACTIVATED_OK\";\n} else {\n command = \"ACTIVATED_FAIL=\" + params.DeviceConfig.IVActivatedFailMessage;\n}\nvar configs = [];\nsequenceNumber = (new Date().getTime()).toString(36);\nvar part1 = \"update=\" + sequenceNumber;\nconst _crypto = require('crypto');\nif (params.Password.Password === \"\") {\n var password = serverParams.Imei;\n} else {\n var password = params.Password.Password;\n}\nif (params.Password.encryption === \"true\") {\n var part2 = encrypt(command, part1, password);\n} else {\n var part2 = command;\n}\nAddValue(\"part1\", part1);\nAddValue(\"part2\", part2);\nAddValue(\"sequenceNumber\", sequenceNumber);\nvar commandConfigs = {\n template: \"main\",\n configs: configs\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction encrypt(text, mid, password) {\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\n const iv = _crypto.randomBytes(16); // random initialization vector\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\n // set the cipher\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\n // encrypt text\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\n // generate output ( encrypted text )\n return Buffer.concat([iv, encrypted]).toString('base64');\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":false,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4121,\"Name\":\"Device Activated\",\"TemplateSMS\":\"OCA-CMD;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"var command = \\\"ACTIVATED_FAIL=Unkonwn Failure.\\\";\\nif (params.DeviceConfig.IVActivated == \\\"true\\\") {\\n command = \\\"ACTIVATED_OK\\\";\\n} else {\\n command = \\\"ACTIVATED_FAIL=\\\" + params.DeviceConfig.IVActivatedFailMessage;\\n}\\nvar configs = [];\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nconst _crypto = require('crypto');\\nvar password = params.Password.Password;\\nif (password === \\\"\\\") {\\n var part2 = command;\\n} else {\\n var part2 = \\\"enc=\\\" + encrypt(command, part1, password);\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716290183},{"Type":1,"NewValue":"{\"Id\":4121,\"Name\":\"Device Activated\",\"TemplateSMS\":\"OCA-CMD;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"var command = \\\"ACTIVATED_FAIL=Unkonwn Failure.\\\";\\nif (params.DeviceConfig.IVActivated == \\\"true\\\") {\\n command = \\\"ACTIVATED_OK\\\";\\n} else {\\n command = \\\"ACTIVATED_FAIL=\\\" + params.DeviceConfig.IVActivatedFailMessage;\\n}\\nvar configs = [];\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nconst _crypto = require('crypto');\\nvar password = params.Password.Password;\\nif (password === \\\"\\\") {\\n var part2 = command;\\n} else {\\n var part2 = \\\"enc=\\\" + encrypt(command, part1, password);\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":4,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1718098112}],"Tags":[]},{"Id":4120,"Name":"Reset Bracelet","TemplateSMS":"OCA-CMD;<>;<>;","Template":"VGCMD-001;<>;<>;[0a]","AckTemplate":null,"Operation":"let command = \"RESETB\";\nvar configs = [];\nvar configsSMS = []; // for sms template\nsequenceNumber = (new Date().getTime()).toString(36);\nvar part1 = \"update=\" + sequenceNumber;\nconst _crypto = require('crypto');\nif (params.Password.Password === \"\") {\n var password = serverParams.Imei;\n} else {\n var password = params.Password.Password;\n}\nif (params.Password.encryption === \"true\") {\n var part2 = encrypt(command, part1, password);\n} else {\n var part2 = command;\n}\nAddValue(\"part1\", part1);\nAddValue(\"part2\", part2);\nAddValue(\"sequenceNumber\", sequenceNumber);\nAddValueSMS(\"part1\", part1); //for sms template\nAddValueSMS(\"part2\", part2); // for sms template\nAddValueSMS(\"sequenceNumber\", sequenceNumber); // for sms template\nvar commandConfigs = {\n template: \"main\",\n configs: configs,\n configsSMS: configsSMS //for sms template\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction AddValueSMS(p1, p2) { //function for sms template\n var cvpair = {\n code: p1,\n value: p2\n };\n configsSMS.push(cvpair);\n}\n\nfunction encrypt(text, mid, password) {\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\n const iv = _crypto.randomBytes(16); // random initialization vector\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\n // set the cipher\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\n // encrypt text\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\n // generate output ( encrypted text )\n return Buffer.concat([iv, encrypted]).toString('base64');\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":false,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4120,\"Name\":\"Reset Bracelet\",\"TemplateSMS\":\"OCA-CMD;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"let command = \\\"RESETB\\\";\\nvar configs = [];\\nvar configsSMS = []; // for sms template\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nconst _crypto = require('crypto');\\nvar password = params.Password.Password;\\nif (password === \\\"\\\") {\\n var part2 = command;\\n} else {\\n var part2 = \\\"enc=\\\" + encrypt(command, part1, password);\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nAddValueSMS(\\\"part1\\\", part1); //for sms template\\nAddValueSMS(\\\"part2\\\", part2); // for sms template\\nAddValueSMS(\\\"sequenceNumber\\\", sequenceNumber); // for sms template\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs,\\n configsSMS: configsSMS //for sms template\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction AddValueSMS(p1, p2) { //function for sms template\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configsSMS.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716290345}],"Tags":[]},{"Id":4119,"Name":"Set Config Enable","TemplateSMS":"VGCMD-001;<>;<>;","Template":"VGCMD-001;<>;<>;[0a]","AckTemplate":null,"Operation":"// write your code here...\nif (params.DeviceConfig.ConfigMode == \"true\") {\n enableConfig = 1;\n} else {\n enableConfig = \"0\";\n}\nvar command = \"CONFIG=\" + enableConfig;\nvar configs = [];\nvar configsSMS = []; // for sms template\nsequenceNumber = (new Date().getTime()).toString(36);\nvar part1 = \"update=\" + sequenceNumber;\nconst _crypto = require('crypto');\nif (params.Password.Password === \"\") {\n var password = serverParams.Imei;\n} else {\n var password = params.Password.Password;\n}\nif (params.Password.encryption === \"true\") {\n var part2 = encrypt(command, part1, password);\n} else {\n var part2 = command;\n}\nAddValue(\"part1\", part1);\nAddValue(\"part2\", part2);\nAddValue(\"sequenceNumber\", sequenceNumber);\nAddValueSMS(\"part1\", part1); //for sms template\nAddValueSMS(\"part2\", part2); // for sms template\nAddValueSMS(\"sequenceNumber\", sequenceNumber); // for sms template\nvar commandConfigs = {\n template: \"main\",\n configs: configs,\n configsSMS: configsSMS //for sms template\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValueSMS(p1, p2) { //function for sms template\n var cvpair = {\n code: p1,\n value: p2\n };\n configsSMS.push(cvpair);\n}\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction encrypt(text, mid, password) {\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\n const iv = _crypto.randomBytes(16); // random initialization vector\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\n // set the cipher\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\n // encrypt text\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\n // generate output ( encrypted text )\n return Buffer.concat([iv, encrypted]).toString('base64');\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":false,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4119,\"Name\":\"Set Config Enable\",\"TemplateSMS\":\"VGCMD-001;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"// write your code here...\\nif (params.DeviceConfig.ConfigMode == \\\"true\\\") {\\n enableConfig = 1;\\n} else {\\n enableConfig = \\\"0\\\";\\n}\\nvar command = \\\"CONFIG=\\\" + enableConfig;\\nvar configs = [];\\nvar configsSMS = []; // for sms template\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nconst _crypto = require('crypto');\\nvar password = params.Password.Password;\\nif (password === \\\"\\\") {\\n var part2 = command;\\n} else {\\n var part2 = \\\"enc=\\\" + encrypt(command, part1, password);\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nAddValueSMS(\\\"part1\\\", part1); //for sms template\\nAddValueSMS(\\\"part2\\\", part2); // for sms template\\nAddValueSMS(\\\"sequenceNumber\\\", sequenceNumber); // for sms template\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs,\\n configsSMS: configsSMS //for sms template\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValueSMS(p1, p2) { //function for sms template\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configsSMS.push(cvpair);\\n}\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716290410}],"Tags":[]},{"Id":4118,"Name":"NonMovement","TemplateSMS":"VGCMD-001;<>;<>;","Template":"VGCMD-001;<>;<>;[0a]","AckTemplate":null,"Operation":"if (params.NonMovement.EnableDisableNonMovement == \"true\") {\n var state = 1;\n} else {\n var state = \"0\";\n}\nvar command = \"ALNM=\" + state + \",\" + params.NonMovement.period;\nvar configs = [];\nvar configsSMS = []; // for sms template\nsequenceNumber = (new Date().getTime()).toString(36);\nvar part1 = \"update=\" + sequenceNumber;\nconst _crypto = require('crypto');\nif (params.Password.Password === \"\") {\n var password = serverParams.Imei;\n} else {\n var password = params.Password.Password;\n}\nif (params.Password.encryption === \"true\") {\n var part2 = encrypt(command, part1, password);\n} else {\n var part2 = command;\n}\nAddValue(\"part1\", part1);\nAddValue(\"part2\", part2);\nAddValue(\"sequenceNumber\", sequenceNumber);\nAddValueSMS(\"part1\", part1); //for sms template\nAddValueSMS(\"part2\", part2); // for sms template\nAddValueSMS(\"sequenceNumber\", sequenceNumber); // for sms template\nvar commandConfigs = {\n template: \"main\",\n configs: configs,\n configsSMS: configsSMS //for sms template\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction AddValueSMS(p1, p2) { //function for sms template\n var cvpair = {\n code: p1,\n value: p2\n };\n configsSMS.push(cvpair);\n}\n\nfunction encrypt(text, mid, password) {\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\n const iv = _crypto.randomBytes(16); // random initialization vector\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\n // set the cipher\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\n // encrypt text\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\n // generate output ( encrypted text )\n return Buffer.concat([iv, encrypted]).toString('base64');\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":false,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4118,\"Name\":\"NonMovement\",\"TemplateSMS\":\"VGCMD-001;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"if (params.NonMovement.EnableDisableNonMovement == \\\"true\\\") {\\n var state = 1;\\n} else {\\n var state = \\\"0\\\";\\n}\\nvar command = \\\"ALNM=\\\" + state + \\\",\\\" + params.NonMovement.period;\\nvar configs = [];\\nvar configsSMS = []; // for sms template\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nconst _crypto = require('crypto');\\nvar password = params.Password.Password;\\nif (password === \\\"\\\") {\\n var part2 = command;\\n} else {\\n var part2 = \\\"enc=\\\" + encrypt(command, part1, password);\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nAddValueSMS(\\\"part1\\\", part1); //for sms template\\nAddValueSMS(\\\"part2\\\", part2); // for sms template\\nAddValueSMS(\\\"sequenceNumber\\\", sequenceNumber); // for sms template\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs,\\n configsSMS: configsSMS //for sms template\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction AddValueSMS(p1, p2) { //function for sms template\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configsSMS.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716290205}],"Tags":[]},{"Id":4117,"Name":"SetLTEParam Bracelet","TemplateSMS":"OCA-CMD;<>;<>;","Template":"VGCMD-001;<>;<>;[0a]","AckTemplate":null,"Operation":"let command = \"LTEPAR=\" + params.Bracelet.LTEParam;\nvar configs = [];\nvar configsSMS = []; // for sms template\nsequenceNumber = (new Date().getTime()).toString(36);\nvar part1 = \"update=\" + sequenceNumber;\nconst _crypto = require('crypto');\nif (params.Password.Password === \"\") {\n var password = serverParams.Imei;\n} else {\n var password = params.Password.Password;\n}\nif (params.Password.encryption === \"true\") {\n var part2 = encrypt(command, part1, password);\n} else {\n var part2 = command;\n}\nAddValue(\"part1\", part1);\nAddValue(\"part2\", part2);\nAddValue(\"sequenceNumber\", sequenceNumber);\nAddValueSMS(\"part1\", part1); //for sms template\nAddValueSMS(\"part2\", part2); // for sms template\nAddValueSMS(\"sequenceNumber\", sequenceNumber); // for sms template\nvar commandConfigs = {\n template: \"main\",\n configs: configs,\n configsSMS: configsSMS //for sms template\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction AddValueSMS(p1, p2) { //function for sms template\n var cvpair = {\n code: p1,\n value: p2\n };\n configsSMS.push(cvpair);\n}\n\nfunction encrypt(text, mid, password) {\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\n const iv = _crypto.randomBytes(16); // random initialization vector\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\n // set the cipher\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\n // encrypt text\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\n // generate output ( encrypted text )\n return Buffer.concat([iv, encrypted]).toString('base64');\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":false,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4117,\"Name\":\"SetLTEParam Bracelet\",\"TemplateSMS\":\"OCA-CMD;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"let command = \\\"LTEPAR=\\\" + params.Bracelet.LTEParam;\\nvar configs = [];\\nvar configsSMS = []; // for sms template\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nconst _crypto = require('crypto');\\nvar password = params.Password.Password;\\nif (password === \\\"\\\") {\\n var part2 = command;\\n} else {\\n var part2 = \\\"enc=\\\" + encrypt(command, part1, password);\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nAddValueSMS(\\\"part1\\\", part1); //for sms template\\nAddValueSMS(\\\"part2\\\", part2); // for sms template\\nAddValueSMS(\\\"sequenceNumber\\\", sequenceNumber); // for sms template\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs,\\n configsSMS: configsSMS //for sms template\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction AddValueSMS(p1, p2) { //function for sms template\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configsSMS.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716290549}],"Tags":[]},{"Id":4116,"Name":"SetCommonParam Bracelet","TemplateSMS":"OCA-CMD;<>;<>;","Template":"VGCMD-001;<>;<>;[0a]","AckTemplate":null,"Operation":"let command = \"COMPAR=\" + params.Bracelet.CommonParam;\nvar configs = [];\nvar configsSMS = []; // for sms template\nsequenceNumber = (new Date().getTime()).toString(36);\nvar part1 = \"update=\" + sequenceNumber;\nconst _crypto = require('crypto');\nif (params.Password.Password === \"\") {\n var password = serverParams.Imei;\n} else {\n var password = params.Password.Password;\n}\nif (params.Password.encryption === \"true\") {\n var part2 = encrypt(command, part1, password);\n} else {\n var part2 = command;\n}\nAddValue(\"part1\", part1);\nAddValue(\"part2\", part2);\nAddValue(\"sequenceNumber\", sequenceNumber);\nAddValueSMS(\"part1\", part1); //for sms template\nAddValueSMS(\"part2\", part2); // for sms template\nAddValueSMS(\"sequenceNumber\", sequenceNumber); // for sms template\nvar commandConfigs = {\n template: \"main\",\n configs: configs,\n configsSMS: configsSMS //for sms template\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction AddValueSMS(p1, p2) { //function for sms template\n var cvpair = {\n code: p1,\n value: p2\n };\n configsSMS.push(cvpair);\n}\n\nfunction encrypt(text, mid, password) {\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\n const iv = _crypto.randomBytes(16); // random initialization vector\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\n // set the cipher\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\n // encrypt text\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\n // generate output ( encrypted text )\n return Buffer.concat([iv, encrypted]).toString('base64');\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":false,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4116,\"Name\":\"SetCommonParam Bracelet\",\"TemplateSMS\":\"OCA-CMD;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"let command = \\\"COMPAR=\\\" + params.Bracelet.CommonParam;\\nvar configs = [];\\nvar configsSMS = []; // for sms template\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nconst _crypto = require('crypto');\\nvar password = params.Password.Password;\\nif (password === \\\"\\\") {\\n var part2 = command;\\n} else {\\n var part2 = \\\"enc=\\\" + encrypt(command, part1, password);\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nAddValueSMS(\\\"part1\\\", part1); //for sms template\\nAddValueSMS(\\\"part2\\\", part2); // for sms template\\nAddValueSMS(\\\"sequenceNumber\\\", sequenceNumber); // for sms template\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs,\\n configsSMS: configsSMS //for sms template\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction AddValueSMS(p1, p2) { //function for sms template\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configsSMS.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716290530}],"Tags":[]},{"Id":4115,"Name":"Battery Charging Alert","TemplateSMS":"VGCMD-001;<>;<>;","Template":"VGCMD-001;<>;<>;[0a]","AckTemplate":null,"Operation":"// write your code here...\nif (params.Batteryalerts.EnableBatteryChargingAlerts == \"true\") {\n batCharging = 1;\n} else {\n batCharging = \"0\";\n}\nvar command = \"BATC=\" + batCharging;\nvar configs = [];\nvar configsSMS = []; // for sms template\nsequenceNumber = (new Date().getTime()).toString(36);\nvar part1 = \"update=\" + sequenceNumber;\nconst _crypto = require('crypto');\nif (params.Password.Password === \"\") {\n var password = serverParams.Imei;\n} else {\n var password = params.Password.Password;\n}\nif (params.Password.encryption === \"true\") {\n var part2 = encrypt(command, part1, password);\n} else {\n var part2 = command;\n}\nAddValue(\"part1\", part1);\nAddValue(\"part2\", part2);\nAddValue(\"sequenceNumber\", sequenceNumber);\nAddValueSMS(\"part1\", part1); //for sms template\nAddValueSMS(\"part2\", part2); // for sms template\nAddValueSMS(\"sequenceNumber\", sequenceNumber); // for sms template\nvar commandConfigs = {\n template: \"main\",\n configs: configs,\n configsSMS: configsSMS //for sms template\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValueSMS(p1, p2) { //function for sms template\n var cvpair = {\n code: p1,\n value: p2\n };\n configsSMS.push(cvpair);\n}\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction encrypt(text, mid, password) {\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\n const iv = _crypto.randomBytes(16); // random initialization vector\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\n // set the cipher\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\n // encrypt text\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\n // generate output ( encrypted text )\n return Buffer.concat([iv, encrypted]).toString('base64');\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":false,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4115,\"Name\":\"Battery Charging Alert\",\"TemplateSMS\":\"VGCMD-001;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"// write your code here...\\nif (params.Batteryalerts.EnableBatteryChargingAlerts == \\\"true\\\") {\\n batCharging = 1;\\n} else {\\n batCharging = \\\"0\\\";\\n}\\nvar command = \\\"BATC=\\\" + batCharging;\\nvar configs = [];\\nvar configsSMS = []; // for sms template\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nconst _crypto = require('crypto');\\nvar password = params.Password.Password;\\nif (password === \\\"\\\") {\\n var part2 = command;\\n} else {\\n var part2 = \\\"enc=\\\" + encrypt(command, part1, password);\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nAddValueSMS(\\\"part1\\\", part1); //for sms template\\nAddValueSMS(\\\"part2\\\", part2); // for sms template\\nAddValueSMS(\\\"sequenceNumber\\\", sequenceNumber); // for sms template\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs,\\n configsSMS: configsSMS //for sms template\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValueSMS(p1, p2) { //function for sms template\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configsSMS.push(cvpair);\\n}\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716290008}],"Tags":[]},{"Id":4114,"Name":"Battery Low Alert Setting","TemplateSMS":"VGCMD-001;<>;<>;","Template":"VGCMD-001;<>;<>;[0a]","AckTemplate":null,"Operation":"if (params.Batteryalerts.EnableBatteryLowAlert == \"true\") {\n endis = 1;\n} else {\n endis = \"0\";\n}\nvar command = \"BATAL=\" + endis + \",\" + params.Batteryalerts.BatteryLowThreshold;\nvar configs = [];\nvar configsSMS = []; // for sms template\nsequenceNumber = (new Date().getTime()).toString(36);\nvar part1 = \"update=\" + sequenceNumber;\nconst _crypto = require('crypto');\nif (params.Password.Password === \"\") {\n var password = serverParams.Imei;\n} else {\n var password = params.Password.Password;\n}\nif (params.Password.encryption === \"true\") {\n var part2 = encrypt(command, part1, password);\n} else {\n var part2 = command;\n}\nAddValue(\"part1\", part1);\nAddValue(\"part2\", part2);\nAddValue(\"sequenceNumber\", sequenceNumber);\nAddValueSMS(\"part1\", part1); //for sms template\nAddValueSMS(\"part2\", part2); // for sms template\nAddValueSMS(\"sequenceNumber\", sequenceNumber); // for sms template\nvar commandConfigs = {\n template: \"main\",\n configs: configs,\n configsSMS: configsSMS //for sms template\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValueSMS(p1, p2) { //function for sms template\n var cvpair = {\n code: p1,\n value: p2\n };\n configsSMS.push(cvpair);\n}\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction encrypt(text, mid, password) {\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\n const iv = _crypto.randomBytes(16); // random initialization vector\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\n // set the cipher\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\n // encrypt text\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\n // generate output ( encrypted text )\n return Buffer.concat([iv, encrypted]).toString('base64');\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":false,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4114,\"Name\":\"Battery Low Alert Setting\",\"TemplateSMS\":\"VGCMD-001;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"if (params.Batteryalerts.EnableBatteryLowAlert == \\\"true\\\") {\\n endis = 1;\\n} else {\\n endis = \\\"0\\\";\\n}\\nvar command = \\\"BATAL=\\\" + endis + \\\",\\\" + params.Batteryalerts.BatteryLowThreshold;\\nvar configs = [];\\nvar configsSMS = []; // for sms template\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nconst _crypto = require('crypto');\\nvar password = params.Password.Password;\\nif (password === \\\"\\\") {\\n var part2 = command;\\n} else {\\n var part2 = \\\"enc=\\\" + encrypt(command, part1, password);\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nAddValueSMS(\\\"part1\\\", part1); //for sms template\\nAddValueSMS(\\\"part2\\\", part2); // for sms template\\nAddValueSMS(\\\"sequenceNumber\\\", sequenceNumber); // for sms template\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs,\\n configsSMS: configsSMS //for sms template\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValueSMS(p1, p2) { //function for sms template\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configsSMS.push(cvpair);\\n}\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716290124}],"Tags":[]},{"Id":4113,"Name":"Real Time Locate","TemplateSMS":"VGCMD-001;<>;<>;","Template":"VGCMD-001;<>;<>;[0a]","AckTemplate":null,"Operation":"var command = \"POSN\";\nvar configs = [];\nsequenceNumber = (new Date().getTime()).toString(36);\nvar part1 = \"request=\" + sequenceNumber;\nconst _crypto = require('crypto');\nif (params.Password.Password === \"\") {\n var password = serverParams.Imei;\n} else {\n var password = params.Password.Password;\n}\nif (params.Password.encryption === \"true\") {\n var part2 = encrypt(command, part1, password);\n} else {\n var part2 = command;\n}\nAddValue(\"part1\", part1);\nAddValue(\"part2\", part2);\nAddValue(\"sequenceNumber\", sequenceNumber);\nvar commandConfigs = {\n template: \"main\",\n configs: configs\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction encrypt(text, mid, password) {\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\n const iv = _crypto.randomBytes(16); // random initialization vector\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\n // set the cipher\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\n // encrypt text\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\n // generate output ( encrypted text )\n return Buffer.concat([iv, encrypted]).toString('base64');\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":false,"Order":null,"SendAttempts":1,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4113,\"Name\":\"Real Time Locate\",\"TemplateSMS\":\"VGCMD-001;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"var command = \\\"POSN\\\";\\nvar configs = [];\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"request=\\\" + sequenceNumber;\\nconst _crypto = require('crypto');\\nvar password = params.Password.Password;\\nif (password === \\\"\\\") {\\n var part2 = command;\\n} else {\\n var part2 = \\\"enc=\\\" + encrypt(command, part1, password);\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":1,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716290253}],"Tags":[]},{"Id":4112,"Name":"Battery Critical Alert Setting","TemplateSMS":"VGCMD-001;<>;<>;","Template":"VGCMD-001;<>;<>;[0a]","AckTemplate":null,"Operation":"// write your code here...\nif (params.Batteryalerts.EnableBatteryCriticalAlert == \"true\") {\n endis = 1;\n} else {\n endis = \"0\";\n}\nvar command = \"BATAC=\" + endis + \",\" + params.Batteryalerts.BatteryCriticalThreshold;\nvar configs = [];\nvar configsSMS = []; // for sms template\nsequenceNumber = (new Date().getTime()).toString(36);\nvar part1 = \"update=\" + sequenceNumber;\nconst _crypto = require('crypto');\nif (params.Password.Password === \"\") {\n var password = serverParams.Imei;\n} else {\n var password = params.Password.Password;\n}\nif (params.Password.encryption === \"true\") {\n var part2 = encrypt(command, part1, password);\n} else {\n var part2 = command;\n}\nAddValue(\"part1\", part1);\nAddValue(\"part2\", part2);\nAddValue(\"sequenceNumber\", sequenceNumber);\nAddValueSMS(\"part1\", part1); //for sms template\nAddValueSMS(\"part2\", part2); // for sms template\nAddValueSMS(\"sequenceNumber\", sequenceNumber); // for sms template\nvar commandConfigs = {\n template: \"main\",\n configs: configs,\n configsSMS: configsSMS //for sms template\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValueSMS(p1, p2) { //function for sms template\n var cvpair = {\n code: p1,\n value: p2\n };\n configsSMS.push(cvpair);\n}\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction encrypt(text, mid, password) {\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\n const iv = _crypto.randomBytes(16); // random initialization vector\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\n // set the cipher\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\n // encrypt text\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\n // generate output ( encrypted text )\n return Buffer.concat([iv, encrypted]).toString('base64');\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":false,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4112,\"Name\":\"Battery Critical Alert Setting\",\"TemplateSMS\":\"VGCMD-001;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"// write your code here...\\nif (params.Batteryalerts.EnableBatteryCriticalAlert == \\\"true\\\") {\\n endis = 1;\\n} else {\\n endis = \\\"0\\\";\\n}\\nvar command = \\\"BATAC=\\\" + endis + \\\",\\\" + params.Batteryalerts.BatteryCriticalThreshold;\\nvar configs = [];\\nvar configsSMS = []; // for sms template\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nconst _crypto = require('crypto');\\nvar password = params.Password.Password;\\nif (password === \\\"\\\") {\\n var part2 = command;\\n} else {\\n var part2 = \\\"enc=\\\" + encrypt(command, part1, password);\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nAddValueSMS(\\\"part1\\\", part1); //for sms template\\nAddValueSMS(\\\"part2\\\", part2); // for sms template\\nAddValueSMS(\\\"sequenceNumber\\\", sequenceNumber); // for sms template\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs,\\n configsSMS: configsSMS //for sms template\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValueSMS(p1, p2) { //function for sms template\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configsSMS.push(cvpair);\\n}\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716290093}],"Tags":[]},{"Id":4111,"Name":"Send Notification","TemplateSMS":"OCA-CMD;<>;<>;","Template":"VGCMD-001;<>;<>;[0a]","AckTemplate":null,"Operation":"var command = \"NOTE=\" + params.Note.Message;\nvar configs = [];\nvar configsSMS = []; // for sms template\nsequenceNumber = (new Date().getTime()).toString(36);\nvar part1 = \"update=\" + sequenceNumber;\nconst _crypto = require('crypto');\nif (params.Password.Password === \"\") {\n var password = serverParams.Imei;\n} else {\n var password = params.Password.Password;\n}\nif (params.Password.encryption === \"true\") {\n var part2 = encrypt(command, part1, password);\n} else {\n var part2 = command;\n}\nAddValue(\"part1\", part1);\nAddValue(\"part2\", part2);\nAddValue(\"sequenceNumber\", sequenceNumber);\nAddValueSMS(\"part1\", part1); //for sms template\nAddValueSMS(\"part2\", part2); // for sms template\nAddValueSMS(\"sequenceNumber\", sequenceNumber); // for sms template\nvar commandConfigs = {\n template: \"main\",\n configs: configs,\n configsSMS: configsSMS //for sms template\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction AddValueSMS(p1, p2) { //function for sms template\n var cvpair = {\n code: p1,\n value: p2\n };\n configsSMS.push(cvpair);\n}\n\nfunction encrypt(text, mid, password) {\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\n const iv = _crypto.randomBytes(16); // random initialization vector\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\n // set the cipher\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\n // encrypt text\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\n // generate output ( encrypted text )\n return Buffer.concat([iv, encrypted]).toString('base64');\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":false,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4111,\"Name\":\"Send Notification\",\"TemplateSMS\":\"OCA-CMD;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"var command = \\\"NOTE=\\\" + params.Note.Message;\\nvar configs = [];\\nvar configsSMS = []; // for sms template\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nconst _crypto = require('crypto');\\nvar password = params.Password.Password;\\nif (password === \\\"\\\") {\\n var part2 = command;\\n} else {\\n var part2 = \\\"enc=\\\" + encrypt(command, part1, password);\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nAddValueSMS(\\\"part1\\\", part1); //for sms template\\nAddValueSMS(\\\"part2\\\", part2); // for sms template\\nAddValueSMS(\\\"sequenceNumber\\\", sequenceNumber); // for sms template\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs,\\n configsSMS: configsSMS //for sms template\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction AddValueSMS(p1, p2) { //function for sms template\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configsSMS.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716290378}],"Tags":[]},{"Id":4110,"Name":"Reboot Bracelet","TemplateSMS":"OCA-CMD;<>;<>;","Template":"VGCMD-001;<>;<>;[0a]","AckTemplate":null,"Operation":"let command = \"REBOOTB\";\nvar configs = [];\nvar configsSMS = []; // for sms template\nsequenceNumber = (new Date().getTime()).toString(36);\nvar part1 = \"update=\" + sequenceNumber;\nconst _crypto = require('crypto');\nif (params.Password.Password === \"\") {\n var password = serverParams.Imei;\n} else {\n var password = params.Password.Password;\n}\nif (params.Password.encryption === \"true\") {\n var part2 = encrypt(command, part1, password);\n} else {\n var part2 = command;\n}\nAddValue(\"part1\", part1);\nAddValue(\"part2\", part2);\nAddValue(\"sequenceNumber\", sequenceNumber);\nAddValueSMS(\"part1\", part1); //for sms template\nAddValueSMS(\"part2\", part2); // for sms template\nAddValueSMS(\"sequenceNumber\", sequenceNumber); // for sms template\nvar commandConfigs = {\n template: \"main\",\n configs: configs,\n configsSMS: configsSMS //for sms template\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction AddValueSMS(p1, p2) { //function for sms template\n var cvpair = {\n code: p1,\n value: p2\n };\n configsSMS.push(cvpair);\n}\n\nfunction encrypt(text, mid, password) {\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\n const iv = _crypto.randomBytes(16); // random initialization vector\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\n // set the cipher\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\n // encrypt text\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\n // generate output ( encrypted text )\n return Buffer.concat([iv, encrypted]).toString('base64');\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":false,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4110,\"Name\":\"Reboot Bracelet\",\"TemplateSMS\":\"OCA-CMD;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"let command = \\\"REBOOTB\\\";\\nvar configs = [];\\nvar configsSMS = []; // for sms template\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nconst _crypto = require('crypto');\\nvar password = params.Password.Password;\\nif (password === \\\"\\\") {\\n var part2 = command;\\n} else {\\n var part2 = \\\"enc=\\\" + encrypt(command, part1, password);\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nAddValueSMS(\\\"part1\\\", part1); //for sms template\\nAddValueSMS(\\\"part2\\\", part2); // for sms template\\nAddValueSMS(\\\"sequenceNumber\\\", sequenceNumber); // for sms template\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs,\\n configsSMS: configsSMS //for sms template\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction AddValueSMS(p1, p2) { //function for sms template\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configsSMS.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716290275}],"Tags":[]},{"Id":4109,"Name":"SetBattery Bracelet","TemplateSMS":"OCA-CMD;<>;<>;","Template":"VGCMD-001;<>;<>;[0a]","AckTemplate":null,"Operation":"let command = \"BATBC=\" + params.Bracelet.LowBattery + \",\" + params.Bracelet.CriticalBattery;\nvar configs = [];\nvar configsSMS = []; // for sms template\nsequenceNumber = (new Date().getTime()).toString(36);\nvar part1 = \"update=\" + sequenceNumber;\nconst _crypto = require('crypto');\nif (params.Password.Password === \"\") {\n var password = serverParams.Imei;\n} else {\n var password = params.Password.Password;\n}\nif (params.Password.encryption === \"true\") {\n var part2 = encrypt(command, part1, password);\n} else {\n var part2 = command;\n}\nAddValue(\"part1\", part1);\nAddValue(\"part2\", part2);\nAddValue(\"sequenceNumber\", sequenceNumber);\nAddValueSMS(\"part1\", part1); //for sms template\nAddValueSMS(\"part2\", part2); // for sms template\nAddValueSMS(\"sequenceNumber\", sequenceNumber); // for sms template\nvar commandConfigs = {\n template: \"main\",\n configs: configs,\n configsSMS: configsSMS //for sms template\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction AddValueSMS(p1, p2) { //function for sms template\n var cvpair = {\n code: p1,\n value: p2\n };\n configsSMS.push(cvpair);\n}\n\nfunction encrypt(text, mid, password) {\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\n const iv = _crypto.randomBytes(16); // random initialization vector\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\n // set the cipher\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\n // encrypt text\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\n // generate output ( encrypted text )\n return Buffer.concat([iv, encrypted]).toString('base64');\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":false,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4109,\"Name\":\"SetBattery Bracelet\",\"TemplateSMS\":\"OCA-CMD;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"let command = \\\"BATBC=\\\" + params.Bracelet.LowBattery + \\\",\\\" + params.Bracelet.CriticalBattery;\\nvar configs = [];\\nvar configsSMS = []; // for sms template\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nconst _crypto = require('crypto');\\nvar password = params.Password.Password;\\nif (password === \\\"\\\") {\\n var part2 = command;\\n} else {\\n var part2 = \\\"enc=\\\" + encrypt(command, part1, password);\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nAddValueSMS(\\\"part1\\\", part1); //for sms template\\nAddValueSMS(\\\"part2\\\", part2); // for sms template\\nAddValueSMS(\\\"sequenceNumber\\\", sequenceNumber); // for sms template\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs,\\n configsSMS: configsSMS //for sms template\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction AddValueSMS(p1, p2) { //function for sms template\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configsSMS.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716290471}],"Tags":[]},{"Id":4108,"Name":"SetTemp Bracelet","TemplateSMS":"OCA-CMD;<>;<>;","Template":"VGCMD-001;<>;<>;[0a]","AckTemplate":null,"Operation":"let command = \"TEMPBC=\" + params.Bracelet.LowTemp + \",\" + params.Bracelet.HighTemp;\nvar configs = [];\nvar configsSMS = []; // for sms template\nsequenceNumber = (new Date().getTime()).toString(36);\nvar part1 = \"update=\" + sequenceNumber;\nconst _crypto = require('crypto');\nif (params.Password.Password === \"\") {\n var password = serverParams.Imei;\n} else {\n var password = params.Password.Password;\n}\nif (params.Password.encryption === \"true\") {\n var part2 = encrypt(command, part1, password);\n} else {\n var part2 = command;\n}\nAddValue(\"part1\", part1);\nAddValue(\"part2\", part2);\nAddValue(\"sequenceNumber\", sequenceNumber);\nAddValueSMS(\"part1\", part1); //for sms template\nAddValueSMS(\"part2\", part2); // for sms template\nAddValueSMS(\"sequenceNumber\", sequenceNumber); // for sms template\nvar commandConfigs = {\n template: \"main\",\n configs: configs,\n configsSMS: configsSMS //for sms template\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction AddValueSMS(p1, p2) { //function for sms template\n var cvpair = {\n code: p1,\n value: p2\n };\n configsSMS.push(cvpair);\n}\n\nfunction encrypt(text, mid, password) {\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\n const iv = _crypto.randomBytes(16); // random initialization vector\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\n // set the cipher\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\n // encrypt text\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\n // generate output ( encrypted text )\n return Buffer.concat([iv, encrypted]).toString('base64');\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":false,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4108,\"Name\":\"SetTemp Bracelet\",\"TemplateSMS\":\"OCA-CMD;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"let command = \\\"TEMPBC=\\\" + params.Bracelet.LowTemp + \\\",\\\" + params.Bracelet.HighTemp;\\nvar configs = [];\\nvar configsSMS = []; // for sms template\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nconst _crypto = require('crypto');\\nvar password = params.Password.Password;\\nif (password === \\\"\\\") {\\n var part2 = command;\\n} else {\\n var part2 = \\\"enc=\\\" + encrypt(command, part1, password);\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nAddValueSMS(\\\"part1\\\", part1); //for sms template\\nAddValueSMS(\\\"part2\\\", part2); // for sms template\\nAddValueSMS(\\\"sequenceNumber\\\", sequenceNumber); // for sms template\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs,\\n configsSMS: configsSMS //for sms template\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction AddValueSMS(p1, p2) { //function for sms template\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configsSMS.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716290568}],"Tags":[]},{"Id":4107,"Name":"Set Password","TemplateSMS":"OCA-CMD;<>;<>;","Template":"VGCMD-001;<>;<>;[0a]","AckTemplate":null,"Operation":"var command = \"PW=\" + params.Password.Password;\nvar configs = [];\nvar configsSMS = []; // for sms template\nsequenceNumber = (new Date().getTime()).toString(36);\nvar part1 = \"update=\" + sequenceNumber;\nconst _crypto = require('crypto');\nif (params.Password.Password === \"\") {\n var password = serverParams.Imei;\n} else {\n // var password = params.Password.Password;\n // use old password if it has been changed to send password update\n let new_password = params.Password.Password;\n let old_password = params.Password.PasswordOld;\n if (new_password === old_password) {\n var password = new_password;\n } else {\n var password = old_password;\n }\n}\nif (params.Password.encryption === \"true\") {\n var part2 = encrypt(command, part1, password);\n} else {\n var part2 = command;\n}\nAddValue(\"part1\", part1);\nAddValue(\"part2\", part2);\nAddValue(\"sequenceNumber\", sequenceNumber);\nAddValueSMS(\"part1\", part1); //for sms template\nAddValueSMS(\"part2\", part2); // for sms template\nAddValueSMS(\"sequenceNumber\", sequenceNumber); // for sms template\nvar commandConfigs = {\n template: \"main\",\n configs: configs,\n configsSMS: configsSMS //for sms template\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction AddValueSMS(p1, p2) { //function for sms template\n var cvpair = {\n code: p1,\n value: p2\n };\n configsSMS.push(cvpair);\n}\n\nfunction encrypt(text, mid, password) {\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\n const iv = _crypto.randomBytes(16); // random initialization vector\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\n // set the cipher\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\n // encrypt text\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\n // generate output ( encrypted text )\n return Buffer.concat([iv, encrypted]).toString('base64');\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":false,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4107,\"Name\":\"Set Password\",\"TemplateSMS\":\"OCA-CMD;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"var command = \\\"PW=\\\" + params.Password.Password;\\nvar configs = [];\\nvar configsSMS = []; // for sms template\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nconst _crypto = require('crypto');\\n// always use IMEI for encryption\\nvar password = serverParams.Imei;\\nvar part2 = \\\"enc=\\\" + encrypt(command, part1, password);\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nAddValueSMS(\\\"part1\\\", part1); //for sms template\\nAddValueSMS(\\\"part2\\\", part2); // for sms template\\nAddValueSMS(\\\"sequenceNumber\\\", sequenceNumber); // for sms template\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs,\\n configsSMS: configsSMS //for sms template\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction AddValueSMS(p1, p2) { //function for sms template\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configsSMS.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716290661}],"Tags":[]},{"Id":4106,"Name":"Set Bracelet Password","TemplateSMS":"OCA-CMD;<>;<>;","Template":"VGCMD-001;<>;<>;[0a]","AckTemplate":null,"Operation":"var command = \"BRAPW=\" + params.Password.BraceletPW;\nvar configs = [];\nvar configsSMS = []; // for sms template\nsequenceNumber = (new Date().getTime()).toString(36);\nvar part1 = \"update=\" + sequenceNumber;\nconst _crypto = require('crypto');\nif (params.Password.Password === \"\") {\n var password = serverParams.Imei;\n} else {\n var password = params.Password.Password;\n}\nif (params.Password.encryption === \"true\") {\n var part2 = encrypt(command, part1, password);\n} else {\n var part2 = command;\n}\nAddValue(\"part1\", part1);\nAddValue(\"part2\", part2);\nAddValue(\"sequenceNumber\", sequenceNumber);\nAddValueSMS(\"part1\", part1); //for sms template\nAddValueSMS(\"part2\", part2); // for sms template\nAddValueSMS(\"sequenceNumber\", sequenceNumber); // for sms template\nvar commandConfigs = {\n template: \"main\",\n configs: configs,\n configsSMS: configsSMS //for sms template\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction AddValueSMS(p1, p2) { //function for sms template\n var cvpair = {\n code: p1,\n value: p2\n };\n configsSMS.push(cvpair);\n}\n\nfunction encrypt(text, mid, password) {\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\n const iv = _crypto.randomBytes(16); // random initialization vector\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\n // set the cipher\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\n // encrypt text\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\n // generate output ( encrypted text )\n return Buffer.concat([iv, encrypted]).toString('base64');\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":false,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4106,\"Name\":\"Set Bracelet Password\",\"TemplateSMS\":\"OCA-CMD;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"var command = \\\"BRAPW=\\\" + params.Password.BraceletPW;\\nvar configs = [];\\nvar configsSMS = []; // for sms template\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nconst _crypto = require('crypto');\\nvar password = params.Password.Password;\\nif (password === \\\"\\\") {\\n var part2 = command;\\n} else {\\n var part2 = \\\"enc=\\\" + encrypt(command, part1, password);\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nAddValueSMS(\\\"part1\\\", part1); //for sms template\\nAddValueSMS(\\\"part2\\\", part2); // for sms template\\nAddValueSMS(\\\"sequenceNumber\\\", sequenceNumber); // for sms template\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs,\\n configsSMS: configsSMS //for sms template\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction AddValueSMS(p1, p2) { //function for sms template\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configsSMS.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716290394}],"Tags":[]},{"Id":4105,"Name":"Set Server","TemplateSMS":"","Template":"VGCMD-001;<>;<>;","AckTemplate":null,"Operation":"var configs = [];\r\nsequenceNumber = (new Date().getTime()).toString(36);\r\nvar part1 = \"update=\" + sequenceNumber;\r\nvar command = \"IP=\" + params.SetServer.SetPrimaryServer + ',' + params.SetServer.SetSecondaryServer;\r\nconst _crypto = require('crypto');\r\nif (params.Password.Password === \"\") {\r\n var password = serverParams.Imei;\r\n} else {\r\n var password = params.Password.Password;\r\n}\r\nif (params.Password.encryption === \"true\") {\r\n var part2 = encrypt(command, part1, password);\r\n} else {\r\n var part2 = command;\r\n}\r\nAddValue(\"part1\", part1);\r\nAddValue(\"part2\", part2);\r\nAddValue(\"sequenceNumber\", sequenceNumber);\r\nvar commandConfigs = {\r\n template: \"main\",\r\n configs: configs\r\n};\r\nmsg.push(JSON.stringify(commandConfigs));\r\n\r\nfunction AddValue(p1, p2) {\r\n var cvpair = {\r\n code: p1,\r\n value: p2\r\n };\r\n configs.push(cvpair);\r\n}\r\n\r\nfunction encrypt(text, mid, password) {\r\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\r\n const iv = _crypto.randomBytes(16); // random initialization vector\r\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\r\n // set the cipher\r\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\r\n // encrypt text\r\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\r\n // generate output ( encrypted text )\r\n return Buffer.concat([iv, encrypted]).toString('base64');\r\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":2,"HasAck":true,"HexString":false,"Order":null,"SendAttempts":1,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4105,\"Name\":\"Set Server\",\"TemplateSMS\":\"\",\"Template\":\"VGCMD-001;<>;<>;\",\"AckTemplate\":null,\"Operation\":\"var configs = [];\\r\\nsequenceNumber = (new Date().getTime()).toString(36);\\r\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\r\\nvar command = \\\"IP=\\\" + params.SetServer.SetPrimaryServer + ',' + params.SetServer.SetSecondaryServer;\\r\\nconst _crypto = require('crypto');\\r\\nvar password = params.Password.Password;\\r\\nif (password === \\\"\\\") {\\r\\n var part2 = command;\\r\\n} else {\\r\\n var part2 = \\\"enc=\\\" + encrypt(command, part1, password);\\r\\n}\\r\\nAddValue(\\\"part1\\\", part1);\\r\\nAddValue(\\\"part2\\\", part2);\\r\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\r\\nvar commandConfigs = {\\r\\n template: \\\"main\\\",\\r\\n configs: configs\\r\\n};\\r\\nmsg.push(JSON.stringify(commandConfigs));\\r\\n\\r\\nfunction AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n configs.push(cvpair);\\r\\n}\\r\\n\\r\\nfunction encrypt(text, mid, password) {\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n const iv = _crypto.randomBytes(16); // random initialization vector\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n // set the cipher\\r\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\r\\n // encrypt text\\r\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\r\\n // generate output ( encrypted text )\\r\\n return Buffer.concat([iv, encrypted]).toString('base64');\\r\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":2,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":1,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716290452}],"Tags":[]},{"Id":4104,"Name":"Reset Device","TemplateSMS":"","Template":"VGCMD-001;<>;<>;","AckTemplate":null,"Operation":"var configs = [];\nsequenceNumber = (new Date().getTime()).toString(36);\nvar part1 = \"update=\" + sequenceNumber;\nvar command = \"RESET\";\nconst _crypto = require('crypto');\nif (params.Password.Password === \"\") {\n var password = serverParams.Imei;\n} else {\n var password = params.Password.Password;\n}\nif (params.Password.encryption === \"true\") {\n var part2 = encrypt(command, part1, password);\n} else {\n var part2 = command;\n}\nAddValue(\"part1\", part1);\nAddValue(\"part2\", part2);\nAddValue(\"sequenceNumber\", sequenceNumber);\nvar commandConfigs = {\n template: \"main\",\n configs: configs\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction encrypt(text, mid, password) {\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\n const iv = _crypto.randomBytes(16); // random initialization vector\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\n // set the cipher\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\n // encrypt text\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\n // generate output ( encrypted text )\n return Buffer.concat([iv, encrypted]).toString('base64');\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":2,"HasAck":true,"HexString":false,"Order":null,"SendAttempts":1,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4104,\"Name\":\"Reset Device\",\"TemplateSMS\":\"\",\"Template\":\"VGCMD-001;<>;<>;\",\"AckTemplate\":null,\"Operation\":\"var configs = [];\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nvar command = \\\"RESET\\\";\\nconst _crypto = require('crypto');\\nvar password = params.Password.Password;\\nif (password === \\\"\\\") {\\n var part2 = command;\\n} else {\\n var part2 = \\\"enc=\\\" + encrypt(command, part1, password);\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":2,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":1,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716290362}],"Tags":[]},{"Id":4103,"Name":"PowerOff Bracelet","TemplateSMS":"OCA-CMD;<>;<>;","Template":"VGCMD-001;<>;<>;[0a]","AckTemplate":null,"Operation":"let command = \"PWRFB\";\nvar configs = [];\nvar configsSMS = []; // for sms template\nsequenceNumber = (new Date().getTime()).toString(36);\nvar part1 = \"update=\" + sequenceNumber;\nconst _crypto = require('crypto');\nif (params.Password.Password === \"\") {\n var password = serverParams.Imei;\n} else {\n var password = params.Password.Password;\n}\nif (params.Password.encryption === \"true\") {\n var part2 = encrypt(command, part1, password);\n} else {\n var part2 = command;\n}\nAddValue(\"part1\", part1);\nAddValue(\"part2\", part2);\nAddValue(\"sequenceNumber\", sequenceNumber);\nAddValueSMS(\"part1\", part1); //for sms template\nAddValueSMS(\"part2\", part2); // for sms template\nAddValueSMS(\"sequenceNumber\", sequenceNumber); // for sms template\nvar commandConfigs = {\n template: \"main\",\n configs: configs,\n configsSMS: configsSMS //for sms template\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction AddValueSMS(p1, p2) { //function for sms template\n var cvpair = {\n code: p1,\n value: p2\n };\n configsSMS.push(cvpair);\n}\n\nfunction encrypt(text, mid, password) {\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\n const iv = _crypto.randomBytes(16); // random initialization vector\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\n // set the cipher\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\n // encrypt text\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\n // generate output ( encrypted text )\n return Buffer.concat([iv, encrypted]).toString('base64');\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":false,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4103,\"Name\":\"PowerOff Bracelet\",\"TemplateSMS\":\"OCA-CMD;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"let command = \\\"PWRFB\\\";\\nvar configs = [];\\nvar configsSMS = []; // for sms template\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nconst _crypto = require('crypto');\\nvar password = params.Password.Password;\\nif (password === \\\"\\\") {\\n var part2 = command;\\n} else {\\n var part2 = \\\"enc=\\\" + encrypt(command, part1, password);\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nAddValueSMS(\\\"part1\\\", part1); //for sms template\\nAddValueSMS(\\\"part2\\\", part2); // for sms template\\nAddValueSMS(\\\"sequenceNumber\\\", sequenceNumber); // for sms template\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs,\\n configsSMS: configsSMS //for sms template\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction AddValueSMS(p1, p2) { //function for sms template\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configsSMS.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716290233}],"Tags":[]},{"Id":4102,"Name":"SetCloudParam Bracelet","TemplateSMS":"OCA-CMD;<>;<>;","Template":"VGCMD-001;<>;<>;[0a]","AckTemplate":null,"Operation":"let command = \"CLDPAR=\" + params.Bracelet.CloudParam;\nvar configs = [];\nvar configsSMS = []; // for sms template\nsequenceNumber = (new Date().getTime()).toString(36);\nvar part1 = \"update=\" + sequenceNumber;\nconst _crypto = require('crypto');\nif (params.Password.Password === \"\") {\n var password = serverParams.Imei;\n} else {\n var password = params.Password.Password;\n}\nif (params.Password.encryption === \"true\") {\n var part2 = encrypt(command, part1, password);\n} else {\n var part2 = command;\n}\nAddValue(\"part1\", part1);\nAddValue(\"part2\", part2);\nAddValue(\"sequenceNumber\", sequenceNumber);\nAddValueSMS(\"part1\", part1); //for sms template\nAddValueSMS(\"part2\", part2); // for sms template\nAddValueSMS(\"sequenceNumber\", sequenceNumber); // for sms template\nvar commandConfigs = {\n template: \"main\",\n configs: configs,\n configsSMS: configsSMS //for sms template\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction AddValueSMS(p1, p2) { //function for sms template\n var cvpair = {\n code: p1,\n value: p2\n };\n configsSMS.push(cvpair);\n}\n\nfunction encrypt(text, mid, password) {\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\n const iv = _crypto.randomBytes(16); // random initialization vector\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\n // set the cipher\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\n // encrypt text\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\n // generate output ( encrypted text )\n return Buffer.concat([iv, encrypted]).toString('base64');\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":false,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4102,\"Name\":\"SetCloudParam Bracelet\",\"TemplateSMS\":\"OCA-CMD;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"let command = \\\"CLDPAR=\\\" + params.Bracelet.CloudParam;\\nvar configs = [];\\nvar configsSMS = []; // for sms template\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nconst _crypto = require('crypto');\\nvar password = params.Password.Password;\\nif (password === \\\"\\\") {\\n var part2 = command;\\n} else {\\n var part2 = \\\"enc=\\\" + encrypt(command, part1, password);\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nAddValueSMS(\\\"part1\\\", part1); //for sms template\\nAddValueSMS(\\\"part2\\\", part2); // for sms template\\nAddValueSMS(\\\"sequenceNumber\\\", sequenceNumber); // for sms template\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs,\\n configsSMS: configsSMS //for sms template\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction AddValueSMS(p1, p2) { //function for sms template\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configsSMS.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716290513}],"Tags":[]},{"Id":4101,"Name":"SetBLEParam Bracelet","TemplateSMS":"OCA-CMD;<>;<>;","Template":"VGCMD-001;<>;<>;[0a]","AckTemplate":null,"Operation":"let command = \"BLEPAR=\" + params.Bracelet.BLEParam;\nvar configs = [];\nvar configsSMS = []; // for sms template\nsequenceNumber = (new Date().getTime()).toString(36);\nvar part1 = \"update=\" + sequenceNumber;\nconst _crypto = require('crypto');\nif (params.Password.Password === \"\") {\n var password = serverParams.Imei;\n} else {\n var password = params.Password.Password;\n}\nif (params.Password.encryption === \"true\") {\n var part2 = encrypt(command, part1, password);\n} else {\n var part2 = command;\n}\nAddValue(\"part1\", part1);\nAddValue(\"part2\", part2);\nAddValue(\"sequenceNumber\", sequenceNumber);\nAddValueSMS(\"part1\", part1); //for sms template\nAddValueSMS(\"part2\", part2); // for sms template\nAddValueSMS(\"sequenceNumber\", sequenceNumber); // for sms template\nvar commandConfigs = {\n template: \"main\",\n configs: configs,\n configsSMS: configsSMS //for sms template\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction AddValueSMS(p1, p2) { //function for sms template\n var cvpair = {\n code: p1,\n value: p2\n };\n configsSMS.push(cvpair);\n}\n\nfunction encrypt(text, mid, password) {\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\n const iv = _crypto.randomBytes(16); // random initialization vector\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\n // set the cipher\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\n // encrypt text\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\n // generate output ( encrypted text )\n return Buffer.concat([iv, encrypted]).toString('base64');\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":false,"Order":null,"SendAttempts":2,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":4101,\"Name\":\"SetBLEParam Bracelet\",\"TemplateSMS\":\"OCA-CMD;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"let command = \\\"BLEPAR=\\\" + params.Bracelet.BLEParam;\\nvar configs = [];\\nvar configsSMS = []; // for sms template\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nconst _crypto = require('crypto');\\nvar password = params.Password.Password;\\nif (password === \\\"\\\") {\\n var part2 = command;\\n} else {\\n var part2 = \\\"enc=\\\" + encrypt(command, part1, password);\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nAddValueSMS(\\\"part1\\\", part1); //for sms template\\nAddValueSMS(\\\"part2\\\", part2); // for sms template\\nAddValueSMS(\\\"sequenceNumber\\\", sequenceNumber); // for sms template\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs,\\n configsSMS: configsSMS //for sms template\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction AddValueSMS(p1, p2) { //function for sms template\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configsSMS.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":2,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716290492}],"Tags":[]},{"Id":4123,"Name":"ClearBuffer","TemplateSMS":"VGCMD-001;<>;<>;","Template":"VGCMD-001;<>;<>;[0a]","AckTemplate":null,"Operation":"var configs = [];\nsequenceNumber = (new Date().getTime()).toString(36);\nvar part1 = \"update=\" + sequenceNumber;\nvar command = \"CLRBUF\";\nconst _crypto = require('crypto');\nif (params.Password.Password === \"\") {\n var password = serverParams.Imei;\n} else {\n var password = params.Password.Password;\n}\nif (params.Password.encryption === \"true\") {\n var part2 = encrypt(command, part1, password);\n} else {\n var part2 = command;\n}\nAddValue(\"part1\", part1);\nAddValue(\"part2\", part2);\nAddValue(\"sequenceNumber\", sequenceNumber);\nvar commandConfigs = {\n template: \"main\",\n configs: configs\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction encrypt(text, mid, password) {\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\n const iv = _crypto.randomBytes(16); // random initialization vector\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\n // set the cipher\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\n // encrypt text\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\n // generate output ( encrypted text )\n return Buffer.concat([iv, encrypted]).toString('base64');\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":false,"Order":null,"SendAttempts":1,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":4123,\"Name\":\"ClearBuffer\",\"TemplateSMS\":\"VGCMD-001;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"var configs = [];\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nvar command = \\\"CLRBUF\\\";\\nconst _crypto = require('crypto');\\nif (params.Password.Password === \\\"\\\") {\\n var password = serverParams.Imei;\\n} else {\\n var password = params.Password.Password;\\n}\\nif (params.Password.encryption === \\\"true\\\") {\\n var part2 = encrypt(command, part1, password);\\n} else {\\n var part2 = command;\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":1,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1710246421},{"Type":1,"NewValue":"{\"Id\":4123,\"Name\":\"ClearBuffer\",\"TemplateSMS\":\"VGCMD-001;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"var configs = [];\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nvar command = \\\"CLRBUF\\\";\\nconst _crypto = require('crypto');\\nvar password = params.Password.Password;\\nif (password === \\\"\\\") {\\n var part2 = command;\\n} else {\\n var part2 = \\\"enc=\\\" + encrypt(command, part1, password);\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":1,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716290144}],"Tags":[]},{"Id":4124,"Name":"RequestData","TemplateSMS":"VGCMD-001;<>;<>;","Template":"VGCMD-001;<>;<>;[0a]","AckTemplate":null,"Operation":"var configs = [];\nsequenceNumber = (new Date().getTime()).toString(36);\nvar part1 = \"update=\" + sequenceNumber;\nvar command = \"REQDATA\";\nconst _crypto = require('crypto');\nif (params.Password.Password === \"\") {\n var password = serverParams.Imei;\n} else {\n var password = params.Password.Password;\n}\nif (params.Password.encryption === \"true\") {\n var part2 = encrypt(command, part1, password);\n} else {\n var part2 = command;\n}\nAddValue(\"part1\", part1);\nAddValue(\"part2\", part2);\nAddValue(\"sequenceNumber\", sequenceNumber);\nvar commandConfigs = {\n template: \"main\",\n configs: configs\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction encrypt(text, mid, password) {\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\n const iv = _crypto.randomBytes(16); // random initialization vector\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\n // set the cipher\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\n // encrypt text\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\n // generate output ( encrypted text )\n return Buffer.concat([iv, encrypted]).toString('base64');\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":false,"Order":null,"SendAttempts":1,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":4124,\"Name\":\"RequestData\",\"TemplateSMS\":\"VGCMD-001;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"var configs = [];\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nvar command = \\\"REQDATA\\\";\\nconst _crypto = require('crypto');\\nif (params.Password.Password === \\\"\\\") {\\n var password = serverParams.Imei;\\n} else {\\n var password = params.Password.Password;\\n}\\nif (params.Password.encryption === \\\"true\\\") {\\n var part2 = encrypt(command, part1, password);\\n} else {\\n var part2 = command;\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":1,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1710246477},{"Type":1,"NewValue":"{\"Id\":4124,\"Name\":\"RequestData\",\"TemplateSMS\":\"VGCMD-001;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"var configs = [];\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nvar command = \\\"REQDATA\\\";\\nconst _crypto = require('crypto');\\nvar password = params.Password.Password;\\nif (password === \\\"\\\") {\\n var part2 = command;\\n} else {\\n var part2 = \\\"enc=\\\" + encrypt(command, part1, password);\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":1,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716290305}],"Tags":[]},{"Id":4125,"Name":"RequestLog","TemplateSMS":"VGCMD-001;<>;<>;","Template":"VGCMD-001;<>;<>;[0a]","AckTemplate":null,"Operation":"var configs = [];\nsequenceNumber = (new Date().getTime()).toString(36);\nvar part1 = \"update=\" + sequenceNumber;\nvar command = \"REQLOG\";\nconst _crypto = require('crypto');\nif (params.Password.Password === \"\") {\n var password = serverParams.Imei;\n} else {\n var password = params.Password.Password;\n}\nif (params.Password.encryption === \"true\") {\n var part2 = encrypt(command, part1, password);\n} else {\n var part2 = command;\n}\nAddValue(\"part1\", part1);\nAddValue(\"part2\", part2);\nAddValue(\"sequenceNumber\", sequenceNumber);\nvar commandConfigs = {\n template: \"main\",\n configs: configs\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction encrypt(text, mid, password) {\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\n const iv = _crypto.randomBytes(16); // random initialization vector\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\n // set the cipher\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\n // encrypt text\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\n // generate output ( encrypted text )\n return Buffer.concat([iv, encrypted]).toString('base64');\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":false,"Order":null,"SendAttempts":1,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":4125,\"Name\":\"RequestLog\",\"TemplateSMS\":\"VGCMD-001;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"var configs = [];\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nvar command = \\\"REQLOG\\\";\\nconst _crypto = require('crypto');\\nif (params.Password.Password === \\\"\\\") {\\n var password = serverParams.Imei;\\n} else {\\n var password = params.Password.Password;\\n}\\nif (params.Password.encryption === \\\"true\\\") {\\n var part2 = encrypt(command, part1, password);\\n} else {\\n var part2 = command;\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":1,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1710246526},{"Type":1,"NewValue":"{\"Id\":4125,\"Name\":\"RequestLog\",\"TemplateSMS\":\"VGCMD-001;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"var configs = [];\\nvar starttimestr = params.DeviceConfig.StartTimeLog;\\nvar starttimedate = new Date(starttimestr);\\nstarttimeInt = starttimedate.getTime() / 1000;\\nif (isNaN(starttimeInt)) {\\n starttimeInt = '';\\n}\\nvar endtimestr = params.DeviceConfig.EndTimeLog;\\nvar endtimedate = new Date(endtimestr);\\nendtimeInt = endtimedate.getTime() / 1000;\\nif (isNaN(endtimeInt)) {\\n endtimeInt = '';\\n}\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nvar command = \\\"REQLOG=\\\" + starttimeInt + \\\",\\\" + endtimeInt;\\nconst _crypto = require('crypto');\\nif (params.Password.Password === \\\"\\\") {\\n var password = serverParams.Imei;\\n} else {\\n var password = params.Password.Password;\\n}\\nif (params.Password.encryption === \\\"true\\\") {\\n var part2 = encrypt(command, part1, password);\\n} else {\\n var part2 = command;\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":1,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1714640696},{"Type":1,"NewValue":"{\"Id\":4125,\"Name\":\"RequestLog\",\"TemplateSMS\":\"VGCMD-001;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"var configs = [];\\nvar starttimestr = params.DeviceConfig.StartTimeLog;\\nvar starttimedate = new Date(starttimestr);\\nstarttimeInt = starttimedate.getTime() / 1000;\\nif (isNaN(starttimeInt)) {\\n starttimeInt = '';\\n}\\nvar endtimestr = params.DeviceConfig.EndTimeLog;\\nvar endtimedate = new Date(endtimestr);\\nendtimeInt = endtimedate.getTime() / 1000;\\nif (isNaN(endtimeInt)) {\\n endtimeInt = '';\\n}\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nvar command = \\\"REQLOG=\\\" + starttimeInt + \\\",\\\" + endtimeInt;\\nconst _crypto = require('crypto');\\nvar password = params.Password.Password;\\nif (password === \\\"\\\") {\\n var part2 = command;\\n} else {\\n var part2 = \\\"enc=\\\" + encrypt(command, part1, password);\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":1,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716290326}],"Tags":[]},{"Id":4126,"Name":"Set RTLog Enable","TemplateSMS":"VGCMD-001;<>;<>;","Template":"VGCMD-001;<>;<>;[0a]","AckTemplate":null,"Operation":"// write your code here...\nif (params.DeviceConfig.EnableLogging == \"true\") {\n enableLogging = \"1\";\n} else {\n enableLogging = \"0\";\n}\nvar command = \"RTLOG=\" + enableLogging;\nvar configs = [];\nvar configsSMS = []; // for sms template\nsequenceNumber = (new Date().getTime()).toString(36);\nvar part1 = \"update=\" + sequenceNumber;\nconst _crypto = require('crypto');\nif (params.Password.Password === \"\") {\n var password = serverParams.Imei;\n} else {\n var password = params.Password.Password;\n}\nif (params.Password.encryption === \"true\") {\n var part2 = encrypt(command, part1, password);\n} else {\n var part2 = command;\n}\nAddValue(\"part1\", part1);\nAddValue(\"part2\", part2);\nAddValue(\"sequenceNumber\", sequenceNumber);\nAddValueSMS(\"part1\", part1); //for sms template\nAddValueSMS(\"part2\", part2); // for sms template\nAddValueSMS(\"sequenceNumber\", sequenceNumber); // for sms template\nvar commandConfigs = {\n template: \"main\",\n configs: configs,\n configsSMS: configsSMS //for sms template\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValueSMS(p1, p2) { //function for sms template\n var cvpair = {\n code: p1,\n value: p2\n };\n configsSMS.push(cvpair);\n}\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction encrypt(text, mid, password) {\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\n const iv = _crypto.randomBytes(16); // random initialization vector\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\n // set the cipher\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\n // encrypt text\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\n // generate output ( encrypted text )\n return Buffer.concat([iv, encrypted]).toString('base64');\n}","CommandToUpdate":null,"Parent":null,"AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"HasAck":true,"HexString":false,"Order":null,"SendAttempts":1,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":4126,\"Name\":\"Set RTLog Enable\",\"TemplateSMS\":\"VGCMD-001;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"// write your code here...\\nif (params.DeviceConfig.EnableLogging == \\\"true\\\") {\\n enableLogging = \\\"1\\\";\\n} else {\\n enableLogging = \\\"0\\\";\\n}\\nvar command = \\\"RTLOG=\\\" + enableLogging;\\nvar configs = [];\\nvar configsSMS = []; // for sms template\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nconst _crypto = require('crypto');\\nif (params.Password.Password === \\\"\\\") {\\n var password = serverParams.Imei;\\n} else {\\n var password = params.Password.Password;\\n}\\nif (params.Password.encryption === \\\"true\\\") {\\n var part2 = encrypt(command, part1, password);\\n} else {\\n var part2 = command;\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nAddValueSMS(\\\"part1\\\", part1); //for sms template\\nAddValueSMS(\\\"part2\\\", part2); // for sms template\\nAddValueSMS(\\\"sequenceNumber\\\", sequenceNumber); // for sms template\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs,\\n configsSMS: configsSMS //for sms template\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValueSMS(p1, p2) { //function for sms template\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configsSMS.push(cvpair);\\n}\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":1,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1710246587},{"Type":1,"NewValue":"{\"Id\":4126,\"Name\":\"Set RTLog Enable\",\"TemplateSMS\":\"VGCMD-001;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"// write your code here...\\nif (params.DeviceConfig.EnableLogging == \\\"true\\\") {\\n enableLogging = \\\"1\\\";\\n} else {\\n enableLogging = \\\"0\\\";\\n}\\nvar command = \\\"RTLOG=\\\" + enableLogging;\\nvar configs = [];\\nvar configsSMS = []; // for sms template\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nconst _crypto = require('crypto');\\nvar password = params.Password.Password;\\nif (password === \\\"\\\") {\\n var part2 = command;\\n} else {\\n var part2 = \\\"enc=\\\" + encrypt(command, part1, password);\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nAddValueSMS(\\\"part1\\\", part1); //for sms template\\nAddValueSMS(\\\"part2\\\", part2); // for sms template\\nAddValueSMS(\\\"sequenceNumber\\\", sequenceNumber); // for sms template\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs,\\n configsSMS: configsSMS //for sms template\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValueSMS(p1, p2) { //function for sms template\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configsSMS.push(cvpair);\\n}\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"CommandToUpdate\":null,\"Parent\":null,\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"HasAck\":true,\"HexString\":false,\"Order\":null,\"SendAttempts\":1,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716290430}],"Tags":[]}],"Operations":[{"Id":279,"Name":"VGA","Operation":"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\n // Define array to push device data into. This will be put into the msg array at the end.\n var deviceParams = [];\n var configsToSend = [];\n var tasks = [];\n const _crypto = require('crypto');\n // handle ACK\n if (messageTypeCode == \"ACK\") {\n return \"\";\n }\n if (params.encrypted_data) { // encrypted data so needs decrypting\n var password;\n if (params.imei == \"null\") {\n return msg;\n }\n password = params.imei;\n if (configs.Password.Password === \"\") {\n // use imei as default password when not specified\n } else {\n // use the password\n password = configs.Password.Password\n }\n // handle encrypted messages arriving via SMS\n // if (raw.startsWith('esendex')) {\n // raw = raw.split('esendex')[2];\n // encimei = raw.split(';')[1];\n // imei = parseInt(raw.split(';')[1], 36).toString();\n // AddValue('imei', imei);\n // raw = raw.replace(encimei, imei);\n // password = imei;\n // }\n let message = decrypt(raw, password);\n //ToDo: handle errors messages arriving\n // if (message.startsWith(\"error\")) {\n // ack = \"ERR;\" + params.count_number + \";\";\n // msg.push({\n // 'code': 'ack',\n // 'value': ack\n // });\n // console.log(msg);\n // } \n if (message) {\n // send message internally\n sendMessageToLocalhost(message);\n let ack = \"ACK-MSG;\" + params.count_number + \";OK;\\n\"\n AddValue(\"ack\", ack);\n } else {\n ack = \"unknown message\" + \" - \" + serverParams.imei + \" --- \" + raw;\n AddValue(\"ack\", ack);\n }\n } else { // General Oysta Template\n switch (messageTypeLocalCode) {\n case (\"COMM\"):\n process_invent_msg(); //incoming invent commands\n break;\n case (\"MACB\"):\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\n add_params_to_output();\n break;\n case (\"REGISTER\"):\n let ble_mac = params.ble_mac;\n let iccid = params.iccid;\n // write values to readonly settings\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\n // remove this to disable auto-config\n //AddConfig(configIds.DeviceConfig.IVActivated, 'true')\n break;\n case (\"CREATE\"):\n let c_ble_mac = params.ble_mac;\n let c_iccid = params.iccid;\n let new_imei = params.new_imei;\n let c_message = \"VGA-001;\" + new_imei + \";mid=\" + params.count_number + \";REGISTER=\" + c_ble_mac + \",\" + c_iccid + \";\";\n // sendMessageToLocalhost(c_message); \n tasks = [{\n \"name\": \"VGA\" + new_imei,\n \"option\": \"sync\",\n \"type\": \"createDevice\",\n \"payload\": JSON.stringify({\n \"name\": \"VGA\" + new_imei,\n \"imei\": new_imei,\n \"abortOnError\": false,\n \"init\": true\n }),\n \"order\": 1\n }, {\n \"name\": \"Create VGA\" + new_imei,\n \"option\": \"async\",\n \"type\": \"sendMessage\",\n \"payload\": JSON.stringify({\n \"message\": c_message\n }),\n \"order\": 2\n }]\n break;\n default:\n // all other general messages\n // Generate location_accuracy based on raw_accuracy - currently no conversion\n add_params_to_output();\n }\n // add messagetTypeLocal to output for templates\n AddValue('local_message_type', messageTypeLocalCode);\n }\n var msg = {\n 'values': deviceParams,\n };\n if (configsToSend.length > 0) {\n msg.configsToSend = configsToSend\n };\n if (tasks.length > 0) {\n msg.tasks = tasks\n };\n // commit values to receiver processor\n console.log(msg);\n // modify to return the object that contains your data\n return msg;\n\n function add_params_to_output() {\n if (!params.raw_accuracy) {\n AddValue('location_accuracy', 9000);\n } else {\n AddValue('location_accuracy', params.raw_accuracy);\n }\n // generate timestamps if they don't exist\n if (!params.event_time) {\n AddValue('event_time', moment.utc().unix());\n }\n if (!params.location_time) {\n AddValue('event_time', moment.utc().unix());\n }\n //if no lat and long are given, set them to 0, 0\n if (!params.latitude_raw) {\n AddValue('latitude', 0);\n } else {\n AddValue('latitude', params.latitude_raw);\n }\n if (!params.longitude_raw) {\n AddValue('longitude', 0);\n } else {\n AddValue('longitude', params.longitude_raw);\n }\n //if (params.temp_bracelet) {\n // AddValue('oysta_labels', 'DegC');\n // AddValue('single_column_value', params.temp_bracelet);\n //}\n }\n\n function process_invent_msg() {\n const details = JSON.parse(raw);\n // AddValue('imei', details.AppId);\n AddValue('json_in', JSON.stringify(details));\n switch (details.Command) {\n case \"ACTIVATE_OK\":\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\n break;\n case \"ACTIVATE_FAILS\":\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\n break;\n case \"APPSET\":\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\n AddConfig(configIds.Password.Password, details.Data.Password);\n break;\n case \"CONFIG\":\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\n break;\n case \"CGFBR\":\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\n let commonParam = addEscapeChar(details.Data.ComPar);\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\n let cloudParam = addEscapeChar(details.Data.CldPar);\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\n let lteParam = addEscapeChar(details.Data.LtePar);\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\n let bleParam = addEscapeChar(details.Data.BlePar);\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\n break;\n case \"REBOOTB\":\n AddConfig(configIds.Bracelet.Reboot, 'true');\n break;\n case \"PWRFB\":\n AddConfig(configIds.Bracelet.PowerOff, 'true');\n break;\n case \"RESETB\":\n AddConfig(configIds.Bracelet.Reset, 'true');\n break;\n case \"BRAPWUPDATE\":\n AddValue(\"PasswordRecoveryFrom\", details.Data.ImeiOld);\n // get password from old device, then set\n AddConfig(configIds.Password.BraceletPW, \"DoNotChange123\" // replace with recovered password, for test this is DoNotChange123\n )\n break;\n case \"NOTE\":\n let type = details.Data.Type !== undefined ? details.Data.Type : \"TYPE MISSING\";\n let text = details.Data.Text !== undefined ? details.Data.Text : \"Text Missing\";\n text = text.split(\",\").join(\" \");\n let id = details.Data.Id !== undefined ? details.Data.Id : \"Id Missing\";\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\n let value = time + \",\" + type + \",\" + id + \",\" + text;\n AddConfig(configIds.Note.Message, value)\n break;\n }\n }\n\n function addEscapeChar(json) {\n if (json === undefined) {\n return undefined;\n }\n let outStr = \"\";\n let jsonStr = JSON.stringify(json);\n for (let c of jsonStr) {\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\n } else {\n outStr += c;\n }\n };\n return outStr;\n }\n\n function sendMessageToLocalhost(str) {\n if (localTesting) {\n console.log(\"Sending message to local host: \" + str);\n } else {\n var server = 'receiver-tcp';\n var c = createConnection(5678, server);\n c.write(`${str}`);\n c.end();\n }\n AddValue(\"ToLocalhost\", str);\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\n function decrypt(encdata, password) {\n var decrypted;\n var dataarray = encdata.split(\";\");\n if (dataarray.length > 5) {\n return \"\";\n }\n var i;\n var part1 = \"\"; // part1 will hold the type, IMEI and message ID\n if (encdata.startsWith(\"ACK\")) {\n return encdata;\n }\n for (i = 0; i < 3; i++) {\n part1 = part1 + dataarray[i] + \";\";\n }\n var mid = dataarray[2]; // use the message ID to create the salt\n var enctext = dataarray[3].split(\"=\")[1]; // the encypted data\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\n // base64 decoding and extract the iv and encrypted data\n const bData = Buffer.from(enctext, 'base64');\n const iv = bData.slice(0, 16); // initial 16 chars\n const text = bData.slice(16); // all the encrypted data\n // derive key using; 32 byte key length (from salted password and mid)\n // decrypt the data in part2 and add to part1\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\n try {\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\n } catch (err) {\n decrypted = undefined;\n }\n return decrypted;\n }\n\n function encrypt(text, mid, password) {\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\n const iv = _crypto.randomBytes(16); // random initialization vector\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\n // set the cipher\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\n // encrypt text\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\n // generate output ( encrypted text )\n return Buffer.concat([iv, encrypted]).toString('base64');\n }\n\n function AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n deviceParams.push(cvpair);\n }\n\n function AddConfig(configName, newvalue) {\n if (newvalue !== undefined) { // don't add if newvalue is undefined\n var cvpair = {\n 'code': configName,\n 'value': newvalue,\n 'forced': true\n };\n configsToSend.push(cvpair);\n };\n }\n\n function isASCII(str) {\n return /^[\\x00-\\xFF]*$/.test(str);\n }\n}\n// params is not defined locally -> export as module\nif (typeof(params) === 'undefined') {\n module.exports = {\n execute_ops\n }\n} else { // on server use local defined vars\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\n // define global returns\n msg = return_values;\n}","Type":0,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\n // Define array to push device data into. This will be put into the msg array at the end.\\n var deviceParams = [];\\n var configsToSend = [];\\n var tasks = [];\\n const _crypto = require('crypto');\\n // handle ACK\\n if (messageTypeCode == \\\"ACK\\\") {\\n return \\\"\\\";\\n }\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\n var password;\\n if (params.imei == \\\"null\\\") {\\n return msg;\\n }\\n password = params.imei;\\n if (configs.Password.Password === \\\"\\\") {\\n // use imei as default password when not specified\\n } else {\\n // use the password\\n password = configs.Password.Password\\n }\\n // handle encrypted messages arriving via SMS\\n // if (raw.startsWith('esendex')) {\\n // raw = raw.split('esendex')[2];\\n // encimei = raw.split(';')[1];\\n // imei = parseInt(raw.split(';')[1], 36).toString();\\n // AddValue('imei', imei);\\n // raw = raw.replace(encimei, imei);\\n // password = imei;\\n // }\\n let message = decrypt(raw, password);\\n //ToDo: handle errors messages arriving\\n // if (message.startsWith(\\\"error\\\")) {\\n // ack = \\\"ERR;\\\" + params.count_number + \\\";\\\";\\n // msg.push({\\n // 'code': 'ack',\\n // 'value': ack\\n // });\\n // console.log(msg);\\n // } \\n if (message) {\\n // send message internally\\n sendMessageToLocalhost(message);\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\n AddValue(\\\"ack\\\", ack);\\n } else {\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\n AddValue(\\\"ack\\\", ack);\\n }\\n } else { // General Oysta Template\\n switch (messageTypeLocalCode) {\\n case (\\\"COMM\\\"):\\n process_invent_msg(); //incoming invent commands\\n break;\\n case (\\\"MACB\\\"):\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\n add_params_to_output();\\n break;\\n case (\\\"REGISTER\\\"):\\n let ble_mac = params.ble_mac;\\n let iccid = params.iccid;\\n // write values to readonly settings\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\n // remove this to disable auto-config\\n //AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\n break;\\n case (\\\"CREATE\\\"):\\n // temp fix to filter old messages\\n // const cutoff = 1707523200000; //10.2.2024\\n // let message_id_time = parseInt(params.count_number, 36);\\n // if (message_id_time > cutoff){\\n let c_ble_mac = params.ble_mac;\\n let c_iccid = params.iccid;\\n let new_imei = params.new_imei;\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\n // sendMessageToLocalhost(c_message); \\n tasks = [{\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\n \\\"option\\\": \\\"sync\\\",\\n \\\"type\\\": \\\"createDevice\\\",\\n \\\"payload\\\": JSON.stringify({\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\n \\\"imei\\\": new_imei,\\n \\\"abortOnError\\\": false,\\n \\\"init\\\": true\\n }),\\n \\\"order\\\": 1\\n }, {\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\n \\\"option\\\": \\\"async\\\",\\n \\\"type\\\": \\\"sendMessage\\\",\\n \\\"payload\\\": JSON.stringify({\\n \\\"message\\\": c_message\\n }),\\n \\\"order\\\": 2\\n }]\\n // }\\n break;\\n case (\\\"ALLDATA\\\"):\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\n let all_data = JSON.parse(json_str);\\n if (\\\"version\\\" in all_data) {\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\n };\\n break;\\n default:\\n // all other general messages\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\n add_params_to_output();\\n }\\n // add messagetTypeLocal to output for templates\\n AddValue('local_message_type', messageTypeLocalCode);\\n }\\n var msg = {\\n 'values': deviceParams,\\n };\\n if (configsToSend.length > 0) {\\n msg.configsToSend = configsToSend\\n };\\n if (tasks.length > 0) {\\n msg.tasks = tasks\\n };\\n // commit values to receiver processor\\n console.log(msg);\\n // modify to return the object that contains your data\\n return msg;\\n\\n function add_params_to_output() {\\n if (!params.raw_accuracy) {\\n AddValue('location_accuracy', 9000);\\n } else {\\n AddValue('location_accuracy', params.raw_accuracy);\\n }\\n // generate timestamps if they don't exist\\n if (!params.event_time) {\\n AddValue('event_time', moment.utc().unix());\\n }\\n if (!params.location_time) {\\n AddValue('event_time', moment.utc().unix());\\n }\\n //if no lat and long are given, set them to 0, 0\\n if (!params.latitude_raw) {\\n AddValue('latitude', 0);\\n } else {\\n AddValue('latitude', params.latitude_raw);\\n }\\n if (!params.longitude_raw) {\\n AddValue('longitude', 0);\\n } else {\\n AddValue('longitude', params.longitude_raw);\\n }\\n // if (params.temp_bracelet){\\n // AddValue('oysta_labels', 'DegC');\\n // AddValue('single_column_value', params.temp_bracelet);\\n // }\\n }\\n\\n function process_invent_msg() {\\n const details = JSON.parse(raw);\\n // AddValue('imei', details.AppId);\\n AddValue('json_in', JSON.stringify(details));\\n switch (details.Command) {\\n case \\\"ACTIVATE_OK\\\":\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\n break;\\n case \\\"ACTIVATE_FAILS\\\":\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\n break;\\n case \\\"APPSET\\\":\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\n AddConfig(configIds.Password.Password, details.Data.Password);\\n break;\\n case \\\"CONFIG\\\":\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\n break;\\n case \\\"CGFBR\\\":\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\n let commonParam = addEscapeChar(details.Data.ComPar);\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\n let lteParam = addEscapeChar(details.Data.LtePar);\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\n let bleParam = addEscapeChar(details.Data.BlePar);\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\n break;\\n case \\\"REBOOTB\\\":\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\n break;\\n case \\\"PWRFB\\\":\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\n break;\\n case \\\"RESETB\\\":\\n AddConfig(configIds.Bracelet.Reset, 'true');\\n break;\\n case \\\"BRAPWUPDATE\\\":\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\n // get password from old device, then set\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\n )\\n break;\\n case \\\"NOTE\\\":\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\n text = text.split(\\\",\\\").join(\\\" \\\");\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\n AddConfig(configIds.Note.Message, value)\\n break;\\n }\\n }\\n\\n function addEscapeChar(json) {\\n if (json === undefined) {\\n return undefined;\\n }\\n let outStr = \\\"\\\";\\n let jsonStr = JSON.stringify(json);\\n for (let c of jsonStr) {\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\n } else {\\n outStr += c;\\n }\\n };\\n return outStr;\\n }\\n\\n function changeSingleQuoteToDouble(jsonStr) {\\n if (jsonStr === undefined) {\\n return undefined;\\n }\\n let outStr = \\\"\\\";\\n for (let c of jsonStr) {\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\n outStr = outStr + String.fromCharCode(34);\\n } else {\\n outStr += c;\\n }\\n };\\n return outStr;\\n }\\n\\n function sendMessageToLocalhost(str) {\\n if (localTesting) {\\n console.log(\\\"Sending message to local host: \\\" + str);\\n } else {\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\n var c = createConnection(5678, server);\\n c.write(`${str}`);\\n c.end();\\n }\\n AddValue(\\\"ToLocalhost\\\", str);\\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\\n function decrypt(encdata, password) {\\n var decrypted;\\n var dataarray = encdata.split(\\\";\\\");\\n if (dataarray.length > 5) {\\n return \\\"\\\";\\n }\\n var i;\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\n if (encdata.startsWith(\\\"ACK\\\")) {\\n return encdata;\\n }\\n for (i = 0; i < 3; i++) {\\n part1 = part1 + dataarray[i] + \\\";\\\";\\n }\\n var mid = dataarray[2]; // use the message ID to create the salt\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n // base64 decoding and extract the iv and encrypted data\\n const bData = Buffer.from(enctext, 'base64');\\n const iv = bData.slice(0, 16); // initial 16 chars\\n const text = bData.slice(16); // all the encrypted data\\n // derive key using; 32 byte key length (from salted password and mid)\\n // decrypt the data in part2 and add to part1\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\n try {\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\n } catch (err) {\\n decrypted = undefined;\\n }\\n return decrypted;\\n }\\n\\n function encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n }\\n\\n function AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n deviceParams.push(cvpair);\\n }\\n\\n function AddConfig(configName, newvalue) {\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\n var cvpair = {\\n 'code': configName,\\n 'value': newvalue,\\n 'forced': true\\n };\\n configsToSend.push(cvpair);\\n };\\n }\\n\\n function isASCII(str) {\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\n }\\n}\\n// params is not defined locally -> export as module\\nif (typeof(params) === 'undefined') {\\n module.exports = {\\n execute_ops\\n }\\n} else { // on server use local defined vars\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\n // define global returns\\n msg = return_values;\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1710246336},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\n // Define array to push device data into. This will be put into the msg array at the end.\\n var deviceParams = [];\\n var configsToSend = [];\\n var tasks = [];\\n const _crypto = require('crypto');\\n // handle ACK\\n if (messageTypeCode == \\\"ACK\\\") {\\n return \\\"\\\";\\n }\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\n var password;\\n if (params.imei == \\\"null\\\") {\\n return msg;\\n }\\n password = params.imei;\\n if (configs.Password.Password === \\\"\\\") {\\n // use imei as default password when not specified\\n } else {\\n // use the password\\n password = configs.Password.Password\\n }\\n // handle encrypted messages arriving via SMS\\n // if (raw.startsWith('esendex')) {\\n // raw = raw.split('esendex')[2];\\n // encimei = raw.split(';')[1];\\n // imei = parseInt(raw.split(';')[1], 36).toString();\\n // AddValue('imei', imei);\\n // raw = raw.replace(encimei, imei);\\n // password = imei;\\n // }\\n let message = decrypt(raw, password);\\n //ToDo: handle errors messages arriving\\n // if (message.startsWith(\\\"error\\\")) {\\n // ack = \\\"ERR;\\\" + params.count_number + \\\";\\\";\\n // msg.push({\\n // 'code': 'ack',\\n // 'value': ack\\n // });\\n // console.log(msg);\\n // } \\n if (message) {\\n // send message internally\\n sendMessageToLocalhost(message);\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\n AddValue(\\\"ack\\\", ack);\\n } else {\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\n AddValue(\\\"ack\\\", ack);\\n }\\n } else { // General Oysta Template\\n switch (messageTypeLocalCode) {\\n case (\\\"COMM\\\"):\\n process_invent_msg(); //incoming invent commands\\n break;\\n case (\\\"MACB\\\"):\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\n add_params_to_output();\\n break;\\n case (\\\"REGISTER\\\"):\\n let ble_mac = params.ble_mac;\\n let iccid = params.iccid;\\n // write values to readonly settings\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\n // will automtaically Activate on Acceptance\\n if (serverParams.EnvName) {\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\n }\\n }\\n break;\\n case (\\\"CREATE\\\"):\\n // temp fix to filter old messages\\n // const cutoff = 1707523200000; //10.2.2024\\n // let message_id_time = parseInt(params.count_number, 36);\\n // if (message_id_time > cutoff){\\n let c_ble_mac = params.ble_mac;\\n let c_iccid = params.iccid;\\n let new_imei = params.new_imei;\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\n // sendMessageToLocalhost(c_message); \\n tasks = [{\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\n \\\"option\\\": \\\"sync\\\",\\n \\\"type\\\": \\\"createDevice\\\",\\n \\\"payload\\\": JSON.stringify({\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\n \\\"imei\\\": new_imei,\\n \\\"abortOnError\\\": false,\\n \\\"init\\\": true\\n }),\\n \\\"order\\\": 1\\n }, {\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\n \\\"option\\\": \\\"async\\\",\\n \\\"type\\\": \\\"sendMessage\\\",\\n \\\"payload\\\": JSON.stringify({\\n \\\"message\\\": c_message\\n }),\\n \\\"order\\\": 2\\n }]\\n // }\\n break;\\n case (\\\"ALLDATA\\\"):\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\n let all_data = JSON.parse(json_str);\\n if (\\\"version\\\" in all_data) {\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\n };\\n break;\\n default:\\n // all other general messages\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\n add_params_to_output();\\n }\\n // add messagetTypeLocal to output for templates\\n AddValue('local_message_type', messageTypeLocalCode);\\n }\\n var msg = {\\n 'values': deviceParams,\\n };\\n if (configsToSend.length > 0) {\\n msg.configsToSend = configsToSend\\n };\\n if (tasks.length > 0) {\\n msg.tasks = tasks\\n };\\n // commit values to receiver processor\\n console.log(msg);\\n // modify to return the object that contains your data\\n return msg;\\n\\n function add_params_to_output() {\\n if (!params.raw_accuracy) {\\n AddValue('location_accuracy', 9000);\\n } else {\\n AddValue('location_accuracy', params.raw_accuracy);\\n }\\n // generate timestamps if they don't exist\\n if (!params.event_time) {\\n AddValue('event_time', moment.utc().unix());\\n }\\n if (!params.location_time) {\\n AddValue('event_time', moment.utc().unix());\\n }\\n //if no lat and long are given, set them to 0, 0\\n if (!params.latitude_raw) {\\n AddValue('latitude', 0);\\n } else {\\n AddValue('latitude', params.latitude_raw);\\n }\\n if (!params.longitude_raw) {\\n AddValue('longitude', 0);\\n } else {\\n AddValue('longitude', params.longitude_raw);\\n }\\n // if (params.temp_bracelet){\\n // AddValue('oysta_labels', 'DegC');\\n // AddValue('single_column_value', params.temp_bracelet);\\n // }\\n }\\n\\n function process_invent_msg() {\\n const details = JSON.parse(raw);\\n // AddValue('imei', details.AppId);\\n AddValue('json_in', JSON.stringify(details));\\n switch (details.Command) {\\n case \\\"ACTIVATE_OK\\\":\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\n break;\\n case \\\"ACTIVATE_FAILS\\\":\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\n break;\\n case \\\"APPSET\\\":\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\n AddConfig(configIds.Password.Password, details.Data.Password);\\n break;\\n case \\\"CONFIG\\\":\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\n break;\\n case \\\"CGFBR\\\":\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\n let commonParam = addEscapeChar(details.Data.ComPar);\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\n let lteParam = addEscapeChar(details.Data.LtePar);\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\n let bleParam = addEscapeChar(details.Data.BlePar);\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\n break;\\n case \\\"REBOOTB\\\":\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\n break;\\n case \\\"PWRFB\\\":\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\n break;\\n case \\\"RESETB\\\":\\n AddConfig(configIds.Bracelet.Reset, 'true');\\n break;\\n case \\\"BRAPWUPDATE\\\":\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\n // get password from old device, then set\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\n )\\n break;\\n case \\\"NOTE\\\":\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\n text = text.split(\\\",\\\").join(\\\" \\\");\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\n AddConfig(configIds.Note.Message, value)\\n break;\\n }\\n }\\n\\n function addEscapeChar(json) {\\n if (json === undefined) {\\n return undefined;\\n }\\n let outStr = \\\"\\\";\\n let jsonStr = JSON.stringify(json);\\n for (let c of jsonStr) {\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\n } else {\\n outStr += c;\\n }\\n };\\n return outStr;\\n }\\n\\n function changeSingleQuoteToDouble(jsonStr) {\\n if (jsonStr === undefined) {\\n return undefined;\\n }\\n let outStr = \\\"\\\";\\n for (let c of jsonStr) {\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\n outStr = outStr + String.fromCharCode(34);\\n } else {\\n outStr += c;\\n }\\n };\\n return outStr;\\n }\\n\\n function sendMessageToLocalhost(str) {\\n if (localTesting) {\\n console.log(\\\"Sending message to local host: \\\" + str);\\n } else {\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\n var c = createConnection(5678, server);\\n c.write(`${str}`);\\n c.end();\\n }\\n AddValue(\\\"ToLocalhost\\\", str);\\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\\n function decrypt(encdata, password) {\\n var decrypted;\\n var dataarray = encdata.split(\\\";\\\");\\n if (dataarray.length > 5) {\\n return \\\"\\\";\\n }\\n var i;\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\n if (encdata.startsWith(\\\"ACK\\\")) {\\n return encdata;\\n }\\n for (i = 0; i < 3; i++) {\\n part1 = part1 + dataarray[i] + \\\";\\\";\\n }\\n var mid = dataarray[2]; // use the message ID to create the salt\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n // base64 decoding and extract the iv and encrypted data\\n const bData = Buffer.from(enctext, 'base64');\\n const iv = bData.slice(0, 16); // initial 16 chars\\n const text = bData.slice(16); // all the encrypted data\\n // derive key using; 32 byte key length (from salted password and mid)\\n // decrypt the data in part2 and add to part1\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\n try {\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\n } catch (err) {\\n decrypted = undefined;\\n }\\n return decrypted;\\n }\\n\\n function encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n }\\n\\n function AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n deviceParams.push(cvpair);\\n }\\n\\n function AddConfig(configName, newvalue) {\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\n var cvpair = {\\n 'code': configName,\\n 'value': newvalue,\\n 'forced': true\\n };\\n configsToSend.push(cvpair);\\n };\\n }\\n\\n function isASCII(str) {\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\n }\\n}\\n// params is not defined locally -> export as module\\nif (typeof(params) === 'undefined') {\\n module.exports = {\\n execute_ops\\n }\\n} else { // on server use local defined vars\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\n // define global returns\\n msg = return_values;\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1711039145},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\n // Define array to push device data into. This will be put into the msg array at the end.\\n var deviceParams = [];\\n var configsToSend = [];\\n var tasks = [];\\n const _crypto = require('crypto');\\n // handle ACK\\n if (messageTypeCode == \\\"ACK\\\") {\\n return \\\"\\\";\\n }\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\n var password;\\n if (params.imei == \\\"null\\\") {\\n return msg;\\n }\\n password = params.imei;\\n if (configs.Password.Password === \\\"\\\") {\\n // use imei as default password when not specified\\n } else {\\n // use the password\\n password = configs.Password.Password\\n }\\n // handle encrypted messages arriving via SMS\\n // if (raw.startsWith('esendex')) {\\n // raw = raw.split('esendex')[2];\\n // encimei = raw.split(';')[1];\\n // imei = parseInt(raw.split(';')[1], 36).toString();\\n // AddValue('imei', imei);\\n // raw = raw.replace(encimei, imei);\\n // password = imei;\\n // }\\n let message = decrypt(raw, password);\\n //ToDo: handle errors messages arriving\\n // if (message.startsWith(\\\"error\\\")) {\\n // ack = \\\"ERR;\\\" + params.count_number + \\\";\\\";\\n // msg.push({\\n // 'code': 'ack',\\n // 'value': ack\\n // });\\n // console.log(msg);\\n // } \\n if (message) {\\n // send message internally\\n sendMessageToLocalhost(message);\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\n AddValue(\\\"ack\\\", ack);\\n } else {\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\n AddValue(\\\"ack\\\", ack);\\n }\\n } else { // General Oysta Template\\n switch (messageTypeLocalCode) {\\n case (\\\"COMM\\\"):\\n process_invent_msg(); //incoming invent commands\\n break;\\n case (\\\"MACB\\\"):\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\n add_params_to_output();\\n break;\\n case (\\\"REGISTER\\\"):\\n let ble_mac = params.ble_mac;\\n let iccid = params.iccid;\\n // check ICCID is a number\\n if (isNaN(iccid)) {\\n iccid = \\\"invalid ICCID\\\"\\n }\\n // write values to readonly settings\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\n // will automtaically Activate on Acceptance\\n if (serverParams.EnvName) {\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\n }\\n }\\n break;\\n case (\\\"CREATE\\\"):\\n // temp fix to filter old messages\\n // const cutoff = 1707523200000; //10.2.2024\\n // let message_id_time = parseInt(params.count_number, 36);\\n // if (message_id_time > cutoff){\\n let c_ble_mac = params.ble_mac;\\n let c_iccid = params.iccid;\\n let new_imei = params.new_imei;\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\n // sendMessageToLocalhost(c_message); \\n tasks = [{\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\n \\\"option\\\": \\\"sync\\\",\\n \\\"type\\\": \\\"createDevice\\\",\\n \\\"payload\\\": JSON.stringify({\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\n \\\"imei\\\": new_imei,\\n \\\"abortOnError\\\": false,\\n \\\"init\\\": true\\n }),\\n \\\"order\\\": 1\\n }, {\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\n \\\"option\\\": \\\"async\\\",\\n \\\"type\\\": \\\"sendMessage\\\",\\n \\\"payload\\\": JSON.stringify({\\n \\\"message\\\": c_message\\n }),\\n \\\"order\\\": 2\\n }]\\n // }\\n break;\\n case (\\\"ALLDATA\\\"):\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\n let all_data = JSON.parse(json_str);\\n if (\\\"version\\\" in all_data) {\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\n };\\n break;\\n default:\\n // all other general messages\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\n add_params_to_output();\\n }\\n // add messagetTypeLocal to output for templates\\n AddValue('local_message_type', messageTypeLocalCode);\\n }\\n var msg = {\\n 'values': deviceParams,\\n };\\n if (configsToSend.length > 0) {\\n msg.configsToSend = configsToSend\\n };\\n if (tasks.length > 0) {\\n msg.tasks = tasks\\n };\\n // commit values to receiver processor\\n console.log(msg);\\n // modify to return the object that contains your data\\n return msg;\\n\\n function add_params_to_output() {\\n if (!params.raw_accuracy) {\\n AddValue('location_accuracy', 9000);\\n } else {\\n AddValue('location_accuracy', params.raw_accuracy);\\n }\\n // generate timestamps if they don't exist\\n if (!params.event_time) {\\n AddValue('event_time', moment.utc().unix());\\n }\\n if (!params.location_time) {\\n AddValue('event_time', moment.utc().unix());\\n }\\n //if no lat and long are given, set them to 0, 0\\n if (!params.latitude_raw) {\\n AddValue('latitude', 0);\\n } else {\\n AddValue('latitude', params.latitude_raw);\\n }\\n if (!params.longitude_raw) {\\n AddValue('longitude', 0);\\n } else {\\n AddValue('longitude', params.longitude_raw);\\n }\\n // if (params.temp_bracelet){\\n // AddValue('oysta_labels', 'DegC');\\n // AddValue('single_column_value', params.temp_bracelet);\\n // }\\n }\\n\\n function process_invent_msg() {\\n const details = JSON.parse(raw);\\n // AddValue('imei', details.AppId);\\n AddValue('json_in', JSON.stringify(details));\\n switch (details.Command) {\\n case \\\"ACTIVATE_OK\\\":\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\n break;\\n case \\\"ACTIVATE_FAILS\\\":\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\n break;\\n case \\\"APPSET\\\":\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\n AddConfig(configIds.Password.Password, details.Data.Password);\\n break;\\n case \\\"CONFIG\\\":\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\n break;\\n case \\\"CGFBR\\\":\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\n let commonParam = addEscapeChar(details.Data.ComPar);\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\n let lteParam = addEscapeChar(details.Data.LtePar);\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\n let bleParam = addEscapeChar(details.Data.BlePar);\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\n break;\\n case \\\"REBOOTB\\\":\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\n break;\\n case \\\"PWRFB\\\":\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\n break;\\n case \\\"RESETB\\\":\\n AddConfig(configIds.Bracelet.Reset, 'true');\\n break;\\n case \\\"BRAPWUPDATE\\\":\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\n // get password from old device, then set\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\n )\\n break;\\n case \\\"NOTE\\\":\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\n text = text.split(\\\",\\\").join(\\\" \\\");\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\n AddConfig(configIds.Note.Message, value)\\n break;\\n }\\n }\\n\\n function addEscapeChar(json) {\\n if (json === undefined) {\\n return undefined;\\n }\\n let outStr = \\\"\\\";\\n let jsonStr = JSON.stringify(json);\\n for (let c of jsonStr) {\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\n } else {\\n outStr += c;\\n }\\n };\\n return outStr;\\n }\\n\\n function changeSingleQuoteToDouble(jsonStr) {\\n if (jsonStr === undefined) {\\n return undefined;\\n }\\n let outStr = \\\"\\\";\\n for (let c of jsonStr) {\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\n outStr = outStr + String.fromCharCode(34);\\n } else {\\n outStr += c;\\n }\\n };\\n return outStr;\\n }\\n\\n function sendMessageToLocalhost(str) {\\n if (localTesting) {\\n console.log(\\\"Sending message to local host: \\\" + str);\\n } else {\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\n var c = createConnection(5678, server);\\n c.write(`${str}`);\\n c.end();\\n }\\n AddValue(\\\"ToLocalhost\\\", str);\\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\\n function decrypt(encdata, password) {\\n var decrypted;\\n var dataarray = encdata.split(\\\";\\\");\\n if (dataarray.length > 5) {\\n return \\\"\\\";\\n }\\n var i;\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\n if (encdata.startsWith(\\\"ACK\\\")) {\\n return encdata;\\n }\\n for (i = 0; i < 3; i++) {\\n part1 = part1 + dataarray[i] + \\\";\\\";\\n }\\n var mid = dataarray[2]; // use the message ID to create the salt\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n // base64 decoding and extract the iv and encrypted data\\n const bData = Buffer.from(enctext, 'base64');\\n const iv = bData.slice(0, 16); // initial 16 chars\\n const text = bData.slice(16); // all the encrypted data\\n // derive key using; 32 byte key length (from salted password and mid)\\n // decrypt the data in part2 and add to part1\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\n try {\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\n } catch (err) {\\n decrypted = undefined;\\n }\\n return decrypted;\\n }\\n\\n function encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n }\\n\\n function AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n deviceParams.push(cvpair);\\n }\\n\\n function AddConfig(configName, newvalue) {\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\n var cvpair = {\\n 'code': configName,\\n 'value': newvalue,\\n 'forced': true\\n };\\n configsToSend.push(cvpair);\\n };\\n }\\n\\n function isASCII(str) {\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\n }\\n}\\n// params is not defined locally -> export as module\\nif (typeof(params) === 'undefined') {\\n module.exports = {\\n execute_ops\\n }\\n} else { // on server use local defined vars\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\n // define global returns\\n msg = return_values;\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1714651746},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\n // Define array to push device data into. This will be put into the msg array at the end.\\n var deviceParams = [];\\n var configsToSend = [];\\n var tasks = [];\\n const _crypto = require('crypto');\\n // handle ACK\\n if (messageTypeCode == \\\"ACK\\\") {\\n return \\\"\\\";\\n }\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\n var password;\\n if (params.imei == \\\"null\\\") {\\n return msg;\\n }\\n password = params.imei;\\n if (configs.Password.Password === \\\"\\\") {\\n // use imei as default password when not specified\\n } else {\\n // use the password\\n password = configs.Password.Password\\n }\\n // handle encrypted messages arriving via SMS\\n // if (raw.startsWith('esendex')) {\\n // raw = raw.split('esendex')[2];\\n // encimei = raw.split(';')[1];\\n // imei = parseInt(raw.split(';')[1], 36).toString();\\n // AddValue('imei', imei);\\n // raw = raw.replace(encimei, imei);\\n // password = imei;\\n // }\\n let message = decrypt(raw, password);\\n //ToDo: handle errors messages arriving\\n // if (message.startsWith(\\\"error\\\")) {\\n // ack = \\\"ERR;\\\" + params.count_number + \\\";\\\";\\n // msg.push({\\n // 'code': 'ack',\\n // 'value': ack\\n // });\\n // console.log(msg);\\n // } \\n if (message) {\\n // send message internally\\n sendMessageToLocalhost(message);\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\n AddValue(\\\"ack\\\", ack);\\n } else {\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\n AddValue(\\\"ack\\\", ack);\\n }\\n } else { // General Oysta Template\\n switch (messageTypeLocalCode) {\\n case (\\\"COMM\\\"):\\n process_invent_msg(); //incoming invent commands\\n break;\\n case (\\\"MACB\\\"):\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\n add_params_to_output();\\n break;\\n case (\\\"REGISTER\\\"):\\n let ble_mac = params.ble_mac;\\n let iccid = params.iccid;\\n // write values to readonly settings\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\n // will automtaically Activate on Acceptance\\n if (serverParams.EnvName) {\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\n }\\n }\\n break;\\n case (\\\"CREATE\\\"):\\n // temp fix to filter old messages\\n // const cutoff = 1707523200000; //10.2.2024\\n // let message_id_time = parseInt(params.count_number, 36);\\n // if (message_id_time > cutoff){\\n let c_ble_mac = params.ble_mac;\\n let c_iccid = params.iccid;\\n // check ICCID is a number\\n if (isNaN(c_iccid)) {\\n c_iccid = \\\"invalid ICCID\\\"\\n }\\n let new_imei = params.new_imei;\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\n // sendMessageToLocalhost(c_message); \\n tasks = [{\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\n \\\"option\\\": \\\"sync\\\",\\n \\\"type\\\": \\\"createDevice\\\",\\n \\\"payload\\\": JSON.stringify({\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\n \\\"imei\\\": new_imei,\\n \\\"abortOnError\\\": false,\\n \\\"init\\\": true\\n }),\\n \\\"order\\\": 1\\n }, {\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\n \\\"option\\\": \\\"async\\\",\\n \\\"type\\\": \\\"sendMessage\\\",\\n \\\"payload\\\": JSON.stringify({\\n \\\"message\\\": c_message\\n }),\\n \\\"order\\\": 2\\n }]\\n // }\\n break;\\n case (\\\"ALLDATA\\\"):\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\n let all_data = JSON.parse(json_str);\\n if (\\\"version\\\" in all_data) {\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\n };\\n break;\\n default:\\n // all other general messages\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\n add_params_to_output();\\n }\\n // add messagetTypeLocal to output for templates\\n AddValue('local_message_type', messageTypeLocalCode);\\n }\\n var msg = {\\n 'values': deviceParams,\\n };\\n if (configsToSend.length > 0) {\\n msg.configsToSend = configsToSend\\n };\\n if (tasks.length > 0) {\\n msg.tasks = tasks\\n };\\n // commit values to receiver processor\\n console.log(msg);\\n // modify to return the object that contains your data\\n return msg;\\n\\n function add_params_to_output() {\\n if (!params.raw_accuracy) {\\n AddValue('location_accuracy', 9000);\\n } else {\\n AddValue('location_accuracy', params.raw_accuracy);\\n }\\n // generate timestamps if they don't exist\\n if (!params.event_time) {\\n AddValue('event_time', moment.utc().unix());\\n }\\n if (!params.location_time) {\\n AddValue('event_time', moment.utc().unix());\\n }\\n //if no lat and long are given, set them to 0, 0\\n if (!params.latitude_raw) {\\n AddValue('latitude', 0);\\n } else {\\n AddValue('latitude', params.latitude_raw);\\n }\\n if (!params.longitude_raw) {\\n AddValue('longitude', 0);\\n } else {\\n AddValue('longitude', params.longitude_raw);\\n }\\n // if (params.temp_bracelet){\\n // AddValue('oysta_labels', 'DegC');\\n // AddValue('single_column_value', params.temp_bracelet);\\n // }\\n }\\n\\n function process_invent_msg() {\\n const details = JSON.parse(raw);\\n // AddValue('imei', details.AppId);\\n AddValue('json_in', JSON.stringify(details));\\n switch (details.Command) {\\n case \\\"ACTIVATE_OK\\\":\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\n break;\\n case \\\"ACTIVATE_FAILS\\\":\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\n break;\\n case \\\"APPSET\\\":\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\n AddConfig(configIds.Password.Password, details.Data.Password);\\n break;\\n case \\\"CONFIG\\\":\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\n break;\\n case \\\"CGFBR\\\":\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\n let commonParam = addEscapeChar(details.Data.ComPar);\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\n let lteParam = addEscapeChar(details.Data.LtePar);\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\n let bleParam = addEscapeChar(details.Data.BlePar);\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\n break;\\n case \\\"REBOOTB\\\":\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\n break;\\n case \\\"PWRFB\\\":\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\n break;\\n case \\\"RESETB\\\":\\n AddConfig(configIds.Bracelet.Reset, 'true');\\n break;\\n case \\\"BRAPWUPDATE\\\":\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\n // get password from old device, then set\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\n )\\n break;\\n case \\\"NOTE\\\":\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\n text = text.split(\\\",\\\").join(\\\" \\\");\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\n AddConfig(configIds.Note.Message, value)\\n break;\\n }\\n }\\n\\n function addEscapeChar(json) {\\n if (json === undefined) {\\n return undefined;\\n }\\n let outStr = \\\"\\\";\\n let jsonStr = JSON.stringify(json);\\n for (let c of jsonStr) {\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\n } else {\\n outStr += c;\\n }\\n };\\n return outStr;\\n }\\n\\n function changeSingleQuoteToDouble(jsonStr) {\\n if (jsonStr === undefined) {\\n return undefined;\\n }\\n let outStr = \\\"\\\";\\n for (let c of jsonStr) {\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\n outStr = outStr + String.fromCharCode(34);\\n } else {\\n outStr += c;\\n }\\n };\\n return outStr;\\n }\\n\\n function sendMessageToLocalhost(str) {\\n if (localTesting) {\\n console.log(\\\"Sending message to local host: \\\" + str);\\n } else {\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\n var c = createConnection(5678, server);\\n c.write(`${str}`);\\n c.end();\\n }\\n AddValue(\\\"ToLocalhost\\\", str);\\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\\n function decrypt(encdata, password) {\\n var decrypted;\\n var dataarray = encdata.split(\\\";\\\");\\n if (dataarray.length > 5) {\\n return \\\"\\\";\\n }\\n var i;\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\n if (encdata.startsWith(\\\"ACK\\\")) {\\n return encdata;\\n }\\n for (i = 0; i < 3; i++) {\\n part1 = part1 + dataarray[i] + \\\";\\\";\\n }\\n var mid = dataarray[2]; // use the message ID to create the salt\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n // base64 decoding and extract the iv and encrypted data\\n const bData = Buffer.from(enctext, 'base64');\\n const iv = bData.slice(0, 16); // initial 16 chars\\n const text = bData.slice(16); // all the encrypted data\\n // derive key using; 32 byte key length (from salted password and mid)\\n // decrypt the data in part2 and add to part1\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\n try {\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\n } catch (err) {\\n decrypted = undefined;\\n }\\n return decrypted;\\n }\\n\\n function encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n }\\n\\n function AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n deviceParams.push(cvpair);\\n }\\n\\n function AddConfig(configName, newvalue) {\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\n var cvpair = {\\n 'code': configName,\\n 'value': newvalue,\\n 'forced': true\\n };\\n configsToSend.push(cvpair);\\n };\\n }\\n\\n function isASCII(str) {\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\n }\\n}\\n// params is not defined locally -> export as module\\nif (typeof(params) === 'undefined') {\\n module.exports = {\\n execute_ops\\n }\\n} else { // on server use local defined vars\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\n // define global returns\\n msg = return_values;\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1715247045},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\n // Define array to push device data into. This will be put into the msg array at the end.\\n var deviceParams = [];\\n var configsToSend = [];\\n var tasks = [];\\n const _crypto = require('crypto');\\n // handle ACK\\n if (messageTypeCode == \\\"ACK\\\") {\\n return \\\"\\\";\\n }\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\n var password;\\n if (params.imei == \\\"null\\\") {\\n return msg;\\n }\\n password = params.imei;\\n if (configs.Password.Password === \\\"\\\") {\\n // use imei as default password when not specified\\n } else {\\n // use the password\\n password = configs.Password.Password\\n }\\n // handle encrypted messages arriving via SMS\\n // if (raw.startsWith('esendex')) {\\n // raw = raw.split('esendex')[2];\\n // encimei = raw.split(';')[1];\\n // imei = parseInt(raw.split(';')[1], 36).toString();\\n // AddValue('imei', imei);\\n // raw = raw.replace(encimei, imei);\\n // password = imei;\\n // }\\n let message = decrypt(raw, password);\\n //ToDo: handle errors messages arriving\\n // if (message.startsWith(\\\"error\\\")) {\\n // ack = \\\"ERR;\\\" + params.count_number + \\\";\\\";\\n // msg.push({\\n // 'code': 'ack',\\n // 'value': ack\\n // });\\n // console.log(msg);\\n // } \\n if (message) {\\n // send message internally\\n sendMessageToLocalhost(message);\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\n AddValue(\\\"ack\\\", ack);\\n } else {\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\n AddValue(\\\"ack\\\", ack);\\n }\\n } else { // General Oysta Template\\n switch (messageTypeLocalCode) {\\n case (\\\"COMM\\\"):\\n process_invent_msg(); //incoming invent commands\\n break;\\n case (\\\"MACB\\\"):\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\n add_params_to_output();\\n break;\\n case (\\\"REGISTER\\\"):\\n let ble_mac = params.ble_mac;\\n let iccid = params.iccid;\\n // write values to readonly settings\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\n // will automtaically Activate on Acceptance\\n if (serverParams.EnvName) {\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\n }\\n }\\n break;\\n case (\\\"CREATE\\\"):\\n // temp fix to filter old messages\\n // const cutoff = 1707523200000; //10.2.2024\\n // let message_id_time = parseInt(params.count_number, 36);\\n // if (message_id_time > cutoff){\\n let c_ble_mac = params.ble_mac;\\n let c_iccid = params.iccid;\\n // check ICCID is a number\\n if (isNaN(c_iccid)) {\\n c_iccid = \\\"invalid ICCID\\\"\\n }\\n let new_imei = params.new_imei;\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\n // sendMessageToLocalhost(c_message); \\n tasks = [{\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\n \\\"option\\\": \\\"sync\\\",\\n \\\"type\\\": \\\"createDevice\\\",\\n \\\"payload\\\": JSON.stringify({\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\n \\\"imei\\\": new_imei,\\n \\\"abortOnError\\\": false,\\n \\\"init\\\": true\\n }),\\n \\\"order\\\": 1\\n }, {\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\n \\\"option\\\": \\\"async\\\",\\n \\\"type\\\": \\\"sendMessage\\\",\\n \\\"payload\\\": JSON.stringify({\\n \\\"message\\\": c_message\\n }),\\n \\\"order\\\": 2\\n }]\\n // }\\n break;\\n case (\\\"ALLDATA\\\"):\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\n let all_data = JSON.parse(json_str);\\n if (\\\"version\\\" in all_data) {\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\n };\\n if (\\\"restarts\\\" in all_data) {\\n AddConfig(configIds.DeviceConfig.Restarts, all_data.restarts);\\n };\\n if (\\\"mtbr\\\" in all_data) {\\n AddConfig(configIds.DeviceConfig.MTBR, all_data.mtbr);\\n };\\n break;\\n default:\\n // all other general messages\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\n add_params_to_output();\\n }\\n // add messagetTypeLocal to output for templates\\n AddValue('local_message_type', messageTypeLocalCode);\\n }\\n var msg = {\\n 'values': deviceParams,\\n };\\n if (configsToSend.length > 0) {\\n msg.configsToSend = configsToSend\\n };\\n if (tasks.length > 0) {\\n msg.tasks = tasks\\n };\\n // commit values to receiver processor\\n console.log(msg);\\n // modify to return the object that contains your data\\n return msg;\\n\\n function add_params_to_output() {\\n if (!params.raw_accuracy) {\\n AddValue('location_accuracy', 9000);\\n } else {\\n AddValue('location_accuracy', params.raw_accuracy);\\n }\\n // generate timestamps if they don't exist\\n if (!params.event_time) {\\n AddValue('event_time', moment.utc().unix());\\n }\\n if (!params.location_time) {\\n AddValue('event_time', moment.utc().unix());\\n }\\n //if no lat and long are given, set them to 0, 0\\n if (!params.latitude_raw) {\\n AddValue('latitude', 0);\\n } else {\\n AddValue('latitude', params.latitude_raw);\\n }\\n if (!params.longitude_raw) {\\n AddValue('longitude', 0);\\n } else {\\n AddValue('longitude', params.longitude_raw);\\n }\\n // if (params.temp_bracelet){\\n // AddValue('oysta_labels', 'DegC');\\n // AddValue('single_column_value', params.temp_bracelet);\\n // }\\n }\\n\\n function process_invent_msg() {\\n const details = JSON.parse(raw);\\n // AddValue('imei', details.AppId);\\n AddValue('json_in', JSON.stringify(details));\\n switch (details.Command) {\\n case \\\"ACTIVATE_OK\\\":\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\n break;\\n case \\\"ACTIVATE_FAILS\\\":\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\n break;\\n case \\\"APPSET\\\":\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\n AddConfig(configIds.Password.Password, details.Data.Password);\\n break;\\n case \\\"CONFIG\\\":\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\n break;\\n case \\\"CGFBR\\\":\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\n let commonParam = addEscapeChar(details.Data.ComPar);\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\n let lteParam = addEscapeChar(details.Data.LtePar);\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\n let bleParam = addEscapeChar(details.Data.BlePar);\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\n break;\\n case \\\"REBOOTB\\\":\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\n break;\\n case \\\"PWRFB\\\":\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\n break;\\n case \\\"RESETB\\\":\\n AddConfig(configIds.Bracelet.Reset, 'true');\\n break;\\n case \\\"BRAPWUPDATE\\\":\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\n // get password from old device, then set\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\n )\\n break;\\n case \\\"NOTE\\\":\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\n text = text.split(\\\",\\\").join(\\\" \\\");\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\n AddConfig(configIds.Note.Message, value)\\n break;\\n }\\n }\\n\\n function addEscapeChar(json) {\\n if (json === undefined) {\\n return undefined;\\n }\\n let outStr = \\\"\\\";\\n let jsonStr = JSON.stringify(json);\\n for (let c of jsonStr) {\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\n } else {\\n outStr += c;\\n }\\n };\\n return outStr;\\n }\\n\\n function changeSingleQuoteToDouble(jsonStr) {\\n if (jsonStr === undefined) {\\n return undefined;\\n }\\n let outStr = \\\"\\\";\\n for (let c of jsonStr) {\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\n outStr = outStr + String.fromCharCode(34);\\n } else {\\n outStr += c;\\n }\\n };\\n return outStr;\\n }\\n\\n function sendMessageToLocalhost(str) {\\n if (localTesting) {\\n console.log(\\\"Sending message to local host: \\\" + str);\\n } else {\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\n var c = createConnection(5678, server);\\n c.write(`${str}`);\\n c.end();\\n }\\n AddValue(\\\"ToLocalhost\\\", str);\\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\\n function decrypt(encdata, password) {\\n var decrypted;\\n var dataarray = encdata.split(\\\";\\\");\\n if (dataarray.length > 5) {\\n return \\\"\\\";\\n }\\n var i;\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\n if (encdata.startsWith(\\\"ACK\\\")) {\\n return encdata;\\n }\\n for (i = 0; i < 3; i++) {\\n part1 = part1 + dataarray[i] + \\\";\\\";\\n }\\n var mid = dataarray[2]; // use the message ID to create the salt\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n // base64 decoding and extract the iv and encrypted data\\n const bData = Buffer.from(enctext, 'base64');\\n const iv = bData.slice(0, 16); // initial 16 chars\\n const text = bData.slice(16); // all the encrypted data\\n // derive key using; 32 byte key length (from salted password and mid)\\n // decrypt the data in part2 and add to part1\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\n try {\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\n } catch (err) {\\n decrypted = undefined;\\n }\\n return decrypted;\\n }\\n\\n function encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n }\\n\\n function AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n deviceParams.push(cvpair);\\n }\\n\\n function AddConfig(configName, newvalue) {\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\n var cvpair = {\\n 'code': configName,\\n 'value': newvalue,\\n 'forced': true\\n };\\n configsToSend.push(cvpair);\\n };\\n }\\n\\n function isASCII(str) {\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\n }\\n}\\n// params is not defined locally -> export as module\\nif (typeof(params) === 'undefined') {\\n module.exports = {\\n execute_ops\\n }\\n} else { // on server use local defined vars\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\n // define global returns\\n msg = return_values;\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1716206509},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\n // Define array to push device data into. This will be put into the msg array at the end.\\n var deviceParams = [];\\n var configsToSend = [];\\n var tasks = [];\\n const _crypto = require('crypto');\\n // handle ACK\\n if (messageTypeCode == \\\"ACK\\\") {\\n return \\\"\\\";\\n }\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\n var password;\\n if (params.imei == \\\"null\\\") {\\n return msg;\\n }\\n password = params.imei;\\n if (configs.Password.Password === \\\"\\\") {\\n // use imei as default password when not specified\\n } else {\\n // use the password\\n password = configs.Password.Password\\n }\\n // handle encrypted messages arriving via SMS\\n // if (raw.startsWith('esendex')) {\\n // raw = raw.split('esendex')[2];\\n // encimei = raw.split(';')[1];\\n // imei = parseInt(raw.split(';')[1], 36).toString();\\n // AddValue('imei', imei);\\n // raw = raw.replace(encimei, imei);\\n // password = imei;\\n // }\\n let message = decrypt(raw, password);\\n //ToDo: handle errors messages arriving\\n // if (message.startsWith(\\\"error\\\")) {\\n // ack = \\\"ERR;\\\" + params.count_number + \\\";\\\";\\n // msg.push({\\n // 'code': 'ack',\\n // 'value': ack\\n // });\\n // console.log(msg);\\n // } \\n if (message) {\\n // send message internally\\n sendMessageToLocalhost(message);\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\n AddValue(\\\"ack\\\", ack);\\n } else {\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\n AddValue(\\\"ack\\\", ack);\\n }\\n } else { // General Oysta Template\\n switch (messageTypeLocalCode) {\\n case (\\\"COMM\\\"):\\n process_invent_msg(); //incoming invent commands\\n break;\\n case (\\\"MACB\\\"):\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\n add_params_to_output();\\n break;\\n case (\\\"REGISTER\\\"):\\n let ble_mac = params.ble_mac;\\n let iccid = params.iccid;\\n // write values to readonly settings\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\n // will automtaically Activate on Acceptance\\n if (serverParams.EnvName) {\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\n }\\n }\\n break;\\n case (\\\"CREATE\\\"):\\n // temp fix to filter old messages\\n // const cutoff = 1707523200000; //10.2.2024\\n // let message_id_time = parseInt(params.count_number, 36);\\n // if (message_id_time > cutoff){\\n let c_ble_mac = params.ble_mac;\\n let c_iccid = params.iccid;\\n // check ICCID is a number\\n if (isNaN(c_iccid)) {\\n c_iccid = \\\"invalid ICCID\\\"\\n }\\n let new_imei = params.new_imei;\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\n // sendMessageToLocalhost(c_message); \\n tasks = [{\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\n \\\"option\\\": \\\"sync\\\",\\n \\\"type\\\": \\\"createDevice\\\",\\n \\\"payload\\\": JSON.stringify({\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\n \\\"imei\\\": new_imei,\\n \\\"abortOnError\\\": false,\\n \\\"init\\\": true\\n }),\\n \\\"order\\\": 1\\n }, {\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\n \\\"option\\\": \\\"async\\\",\\n \\\"type\\\": \\\"sendMessage\\\",\\n \\\"payload\\\": JSON.stringify({\\n \\\"message\\\": c_message\\n }),\\n \\\"order\\\": 2\\n }]\\n // }\\n break;\\n case (\\\"ALLDATA\\\"):\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\n let all_data = JSON.parse(json_str);\\n if (\\\"version\\\" in all_data) {\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\n };\\n if (\\\"restarts\\\" in all_data) {\\n AddConfig(configIds.DeviceConfig.Restarts, all_data.restarts);\\n };\\n if (\\\"mtbr\\\" in all_data) {\\n AddConfig(configIds.DeviceConfig.MTBR, new Date(all_data.mtbr * 1000).toISOString().substring(11, 19));\\n };\\n break;\\n default:\\n // all other general messages\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\n add_params_to_output();\\n }\\n // add messagetTypeLocal to output for templates\\n AddValue('local_message_type', messageTypeLocalCode);\\n }\\n var msg = {\\n 'values': deviceParams,\\n };\\n if (configsToSend.length > 0) {\\n msg.configsToSend = configsToSend\\n };\\n if (tasks.length > 0) {\\n msg.tasks = tasks\\n };\\n // commit values to receiver processor\\n console.log(msg);\\n // modify to return the object that contains your data\\n return msg;\\n\\n function add_params_to_output() {\\n if (!params.raw_accuracy) {\\n AddValue('location_accuracy', 9000);\\n } else {\\n AddValue('location_accuracy', params.raw_accuracy);\\n }\\n // generate timestamps if they don't exist\\n if (!params.event_time) {\\n AddValue('event_time', moment.utc().unix());\\n }\\n if (!params.location_time) {\\n AddValue('event_time', moment.utc().unix());\\n }\\n //if no lat and long are given, set them to 0, 0\\n if (!params.latitude_raw) {\\n AddValue('latitude', 0);\\n } else {\\n AddValue('latitude', params.latitude_raw);\\n }\\n if (!params.longitude_raw) {\\n AddValue('longitude', 0);\\n } else {\\n AddValue('longitude', params.longitude_raw);\\n }\\n // if (params.temp_bracelet){\\n // AddValue('oysta_labels', 'DegC');\\n // AddValue('single_column_value', params.temp_bracelet);\\n // }\\n }\\n\\n function process_invent_msg() {\\n const details = JSON.parse(raw);\\n // AddValue('imei', details.AppId);\\n AddValue('json_in', JSON.stringify(details));\\n switch (details.Command) {\\n case \\\"ACTIVATE_OK\\\":\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\n break;\\n case \\\"ACTIVATE_FAILS\\\":\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\n break;\\n case \\\"APPSET\\\":\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\n AddConfig(configIds.Password.Password, details.Data.Password);\\n break;\\n case \\\"CONFIG\\\":\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\n break;\\n case \\\"CGFBR\\\":\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\n let commonParam = addEscapeChar(details.Data.ComPar);\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\n let lteParam = addEscapeChar(details.Data.LtePar);\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\n let bleParam = addEscapeChar(details.Data.BlePar);\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\n break;\\n case \\\"REBOOTB\\\":\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\n break;\\n case \\\"PWRFB\\\":\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\n break;\\n case \\\"RESETB\\\":\\n AddConfig(configIds.Bracelet.Reset, 'true');\\n break;\\n case \\\"BRAPWUPDATE\\\":\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\n // get password from old device, then set\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\n )\\n break;\\n case \\\"NOTE\\\":\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\n text = text.split(\\\",\\\").join(\\\" \\\");\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\n AddConfig(configIds.Note.Message, value)\\n break;\\n }\\n }\\n\\n function addEscapeChar(json) {\\n if (json === undefined) {\\n return undefined;\\n }\\n let outStr = \\\"\\\";\\n let jsonStr = JSON.stringify(json);\\n for (let c of jsonStr) {\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\n } else {\\n outStr += c;\\n }\\n };\\n return outStr;\\n }\\n\\n function changeSingleQuoteToDouble(jsonStr) {\\n if (jsonStr === undefined) {\\n return undefined;\\n }\\n let outStr = \\\"\\\";\\n for (let c of jsonStr) {\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\n outStr = outStr + String.fromCharCode(34);\\n } else {\\n outStr += c;\\n }\\n };\\n return outStr;\\n }\\n\\n function sendMessageToLocalhost(str) {\\n if (localTesting) {\\n console.log(\\\"Sending message to local host: \\\" + str);\\n } else {\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\n var c = createConnection(5678, server);\\n c.write(`${str}`);\\n c.end();\\n }\\n AddValue(\\\"ToLocalhost\\\", str);\\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\\n function decrypt(encdata, password) {\\n var decrypted;\\n var dataarray = encdata.split(\\\";\\\");\\n if (dataarray.length > 5) {\\n return \\\"\\\";\\n }\\n var i;\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\n if (encdata.startsWith(\\\"ACK\\\")) {\\n return encdata;\\n }\\n for (i = 0; i < 3; i++) {\\n part1 = part1 + dataarray[i] + \\\";\\\";\\n }\\n var mid = dataarray[2]; // use the message ID to create the salt\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n // base64 decoding and extract the iv and encrypted data\\n const bData = Buffer.from(enctext, 'base64');\\n const iv = bData.slice(0, 16); // initial 16 chars\\n const text = bData.slice(16); // all the encrypted data\\n // derive key using; 32 byte key length (from salted password and mid)\\n // decrypt the data in part2 and add to part1\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\n try {\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\n } catch (err) {\\n decrypted = undefined;\\n }\\n return decrypted;\\n }\\n\\n function encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n }\\n\\n function AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n deviceParams.push(cvpair);\\n }\\n\\n function AddConfig(configName, newvalue) {\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\n var cvpair = {\\n 'code': configName,\\n 'value': newvalue,\\n 'forced': true\\n };\\n configsToSend.push(cvpair);\\n };\\n }\\n\\n function isASCII(str) {\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\n }\\n}\\n// params is not defined locally -> export as module\\nif (typeof(params) === 'undefined') {\\n module.exports = {\\n execute_ops\\n }\\n} else { // on server use local defined vars\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\n // define global returns\\n msg = return_values;\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1716543912},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\n // Define array to push device data into. This will be put into the msg array at the end.\\n var deviceParams = [];\\n var configsToSend = [];\\n var tasks = [];\\n const _crypto = require('crypto');\\n // handle ACK\\n if (messageTypeCode == \\\"ACK\\\") {\\n return \\\"\\\";\\n }\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\n var password;\\n if (params.imei == \\\"null\\\") {\\n return msg;\\n }\\n password = params.imei;\\n if (configs.Password.Password === \\\"\\\") {\\n // use imei as default password when not specified\\n } else {\\n // use the password\\n password = configs.Password.Password\\n }\\n // handle encrypted messages arriving via SMS\\n // if (raw.startsWith('esendex')) {\\n // raw = raw.split('esendex')[2];\\n // encimei = raw.split(';')[1];\\n // imei = parseInt(raw.split(';')[1], 36).toString();\\n // AddValue('imei', imei);\\n // raw = raw.replace(encimei, imei);\\n // password = imei;\\n // }\\n let message = decrypt(raw, password);\\n //ToDo: handle errors messages arriving\\n // if (message.startsWith(\\\"error\\\")) {\\n // ack = \\\"ERR;\\\" + params.count_number + \\\";\\\";\\n // msg.push({\\n // 'code': 'ack',\\n // 'value': ack\\n // });\\n // console.log(msg);\\n // } \\n if (message) {\\n // send message internally\\n sendMessageToLocalhost(message);\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\n AddValue(\\\"ack\\\", ack);\\n } else {\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\n AddValue(\\\"ack\\\", ack);\\n }\\n } else { // General Oysta Template\\n switch (messageTypeLocalCode) {\\n case (\\\"COMM\\\"):\\n process_invent_msg(); //incoming invent commands\\n break;\\n case (\\\"MACB\\\"):\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\n add_params_to_output();\\n break;\\n case \\\"GETPWB\\\": // handle GETPWB message\\n let imei = params.braceletIMEI; // not actually needed ?\\n let mac = params.BLEMAC; // not actually needed ?\\n let BraceletPW = \\\"\\\"; // until we set it from query below\\n if (params.braceletIMEI) {\\n if (serverParams.Password) {\\n BraceletPW = serverParams.Password; // query key value table\\n console.log(BraceletPW); // print for testing reasons\\n AddConfig(configIds.DeviceConfig.BraceletPW, BraceletPW); //this to return the value\\n }\\n } else {\\n //return error\\n }\\n break;\\n case (\\\"REGISTER\\\"):\\n let ble_mac = params.ble_mac;\\n let iccid = params.iccid;\\n // write values to readonly settings\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\n // will automtaically Activate on Acceptance\\n if (serverParams.EnvName) {\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\n }\\n }\\n break;\\n case (\\\"CREATE\\\"):\\n // temp fix to filter old messages\\n // const cutoff = 1707523200000; //10.2.2024\\n // let message_id_time = parseInt(params.count_number, 36);\\n // if (message_id_time > cutoff){\\n let c_ble_mac = params.ble_mac;\\n let c_iccid = params.iccid;\\n // check ICCID is a number\\n if (isNaN(c_iccid)) {\\n c_iccid = \\\"invalid ICCID\\\"\\n }\\n let new_imei = params.new_imei;\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\n // sendMessageToLocalhost(c_message); \\n tasks = [{\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\n \\\"option\\\": \\\"sync\\\",\\n \\\"type\\\": \\\"createDevice\\\",\\n \\\"payload\\\": JSON.stringify({\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\n \\\"imei\\\": new_imei,\\n \\\"abortOnError\\\": false,\\n \\\"init\\\": true\\n }),\\n \\\"order\\\": 1\\n }, {\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\n \\\"option\\\": \\\"async\\\",\\n \\\"type\\\": \\\"sendMessage\\\",\\n \\\"payload\\\": JSON.stringify({\\n \\\"message\\\": c_message\\n }),\\n \\\"order\\\": 2\\n }]\\n // }\\n break;\\n case (\\\"ALLDATA\\\"):\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\n let all_data = JSON.parse(json_str);\\n if (\\\"version\\\" in all_data) {\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\n };\\n if (\\\"restarts\\\" in all_data) {\\n AddConfig(configIds.DeviceConfig.Restarts, all_data.restarts);\\n };\\n if (\\\"mtbr\\\" in all_data) {\\n AddConfig(configIds.DeviceConfig.MTBR, new Date(all_data.mtbr * 1000).toISOString().substring(11, 19));\\n };\\n break;\\n default:\\n // all other general messages\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\n add_params_to_output();\\n }\\n // add messagetTypeLocal to output for templates\\n AddValue('local_message_type', messageTypeLocalCode);\\n }\\n var msg = {\\n 'values': deviceParams,\\n };\\n if (configsToSend.length > 0) {\\n msg.configsToSend = configsToSend\\n };\\n if (tasks.length > 0) {\\n msg.tasks = tasks\\n };\\n // commit values to receiver processor\\n console.log(msg);\\n // modify to return the object that contains your data\\n return msg;\\n\\n function add_params_to_output() {\\n if (!params.raw_accuracy) {\\n AddValue('location_accuracy', 9000);\\n } else {\\n AddValue('location_accuracy', params.raw_accuracy);\\n }\\n // generate timestamps if they don't exist\\n if (!params.event_time) {\\n AddValue('event_time', moment.utc().unix());\\n }\\n if (!params.location_time) {\\n AddValue('event_time', moment.utc().unix());\\n }\\n //if no lat and long are given, set them to 0, 0\\n if (!params.latitude_raw) {\\n AddValue('latitude', 0);\\n } else {\\n AddValue('latitude', params.latitude_raw);\\n }\\n if (!params.longitude_raw) {\\n AddValue('longitude', 0);\\n } else {\\n AddValue('longitude', params.longitude_raw);\\n }\\n // if (params.temp_bracelet){\\n // AddValue('oysta_labels', 'DegC');\\n // AddValue('single_column_value', params.temp_bracelet);\\n // }\\n }\\n\\n function process_invent_msg() {\\n const details = JSON.parse(raw);\\n // AddValue('imei', details.AppId);\\n AddValue('json_in', JSON.stringify(details));\\n switch (details.Command) {\\n case \\\"ACTIVATE_OK\\\":\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\n break;\\n case \\\"ACTIVATE_FAILS\\\":\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\n break;\\n case \\\"APPSET\\\":\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\n AddConfig(configIds.Password.Password, details.Data.Password);\\n break;\\n case \\\"CONFIG\\\":\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\n break;\\n case \\\"CGFBR\\\":\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\n let commonParam = addEscapeChar(details.Data.ComPar);\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\n let lteParam = addEscapeChar(details.Data.LtePar);\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\n let bleParam = addEscapeChar(details.Data.BlePar);\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\n break;\\n case \\\"REBOOTB\\\":\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\n break;\\n case \\\"PWRFB\\\":\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\n break;\\n case \\\"RESETB\\\":\\n AddConfig(configIds.Bracelet.Reset, 'true');\\n break;\\n case \\\"BRAPWUPDATE\\\":\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\n // get password from old device, then set\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\n )\\n break;\\n case \\\"NOTE\\\":\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\n text = text.split(\\\",\\\").join(\\\" \\\");\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\n AddConfig(configIds.Note.Message, value)\\n break;\\n }\\n }\\n\\n function addEscapeChar(json) {\\n if (json === undefined) {\\n return undefined;\\n }\\n let outStr = \\\"\\\";\\n let jsonStr = JSON.stringify(json);\\n for (let c of jsonStr) {\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\n } else {\\n outStr += c;\\n }\\n };\\n return outStr;\\n }\\n\\n function changeSingleQuoteToDouble(jsonStr) {\\n if (jsonStr === undefined) {\\n return undefined;\\n }\\n let outStr = \\\"\\\";\\n for (let c of jsonStr) {\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\n outStr = outStr + String.fromCharCode(34);\\n } else {\\n outStr += c;\\n }\\n };\\n return outStr;\\n }\\n\\n function sendMessageToLocalhost(str) {\\n if (localTesting) {\\n console.log(\\\"Sending message to local host: \\\" + str);\\n } else {\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\n var c = createConnection(5678, server);\\n c.write(`${str}`);\\n c.end();\\n }\\n AddValue(\\\"ToLocalhost\\\", str);\\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\\n function decrypt(encdata, password) {\\n var decrypted;\\n var dataarray = encdata.split(\\\";\\\");\\n if (dataarray.length > 5) {\\n return \\\"\\\";\\n }\\n var i;\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\n if (encdata.startsWith(\\\"ACK\\\")) {\\n return encdata;\\n }\\n for (i = 0; i < 3; i++) {\\n part1 = part1 + dataarray[i] + \\\";\\\";\\n }\\n var mid = dataarray[2]; // use the message ID to create the salt\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n // base64 decoding and extract the iv and encrypted data\\n const bData = Buffer.from(enctext, 'base64');\\n const iv = bData.slice(0, 16); // initial 16 chars\\n const text = bData.slice(16); // all the encrypted data\\n // derive key using; 32 byte key length (from salted password and mid)\\n // decrypt the data in part2 and add to part1\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\n try {\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\n } catch (err) {\\n decrypted = undefined;\\n }\\n return decrypted;\\n }\\n\\n function encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n }\\n\\n function AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n deviceParams.push(cvpair);\\n }\\n\\n function AddConfig(configName, newvalue) {\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\n var cvpair = {\\n 'code': configName,\\n 'value': newvalue,\\n 'forced': true\\n };\\n configsToSend.push(cvpair);\\n };\\n }\\n\\n function isASCII(str) {\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\n }\\n}\\n// params is not defined locally -> export as module\\nif (typeof(params) === 'undefined') {\\n module.exports = {\\n execute_ops\\n }\\n} else { // on server use local defined vars\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\n // define global returns\\n msg = return_values;\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1742311652},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n // Define array to push device data into. This will be put into the msg array at the end.\\r\\n var deviceParams = [];\\r\\n var configsToSend = [];\\r\\n var tasks = [];\\r\\n const _crypto = require('crypto');\\r\\n // handle ACK\\r\\n if (messageTypeCode == \\\"ACK\\\") {\\r\\n return \\\"\\\";\\r\\n }\\r\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\r\\n var password;\\r\\n if (params.imei == \\\"null\\\") {\\r\\n return msg;\\r\\n }\\r\\n password = params.imei;\\r\\n if (configs.Password.Password === \\\"\\\") {\\r\\n // use imei as default password when not specified\\r\\n } else {\\r\\n // use the password\\r\\n password = configs.Password.Password\\r\\n }\\r\\n let message = decrypt(raw, password);\\r\\n if (message) {\\r\\n // send message internally\\r\\n sendMessageToLocalhost(message);\\r\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n } else {\\r\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n }\\r\\n } else { // General Oysta Template\\r\\n switch (messageTypeLocalCode) {\\r\\n case (\\\"COMM\\\"):\\r\\n process_invent_msg(); //incoming invent commands\\r\\n break;\\r\\n case (\\\"MACB\\\"):\\r\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\r\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\r\\n add_params_to_output();\\r\\n break;\\r\\n case \\\"INFO-GETPWB\\\": // handle GETPWB message\\r\\n let imei = params.bracelet_imei; // not actually needed ?\\r\\n //let mac = params.BLEMAC; // not actually needed ?\\r\\n let BraceletPW = \\\"\\\"; // until we set it from query below\\r\\n if (params.braceletIMEI) {\\r\\n if (serverParams.Password) {\\r\\n BraceletPW = serverParams.Password; // query key value table\\r\\n console.log(BraceletPW); // print for testing reasons\\r\\n AddConfig(configIds.DeviceConfig.BraceletPW, BraceletPW); //this to return the value\\r\\n }\\r\\n } else {\\r\\n //return error\\r\\n }\\r\\n break;\\r\\n case (\\\"REGISTER\\\"):\\r\\n let ble_mac = params.ble_mac;\\r\\n let iccid = params.iccid;\\r\\n // write values to readonly settings\\r\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\r\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\r\\n // will automtaically Activate on Acceptance\\r\\n if (serverParams.EnvName) {\\r\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\r\\n }\\r\\n }\\r\\n break;\\r\\n case (\\\"CREATE\\\"):\\r\\n // temp fix to filter old messages\\r\\n // const cutoff = 1707523200000; //10.2.2024\\r\\n // let message_id_time = parseInt(params.count_number, 36);\\r\\n // if (message_id_time > cutoff){\\r\\n let c_ble_mac = params.ble_mac;\\r\\n let c_iccid = params.iccid;\\r\\n let new_imei = params.new_imei;\\r\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\r\\n // sendMessageToLocalhost(c_message); \\r\\n tasks = [{\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"sync\\\",\\r\\n \\\"type\\\": \\\"createDevice\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"imei\\\": new_imei,\\r\\n \\\"abortOnError\\\": false,\\r\\n \\\"init\\\": true\\r\\n }),\\r\\n \\\"order\\\": 1\\r\\n }, {\\r\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"async\\\",\\r\\n \\\"type\\\": \\\"sendMessage\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"message\\\": c_message\\r\\n }),\\r\\n \\\"order\\\": 2\\r\\n }]\\r\\n // }\\r\\n break;\\r\\n case (\\\"ALLDATA\\\"):\\r\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\r\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\r\\n let all_data = JSON.parse(json_str);\\r\\n if (\\\"version\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\r\\n };\\r\\n break;\\r\\n default:\\r\\n // all other general messages\\r\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\r\\n add_params_to_output();\\r\\n }\\r\\n // add messagetTypeLocal to output for templates\\r\\n AddValue('local_message_type', messageTypeLocalCode);\\r\\n }\\r\\n var msg = {\\r\\n 'values': deviceParams,\\r\\n };\\r\\n if (configsToSend.length > 0) {\\r\\n msg.configsToSend = configsToSend\\r\\n };\\r\\n if (tasks.length > 0) {\\r\\n msg.tasks = tasks\\r\\n };\\r\\n // commit values to receiver processor\\r\\n console.log(msg);\\r\\n // modify to return the object that contains your data\\r\\n return msg;\\r\\n\\r\\n function add_params_to_output() {\\r\\n if (!params.raw_accuracy) {\\r\\n AddValue('location_accuracy', 9000);\\r\\n } else {\\r\\n AddValue('location_accuracy', params.raw_accuracy);\\r\\n }\\r\\n // generate timestamps if they don't exist\\r\\n if (!params.event_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n if (!params.location_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n //if no lat and long are given, set them to 0, 0\\r\\n if (!params.latitude_raw) {\\r\\n AddValue('latitude', 0);\\r\\n } else {\\r\\n AddValue('latitude', params.latitude_raw);\\r\\n }\\r\\n if (!params.longitude_raw) {\\r\\n AddValue('longitude', 0);\\r\\n } else {\\r\\n AddValue('longitude', params.longitude_raw);\\r\\n }\\r\\n // if (params.temp_bracelet){\\r\\n // AddValue('oysta_labels', 'DegC');\\r\\n // AddValue('single_column_value', params.temp_bracelet);\\r\\n // }\\r\\n }\\r\\n\\r\\n function process_invent_msg() {\\r\\n const details = JSON.parse(raw);\\r\\n // AddValue('imei', details.AppId);\\r\\n AddValue('json_in', JSON.stringify(details));\\r\\n switch (details.Command) {\\r\\n case \\\"ACTIVATE_OK\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\r\\n break;\\r\\n case \\\"ACTIVATE_FAILS\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\r\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\r\\n break;\\r\\n case \\\"APPSET\\\":\\r\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\r\\n AddConfig(configIds.Password.Password, details.Data.Password);\\r\\n break;\\r\\n case \\\"CONFIG\\\":\\r\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\r\\n break;\\r\\n case \\\"CGFBR\\\":\\r\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\r\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\r\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\r\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\r\\n let commonParam = addEscapeChar(details.Data.ComPar);\\r\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\r\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\r\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\r\\n let lteParam = addEscapeChar(details.Data.LtePar);\\r\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\r\\n let bleParam = addEscapeChar(details.Data.BlePar);\\r\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\r\\n break;\\r\\n case \\\"REBOOTB\\\":\\r\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\r\\n break;\\r\\n case \\\"PWRFB\\\":\\r\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\r\\n break;\\r\\n case \\\"RESETB\\\":\\r\\n AddConfig(configIds.Bracelet.Reset, 'true');\\r\\n break;\\r\\n case \\\"BRAPWUPDATE\\\":\\r\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\r\\n // get password from old device, then set\\r\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\r\\n )\\r\\n break;\\r\\n case \\\"NOTE\\\":\\r\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\r\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\r\\n text = text.split(\\\",\\\").join(\\\" \\\");\\r\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\r\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\r\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\r\\n AddConfig(configIds.Note.Message, value)\\r\\n break;\\r\\n }\\r\\n }\\r\\n\\r\\n function addEscapeChar(json) {\\r\\n if (json === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n let jsonStr = JSON.stringify(json);\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\r\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function changeSingleQuoteToDouble(jsonStr) {\\r\\n if (jsonStr === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\r\\n outStr = outStr + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function sendMessageToLocalhost(str) {\\r\\n if (localTesting) {\\r\\n console.log(\\\"Sending message to local host: \\\" + str);\\r\\n } else {\\r\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\r\\n var c = createConnection(5878, server); // acceptance is 5678 - protocol dev 5878 - dev is 5679 ?\\r\\n c.write(`${str}`);\\r\\n c.end();\\r\\n }\\r\\n AddValue(\\\"ToLocalhost\\\", str);\\r\\n }\\r\\n\\r\\n function createConnection(port, server) {\\r\\n c = net.createConnection(port, server);\\r\\n c.on('error', function(error) {\\r\\n c = createConnection(port, server);\\r\\n });\\r\\n return c;\\r\\n }\\r\\n\\r\\n function decrypt(encdata, password) {\\r\\n var decrypted;\\r\\n var dataarray = encdata.split(\\\";\\\");\\r\\n if (dataarray.length > 5) {\\r\\n return \\\"\\\";\\r\\n }\\r\\n var i;\\r\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\r\\n if (encdata.startsWith(\\\"ACK\\\")) {\\r\\n return encdata;\\r\\n }\\r\\n for (i = 0; i < 3; i++) {\\r\\n part1 = part1 + dataarray[i] + \\\";\\\";\\r\\n }\\r\\n var mid = dataarray[2]; // use the message ID to create the salt\\r\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n // base64 decoding and extract the iv and encrypted data\\r\\n const bData = Buffer.from(enctext, 'base64');\\r\\n const iv = bData.slice(0, 16); // initial 16 chars\\r\\n const text = bData.slice(16); // all the encrypted data\\r\\n // derive key using; 32 byte key length (from salted password and mid)\\r\\n // decrypt the data in part2 and add to part1\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\r\\n try {\\r\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\r\\n } catch (err) {\\r\\n decrypted = undefined;\\r\\n }\\r\\n return decrypted;\\r\\n }\\r\\n\\r\\n function encrypt(text, mid, password) {\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n const iv = _crypto.randomBytes(16); // random initialization vector\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n // set the cipher\\r\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\r\\n // encrypt text\\r\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\r\\n // generate output ( encrypted text )\\r\\n return Buffer.concat([iv, encrypted]).toString('base64');\\r\\n }\\r\\n\\r\\n function AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n deviceParams.push(cvpair);\\r\\n }\\r\\n\\r\\n function AddConfig(configName, newvalue) {\\r\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n var cvpair = {\\r\\n 'code': configName,\\r\\n 'value': newvalue,\\r\\n 'forced': true\\r\\n };\\r\\n configsToSend.push(cvpair);\\r\\n };\\r\\n }\\r\\n\\r\\n function isASCII(str) {\\r\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\r\\n }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n module.exports = {\\r\\n execute_ops\\r\\n }\\r\\n} else { // on server use local defined vars\\r\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n // define global returns\\r\\n msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1742386705},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n // Define array to push device data into. This will be put into the msg array at the end.\\r\\n var deviceParams = [];\\r\\n var configsToSend = [];\\r\\n var tasks = [];\\r\\n const _crypto = require('crypto');\\r\\n // handle ACK\\r\\n if (messageTypeCode == \\\"ACK\\\") {\\r\\n return \\\"\\\";\\r\\n }\\r\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\r\\n var password;\\r\\n if (params.imei == \\\"null\\\") {\\r\\n return msg;\\r\\n }\\r\\n password = params.imei;\\r\\n if (configs.Password.Password === \\\"\\\") {\\r\\n // use imei as default password when not specified\\r\\n } else {\\r\\n // use the password\\r\\n password = configs.Password.Password\\r\\n }\\r\\n let message = decrypt(raw, password);\\r\\n if (message) {\\r\\n // send message internally\\r\\n sendMessageToLocalhost(message);\\r\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n } else {\\r\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n }\\r\\n } else { // General Oysta Template\\r\\n switch (messageTypeLocalCode) {\\r\\n case (\\\"COMM\\\"):\\r\\n process_invent_msg(); //incoming invent commands\\r\\n break;\\r\\n case (\\\"MACB\\\"):\\r\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\r\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\r\\n add_params_to_output();\\r\\n break;\\r\\n case \\\"INFO-GETPWB\\\": // handle GETPWB message\\r\\n //let imei = params.bracelet_imei; // not actually needed ?\\r\\n //let mac = params.BLEMAC; // not actually needed ?\\r\\n let BraceletPW = \\\"\\\"; // until we set it from query below\\r\\n // if(params.bracelet_imei){\\r\\n // if(serverParams.Password){\\r\\n // BraceletPW = serverParams.Password; // query key value table\\r\\n // console.log(BraceletPW); // print for testing reasons\\r\\n // AddConfig(configIds.DeviceConfig.BraceletPW, BraceletPW);//this to return the value\\r\\n // }\\r\\n // }\\r\\n // else {\\r\\n // //return error\\r\\n // }\\r\\n AddValue(\\\"password\\\", \\\"myNewPassword\\\");\\r\\n break;\\r\\n case (\\\"REGISTER\\\"):\\r\\n let ble_mac = params.ble_mac;\\r\\n let iccid = params.iccid;\\r\\n // write values to readonly settings\\r\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\r\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\r\\n // will automtaically Activate on Acceptance\\r\\n if (serverParams.EnvName) {\\r\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\r\\n }\\r\\n }\\r\\n break;\\r\\n case (\\\"CREATE\\\"):\\r\\n // temp fix to filter old messages\\r\\n // const cutoff = 1707523200000; //10.2.2024\\r\\n // let message_id_time = parseInt(params.count_number, 36);\\r\\n // if (message_id_time > cutoff){\\r\\n let c_ble_mac = params.ble_mac;\\r\\n let c_iccid = params.iccid;\\r\\n let new_imei = params.new_imei;\\r\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\r\\n // sendMessageToLocalhost(c_message); \\r\\n tasks = [{\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"sync\\\",\\r\\n \\\"type\\\": \\\"createDevice\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"imei\\\": new_imei,\\r\\n \\\"abortOnError\\\": false,\\r\\n \\\"init\\\": true\\r\\n }),\\r\\n \\\"order\\\": 1\\r\\n }, {\\r\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"async\\\",\\r\\n \\\"type\\\": \\\"sendMessage\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"message\\\": c_message\\r\\n }),\\r\\n \\\"order\\\": 2\\r\\n }]\\r\\n // }\\r\\n break;\\r\\n case (\\\"ALLDATA\\\"):\\r\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\r\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\r\\n let all_data = JSON.parse(json_str);\\r\\n if (\\\"version\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\r\\n };\\r\\n break;\\r\\n default:\\r\\n // all other general messages\\r\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\r\\n add_params_to_output();\\r\\n }\\r\\n // add messagetTypeLocal to output for templates\\r\\n AddValue('local_message_type', messageTypeLocalCode);\\r\\n }\\r\\n var msg = {\\r\\n 'values': deviceParams,\\r\\n };\\r\\n if (configsToSend.length > 0) {\\r\\n msg.configsToSend = configsToSend\\r\\n };\\r\\n if (tasks.length > 0) {\\r\\n msg.tasks = tasks\\r\\n };\\r\\n // commit values to receiver processor\\r\\n console.log(msg);\\r\\n // modify to return the object that contains your data\\r\\n return msg;\\r\\n\\r\\n function add_params_to_output() {\\r\\n if (!params.raw_accuracy) {\\r\\n AddValue('location_accuracy', 9000);\\r\\n } else {\\r\\n AddValue('location_accuracy', params.raw_accuracy);\\r\\n }\\r\\n // generate timestamps if they don't exist\\r\\n if (!params.event_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n if (!params.location_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n //if no lat and long are given, set them to 0, 0\\r\\n if (!params.latitude_raw) {\\r\\n AddValue('latitude', 0);\\r\\n } else {\\r\\n AddValue('latitude', params.latitude_raw);\\r\\n }\\r\\n if (!params.longitude_raw) {\\r\\n AddValue('longitude', 0);\\r\\n } else {\\r\\n AddValue('longitude', params.longitude_raw);\\r\\n }\\r\\n // if (params.temp_bracelet){\\r\\n // AddValue('oysta_labels', 'DegC');\\r\\n // AddValue('single_column_value', params.temp_bracelet);\\r\\n // }\\r\\n }\\r\\n\\r\\n function process_invent_msg() {\\r\\n const details = JSON.parse(raw);\\r\\n // AddValue('imei', details.AppId);\\r\\n AddValue('json_in', JSON.stringify(details));\\r\\n switch (details.Command) {\\r\\n case \\\"ACTIVATE_OK\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\r\\n break;\\r\\n case \\\"ACTIVATE_FAILS\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\r\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\r\\n break;\\r\\n case \\\"APPSET\\\":\\r\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\r\\n AddConfig(configIds.Password.Password, details.Data.Password);\\r\\n break;\\r\\n case \\\"CONFIG\\\":\\r\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\r\\n break;\\r\\n case \\\"CGFBR\\\":\\r\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\r\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\r\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\r\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\r\\n let commonParam = addEscapeChar(details.Data.ComPar);\\r\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\r\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\r\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\r\\n let lteParam = addEscapeChar(details.Data.LtePar);\\r\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\r\\n let bleParam = addEscapeChar(details.Data.BlePar);\\r\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\r\\n break;\\r\\n case \\\"REBOOTB\\\":\\r\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\r\\n break;\\r\\n case \\\"PWRFB\\\":\\r\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\r\\n break;\\r\\n case \\\"RESETB\\\":\\r\\n AddConfig(configIds.Bracelet.Reset, 'true');\\r\\n break;\\r\\n case \\\"BRAPWUPDATE\\\":\\r\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\r\\n // get password from old device, then set\\r\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\r\\n )\\r\\n break;\\r\\n case \\\"NOTE\\\":\\r\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\r\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\r\\n text = text.split(\\\",\\\").join(\\\" \\\");\\r\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\r\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\r\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\r\\n AddConfig(configIds.Note.Message, value)\\r\\n break;\\r\\n }\\r\\n }\\r\\n\\r\\n function addEscapeChar(json) {\\r\\n if (json === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n let jsonStr = JSON.stringify(json);\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\r\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function changeSingleQuoteToDouble(jsonStr) {\\r\\n if (jsonStr === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\r\\n outStr = outStr + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function sendMessageToLocalhost(str) {\\r\\n if (localTesting) {\\r\\n console.log(\\\"Sending message to local host: \\\" + str);\\r\\n } else {\\r\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\r\\n var c = createConnection(5878, server); // acceptance is 5678 - protocol dev 5878 - dev is 5679 ?\\r\\n c.write(`${str}`);\\r\\n c.end();\\r\\n }\\r\\n AddValue(\\\"ToLocalhost\\\", str);\\r\\n }\\r\\n\\r\\n function createConnection(port, server) {\\r\\n c = net.createConnection(port, server);\\r\\n c.on('error', function(error) {\\r\\n c = createConnection(port, server);\\r\\n });\\r\\n return c;\\r\\n }\\r\\n\\r\\n function decrypt(encdata, password) {\\r\\n var decrypted;\\r\\n var dataarray = encdata.split(\\\";\\\");\\r\\n if (dataarray.length > 5) {\\r\\n return \\\"\\\";\\r\\n }\\r\\n var i;\\r\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\r\\n if (encdata.startsWith(\\\"ACK\\\")) {\\r\\n return encdata;\\r\\n }\\r\\n for (i = 0; i < 3; i++) {\\r\\n part1 = part1 + dataarray[i] + \\\";\\\";\\r\\n }\\r\\n var mid = dataarray[2]; // use the message ID to create the salt\\r\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n // base64 decoding and extract the iv and encrypted data\\r\\n const bData = Buffer.from(enctext, 'base64');\\r\\n const iv = bData.slice(0, 16); // initial 16 chars\\r\\n const text = bData.slice(16); // all the encrypted data\\r\\n // derive key using; 32 byte key length (from salted password and mid)\\r\\n // decrypt the data in part2 and add to part1\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\r\\n try {\\r\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\r\\n } catch (err) {\\r\\n decrypted = undefined;\\r\\n }\\r\\n return decrypted;\\r\\n }\\r\\n\\r\\n function encrypt(text, mid, password) {\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n const iv = _crypto.randomBytes(16); // random initialization vector\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n // set the cipher\\r\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\r\\n // encrypt text\\r\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\r\\n // generate output ( encrypted text )\\r\\n return Buffer.concat([iv, encrypted]).toString('base64');\\r\\n }\\r\\n\\r\\n function AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n deviceParams.push(cvpair);\\r\\n }\\r\\n\\r\\n function AddConfig(configName, newvalue) {\\r\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n var cvpair = {\\r\\n 'code': configName,\\r\\n 'value': newvalue,\\r\\n 'forced': true\\r\\n };\\r\\n configsToSend.push(cvpair);\\r\\n };\\r\\n }\\r\\n\\r\\n function isASCII(str) {\\r\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\r\\n }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n module.exports = {\\r\\n execute_ops\\r\\n }\\r\\n} else { // on server use local defined vars\\r\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n // define global returns\\r\\n msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1742387419},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n // Define array to push device data into. This will be put into the msg array at the end.\\r\\n var deviceParams = [];\\r\\n var configsToSend = [];\\r\\n var tasks = [];\\r\\n const _crypto = require('crypto');\\r\\n // handle ACK\\r\\n if (messageTypeCode == \\\"ACK\\\") {\\r\\n return \\\"\\\";\\r\\n }\\r\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\r\\n var password;\\r\\n if (params.imei == \\\"null\\\") {\\r\\n return msg;\\r\\n }\\r\\n password = params.imei;\\r\\n if (configs.Password.Password === \\\"\\\") {\\r\\n // use imei as default password when not specified\\r\\n } else {\\r\\n // use the password\\r\\n password = configs.Password.Password\\r\\n }\\r\\n let message = decrypt(raw, password);\\r\\n if (message) {\\r\\n // send message internally\\r\\n sendMessageToLocalhost(message);\\r\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n } else {\\r\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n }\\r\\n } else { // General Oysta Template\\r\\n switch (messageTypeLocalCode) {\\r\\n case (\\\"COMM\\\"):\\r\\n process_invent_msg(); //incoming invent commands\\r\\n break;\\r\\n case (\\\"MACB\\\"):\\r\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\r\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\r\\n add_params_to_output();\\r\\n break;\\r\\n case \\\"INFO-GETPWB\\\": // handle GETPWB message\\r\\n //let imei = params.bracelet_imei; // not actually needed ?\\r\\n //let mac = params.BLEMAC; // not actually needed ?\\r\\n let BraceletPW = \\\"\\\"; // until we set it from query below\\r\\n // if(params.bracelet_imei){\\r\\n // if(serverParams.Password){\\r\\n // BraceletPW = serverParams.Password; // query key value table\\r\\n // console.log(BraceletPW); // print for testing reasons\\r\\n // AddConfig(configIds.DeviceConfig.BraceletPW, BraceletPW);//this to return the value\\r\\n // }\\r\\n // }\\r\\n // else {\\r\\n // //return error\\r\\n // }\\r\\n AddValue(\\\"password\\\", \\\"myNewPassword\\\");\\r\\n break;\\r\\n case (\\\"REGISTER\\\"):\\r\\n let ble_mac = params.ble_mac;\\r\\n let iccid = params.iccid;\\r\\n // write values to readonly settings\\r\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\r\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\r\\n // will automtaically Activate on Acceptance\\r\\n if (serverParams.EnvName) {\\r\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\r\\n }\\r\\n }\\r\\n break;\\r\\n case (\\\"CREATE\\\"):\\r\\n // temp fix to filter old messages\\r\\n // const cutoff = 1707523200000; //10.2.2024\\r\\n // let message_id_time = parseInt(params.count_number, 36);\\r\\n // if (message_id_time > cutoff){\\r\\n let c_ble_mac = params.ble_mac;\\r\\n let c_iccid = params.iccid;\\r\\n let new_imei = params.new_imei;\\r\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\r\\n // sendMessageToLocalhost(c_message); \\r\\n tasks = [{\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"sync\\\",\\r\\n \\\"type\\\": \\\"createDevice\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"imei\\\": new_imei,\\r\\n \\\"abortOnError\\\": false,\\r\\n \\\"init\\\": true\\r\\n }),\\r\\n \\\"order\\\": 1\\r\\n }, {\\r\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"async\\\",\\r\\n \\\"type\\\": \\\"sendMessage\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"message\\\": c_message\\r\\n }),\\r\\n \\\"order\\\": 2\\r\\n }]\\r\\n // }\\r\\n break;\\r\\n case (\\\"ALLDATA\\\"):\\r\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\r\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\r\\n let all_data = JSON.parse(json_str);\\r\\n if (\\\"version\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\r\\n };\\r\\n break;\\r\\n default:\\r\\n // all other general messages\\r\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\r\\n add_params_to_output();\\r\\n }\\r\\n // add messagetTypeLocal to output for templates\\r\\n AddValue('local_message_type', messageTypeLocalCode);\\r\\n }\\r\\n var msg = {\\r\\n 'values': deviceParams,\\r\\n };\\r\\n if (configsToSend.length > 0) {\\r\\n msg.configsToSend = configsToSend\\r\\n };\\r\\n if (tasks.length > 0) {\\r\\n msg.tasks = tasks\\r\\n };\\r\\n // commit values to receiver processor\\r\\n console.log(msg);\\r\\n // modify to return the object that contains your data\\r\\n return msg;\\r\\n\\r\\n function add_params_to_output() {\\r\\n if (!params.raw_accuracy) {\\r\\n AddValue('location_accuracy', 9000);\\r\\n } else {\\r\\n AddValue('location_accuracy', params.raw_accuracy);\\r\\n }\\r\\n // generate timestamps if they don't exist\\r\\n if (!params.event_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n if (!params.location_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n //if no lat and long are given, set them to 0, 0\\r\\n if (!params.latitude_raw) {\\r\\n AddValue('latitude', 0);\\r\\n } else {\\r\\n AddValue('latitude', params.latitude_raw);\\r\\n }\\r\\n if (!params.longitude_raw) {\\r\\n AddValue('longitude', 0);\\r\\n } else {\\r\\n AddValue('longitude', params.longitude_raw);\\r\\n }\\r\\n // if (params.temp_bracelet){\\r\\n // AddValue('oysta_labels', 'DegC');\\r\\n // AddValue('single_column_value', params.temp_bracelet);\\r\\n // }\\r\\n }\\r\\n\\r\\n function process_invent_msg() {\\r\\n const details = JSON.parse(raw);\\r\\n // AddValue('imei', details.AppId);\\r\\n AddValue('json_in', JSON.stringify(details));\\r\\n switch (details.Command) {\\r\\n case \\\"ACTIVATE_OK\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\r\\n break;\\r\\n case \\\"ACTIVATE_FAILS\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\r\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\r\\n break;\\r\\n case \\\"APPSET\\\":\\r\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\r\\n AddConfig(configIds.Password.Password, details.Data.Password);\\r\\n break;\\r\\n case \\\"CONFIG\\\":\\r\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\r\\n break;\\r\\n case \\\"CGFBR\\\":\\r\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\r\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\r\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\r\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\r\\n let commonParam = addEscapeChar(details.Data.ComPar);\\r\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\r\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\r\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\r\\n let lteParam = addEscapeChar(details.Data.LtePar);\\r\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\r\\n let bleParam = addEscapeChar(details.Data.BlePar);\\r\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\r\\n break;\\r\\n case \\\"REBOOTB\\\":\\r\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\r\\n break;\\r\\n case \\\"PWRFB\\\":\\r\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\r\\n break;\\r\\n case \\\"RESETB\\\":\\r\\n AddConfig(configIds.Bracelet.Reset, 'true');\\r\\n break;\\r\\n case \\\"BRAPWUPDATE\\\":\\r\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\r\\n // get password from old device, then set\\r\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\r\\n )\\r\\n break;\\r\\n case \\\"NOTE\\\":\\r\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\r\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\r\\n text = text.split(\\\",\\\").join(\\\" \\\");\\r\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\r\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\r\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\r\\n AddConfig(configIds.Note.Message, value)\\r\\n break;\\r\\n }\\r\\n }\\r\\n\\r\\n function addEscapeChar(json) {\\r\\n if (json === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n let jsonStr = JSON.stringify(json);\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\r\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function changeSingleQuoteToDouble(jsonStr) {\\r\\n if (jsonStr === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\r\\n outStr = outStr + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function sendMessageToLocalhost(str) {\\r\\n if (localTesting) {\\r\\n console.log(\\\"Sending message to local host: \\\" + str);\\r\\n } else {\\r\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\r\\n var c = createConnection(5878, server); // acceptance is 5678 - protocol dev 5878 - dev is 5679 ?\\r\\n c.write(`${str}`);\\r\\n c.end();\\r\\n }\\r\\n AddValue(\\\"ToLocalhost\\\", str);\\r\\n }\\r\\n\\r\\n function createConnection(port, server) {\\r\\n c = net.createConnection(port, server);\\r\\n c.on('error', function(error) {\\r\\n c = createConnection(port, server);\\r\\n });\\r\\n return c;\\r\\n }\\r\\n\\r\\n function decrypt(encdata, password) {\\r\\n var decrypted;\\r\\n var dataarray = encdata.split(\\\";\\\");\\r\\n if (dataarray.length > 5) {\\r\\n return \\\"\\\";\\r\\n }\\r\\n var i;\\r\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\r\\n if (encdata.startsWith(\\\"ACK\\\")) {\\r\\n return encdata;\\r\\n }\\r\\n for (i = 0; i < 3; i++) {\\r\\n part1 = part1 + dataarray[i] + \\\";\\\";\\r\\n }\\r\\n var mid = dataarray[2]; // use the message ID to create the salt\\r\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n // base64 decoding and extract the iv and encrypted data\\r\\n const bData = Buffer.from(enctext, 'base64');\\r\\n const iv = bData.slice(0, 16); // initial 16 chars\\r\\n const text = bData.slice(16); // all the encrypted data\\r\\n // derive key using; 32 byte key length (from salted password and mid)\\r\\n // decrypt the data in part2 and add to part1\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\r\\n try {\\r\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\r\\n } catch (err) {\\r\\n decrypted = undefined;\\r\\n }\\r\\n return decrypted;\\r\\n }\\r\\n\\r\\n function encrypt(text, mid, password) {\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n const iv = _crypto.randomBytes(16); // random initialization vector\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n // set the cipher\\r\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\r\\n // encrypt text\\r\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\r\\n // generate output ( encrypted text )\\r\\n return Buffer.concat([iv, encrypted]).toString('base64');\\r\\n }\\r\\n\\r\\n function AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n deviceParams.push(cvpair);\\r\\n }\\r\\n\\r\\n function AddConfig(configName, newvalue) {\\r\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n var cvpair = {\\r\\n 'code': configName,\\r\\n 'value': newvalue,\\r\\n 'forced': true\\r\\n };\\r\\n configsToSend.push(cvpair);\\r\\n };\\r\\n }\\r\\n\\r\\n function isASCII(str) {\\r\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\r\\n }\\r\\n\\r\\n function LookupValue(key, type, template) {\\r\\n var cvpair = {\\r\\n key: key, // key to be lookded up\\r\\n type: type, // type of the key\\r\\n template: template // the variable the result will be mapped to\\r\\n };\\r\\n msg.KeyValue = cvpair;\\r\\n }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n module.exports = {\\r\\n execute_ops\\r\\n }\\r\\n} else { // on server use local defined vars\\r\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n // define global returns\\r\\n msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1744200583},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n // Define array to push device data into. This will be put into the msg array at the end.\\r\\n var deviceParams = [];\\r\\n var configsToSend = [];\\r\\n var tasks = [];\\r\\n const _crypto = require('crypto');\\r\\n // handle ACK\\r\\n if (messageTypeCode == \\\"ACK\\\") {\\r\\n return \\\"\\\";\\r\\n }\\r\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\r\\n var password;\\r\\n if (params.imei == \\\"null\\\") {\\r\\n return msg;\\r\\n }\\r\\n password = params.imei;\\r\\n if (configs.Password.Password === \\\"\\\") {\\r\\n // use imei as default password when not specified\\r\\n } else {\\r\\n // use the password\\r\\n password = configs.Password.Password\\r\\n }\\r\\n let message = decrypt(raw, password);\\r\\n if (message) {\\r\\n // send message internally\\r\\n sendMessageToLocalhost(message);\\r\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n } else {\\r\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n }\\r\\n } else { // General Oysta Template\\r\\n switch (messageTypeLocalCode) {\\r\\n case (\\\"COMM\\\"):\\r\\n process_invent_msg(); //incoming invent commands\\r\\n break;\\r\\n case (\\\"MACB\\\"):\\r\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\r\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\r\\n add_params_to_output();\\r\\n break;\\r\\n case \\\"INFO-GETPWB\\\": // handle GETPWB message\\r\\n //let imei = params.bracelet_imei; // not actually needed ?\\r\\n //let mac = params.BLEMAC; // not actually needed ?\\r\\n let BraceletPW = \\\"\\\"; // until we set it from query below\\r\\n // if(params.bracelet_imei){\\r\\n // if(serverParams.Password){\\r\\n // BraceletPW = serverParams.Password; // query key value table\\r\\n // console.log(BraceletPW); // print for testing reasons\\r\\n // AddConfig(configIds.DeviceConfig.BraceletPW, BraceletPW);//this to return the value\\r\\n // }\\r\\n // }\\r\\n // else {\\r\\n // //return error\\r\\n // }\\r\\n //AddValue(\\\"password\\\", \\\"myNewPassword\\\");\\r\\n LookupValue(params.ble_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n break;\\r\\n case (\\\"REGISTER\\\"):\\r\\n let ble_mac = params.ble_mac;\\r\\n let iccid = params.iccid;\\r\\n // write values to readonly settings\\r\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\r\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\r\\n // will automtaically Activate on Acceptance\\r\\n if (serverParams.EnvName) {\\r\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\r\\n }\\r\\n }\\r\\n break;\\r\\n case (\\\"CREATE\\\"):\\r\\n // temp fix to filter old messages\\r\\n // const cutoff = 1707523200000; //10.2.2024\\r\\n // let message_id_time = parseInt(params.count_number, 36);\\r\\n // if (message_id_time > cutoff){\\r\\n let c_ble_mac = params.ble_mac;\\r\\n let c_iccid = params.iccid;\\r\\n let new_imei = params.new_imei;\\r\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\r\\n // sendMessageToLocalhost(c_message); \\r\\n tasks = [{\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"sync\\\",\\r\\n \\\"type\\\": \\\"createDevice\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"imei\\\": new_imei,\\r\\n \\\"abortOnError\\\": false,\\r\\n \\\"init\\\": true\\r\\n }),\\r\\n \\\"order\\\": 1\\r\\n }, {\\r\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"async\\\",\\r\\n \\\"type\\\": \\\"sendMessage\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"message\\\": c_message\\r\\n }),\\r\\n \\\"order\\\": 2\\r\\n }]\\r\\n // }\\r\\n break;\\r\\n case (\\\"ALLDATA\\\"):\\r\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\r\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\r\\n let all_data = JSON.parse(json_str);\\r\\n if (\\\"version\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\r\\n };\\r\\n break;\\r\\n default:\\r\\n // all other general messages\\r\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\r\\n add_params_to_output();\\r\\n }\\r\\n // add messagetTypeLocal to output for templates\\r\\n AddValue('local_message_type', messageTypeLocalCode);\\r\\n }\\r\\n var msg = {\\r\\n 'values': deviceParams,\\r\\n };\\r\\n if (configsToSend.length > 0) {\\r\\n msg.configsToSend = configsToSend\\r\\n };\\r\\n if (tasks.length > 0) {\\r\\n msg.tasks = tasks\\r\\n };\\r\\n // commit values to receiver processor\\r\\n console.log(msg);\\r\\n // modify to return the object that contains your data\\r\\n return msg;\\r\\n\\r\\n function add_params_to_output() {\\r\\n if (!params.raw_accuracy) {\\r\\n AddValue('location_accuracy', 9000);\\r\\n } else {\\r\\n AddValue('location_accuracy', params.raw_accuracy);\\r\\n }\\r\\n // generate timestamps if they don't exist\\r\\n if (!params.event_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n if (!params.location_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n //if no lat and long are given, set them to 0, 0\\r\\n if (!params.latitude_raw) {\\r\\n AddValue('latitude', 0);\\r\\n } else {\\r\\n AddValue('latitude', params.latitude_raw);\\r\\n }\\r\\n if (!params.longitude_raw) {\\r\\n AddValue('longitude', 0);\\r\\n } else {\\r\\n AddValue('longitude', params.longitude_raw);\\r\\n }\\r\\n // if (params.temp_bracelet){\\r\\n // AddValue('oysta_labels', 'DegC');\\r\\n // AddValue('single_column_value', params.temp_bracelet);\\r\\n // }\\r\\n }\\r\\n\\r\\n function process_invent_msg() {\\r\\n const details = JSON.parse(raw);\\r\\n // AddValue('imei', details.AppId);\\r\\n AddValue('json_in', JSON.stringify(details));\\r\\n switch (details.Command) {\\r\\n case \\\"ACTIVATE_OK\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\r\\n break;\\r\\n case \\\"ACTIVATE_FAILS\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\r\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\r\\n break;\\r\\n case \\\"APPSET\\\":\\r\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\r\\n AddConfig(configIds.Password.Password, details.Data.Password);\\r\\n break;\\r\\n case \\\"CONFIG\\\":\\r\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\r\\n break;\\r\\n case \\\"CGFBR\\\":\\r\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\r\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\r\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\r\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\r\\n let commonParam = addEscapeChar(details.Data.ComPar);\\r\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\r\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\r\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\r\\n let lteParam = addEscapeChar(details.Data.LtePar);\\r\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\r\\n let bleParam = addEscapeChar(details.Data.BlePar);\\r\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\r\\n break;\\r\\n case \\\"REBOOTB\\\":\\r\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\r\\n break;\\r\\n case \\\"PWRFB\\\":\\r\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\r\\n break;\\r\\n case \\\"RESETB\\\":\\r\\n AddConfig(configIds.Bracelet.Reset, 'true');\\r\\n break;\\r\\n case \\\"BRAPWUPDATE\\\":\\r\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\r\\n // get password from old device, then set\\r\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\r\\n )\\r\\n break;\\r\\n case \\\"NOTE\\\":\\r\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\r\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\r\\n text = text.split(\\\",\\\").join(\\\" \\\");\\r\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\r\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\r\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\r\\n AddConfig(configIds.Note.Message, value)\\r\\n break;\\r\\n }\\r\\n }\\r\\n\\r\\n function addEscapeChar(json) {\\r\\n if (json === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n let jsonStr = JSON.stringify(json);\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\r\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function changeSingleQuoteToDouble(jsonStr) {\\r\\n if (jsonStr === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\r\\n outStr = outStr + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function sendMessageToLocalhost(str) {\\r\\n if (localTesting) {\\r\\n console.log(\\\"Sending message to local host: \\\" + str);\\r\\n } else {\\r\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\r\\n var c = createConnection(5878, server); // acceptance is 5678 - protocol dev 5878 - dev is 5679 ?\\r\\n c.write(`${str}`);\\r\\n c.end();\\r\\n }\\r\\n AddValue(\\\"ToLocalhost\\\", str);\\r\\n }\\r\\n\\r\\n function createConnection(port, server) {\\r\\n c = net.createConnection(port, server);\\r\\n c.on('error', function(error) {\\r\\n c = createConnection(port, server);\\r\\n });\\r\\n return c;\\r\\n }\\r\\n\\r\\n function decrypt(encdata, password) {\\r\\n var decrypted;\\r\\n var dataarray = encdata.split(\\\";\\\");\\r\\n if (dataarray.length > 5) {\\r\\n return \\\"\\\";\\r\\n }\\r\\n var i;\\r\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\r\\n if (encdata.startsWith(\\\"ACK\\\")) {\\r\\n return encdata;\\r\\n }\\r\\n for (i = 0; i < 3; i++) {\\r\\n part1 = part1 + dataarray[i] + \\\";\\\";\\r\\n }\\r\\n var mid = dataarray[2]; // use the message ID to create the salt\\r\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n // base64 decoding and extract the iv and encrypted data\\r\\n const bData = Buffer.from(enctext, 'base64');\\r\\n const iv = bData.slice(0, 16); // initial 16 chars\\r\\n const text = bData.slice(16); // all the encrypted data\\r\\n // derive key using; 32 byte key length (from salted password and mid)\\r\\n // decrypt the data in part2 and add to part1\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\r\\n try {\\r\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\r\\n } catch (err) {\\r\\n decrypted = undefined;\\r\\n }\\r\\n return decrypted;\\r\\n }\\r\\n\\r\\n function encrypt(text, mid, password) {\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n const iv = _crypto.randomBytes(16); // random initialization vector\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n // set the cipher\\r\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\r\\n // encrypt text\\r\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\r\\n // generate output ( encrypted text )\\r\\n return Buffer.concat([iv, encrypted]).toString('base64');\\r\\n }\\r\\n\\r\\n function AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n deviceParams.push(cvpair);\\r\\n }\\r\\n\\r\\n function AddConfig(configName, newvalue) {\\r\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n var cvpair = {\\r\\n 'code': configName,\\r\\n 'value': newvalue,\\r\\n 'forced': true\\r\\n };\\r\\n configsToSend.push(cvpair);\\r\\n };\\r\\n }\\r\\n\\r\\n function isASCII(str) {\\r\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\r\\n }\\r\\n\\r\\n function LookupValue(key, type, template) {\\r\\n var cvpair = {\\r\\n key: key, // key to be lookded up\\r\\n type: type, // type of the key\\r\\n template: template // the variable the result will be mapped to\\r\\n };\\r\\n msg.KeyValue = cvpair;\\r\\n }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n module.exports = {\\r\\n execute_ops\\r\\n }\\r\\n} else { // on server use local defined vars\\r\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n // define global returns\\r\\n msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1744200792},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n // Define array to push device data into. This will be put into the msg array at the end.\\r\\n var deviceParams = [];\\r\\n var configsToSend = [];\\r\\n var tasks = [];\\r\\n const _crypto = require('crypto');\\r\\n // handle ACK\\r\\n if (messageTypeCode == \\\"ACK\\\") {\\r\\n return \\\"\\\";\\r\\n }\\r\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\r\\n var password;\\r\\n if (params.imei == \\\"null\\\") {\\r\\n return msg;\\r\\n }\\r\\n password = params.imei;\\r\\n if (configs.Password.Password === \\\"\\\") {\\r\\n // use imei as default password when not specified\\r\\n } else {\\r\\n // use the password\\r\\n password = configs.Password.Password\\r\\n }\\r\\n let message = decrypt(raw, password);\\r\\n if (message) {\\r\\n // send message internally\\r\\n sendMessageToLocalhost(message);\\r\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n } else {\\r\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n }\\r\\n } else { // General Oysta Template\\r\\n switch (messageTypeLocalCode) {\\r\\n case (\\\"COMM\\\"):\\r\\n process_invent_msg(); //incoming invent commands\\r\\n break;\\r\\n case (\\\"MACB\\\"):\\r\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\r\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\r\\n add_params_to_output();\\r\\n break;\\r\\n case \\\"INFO-GETPWB\\\": // handle GETPWB message\\r\\n //let imei = params.bracelet_imei; // not actually needed ?\\r\\n //let mac = params.BLEMAC; // not actually needed ?\\r\\n let BraceletPW = \\\"\\\"; // until we set it from query below\\r\\n // if(params.bracelet_imei){\\r\\n // if(serverParams.Password){\\r\\n // BraceletPW = serverParams.Password; // query key value table\\r\\n // console.log(BraceletPW); // print for testing reasons\\r\\n // AddConfig(configIds.DeviceConfig.BraceletPW, BraceletPW);//this to return the value\\r\\n // }\\r\\n // }\\r\\n // else {\\r\\n // //return error\\r\\n // }\\r\\n //AddValue(\\\"password\\\", \\\"myNewPassword\\\");\\r\\n //LookupValue(params.ble_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n LookupValue(\\\"BC572909705E\\\", \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n break;\\r\\n case (\\\"REGISTER\\\"):\\r\\n let ble_mac = params.ble_mac;\\r\\n let iccid = params.iccid;\\r\\n // write values to readonly settings\\r\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\r\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\r\\n // will automtaically Activate on Acceptance\\r\\n if (serverParams.EnvName) {\\r\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\r\\n }\\r\\n }\\r\\n break;\\r\\n case (\\\"CREATE\\\"):\\r\\n // temp fix to filter old messages\\r\\n // const cutoff = 1707523200000; //10.2.2024\\r\\n // let message_id_time = parseInt(params.count_number, 36);\\r\\n // if (message_id_time > cutoff){\\r\\n let c_ble_mac = params.ble_mac;\\r\\n let c_iccid = params.iccid;\\r\\n let new_imei = params.new_imei;\\r\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\r\\n // sendMessageToLocalhost(c_message); \\r\\n tasks = [{\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"sync\\\",\\r\\n \\\"type\\\": \\\"createDevice\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"imei\\\": new_imei,\\r\\n \\\"abortOnError\\\": false,\\r\\n \\\"init\\\": true\\r\\n }),\\r\\n \\\"order\\\": 1\\r\\n }, {\\r\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"async\\\",\\r\\n \\\"type\\\": \\\"sendMessage\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"message\\\": c_message\\r\\n }),\\r\\n \\\"order\\\": 2\\r\\n }]\\r\\n // }\\r\\n break;\\r\\n case (\\\"ALLDATA\\\"):\\r\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\r\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\r\\n let all_data = JSON.parse(json_str);\\r\\n if (\\\"version\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\r\\n };\\r\\n break;\\r\\n default:\\r\\n // all other general messages\\r\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\r\\n add_params_to_output();\\r\\n }\\r\\n // add messagetTypeLocal to output for templates\\r\\n AddValue('local_message_type', messageTypeLocalCode);\\r\\n }\\r\\n var msg = {\\r\\n 'values': deviceParams,\\r\\n };\\r\\n if (configsToSend.length > 0) {\\r\\n msg.configsToSend = configsToSend\\r\\n };\\r\\n if (tasks.length > 0) {\\r\\n msg.tasks = tasks\\r\\n };\\r\\n // commit values to receiver processor\\r\\n console.log(msg);\\r\\n // modify to return the object that contains your data\\r\\n return msg;\\r\\n\\r\\n function add_params_to_output() {\\r\\n if (!params.raw_accuracy) {\\r\\n AddValue('location_accuracy', 9000);\\r\\n } else {\\r\\n AddValue('location_accuracy', params.raw_accuracy);\\r\\n }\\r\\n // generate timestamps if they don't exist\\r\\n if (!params.event_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n if (!params.location_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n //if no lat and long are given, set them to 0, 0\\r\\n if (!params.latitude_raw) {\\r\\n AddValue('latitude', 0);\\r\\n } else {\\r\\n AddValue('latitude', params.latitude_raw);\\r\\n }\\r\\n if (!params.longitude_raw) {\\r\\n AddValue('longitude', 0);\\r\\n } else {\\r\\n AddValue('longitude', params.longitude_raw);\\r\\n }\\r\\n // if (params.temp_bracelet){\\r\\n // AddValue('oysta_labels', 'DegC');\\r\\n // AddValue('single_column_value', params.temp_bracelet);\\r\\n // }\\r\\n }\\r\\n\\r\\n function process_invent_msg() {\\r\\n const details = JSON.parse(raw);\\r\\n // AddValue('imei', details.AppId);\\r\\n AddValue('json_in', JSON.stringify(details));\\r\\n switch (details.Command) {\\r\\n case \\\"ACTIVATE_OK\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\r\\n break;\\r\\n case \\\"ACTIVATE_FAILS\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\r\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\r\\n break;\\r\\n case \\\"APPSET\\\":\\r\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\r\\n AddConfig(configIds.Password.Password, details.Data.Password);\\r\\n break;\\r\\n case \\\"CONFIG\\\":\\r\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\r\\n break;\\r\\n case \\\"CGFBR\\\":\\r\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\r\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\r\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\r\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\r\\n let commonParam = addEscapeChar(details.Data.ComPar);\\r\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\r\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\r\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\r\\n let lteParam = addEscapeChar(details.Data.LtePar);\\r\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\r\\n let bleParam = addEscapeChar(details.Data.BlePar);\\r\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\r\\n break;\\r\\n case \\\"REBOOTB\\\":\\r\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\r\\n break;\\r\\n case \\\"PWRFB\\\":\\r\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\r\\n break;\\r\\n case \\\"RESETB\\\":\\r\\n AddConfig(configIds.Bracelet.Reset, 'true');\\r\\n break;\\r\\n case \\\"BRAPWUPDATE\\\":\\r\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\r\\n // get password from old device, then set\\r\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\r\\n )\\r\\n break;\\r\\n case \\\"NOTE\\\":\\r\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\r\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\r\\n text = text.split(\\\",\\\").join(\\\" \\\");\\r\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\r\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\r\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\r\\n AddConfig(configIds.Note.Message, value)\\r\\n break;\\r\\n }\\r\\n }\\r\\n\\r\\n function addEscapeChar(json) {\\r\\n if (json === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n let jsonStr = JSON.stringify(json);\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\r\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function changeSingleQuoteToDouble(jsonStr) {\\r\\n if (jsonStr === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\r\\n outStr = outStr + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function sendMessageToLocalhost(str) {\\r\\n if (localTesting) {\\r\\n console.log(\\\"Sending message to local host: \\\" + str);\\r\\n } else {\\r\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\r\\n var c = createConnection(5878, server); // acceptance is 5678 - protocol dev 5878 - dev is 5679 ?\\r\\n c.write(`${str}`);\\r\\n c.end();\\r\\n }\\r\\n AddValue(\\\"ToLocalhost\\\", str);\\r\\n }\\r\\n\\r\\n function createConnection(port, server) {\\r\\n c = net.createConnection(port, server);\\r\\n c.on('error', function(error) {\\r\\n c = createConnection(port, server);\\r\\n });\\r\\n return c;\\r\\n }\\r\\n\\r\\n function decrypt(encdata, password) {\\r\\n var decrypted;\\r\\n var dataarray = encdata.split(\\\";\\\");\\r\\n if (dataarray.length > 5) {\\r\\n return \\\"\\\";\\r\\n }\\r\\n var i;\\r\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\r\\n if (encdata.startsWith(\\\"ACK\\\")) {\\r\\n return encdata;\\r\\n }\\r\\n for (i = 0; i < 3; i++) {\\r\\n part1 = part1 + dataarray[i] + \\\";\\\";\\r\\n }\\r\\n var mid = dataarray[2]; // use the message ID to create the salt\\r\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n // base64 decoding and extract the iv and encrypted data\\r\\n const bData = Buffer.from(enctext, 'base64');\\r\\n const iv = bData.slice(0, 16); // initial 16 chars\\r\\n const text = bData.slice(16); // all the encrypted data\\r\\n // derive key using; 32 byte key length (from salted password and mid)\\r\\n // decrypt the data in part2 and add to part1\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\r\\n try {\\r\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\r\\n } catch (err) {\\r\\n decrypted = undefined;\\r\\n }\\r\\n return decrypted;\\r\\n }\\r\\n\\r\\n function encrypt(text, mid, password) {\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n const iv = _crypto.randomBytes(16); // random initialization vector\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n // set the cipher\\r\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\r\\n // encrypt text\\r\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\r\\n // generate output ( encrypted text )\\r\\n return Buffer.concat([iv, encrypted]).toString('base64');\\r\\n }\\r\\n\\r\\n function AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n deviceParams.push(cvpair);\\r\\n }\\r\\n\\r\\n function AddConfig(configName, newvalue) {\\r\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n var cvpair = {\\r\\n 'code': configName,\\r\\n 'value': newvalue,\\r\\n 'forced': true\\r\\n };\\r\\n configsToSend.push(cvpair);\\r\\n };\\r\\n }\\r\\n\\r\\n function isASCII(str) {\\r\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\r\\n }\\r\\n\\r\\n function LookupValue(key, type, template) {\\r\\n var cvpair = {\\r\\n key: key, // key to be lookded up\\r\\n type: type, // type of the key\\r\\n template: template // the variable the result will be mapped to\\r\\n };\\r\\n msg.KeyValue = cvpair;\\r\\n }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n module.exports = {\\r\\n execute_ops\\r\\n }\\r\\n} else { // on server use local defined vars\\r\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n // define global returns\\r\\n msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1744202227},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n // Define array to push device data into. This will be put into the msg array at the end.\\r\\n var deviceParams = [];\\r\\n var configsToSend = [];\\r\\n var tasks = [];\\r\\n msg = {};\\r\\n const _crypto = require('crypto');\\r\\n // handle ACK\\r\\n if (messageTypeCode == \\\"ACK\\\") {\\r\\n return \\\"\\\";\\r\\n }\\r\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\r\\n var password;\\r\\n if (params.imei == \\\"null\\\") {\\r\\n return msg;\\r\\n }\\r\\n password = params.imei;\\r\\n if (configs.Password.Password === \\\"\\\") {\\r\\n // use imei as default password when not specified\\r\\n } else {\\r\\n // use the password\\r\\n password = configs.Password.Password\\r\\n }\\r\\n let message = decrypt(raw, password);\\r\\n if (message) {\\r\\n // send message internally\\r\\n sendMessageToLocalhost(message);\\r\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n } else {\\r\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n }\\r\\n } else { // General Oysta Template\\r\\n switch (messageTypeLocalCode) {\\r\\n case (\\\"COMM\\\"):\\r\\n process_invent_msg(); //incoming invent commands\\r\\n break;\\r\\n case (\\\"MACB\\\"):\\r\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\r\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\r\\n add_params_to_output();\\r\\n break;\\r\\n case \\\"INFO-GETPWB\\\": // handle GETPWB message\\r\\n //let imei = params.bracelet_imei; // not actually needed ?\\r\\n //let mac = params.BLEMAC; // not actually needed ?\\r\\n let BraceletPW = \\\"\\\"; // until we set it from query below\\r\\n // if(params.bracelet_imei){\\r\\n // if(serverParams.Password){\\r\\n // BraceletPW = serverParams.Password; // query key value table\\r\\n // console.log(BraceletPW); // print for testing reasons\\r\\n // AddConfig(configIds.DeviceConfig.BraceletPW, BraceletPW);//this to return the value\\r\\n // }\\r\\n // }\\r\\n // else {\\r\\n // //return error\\r\\n // }\\r\\n //AddValue(\\\"password\\\", \\\"myNewPassword\\\");\\r\\n //LookupValue(params.ble_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n LookupValue(\\\"BC572909705E\\\", \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n break;\\r\\n case (\\\"REGISTER\\\"):\\r\\n let ble_mac = params.ble_mac;\\r\\n let iccid = params.iccid;\\r\\n // write values to readonly settings\\r\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\r\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\r\\n // will automtaically Activate on Acceptance\\r\\n if (serverParams.EnvName) {\\r\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\r\\n }\\r\\n }\\r\\n break;\\r\\n case (\\\"CREATE\\\"):\\r\\n // temp fix to filter old messages\\r\\n // const cutoff = 1707523200000; //10.2.2024\\r\\n // let message_id_time = parseInt(params.count_number, 36);\\r\\n // if (message_id_time > cutoff){\\r\\n let c_ble_mac = params.ble_mac;\\r\\n let c_iccid = params.iccid;\\r\\n let new_imei = params.new_imei;\\r\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\r\\n // sendMessageToLocalhost(c_message); \\r\\n tasks = [{\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"sync\\\",\\r\\n \\\"type\\\": \\\"createDevice\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"imei\\\": new_imei,\\r\\n \\\"abortOnError\\\": false,\\r\\n \\\"init\\\": true\\r\\n }),\\r\\n \\\"order\\\": 1\\r\\n }, {\\r\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"async\\\",\\r\\n \\\"type\\\": \\\"sendMessage\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"message\\\": c_message\\r\\n }),\\r\\n \\\"order\\\": 2\\r\\n }]\\r\\n // }\\r\\n break;\\r\\n case (\\\"ALLDATA\\\"):\\r\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\r\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\r\\n let all_data = JSON.parse(json_str);\\r\\n if (\\\"version\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\r\\n };\\r\\n break;\\r\\n default:\\r\\n // all other general messages\\r\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\r\\n add_params_to_output();\\r\\n }\\r\\n // add messagetTypeLocal to output for templates\\r\\n AddValue('local_message_type', messageTypeLocalCode);\\r\\n }\\r\\n var msg = {\\r\\n 'values': deviceParams,\\r\\n };\\r\\n if (configsToSend.length > 0) {\\r\\n msg.configsToSend = configsToSend\\r\\n };\\r\\n if (tasks.length > 0) {\\r\\n msg.tasks = tasks\\r\\n };\\r\\n // commit values to receiver processor\\r\\n console.log(msg);\\r\\n // modify to return the object that contains your data\\r\\n return msg;\\r\\n\\r\\n function add_params_to_output() {\\r\\n if (!params.raw_accuracy) {\\r\\n AddValue('location_accuracy', 9000);\\r\\n } else {\\r\\n AddValue('location_accuracy', params.raw_accuracy);\\r\\n }\\r\\n // generate timestamps if they don't exist\\r\\n if (!params.event_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n if (!params.location_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n //if no lat and long are given, set them to 0, 0\\r\\n if (!params.latitude_raw) {\\r\\n AddValue('latitude', 0);\\r\\n } else {\\r\\n AddValue('latitude', params.latitude_raw);\\r\\n }\\r\\n if (!params.longitude_raw) {\\r\\n AddValue('longitude', 0);\\r\\n } else {\\r\\n AddValue('longitude', params.longitude_raw);\\r\\n }\\r\\n // if (params.temp_bracelet){\\r\\n // AddValue('oysta_labels', 'DegC');\\r\\n // AddValue('single_column_value', params.temp_bracelet);\\r\\n // }\\r\\n }\\r\\n\\r\\n function process_invent_msg() {\\r\\n const details = JSON.parse(raw);\\r\\n // AddValue('imei', details.AppId);\\r\\n AddValue('json_in', JSON.stringify(details));\\r\\n switch (details.Command) {\\r\\n case \\\"ACTIVATE_OK\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\r\\n break;\\r\\n case \\\"ACTIVATE_FAILS\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\r\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\r\\n break;\\r\\n case \\\"APPSET\\\":\\r\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\r\\n AddConfig(configIds.Password.Password, details.Data.Password);\\r\\n break;\\r\\n case \\\"CONFIG\\\":\\r\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\r\\n break;\\r\\n case \\\"CGFBR\\\":\\r\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\r\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\r\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\r\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\r\\n let commonParam = addEscapeChar(details.Data.ComPar);\\r\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\r\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\r\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\r\\n let lteParam = addEscapeChar(details.Data.LtePar);\\r\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\r\\n let bleParam = addEscapeChar(details.Data.BlePar);\\r\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\r\\n break;\\r\\n case \\\"REBOOTB\\\":\\r\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\r\\n break;\\r\\n case \\\"PWRFB\\\":\\r\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\r\\n break;\\r\\n case \\\"RESETB\\\":\\r\\n AddConfig(configIds.Bracelet.Reset, 'true');\\r\\n break;\\r\\n case \\\"BRAPWUPDATE\\\":\\r\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\r\\n // get password from old device, then set\\r\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\r\\n )\\r\\n break;\\r\\n case \\\"NOTE\\\":\\r\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\r\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\r\\n text = text.split(\\\",\\\").join(\\\" \\\");\\r\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\r\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\r\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\r\\n AddConfig(configIds.Note.Message, value)\\r\\n break;\\r\\n }\\r\\n }\\r\\n\\r\\n function addEscapeChar(json) {\\r\\n if (json === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n let jsonStr = JSON.stringify(json);\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\r\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function changeSingleQuoteToDouble(jsonStr) {\\r\\n if (jsonStr === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\r\\n outStr = outStr + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function sendMessageToLocalhost(str) {\\r\\n if (localTesting) {\\r\\n console.log(\\\"Sending message to local host: \\\" + str);\\r\\n } else {\\r\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\r\\n var c = createConnection(5878, server); // acceptance is 5678 - protocol dev 5878 - dev is 5679 ?\\r\\n c.write(`${str}`);\\r\\n c.end();\\r\\n }\\r\\n AddValue(\\\"ToLocalhost\\\", str);\\r\\n }\\r\\n\\r\\n function createConnection(port, server) {\\r\\n c = net.createConnection(port, server);\\r\\n c.on('error', function(error) {\\r\\n c = createConnection(port, server);\\r\\n });\\r\\n return c;\\r\\n }\\r\\n\\r\\n function decrypt(encdata, password) {\\r\\n var decrypted;\\r\\n var dataarray = encdata.split(\\\";\\\");\\r\\n if (dataarray.length > 5) {\\r\\n return \\\"\\\";\\r\\n }\\r\\n var i;\\r\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\r\\n if (encdata.startsWith(\\\"ACK\\\")) {\\r\\n return encdata;\\r\\n }\\r\\n for (i = 0; i < 3; i++) {\\r\\n part1 = part1 + dataarray[i] + \\\";\\\";\\r\\n }\\r\\n var mid = dataarray[2]; // use the message ID to create the salt\\r\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n // base64 decoding and extract the iv and encrypted data\\r\\n const bData = Buffer.from(enctext, 'base64');\\r\\n const iv = bData.slice(0, 16); // initial 16 chars\\r\\n const text = bData.slice(16); // all the encrypted data\\r\\n // derive key using; 32 byte key length (from salted password and mid)\\r\\n // decrypt the data in part2 and add to part1\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\r\\n try {\\r\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\r\\n } catch (err) {\\r\\n decrypted = undefined;\\r\\n }\\r\\n return decrypted;\\r\\n }\\r\\n\\r\\n function encrypt(text, mid, password) {\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n const iv = _crypto.randomBytes(16); // random initialization vector\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n // set the cipher\\r\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\r\\n // encrypt text\\r\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\r\\n // generate output ( encrypted text )\\r\\n return Buffer.concat([iv, encrypted]).toString('base64');\\r\\n }\\r\\n\\r\\n function AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n deviceParams.push(cvpair);\\r\\n }\\r\\n\\r\\n function AddConfig(configName, newvalue) {\\r\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n var cvpair = {\\r\\n 'code': configName,\\r\\n 'value': newvalue,\\r\\n 'forced': true\\r\\n };\\r\\n configsToSend.push(cvpair);\\r\\n };\\r\\n }\\r\\n\\r\\n function isASCII(str) {\\r\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\r\\n }\\r\\n\\r\\n function LookupValue(key, type, template) {\\r\\n var cvpair = {\\r\\n key: key, // key to be lookded up\\r\\n type: type, // type of the key\\r\\n template: template // the variable the result will be mapped to\\r\\n };\\r\\n msg.KeyValue = cvpair;\\r\\n }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n module.exports = {\\r\\n execute_ops\\r\\n }\\r\\n} else { // on server use local defined vars\\r\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n // define global returns\\r\\n msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1744202554},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n // Define array to push device data into. This will be put into the msg array at the end.\\r\\n var deviceParams = [];\\r\\n var configsToSend = [];\\r\\n var tasks = [];\\r\\n msg = {};\\r\\n const _crypto = require('crypto');\\r\\n // handle ACK\\r\\n if (messageTypeCode == \\\"ACK\\\") {\\r\\n return \\\"\\\";\\r\\n }\\r\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\r\\n var password;\\r\\n if (params.imei == \\\"null\\\") {\\r\\n return msg;\\r\\n }\\r\\n password = params.imei;\\r\\n if (configs.Password.Password === \\\"\\\") {\\r\\n // use imei as default password when not specified\\r\\n } else {\\r\\n // use the password\\r\\n password = configs.Password.Password\\r\\n }\\r\\n let message = decrypt(raw, password);\\r\\n if (message) {\\r\\n // send message internally\\r\\n sendMessageToLocalhost(message);\\r\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n } else {\\r\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n }\\r\\n } else { // General Oysta Template\\r\\n switch (messageTypeLocalCode) {\\r\\n case (\\\"COMM\\\"):\\r\\n process_invent_msg(); //incoming invent commands\\r\\n break;\\r\\n case (\\\"MACB\\\"):\\r\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\r\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\r\\n add_params_to_output();\\r\\n break;\\r\\n case \\\"INFO-GETPWB\\\": // handle GETPWB message\\r\\n //let imei = params.bracelet_imei; // not actually needed ?\\r\\n //let mac = params.BLEMAC; // not actually needed ?\\r\\n AddValue(\\\"mac\\\", params.ble_mac);\\r\\n AddValue(\\\"key\\\", params.key);\\r\\n console.log(\\\"mac: \\\" + params.ble_mac);\\r\\n let BraceletPW = \\\"\\\"; // until we set it from query below\\r\\n // if(params.bracelet_imei){\\r\\n // if(serverParams.Password){\\r\\n // BraceletPW = serverParams.Password; // query key value table\\r\\n // console.log(BraceletPW); // print for testing reasons\\r\\n // AddConfig(configIds.DeviceConfig.BraceletPW, BraceletPW);//this to return the value\\r\\n // }\\r\\n // }\\r\\n // else {\\r\\n // //return error\\r\\n // }\\r\\n //AddValue(\\\"password\\\", \\\"myNewPassword\\\");\\r\\n //LookupValue(params.ble_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n LookupValue(\\\"BC572909705E\\\", \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n if (deviceParams.length > 0) {\\r\\n msg.values = deviceParams\\r\\n };\\r\\n console.log(msg);\\r\\n break;\\r\\n case (\\\"REGISTER\\\"):\\r\\n let ble_mac = params.ble_mac;\\r\\n let iccid = params.iccid;\\r\\n // write values to readonly settings\\r\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\r\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\r\\n // will automtaically Activate on Acceptance\\r\\n if (serverParams.EnvName) {\\r\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\r\\n }\\r\\n }\\r\\n break;\\r\\n case (\\\"CREATE\\\"):\\r\\n // temp fix to filter old messages\\r\\n // const cutoff = 1707523200000; //10.2.2024\\r\\n // let message_id_time = parseInt(params.count_number, 36);\\r\\n // if (message_id_time > cutoff){\\r\\n let c_ble_mac = params.ble_mac;\\r\\n let c_iccid = params.iccid;\\r\\n let new_imei = params.new_imei;\\r\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\r\\n // sendMessageToLocalhost(c_message); \\r\\n tasks = [{\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"sync\\\",\\r\\n \\\"type\\\": \\\"createDevice\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"imei\\\": new_imei,\\r\\n \\\"abortOnError\\\": false,\\r\\n \\\"init\\\": true\\r\\n }),\\r\\n \\\"order\\\": 1\\r\\n }, {\\r\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"async\\\",\\r\\n \\\"type\\\": \\\"sendMessage\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"message\\\": c_message\\r\\n }),\\r\\n \\\"order\\\": 2\\r\\n }]\\r\\n // }\\r\\n break;\\r\\n case (\\\"ALLDATA\\\"):\\r\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\r\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\r\\n let all_data = JSON.parse(json_str);\\r\\n if (\\\"version\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\r\\n };\\r\\n break;\\r\\n default:\\r\\n // all other general messages\\r\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\r\\n add_params_to_output();\\r\\n }\\r\\n // add messagetTypeLocal to output for templates\\r\\n AddValue('local_message_type', messageTypeLocalCode);\\r\\n }\\r\\n var msg = {\\r\\n 'values': deviceParams,\\r\\n };\\r\\n if (configsToSend.length > 0) {\\r\\n msg.configsToSend = configsToSend\\r\\n };\\r\\n if (tasks.length > 0) {\\r\\n msg.tasks = tasks\\r\\n };\\r\\n // commit values to receiver processor\\r\\n console.log(msg);\\r\\n // modify to return the object that contains your data\\r\\n return msg;\\r\\n\\r\\n function add_params_to_output() {\\r\\n if (!params.raw_accuracy) {\\r\\n AddValue('location_accuracy', 9000);\\r\\n } else {\\r\\n AddValue('location_accuracy', params.raw_accuracy);\\r\\n }\\r\\n // generate timestamps if they don't exist\\r\\n if (!params.event_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n if (!params.location_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n //if no lat and long are given, set them to 0, 0\\r\\n if (!params.latitude_raw) {\\r\\n AddValue('latitude', 0);\\r\\n } else {\\r\\n AddValue('latitude', params.latitude_raw);\\r\\n }\\r\\n if (!params.longitude_raw) {\\r\\n AddValue('longitude', 0);\\r\\n } else {\\r\\n AddValue('longitude', params.longitude_raw);\\r\\n }\\r\\n // if (params.temp_bracelet){\\r\\n // AddValue('oysta_labels', 'DegC');\\r\\n // AddValue('single_column_value', params.temp_bracelet);\\r\\n // }\\r\\n }\\r\\n\\r\\n function process_invent_msg() {\\r\\n const details = JSON.parse(raw);\\r\\n // AddValue('imei', details.AppId);\\r\\n AddValue('json_in', JSON.stringify(details));\\r\\n switch (details.Command) {\\r\\n case \\\"ACTIVATE_OK\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\r\\n break;\\r\\n case \\\"ACTIVATE_FAILS\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\r\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\r\\n break;\\r\\n case \\\"APPSET\\\":\\r\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\r\\n AddConfig(configIds.Password.Password, details.Data.Password);\\r\\n break;\\r\\n case \\\"CONFIG\\\":\\r\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\r\\n break;\\r\\n case \\\"CGFBR\\\":\\r\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\r\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\r\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\r\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\r\\n let commonParam = addEscapeChar(details.Data.ComPar);\\r\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\r\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\r\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\r\\n let lteParam = addEscapeChar(details.Data.LtePar);\\r\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\r\\n let bleParam = addEscapeChar(details.Data.BlePar);\\r\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\r\\n break;\\r\\n case \\\"REBOOTB\\\":\\r\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\r\\n break;\\r\\n case \\\"PWRFB\\\":\\r\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\r\\n break;\\r\\n case \\\"RESETB\\\":\\r\\n AddConfig(configIds.Bracelet.Reset, 'true');\\r\\n break;\\r\\n case \\\"BRAPWUPDATE\\\":\\r\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\r\\n // get password from old device, then set\\r\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\r\\n )\\r\\n break;\\r\\n case \\\"NOTE\\\":\\r\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\r\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\r\\n text = text.split(\\\",\\\").join(\\\" \\\");\\r\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\r\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\r\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\r\\n AddConfig(configIds.Note.Message, value)\\r\\n break;\\r\\n }\\r\\n }\\r\\n\\r\\n function addEscapeChar(json) {\\r\\n if (json === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n let jsonStr = JSON.stringify(json);\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\r\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function changeSingleQuoteToDouble(jsonStr) {\\r\\n if (jsonStr === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\r\\n outStr = outStr + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function sendMessageToLocalhost(str) {\\r\\n if (localTesting) {\\r\\n console.log(\\\"Sending message to local host: \\\" + str);\\r\\n } else {\\r\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\r\\n var c = createConnection(5878, server); // acceptance is 5678 - protocol dev 5878 - dev is 5679 ?\\r\\n c.write(`${str}`);\\r\\n c.end();\\r\\n }\\r\\n AddValue(\\\"ToLocalhost\\\", str);\\r\\n }\\r\\n\\r\\n function createConnection(port, server) {\\r\\n c = net.createConnection(port, server);\\r\\n c.on('error', function(error) {\\r\\n c = createConnection(port, server);\\r\\n });\\r\\n return c;\\r\\n }\\r\\n\\r\\n function decrypt(encdata, password) {\\r\\n var decrypted;\\r\\n var dataarray = encdata.split(\\\";\\\");\\r\\n if (dataarray.length > 5) {\\r\\n return \\\"\\\";\\r\\n }\\r\\n var i;\\r\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\r\\n if (encdata.startsWith(\\\"ACK\\\")) {\\r\\n return encdata;\\r\\n }\\r\\n for (i = 0; i < 3; i++) {\\r\\n part1 = part1 + dataarray[i] + \\\";\\\";\\r\\n }\\r\\n var mid = dataarray[2]; // use the message ID to create the salt\\r\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n // base64 decoding and extract the iv and encrypted data\\r\\n const bData = Buffer.from(enctext, 'base64');\\r\\n const iv = bData.slice(0, 16); // initial 16 chars\\r\\n const text = bData.slice(16); // all the encrypted data\\r\\n // derive key using; 32 byte key length (from salted password and mid)\\r\\n // decrypt the data in part2 and add to part1\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\r\\n try {\\r\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\r\\n } catch (err) {\\r\\n decrypted = undefined;\\r\\n }\\r\\n return decrypted;\\r\\n }\\r\\n\\r\\n function encrypt(text, mid, password) {\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n const iv = _crypto.randomBytes(16); // random initialization vector\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n // set the cipher\\r\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\r\\n // encrypt text\\r\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\r\\n // generate output ( encrypted text )\\r\\n return Buffer.concat([iv, encrypted]).toString('base64');\\r\\n }\\r\\n\\r\\n function AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n deviceParams.push(cvpair);\\r\\n }\\r\\n\\r\\n function AddConfig(configName, newvalue) {\\r\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n var cvpair = {\\r\\n 'code': configName,\\r\\n 'value': newvalue,\\r\\n 'forced': true\\r\\n };\\r\\n configsToSend.push(cvpair);\\r\\n };\\r\\n }\\r\\n\\r\\n function isASCII(str) {\\r\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\r\\n }\\r\\n\\r\\n function LookupValue(key, type, template) {\\r\\n var cvpair = {\\r\\n key: key, // key to be lookded up\\r\\n type: type, // type of the key\\r\\n template: template // the variable the result will be mapped to\\r\\n };\\r\\n msg.KeyValue = cvpair;\\r\\n }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n module.exports = {\\r\\n execute_ops\\r\\n }\\r\\n} else { // on server use local defined vars\\r\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n // define global returns\\r\\n msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1744202767},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n // Define array to push device data into. This will be put into the msg array at the end.\\r\\n var deviceParams = [];\\r\\n var configsToSend = [];\\r\\n var tasks = [];\\r\\n msg = {};\\r\\n const _crypto = require('crypto');\\r\\n // handle ACK\\r\\n if (messageTypeCode == \\\"ACK\\\") {\\r\\n return \\\"\\\";\\r\\n }\\r\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\r\\n var password;\\r\\n if (params.imei == \\\"null\\\") {\\r\\n return msg;\\r\\n }\\r\\n password = params.imei;\\r\\n if (configs.Password.Password === \\\"\\\") {\\r\\n // use imei as default password when not specified\\r\\n } else {\\r\\n // use the password\\r\\n password = configs.Password.Password\\r\\n }\\r\\n let message = decrypt(raw, password);\\r\\n if (message) {\\r\\n // send message internally\\r\\n sendMessageToLocalhost(message);\\r\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n } else {\\r\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n }\\r\\n } else { // General Oysta Template\\r\\n switch (messageTypeLocalCode) {\\r\\n case (\\\"COMM\\\"):\\r\\n process_invent_msg(); //incoming invent commands\\r\\n break;\\r\\n case (\\\"MACB\\\"):\\r\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\r\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\r\\n add_params_to_output();\\r\\n break;\\r\\n case \\\"INFO-GETPWB\\\": // handle GETPWB message\\r\\n //let imei = params.bracelet_imei; // not actually needed ?\\r\\n //let mac = params.BLEMAC; // not actually needed ?\\r\\n AddValue(\\\"mac\\\", params.ble_mac);\\r\\n //AddValue(\\\"key\\\", params.key);\\r\\n console.log(\\\"mac: \\\" + params.ble_mac);\\r\\n let BraceletPW = \\\"\\\"; // until we set it from query below\\r\\n // if(params.bracelet_imei){\\r\\n // if(serverParams.Password){\\r\\n // BraceletPW = serverParams.Password; // query key value table\\r\\n // console.log(BraceletPW); // print for testing reasons\\r\\n // AddConfig(configIds.DeviceConfig.BraceletPW, BraceletPW);//this to return the value\\r\\n // }\\r\\n // }\\r\\n // else {\\r\\n // //return error\\r\\n // }\\r\\n //AddValue(\\\"password\\\", \\\"myNewPassword\\\");\\r\\n //LookupValue(params.ble_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n LookupValue(\\\"BC572909705E\\\", \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n if (deviceParams.length > 0) {\\r\\n msg.values = deviceParams\\r\\n };\\r\\n console.log(msg);\\r\\n break;\\r\\n case (\\\"REGISTER\\\"):\\r\\n let ble_mac = params.ble_mac;\\r\\n let iccid = params.iccid;\\r\\n // write values to readonly settings\\r\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\r\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\r\\n // will automtaically Activate on Acceptance\\r\\n if (serverParams.EnvName) {\\r\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\r\\n }\\r\\n }\\r\\n break;\\r\\n case (\\\"CREATE\\\"):\\r\\n // temp fix to filter old messages\\r\\n // const cutoff = 1707523200000; //10.2.2024\\r\\n // let message_id_time = parseInt(params.count_number, 36);\\r\\n // if (message_id_time > cutoff){\\r\\n let c_ble_mac = params.ble_mac;\\r\\n let c_iccid = params.iccid;\\r\\n let new_imei = params.new_imei;\\r\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\r\\n // sendMessageToLocalhost(c_message); \\r\\n tasks = [{\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"sync\\\",\\r\\n \\\"type\\\": \\\"createDevice\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"imei\\\": new_imei,\\r\\n \\\"abortOnError\\\": false,\\r\\n \\\"init\\\": true\\r\\n }),\\r\\n \\\"order\\\": 1\\r\\n }, {\\r\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"async\\\",\\r\\n \\\"type\\\": \\\"sendMessage\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"message\\\": c_message\\r\\n }),\\r\\n \\\"order\\\": 2\\r\\n }]\\r\\n // }\\r\\n break;\\r\\n case (\\\"ALLDATA\\\"):\\r\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\r\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\r\\n let all_data = JSON.parse(json_str);\\r\\n if (\\\"version\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\r\\n };\\r\\n break;\\r\\n default:\\r\\n // all other general messages\\r\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\r\\n add_params_to_output();\\r\\n }\\r\\n // add messagetTypeLocal to output for templates\\r\\n AddValue('local_message_type', messageTypeLocalCode);\\r\\n }\\r\\n var msg = {\\r\\n 'values': deviceParams,\\r\\n };\\r\\n if (configsToSend.length > 0) {\\r\\n msg.configsToSend = configsToSend\\r\\n };\\r\\n if (tasks.length > 0) {\\r\\n msg.tasks = tasks\\r\\n };\\r\\n // commit values to receiver processor\\r\\n console.log(msg);\\r\\n // modify to return the object that contains your data\\r\\n return msg;\\r\\n\\r\\n function add_params_to_output() {\\r\\n if (!params.raw_accuracy) {\\r\\n AddValue('location_accuracy', 9000);\\r\\n } else {\\r\\n AddValue('location_accuracy', params.raw_accuracy);\\r\\n }\\r\\n // generate timestamps if they don't exist\\r\\n if (!params.event_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n if (!params.location_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n //if no lat and long are given, set them to 0, 0\\r\\n if (!params.latitude_raw) {\\r\\n AddValue('latitude', 0);\\r\\n } else {\\r\\n AddValue('latitude', params.latitude_raw);\\r\\n }\\r\\n if (!params.longitude_raw) {\\r\\n AddValue('longitude', 0);\\r\\n } else {\\r\\n AddValue('longitude', params.longitude_raw);\\r\\n }\\r\\n // if (params.temp_bracelet){\\r\\n // AddValue('oysta_labels', 'DegC');\\r\\n // AddValue('single_column_value', params.temp_bracelet);\\r\\n // }\\r\\n }\\r\\n\\r\\n function process_invent_msg() {\\r\\n const details = JSON.parse(raw);\\r\\n // AddValue('imei', details.AppId);\\r\\n AddValue('json_in', JSON.stringify(details));\\r\\n switch (details.Command) {\\r\\n case \\\"ACTIVATE_OK\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\r\\n break;\\r\\n case \\\"ACTIVATE_FAILS\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\r\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\r\\n break;\\r\\n case \\\"APPSET\\\":\\r\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\r\\n AddConfig(configIds.Password.Password, details.Data.Password);\\r\\n break;\\r\\n case \\\"CONFIG\\\":\\r\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\r\\n break;\\r\\n case \\\"CGFBR\\\":\\r\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\r\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\r\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\r\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\r\\n let commonParam = addEscapeChar(details.Data.ComPar);\\r\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\r\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\r\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\r\\n let lteParam = addEscapeChar(details.Data.LtePar);\\r\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\r\\n let bleParam = addEscapeChar(details.Data.BlePar);\\r\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\r\\n break;\\r\\n case \\\"REBOOTB\\\":\\r\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\r\\n break;\\r\\n case \\\"PWRFB\\\":\\r\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\r\\n break;\\r\\n case \\\"RESETB\\\":\\r\\n AddConfig(configIds.Bracelet.Reset, 'true');\\r\\n break;\\r\\n case \\\"BRAPWUPDATE\\\":\\r\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\r\\n // get password from old device, then set\\r\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\r\\n )\\r\\n break;\\r\\n case \\\"NOTE\\\":\\r\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\r\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\r\\n text = text.split(\\\",\\\").join(\\\" \\\");\\r\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\r\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\r\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\r\\n AddConfig(configIds.Note.Message, value)\\r\\n break;\\r\\n }\\r\\n }\\r\\n\\r\\n function addEscapeChar(json) {\\r\\n if (json === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n let jsonStr = JSON.stringify(json);\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\r\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function changeSingleQuoteToDouble(jsonStr) {\\r\\n if (jsonStr === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\r\\n outStr = outStr + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function sendMessageToLocalhost(str) {\\r\\n if (localTesting) {\\r\\n console.log(\\\"Sending message to local host: \\\" + str);\\r\\n } else {\\r\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\r\\n var c = createConnection(5878, server); // acceptance is 5678 - protocol dev 5878 - dev is 5679 ?\\r\\n c.write(`${str}`);\\r\\n c.end();\\r\\n }\\r\\n AddValue(\\\"ToLocalhost\\\", str);\\r\\n }\\r\\n\\r\\n function createConnection(port, server) {\\r\\n c = net.createConnection(port, server);\\r\\n c.on('error', function(error) {\\r\\n c = createConnection(port, server);\\r\\n });\\r\\n return c;\\r\\n }\\r\\n\\r\\n function decrypt(encdata, password) {\\r\\n var decrypted;\\r\\n var dataarray = encdata.split(\\\";\\\");\\r\\n if (dataarray.length > 5) {\\r\\n return \\\"\\\";\\r\\n }\\r\\n var i;\\r\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\r\\n if (encdata.startsWith(\\\"ACK\\\")) {\\r\\n return encdata;\\r\\n }\\r\\n for (i = 0; i < 3; i++) {\\r\\n part1 = part1 + dataarray[i] + \\\";\\\";\\r\\n }\\r\\n var mid = dataarray[2]; // use the message ID to create the salt\\r\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n // base64 decoding and extract the iv and encrypted data\\r\\n const bData = Buffer.from(enctext, 'base64');\\r\\n const iv = bData.slice(0, 16); // initial 16 chars\\r\\n const text = bData.slice(16); // all the encrypted data\\r\\n // derive key using; 32 byte key length (from salted password and mid)\\r\\n // decrypt the data in part2 and add to part1\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\r\\n try {\\r\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\r\\n } catch (err) {\\r\\n decrypted = undefined;\\r\\n }\\r\\n return decrypted;\\r\\n }\\r\\n\\r\\n function encrypt(text, mid, password) {\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n const iv = _crypto.randomBytes(16); // random initialization vector\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n // set the cipher\\r\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\r\\n // encrypt text\\r\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\r\\n // generate output ( encrypted text )\\r\\n return Buffer.concat([iv, encrypted]).toString('base64');\\r\\n }\\r\\n\\r\\n function AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n deviceParams.push(cvpair);\\r\\n }\\r\\n\\r\\n function AddConfig(configName, newvalue) {\\r\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n var cvpair = {\\r\\n 'code': configName,\\r\\n 'value': newvalue,\\r\\n 'forced': true\\r\\n };\\r\\n configsToSend.push(cvpair);\\r\\n };\\r\\n }\\r\\n\\r\\n function isASCII(str) {\\r\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\r\\n }\\r\\n\\r\\n function LookupValue(key, type, template) {\\r\\n var cvpair = {\\r\\n key: key, // key to be lookded up\\r\\n type: type, // type of the key\\r\\n template: template // the variable the result will be mapped to\\r\\n };\\r\\n msg.KeyValue = cvpair;\\r\\n }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n module.exports = {\\r\\n execute_ops\\r\\n }\\r\\n} else { // on server use local defined vars\\r\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n // define global returns\\r\\n msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1744202957},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n // Define array to push device data into. This will be put into the msg array at the end.\\r\\n var deviceParams = [];\\r\\n var configsToSend = [];\\r\\n var tasks = [];\\r\\n msg = {};\\r\\n const _crypto = require('crypto');\\r\\n // handle ACK\\r\\n if (messageTypeCode == \\\"ACK\\\") {\\r\\n return \\\"\\\";\\r\\n }\\r\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\r\\n var password;\\r\\n if (params.imei == \\\"null\\\") {\\r\\n return msg;\\r\\n }\\r\\n password = params.imei;\\r\\n if (configs.Password.Password === \\\"\\\") {\\r\\n // use imei as default password when not specified\\r\\n } else {\\r\\n // use the password\\r\\n password = configs.Password.Password\\r\\n }\\r\\n let message = decrypt(raw, password);\\r\\n if (message) {\\r\\n // send message internally\\r\\n sendMessageToLocalhost(message);\\r\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n } else {\\r\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n }\\r\\n } else { // General Oysta Template\\r\\n switch (messageTypeLocalCode) {\\r\\n case (\\\"COMM\\\"):\\r\\n process_invent_msg(); //incoming invent commands\\r\\n break;\\r\\n case (\\\"MACB\\\"):\\r\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\r\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\r\\n add_params_to_output();\\r\\n break;\\r\\n case \\\"INFO-GETPWB\\\": // handle GETPWB message\\r\\n //let imei = params.bracelet_imei; // not actually needed ?\\r\\n //let mac = params.BLEMAC; // not actually needed ?\\r\\n AddValue(\\\"mac\\\", params.ble_mac);\\r\\n //AddValue(\\\"key\\\", params.key);\\r\\n console.log(\\\"mac: \\\" + params.ble_mac);\\r\\n let BraceletPW = \\\"\\\"; // until we set it from query below\\r\\n // if(params.bracelet_imei){\\r\\n // if(serverParams.Password){\\r\\n // BraceletPW = serverParams.Password; // query key value table\\r\\n // console.log(BraceletPW); // print for testing reasons\\r\\n // AddConfig(configIds.DeviceConfig.BraceletPW, BraceletPW);//this to return the value\\r\\n // }\\r\\n // }\\r\\n // else {\\r\\n // //return error\\r\\n // }\\r\\n //AddValue(\\\"password\\\", \\\"myNewPassword\\\");\\r\\n //LookupValue(params.ble_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n LookupValue(\\\"mac\\\", \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n if (deviceParams.length > 0) {\\r\\n msg.values = deviceParams\\r\\n };\\r\\n console.log(msg);\\r\\n break;\\r\\n case (\\\"REGISTER\\\"):\\r\\n let ble_mac = params.ble_mac;\\r\\n let iccid = params.iccid;\\r\\n // write values to readonly settings\\r\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\r\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\r\\n // will automtaically Activate on Acceptance\\r\\n if (serverParams.EnvName) {\\r\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\r\\n }\\r\\n }\\r\\n break;\\r\\n case (\\\"CREATE\\\"):\\r\\n // temp fix to filter old messages\\r\\n // const cutoff = 1707523200000; //10.2.2024\\r\\n // let message_id_time = parseInt(params.count_number, 36);\\r\\n // if (message_id_time > cutoff){\\r\\n let c_ble_mac = params.ble_mac;\\r\\n let c_iccid = params.iccid;\\r\\n let new_imei = params.new_imei;\\r\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\r\\n // sendMessageToLocalhost(c_message); \\r\\n tasks = [{\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"sync\\\",\\r\\n \\\"type\\\": \\\"createDevice\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"imei\\\": new_imei,\\r\\n \\\"abortOnError\\\": false,\\r\\n \\\"init\\\": true\\r\\n }),\\r\\n \\\"order\\\": 1\\r\\n }, {\\r\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"async\\\",\\r\\n \\\"type\\\": \\\"sendMessage\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"message\\\": c_message\\r\\n }),\\r\\n \\\"order\\\": 2\\r\\n }]\\r\\n // }\\r\\n break;\\r\\n case (\\\"ALLDATA\\\"):\\r\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\r\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\r\\n let all_data = JSON.parse(json_str);\\r\\n if (\\\"version\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\r\\n };\\r\\n break;\\r\\n default:\\r\\n // all other general messages\\r\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\r\\n add_params_to_output();\\r\\n }\\r\\n // add messagetTypeLocal to output for templates\\r\\n AddValue('local_message_type', messageTypeLocalCode);\\r\\n }\\r\\n var msg = {\\r\\n 'values': deviceParams,\\r\\n };\\r\\n if (configsToSend.length > 0) {\\r\\n msg.configsToSend = configsToSend\\r\\n };\\r\\n if (tasks.length > 0) {\\r\\n msg.tasks = tasks\\r\\n };\\r\\n // commit values to receiver processor\\r\\n console.log(msg);\\r\\n // modify to return the object that contains your data\\r\\n return msg;\\r\\n\\r\\n function add_params_to_output() {\\r\\n if (!params.raw_accuracy) {\\r\\n AddValue('location_accuracy', 9000);\\r\\n } else {\\r\\n AddValue('location_accuracy', params.raw_accuracy);\\r\\n }\\r\\n // generate timestamps if they don't exist\\r\\n if (!params.event_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n if (!params.location_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n //if no lat and long are given, set them to 0, 0\\r\\n if (!params.latitude_raw) {\\r\\n AddValue('latitude', 0);\\r\\n } else {\\r\\n AddValue('latitude', params.latitude_raw);\\r\\n }\\r\\n if (!params.longitude_raw) {\\r\\n AddValue('longitude', 0);\\r\\n } else {\\r\\n AddValue('longitude', params.longitude_raw);\\r\\n }\\r\\n // if (params.temp_bracelet){\\r\\n // AddValue('oysta_labels', 'DegC');\\r\\n // AddValue('single_column_value', params.temp_bracelet);\\r\\n // }\\r\\n }\\r\\n\\r\\n function process_invent_msg() {\\r\\n const details = JSON.parse(raw);\\r\\n // AddValue('imei', details.AppId);\\r\\n AddValue('json_in', JSON.stringify(details));\\r\\n switch (details.Command) {\\r\\n case \\\"ACTIVATE_OK\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\r\\n break;\\r\\n case \\\"ACTIVATE_FAILS\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\r\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\r\\n break;\\r\\n case \\\"APPSET\\\":\\r\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\r\\n AddConfig(configIds.Password.Password, details.Data.Password);\\r\\n break;\\r\\n case \\\"CONFIG\\\":\\r\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\r\\n break;\\r\\n case \\\"CGFBR\\\":\\r\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\r\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\r\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\r\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\r\\n let commonParam = addEscapeChar(details.Data.ComPar);\\r\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\r\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\r\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\r\\n let lteParam = addEscapeChar(details.Data.LtePar);\\r\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\r\\n let bleParam = addEscapeChar(details.Data.BlePar);\\r\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\r\\n break;\\r\\n case \\\"REBOOTB\\\":\\r\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\r\\n break;\\r\\n case \\\"PWRFB\\\":\\r\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\r\\n break;\\r\\n case \\\"RESETB\\\":\\r\\n AddConfig(configIds.Bracelet.Reset, 'true');\\r\\n break;\\r\\n case \\\"BRAPWUPDATE\\\":\\r\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\r\\n // get password from old device, then set\\r\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\r\\n )\\r\\n break;\\r\\n case \\\"NOTE\\\":\\r\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\r\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\r\\n text = text.split(\\\",\\\").join(\\\" \\\");\\r\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\r\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\r\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\r\\n AddConfig(configIds.Note.Message, value)\\r\\n break;\\r\\n }\\r\\n }\\r\\n\\r\\n function addEscapeChar(json) {\\r\\n if (json === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n let jsonStr = JSON.stringify(json);\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\r\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function changeSingleQuoteToDouble(jsonStr) {\\r\\n if (jsonStr === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\r\\n outStr = outStr + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function sendMessageToLocalhost(str) {\\r\\n if (localTesting) {\\r\\n console.log(\\\"Sending message to local host: \\\" + str);\\r\\n } else {\\r\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\r\\n var c = createConnection(5878, server); // acceptance is 5678 - protocol dev 5878 - dev is 5679 ?\\r\\n c.write(`${str}`);\\r\\n c.end();\\r\\n }\\r\\n AddValue(\\\"ToLocalhost\\\", str);\\r\\n }\\r\\n\\r\\n function createConnection(port, server) {\\r\\n c = net.createConnection(port, server);\\r\\n c.on('error', function(error) {\\r\\n c = createConnection(port, server);\\r\\n });\\r\\n return c;\\r\\n }\\r\\n\\r\\n function decrypt(encdata, password) {\\r\\n var decrypted;\\r\\n var dataarray = encdata.split(\\\";\\\");\\r\\n if (dataarray.length > 5) {\\r\\n return \\\"\\\";\\r\\n }\\r\\n var i;\\r\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\r\\n if (encdata.startsWith(\\\"ACK\\\")) {\\r\\n return encdata;\\r\\n }\\r\\n for (i = 0; i < 3; i++) {\\r\\n part1 = part1 + dataarray[i] + \\\";\\\";\\r\\n }\\r\\n var mid = dataarray[2]; // use the message ID to create the salt\\r\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n // base64 decoding and extract the iv and encrypted data\\r\\n const bData = Buffer.from(enctext, 'base64');\\r\\n const iv = bData.slice(0, 16); // initial 16 chars\\r\\n const text = bData.slice(16); // all the encrypted data\\r\\n // derive key using; 32 byte key length (from salted password and mid)\\r\\n // decrypt the data in part2 and add to part1\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\r\\n try {\\r\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\r\\n } catch (err) {\\r\\n decrypted = undefined;\\r\\n }\\r\\n return decrypted;\\r\\n }\\r\\n\\r\\n function encrypt(text, mid, password) {\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n const iv = _crypto.randomBytes(16); // random initialization vector\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n // set the cipher\\r\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\r\\n // encrypt text\\r\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\r\\n // generate output ( encrypted text )\\r\\n return Buffer.concat([iv, encrypted]).toString('base64');\\r\\n }\\r\\n\\r\\n function AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n deviceParams.push(cvpair);\\r\\n }\\r\\n\\r\\n function AddConfig(configName, newvalue) {\\r\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n var cvpair = {\\r\\n 'code': configName,\\r\\n 'value': newvalue,\\r\\n 'forced': true\\r\\n };\\r\\n configsToSend.push(cvpair);\\r\\n };\\r\\n }\\r\\n\\r\\n function isASCII(str) {\\r\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\r\\n }\\r\\n\\r\\n function LookupValue(key, type, template) {\\r\\n var cvpair = {\\r\\n key: key, // key to be lookded up\\r\\n type: type, // type of the key\\r\\n template: template // the variable the result will be mapped to\\r\\n };\\r\\n msg.KeyValue = cvpair;\\r\\n }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n module.exports = {\\r\\n execute_ops\\r\\n }\\r\\n} else { // on server use local defined vars\\r\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n // define global returns\\r\\n msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1744203728},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n // Define array to push device data into. This will be put into the msg array at the end.\\r\\n var deviceParams = [];\\r\\n var configsToSend = [];\\r\\n var tasks = [];\\r\\n msg = {};\\r\\n const _crypto = require('crypto');\\r\\n // handle ACK\\r\\n if (messageTypeCode == \\\"ACK\\\") {\\r\\n return \\\"\\\";\\r\\n }\\r\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\r\\n var password;\\r\\n if (params.imei == \\\"null\\\") {\\r\\n return msg;\\r\\n }\\r\\n password = params.imei;\\r\\n if (configs.Password.Password === \\\"\\\") {\\r\\n // use imei as default password when not specified\\r\\n } else {\\r\\n // use the password\\r\\n password = configs.Password.Password\\r\\n }\\r\\n let message = decrypt(raw, password);\\r\\n if (message) {\\r\\n // send message internally\\r\\n sendMessageToLocalhost(message);\\r\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n } else {\\r\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n }\\r\\n } else { // General Oysta Template\\r\\n switch (messageTypeLocalCode) {\\r\\n case (\\\"COMM\\\"):\\r\\n process_invent_msg(); //incoming invent commands\\r\\n break;\\r\\n case (\\\"MACB\\\"):\\r\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\r\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\r\\n add_params_to_output();\\r\\n break;\\r\\n case \\\"INFO-GETPWB\\\": // handle GETPWB message\\r\\n //let imei = params.bracelet_imei; // not actually needed ?\\r\\n //let mac = params.BLEMAC; // not actually needed ?\\r\\n AddValue(\\\"mac\\\", params.bracelet_mac);\\r\\n //AddValue(\\\"key\\\", params.key);\\r\\n console.log(\\\"mac: \\\" + params.bracelet_mac);\\r\\n let BraceletPW = \\\"\\\"; // until we set it from query below\\r\\n // if(params.bracelet_imei){\\r\\n // if(serverParams.Password){\\r\\n // BraceletPW = serverParams.Password; // query key value table\\r\\n // console.log(BraceletPW); // print for testing reasons\\r\\n // AddConfig(configIds.DeviceConfig.BraceletPW, BraceletPW);//this to return the value\\r\\n // }\\r\\n // }\\r\\n // else {\\r\\n // //return error\\r\\n // }\\r\\n //AddValue(\\\"password\\\", \\\"myNewPassword\\\");\\r\\n //LookupValue(params.ble_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n LookupValue(\\\"mac\\\", \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n if (deviceParams.length > 0) {\\r\\n msg.values = deviceParams\\r\\n };\\r\\n console.log(msg);\\r\\n break;\\r\\n case (\\\"REGISTER\\\"):\\r\\n let ble_mac = params.ble_mac;\\r\\n let iccid = params.iccid;\\r\\n // write values to readonly settings\\r\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\r\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\r\\n // will automtaically Activate on Acceptance\\r\\n if (serverParams.EnvName) {\\r\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\r\\n }\\r\\n }\\r\\n break;\\r\\n case (\\\"CREATE\\\"):\\r\\n // temp fix to filter old messages\\r\\n // const cutoff = 1707523200000; //10.2.2024\\r\\n // let message_id_time = parseInt(params.count_number, 36);\\r\\n // if (message_id_time > cutoff){\\r\\n let c_ble_mac = params.ble_mac;\\r\\n let c_iccid = params.iccid;\\r\\n let new_imei = params.new_imei;\\r\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\r\\n // sendMessageToLocalhost(c_message); \\r\\n tasks = [{\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"sync\\\",\\r\\n \\\"type\\\": \\\"createDevice\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"imei\\\": new_imei,\\r\\n \\\"abortOnError\\\": false,\\r\\n \\\"init\\\": true\\r\\n }),\\r\\n \\\"order\\\": 1\\r\\n }, {\\r\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"async\\\",\\r\\n \\\"type\\\": \\\"sendMessage\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"message\\\": c_message\\r\\n }),\\r\\n \\\"order\\\": 2\\r\\n }]\\r\\n // }\\r\\n break;\\r\\n case (\\\"ALLDATA\\\"):\\r\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\r\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\r\\n let all_data = JSON.parse(json_str);\\r\\n if (\\\"version\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\r\\n };\\r\\n break;\\r\\n default:\\r\\n // all other general messages\\r\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\r\\n add_params_to_output();\\r\\n }\\r\\n // add messagetTypeLocal to output for templates\\r\\n AddValue('local_message_type', messageTypeLocalCode);\\r\\n }\\r\\n var msg = {\\r\\n 'values': deviceParams,\\r\\n };\\r\\n if (configsToSend.length > 0) {\\r\\n msg.configsToSend = configsToSend\\r\\n };\\r\\n if (tasks.length > 0) {\\r\\n msg.tasks = tasks\\r\\n };\\r\\n // commit values to receiver processor\\r\\n console.log(msg);\\r\\n // modify to return the object that contains your data\\r\\n return msg;\\r\\n\\r\\n function add_params_to_output() {\\r\\n if (!params.raw_accuracy) {\\r\\n AddValue('location_accuracy', 9000);\\r\\n } else {\\r\\n AddValue('location_accuracy', params.raw_accuracy);\\r\\n }\\r\\n // generate timestamps if they don't exist\\r\\n if (!params.event_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n if (!params.location_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n //if no lat and long are given, set them to 0, 0\\r\\n if (!params.latitude_raw) {\\r\\n AddValue('latitude', 0);\\r\\n } else {\\r\\n AddValue('latitude', params.latitude_raw);\\r\\n }\\r\\n if (!params.longitude_raw) {\\r\\n AddValue('longitude', 0);\\r\\n } else {\\r\\n AddValue('longitude', params.longitude_raw);\\r\\n }\\r\\n // if (params.temp_bracelet){\\r\\n // AddValue('oysta_labels', 'DegC');\\r\\n // AddValue('single_column_value', params.temp_bracelet);\\r\\n // }\\r\\n }\\r\\n\\r\\n function process_invent_msg() {\\r\\n const details = JSON.parse(raw);\\r\\n // AddValue('imei', details.AppId);\\r\\n AddValue('json_in', JSON.stringify(details));\\r\\n switch (details.Command) {\\r\\n case \\\"ACTIVATE_OK\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\r\\n break;\\r\\n case \\\"ACTIVATE_FAILS\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\r\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\r\\n break;\\r\\n case \\\"APPSET\\\":\\r\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\r\\n AddConfig(configIds.Password.Password, details.Data.Password);\\r\\n break;\\r\\n case \\\"CONFIG\\\":\\r\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\r\\n break;\\r\\n case \\\"CGFBR\\\":\\r\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\r\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\r\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\r\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\r\\n let commonParam = addEscapeChar(details.Data.ComPar);\\r\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\r\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\r\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\r\\n let lteParam = addEscapeChar(details.Data.LtePar);\\r\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\r\\n let bleParam = addEscapeChar(details.Data.BlePar);\\r\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\r\\n break;\\r\\n case \\\"REBOOTB\\\":\\r\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\r\\n break;\\r\\n case \\\"PWRFB\\\":\\r\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\r\\n break;\\r\\n case \\\"RESETB\\\":\\r\\n AddConfig(configIds.Bracelet.Reset, 'true');\\r\\n break;\\r\\n case \\\"BRAPWUPDATE\\\":\\r\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\r\\n // get password from old device, then set\\r\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\r\\n )\\r\\n break;\\r\\n case \\\"NOTE\\\":\\r\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\r\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\r\\n text = text.split(\\\",\\\").join(\\\" \\\");\\r\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\r\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\r\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\r\\n AddConfig(configIds.Note.Message, value)\\r\\n break;\\r\\n }\\r\\n }\\r\\n\\r\\n function addEscapeChar(json) {\\r\\n if (json === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n let jsonStr = JSON.stringify(json);\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\r\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function changeSingleQuoteToDouble(jsonStr) {\\r\\n if (jsonStr === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\r\\n outStr = outStr + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function sendMessageToLocalhost(str) {\\r\\n if (localTesting) {\\r\\n console.log(\\\"Sending message to local host: \\\" + str);\\r\\n } else {\\r\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\r\\n var c = createConnection(5878, server); // acceptance is 5678 - protocol dev 5878 - dev is 5679 ?\\r\\n c.write(`${str}`);\\r\\n c.end();\\r\\n }\\r\\n AddValue(\\\"ToLocalhost\\\", str);\\r\\n }\\r\\n\\r\\n function createConnection(port, server) {\\r\\n c = net.createConnection(port, server);\\r\\n c.on('error', function(error) {\\r\\n c = createConnection(port, server);\\r\\n });\\r\\n return c;\\r\\n }\\r\\n\\r\\n function decrypt(encdata, password) {\\r\\n var decrypted;\\r\\n var dataarray = encdata.split(\\\";\\\");\\r\\n if (dataarray.length > 5) {\\r\\n return \\\"\\\";\\r\\n }\\r\\n var i;\\r\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\r\\n if (encdata.startsWith(\\\"ACK\\\")) {\\r\\n return encdata;\\r\\n }\\r\\n for (i = 0; i < 3; i++) {\\r\\n part1 = part1 + dataarray[i] + \\\";\\\";\\r\\n }\\r\\n var mid = dataarray[2]; // use the message ID to create the salt\\r\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n // base64 decoding and extract the iv and encrypted data\\r\\n const bData = Buffer.from(enctext, 'base64');\\r\\n const iv = bData.slice(0, 16); // initial 16 chars\\r\\n const text = bData.slice(16); // all the encrypted data\\r\\n // derive key using; 32 byte key length (from salted password and mid)\\r\\n // decrypt the data in part2 and add to part1\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\r\\n try {\\r\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\r\\n } catch (err) {\\r\\n decrypted = undefined;\\r\\n }\\r\\n return decrypted;\\r\\n }\\r\\n\\r\\n function encrypt(text, mid, password) {\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n const iv = _crypto.randomBytes(16); // random initialization vector\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n // set the cipher\\r\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\r\\n // encrypt text\\r\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\r\\n // generate output ( encrypted text )\\r\\n return Buffer.concat([iv, encrypted]).toString('base64');\\r\\n }\\r\\n\\r\\n function AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n deviceParams.push(cvpair);\\r\\n }\\r\\n\\r\\n function AddConfig(configName, newvalue) {\\r\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n var cvpair = {\\r\\n 'code': configName,\\r\\n 'value': newvalue,\\r\\n 'forced': true\\r\\n };\\r\\n configsToSend.push(cvpair);\\r\\n };\\r\\n }\\r\\n\\r\\n function isASCII(str) {\\r\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\r\\n }\\r\\n\\r\\n function LookupValue(key, type, template) {\\r\\n var cvpair = {\\r\\n key: key, // key to be lookded up\\r\\n type: type, // type of the key\\r\\n template: template // the variable the result will be mapped to\\r\\n };\\r\\n msg.KeyValue = cvpair;\\r\\n }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n module.exports = {\\r\\n execute_ops\\r\\n }\\r\\n} else { // on server use local defined vars\\r\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n // define global returns\\r\\n msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1744203822},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n // Define array to push device data into. This will be put into the msg array at the end.\\r\\n var deviceParams = [];\\r\\n var configsToSend = [];\\r\\n var tasks = [];\\r\\n const _crypto = require('crypto');\\r\\n // handle ACK\\r\\n if (messageTypeCode == \\\"ACK\\\") {\\r\\n return \\\"\\\";\\r\\n }\\r\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\r\\n var password;\\r\\n if (params.imei == \\\"null\\\") {\\r\\n return msg;\\r\\n }\\r\\n password = params.imei;\\r\\n if (configs.Password.Password === \\\"\\\") {\\r\\n // use imei as default password when not specified\\r\\n } else {\\r\\n // use the password\\r\\n password = configs.Password.Password\\r\\n }\\r\\n let message = decrypt(raw, password);\\r\\n if (message) {\\r\\n // send message internally\\r\\n sendMessageToLocalhost(message);\\r\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n } else {\\r\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n }\\r\\n } else { // General Oysta Template\\r\\n switch (messageTypeLocalCode) {\\r\\n case (\\\"COMM\\\"):\\r\\n process_invent_msg(); //incoming invent commands\\r\\n break;\\r\\n case (\\\"MACB\\\"):\\r\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\r\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\r\\n add_params_to_output();\\r\\n break;\\r\\n case \\\"INFO-GETPWB\\\": // handle GETPWB message\\r\\n //let imei = params.bracelet_imei; // not actually needed ?\\r\\n //let mac = params.BLEMAC; // not actually needed ?\\r\\n AddValue(\\\"mac\\\", params.bracelet_mac);\\r\\n //AddValue(\\\"key\\\", params.key);\\r\\n console.log(\\\"mac: \\\" + params.bracelet_mac);\\r\\n let BraceletPW = \\\"\\\"; // until we set it from query below\\r\\n // if(params.bracelet_imei){\\r\\n // if(serverParams.Password){\\r\\n // BraceletPW = serverParams.Password; // query key value table\\r\\n // console.log(BraceletPW); // print for testing reasons\\r\\n // AddConfig(configIds.DeviceConfig.BraceletPW, BraceletPW);//this to return the value\\r\\n // }\\r\\n // }\\r\\n // else {\\r\\n // //return error\\r\\n // }\\r\\n //AddValue(\\\"password\\\", \\\"myNewPassword\\\");\\r\\n //LookupValue(params.ble_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n LookupValue(params.bracelet_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n break;\\r\\n case (\\\"REGISTER\\\"):\\r\\n let ble_mac = params.ble_mac;\\r\\n let iccid = params.iccid;\\r\\n // write values to readonly settings\\r\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\r\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\r\\n // will automtaically Activate on Acceptance\\r\\n if (serverParams.EnvName) {\\r\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\r\\n }\\r\\n }\\r\\n break;\\r\\n case (\\\"CREATE\\\"):\\r\\n // temp fix to filter old messages\\r\\n // const cutoff = 1707523200000; //10.2.2024\\r\\n // let message_id_time = parseInt(params.count_number, 36);\\r\\n // if (message_id_time > cutoff){\\r\\n let c_ble_mac = params.ble_mac;\\r\\n let c_iccid = params.iccid;\\r\\n let new_imei = params.new_imei;\\r\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\r\\n // sendMessageToLocalhost(c_message); \\r\\n tasks = [{\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"sync\\\",\\r\\n \\\"type\\\": \\\"createDevice\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"imei\\\": new_imei,\\r\\n \\\"abortOnError\\\": false,\\r\\n \\\"init\\\": true\\r\\n }),\\r\\n \\\"order\\\": 1\\r\\n }, {\\r\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"async\\\",\\r\\n \\\"type\\\": \\\"sendMessage\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"message\\\": c_message\\r\\n }),\\r\\n \\\"order\\\": 2\\r\\n }]\\r\\n // }\\r\\n break;\\r\\n case (\\\"ALLDATA\\\"):\\r\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\r\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\r\\n let all_data = JSON.parse(json_str);\\r\\n if (\\\"version\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\r\\n };\\r\\n break;\\r\\n default:\\r\\n // all other general messages\\r\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\r\\n add_params_to_output();\\r\\n }\\r\\n // add messagetTypeLocal to output for templates\\r\\n AddValue('local_message_type', messageTypeLocalCode);\\r\\n }\\r\\n var msg = {\\r\\n 'values': deviceParams,\\r\\n };\\r\\n console.log(msg);\\r\\n if (configsToSend.length > 0) {\\r\\n msg.configsToSend = configsToSend\\r\\n };\\r\\n if (tasks.length > 0) {\\r\\n msg.tasks = tasks\\r\\n };\\r\\n // commit values to receiver processor\\r\\n console.log(msg);\\r\\n // modify to return the object that contains your data\\r\\n return msg;\\r\\n\\r\\n function add_params_to_output() {\\r\\n if (!params.raw_accuracy) {\\r\\n AddValue('location_accuracy', 9000);\\r\\n } else {\\r\\n AddValue('location_accuracy', params.raw_accuracy);\\r\\n }\\r\\n // generate timestamps if they don't exist\\r\\n if (!params.event_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n if (!params.location_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n //if no lat and long are given, set them to 0, 0\\r\\n if (!params.latitude_raw) {\\r\\n AddValue('latitude', 0);\\r\\n } else {\\r\\n AddValue('latitude', params.latitude_raw);\\r\\n }\\r\\n if (!params.longitude_raw) {\\r\\n AddValue('longitude', 0);\\r\\n } else {\\r\\n AddValue('longitude', params.longitude_raw);\\r\\n }\\r\\n // if (params.temp_bracelet){\\r\\n // AddValue('oysta_labels', 'DegC');\\r\\n // AddValue('single_column_value', params.temp_bracelet);\\r\\n // }\\r\\n }\\r\\n\\r\\n function process_invent_msg() {\\r\\n const details = JSON.parse(raw);\\r\\n // AddValue('imei', details.AppId);\\r\\n AddValue('json_in', JSON.stringify(details));\\r\\n switch (details.Command) {\\r\\n case \\\"ACTIVATE_OK\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\r\\n break;\\r\\n case \\\"ACTIVATE_FAILS\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\r\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\r\\n break;\\r\\n case \\\"APPSET\\\":\\r\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\r\\n AddConfig(configIds.Password.Password, details.Data.Password);\\r\\n break;\\r\\n case \\\"CONFIG\\\":\\r\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\r\\n break;\\r\\n case \\\"CGFBR\\\":\\r\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\r\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\r\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\r\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\r\\n let commonParam = addEscapeChar(details.Data.ComPar);\\r\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\r\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\r\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\r\\n let lteParam = addEscapeChar(details.Data.LtePar);\\r\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\r\\n let bleParam = addEscapeChar(details.Data.BlePar);\\r\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\r\\n break;\\r\\n case \\\"REBOOTB\\\":\\r\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\r\\n break;\\r\\n case \\\"PWRFB\\\":\\r\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\r\\n break;\\r\\n case \\\"RESETB\\\":\\r\\n AddConfig(configIds.Bracelet.Reset, 'true');\\r\\n break;\\r\\n case \\\"BRAPWUPDATE\\\":\\r\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\r\\n // get password from old device, then set\\r\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\r\\n )\\r\\n break;\\r\\n case \\\"NOTE\\\":\\r\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\r\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\r\\n text = text.split(\\\",\\\").join(\\\" \\\");\\r\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\r\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\r\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\r\\n AddConfig(configIds.Note.Message, value)\\r\\n break;\\r\\n }\\r\\n }\\r\\n\\r\\n function addEscapeChar(json) {\\r\\n if (json === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n let jsonStr = JSON.stringify(json);\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\r\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function changeSingleQuoteToDouble(jsonStr) {\\r\\n if (jsonStr === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\r\\n outStr = outStr + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function sendMessageToLocalhost(str) {\\r\\n if (localTesting) {\\r\\n console.log(\\\"Sending message to local host: \\\" + str);\\r\\n } else {\\r\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\r\\n var c = createConnection(5878, server); // acceptance is 5678 - protocol dev 5878 - dev is 5679 ?\\r\\n c.write(`${str}`);\\r\\n c.end();\\r\\n }\\r\\n AddValue(\\\"ToLocalhost\\\", str);\\r\\n }\\r\\n\\r\\n function createConnection(port, server) {\\r\\n c = net.createConnection(port, server);\\r\\n c.on('error', function(error) {\\r\\n c = createConnection(port, server);\\r\\n });\\r\\n return c;\\r\\n }\\r\\n\\r\\n function decrypt(encdata, password) {\\r\\n var decrypted;\\r\\n var dataarray = encdata.split(\\\";\\\");\\r\\n if (dataarray.length > 5) {\\r\\n return \\\"\\\";\\r\\n }\\r\\n var i;\\r\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\r\\n if (encdata.startsWith(\\\"ACK\\\")) {\\r\\n return encdata;\\r\\n }\\r\\n for (i = 0; i < 3; i++) {\\r\\n part1 = part1 + dataarray[i] + \\\";\\\";\\r\\n }\\r\\n var mid = dataarray[2]; // use the message ID to create the salt\\r\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n // base64 decoding and extract the iv and encrypted data\\r\\n const bData = Buffer.from(enctext, 'base64');\\r\\n const iv = bData.slice(0, 16); // initial 16 chars\\r\\n const text = bData.slice(16); // all the encrypted data\\r\\n // derive key using; 32 byte key length (from salted password and mid)\\r\\n // decrypt the data in part2 and add to part1\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\r\\n try {\\r\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\r\\n } catch (err) {\\r\\n decrypted = undefined;\\r\\n }\\r\\n return decrypted;\\r\\n }\\r\\n\\r\\n function encrypt(text, mid, password) {\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n const iv = _crypto.randomBytes(16); // random initialization vector\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n // set the cipher\\r\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\r\\n // encrypt text\\r\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\r\\n // generate output ( encrypted text )\\r\\n return Buffer.concat([iv, encrypted]).toString('base64');\\r\\n }\\r\\n\\r\\n function AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n deviceParams.push(cvpair);\\r\\n }\\r\\n\\r\\n function AddConfig(configName, newvalue) {\\r\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n var cvpair = {\\r\\n 'code': configName,\\r\\n 'value': newvalue,\\r\\n 'forced': true\\r\\n };\\r\\n configsToSend.push(cvpair);\\r\\n };\\r\\n }\\r\\n\\r\\n function isASCII(str) {\\r\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\r\\n }\\r\\n\\r\\n function LookupValue(key, type, template) {\\r\\n var cvpair = {\\r\\n key: key, // key to be lookded up\\r\\n type: type, // type of the key\\r\\n template: template // the variable the result will be mapped to\\r\\n };\\r\\n msg.KeyValue = cvpair;\\r\\n }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n module.exports = {\\r\\n execute_ops\\r\\n }\\r\\n} else { // on server use local defined vars\\r\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n // define global returns\\r\\n msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1744204411},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n // Define array to push device data into. This will be put into the msg array at the end.\\r\\n var deviceParams = [];\\r\\n var configsToSend = [];\\r\\n var tasks = [];\\r\\n const _crypto = require('crypto');\\r\\n // handle ACK\\r\\n if (messageTypeCode == \\\"ACK\\\") {\\r\\n return \\\"\\\";\\r\\n }\\r\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\r\\n var password;\\r\\n if (params.imei == \\\"null\\\") {\\r\\n return msg;\\r\\n }\\r\\n password = params.imei;\\r\\n if (configs.Password.Password === \\\"\\\") {\\r\\n // use imei as default password when not specified\\r\\n } else {\\r\\n // use the password\\r\\n password = configs.Password.Password\\r\\n }\\r\\n let message = decrypt(raw, password);\\r\\n if (message) {\\r\\n // send message internally\\r\\n sendMessageToLocalhost(message);\\r\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n } else {\\r\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n }\\r\\n } else { // General Oysta Template\\r\\n switch (messageTypeLocalCode) {\\r\\n case (\\\"COMM\\\"):\\r\\n process_invent_msg(); //incoming invent commands\\r\\n break;\\r\\n case (\\\"MACB\\\"):\\r\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\r\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\r\\n add_params_to_output();\\r\\n break;\\r\\n case \\\"INFO-GETPWB\\\": // handle GETPWB message\\r\\n //let imei = params.bracelet_imei; // not actually needed ?\\r\\n //let mac = params.BLEMAC; // not actually needed ?\\r\\n //AddValue(\\\"mac\\\", params.bracelet_mac);\\r\\n //AddValue(\\\"key\\\", params.key);\\r\\n //console.log(\\\"mac: \\\" + params.bracelet_mac);\\r\\n let BraceletPW = \\\"\\\"; // until we set it from query below\\r\\n // if(params.bracelet_imei){\\r\\n // if(serverParams.Password){\\r\\n // BraceletPW = serverParams.Password; // query key value table\\r\\n // console.log(BraceletPW); // print for testing reasons\\r\\n // AddConfig(configIds.DeviceConfig.BraceletPW, BraceletPW);//this to return the value\\r\\n // }\\r\\n // }\\r\\n // else {\\r\\n // //return error\\r\\n // }\\r\\n //AddValue(\\\"password\\\", \\\"myNewPassword\\\");\\r\\n //LookupValue(params.ble_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n LookupValue(params.bracelet_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n break;\\r\\n case (\\\"REGISTER\\\"):\\r\\n let ble_mac = params.ble_mac;\\r\\n let iccid = params.iccid;\\r\\n // write values to readonly settings\\r\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\r\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\r\\n // will automtaically Activate on Acceptance\\r\\n if (serverParams.EnvName) {\\r\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\r\\n }\\r\\n }\\r\\n break;\\r\\n case (\\\"CREATE\\\"):\\r\\n // temp fix to filter old messages\\r\\n // const cutoff = 1707523200000; //10.2.2024\\r\\n // let message_id_time = parseInt(params.count_number, 36);\\r\\n // if (message_id_time > cutoff){\\r\\n let c_ble_mac = params.ble_mac;\\r\\n let c_iccid = params.iccid;\\r\\n let new_imei = params.new_imei;\\r\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\r\\n // sendMessageToLocalhost(c_message); \\r\\n tasks = [{\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"sync\\\",\\r\\n \\\"type\\\": \\\"createDevice\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"imei\\\": new_imei,\\r\\n \\\"abortOnError\\\": false,\\r\\n \\\"init\\\": true\\r\\n }),\\r\\n \\\"order\\\": 1\\r\\n }, {\\r\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"async\\\",\\r\\n \\\"type\\\": \\\"sendMessage\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"message\\\": c_message\\r\\n }),\\r\\n \\\"order\\\": 2\\r\\n }]\\r\\n // }\\r\\n break;\\r\\n case (\\\"ALLDATA\\\"):\\r\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\r\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\r\\n let all_data = JSON.parse(json_str);\\r\\n if (\\\"version\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\r\\n };\\r\\n break;\\r\\n default:\\r\\n // all other general messages\\r\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\r\\n add_params_to_output();\\r\\n }\\r\\n // add messagetTypeLocal to output for templates\\r\\n AddValue('local_message_type', messageTypeLocalCode);\\r\\n }\\r\\n var msg = {\\r\\n 'values': deviceParams,\\r\\n };\\r\\n\\r\\n function LookupValue(key, type, template) {\\r\\n var cvpair = {\\r\\n key: key, // key to be lookded up\\r\\n type: type, // type of the key\\r\\n template: template // the variable the result will be mapped to\\r\\n };\\r\\n msg.KeyValue = cvpair;\\r\\n }\\r\\n if (configsToSend.length > 0) {\\r\\n msg.configsToSend = configsToSend\\r\\n };\\r\\n if (tasks.length > 0) {\\r\\n msg.tasks = tasks\\r\\n };\\r\\n // commit values to receiver processor\\r\\n console.log(msg);\\r\\n // modify to return the object that contains your data\\r\\n return msg;\\r\\n\\r\\n function add_params_to_output() {\\r\\n if (!params.raw_accuracy) {\\r\\n AddValue('location_accuracy', 9000);\\r\\n } else {\\r\\n AddValue('location_accuracy', params.raw_accuracy);\\r\\n }\\r\\n // generate timestamps if they don't exist\\r\\n if (!params.event_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n if (!params.location_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n //if no lat and long are given, set them to 0, 0\\r\\n if (!params.latitude_raw) {\\r\\n AddValue('latitude', 0);\\r\\n } else {\\r\\n AddValue('latitude', params.latitude_raw);\\r\\n }\\r\\n if (!params.longitude_raw) {\\r\\n AddValue('longitude', 0);\\r\\n } else {\\r\\n AddValue('longitude', params.longitude_raw);\\r\\n }\\r\\n // if (params.temp_bracelet){\\r\\n // AddValue('oysta_labels', 'DegC');\\r\\n // AddValue('single_column_value', params.temp_bracelet);\\r\\n // }\\r\\n }\\r\\n\\r\\n function process_invent_msg() {\\r\\n const details = JSON.parse(raw);\\r\\n // AddValue('imei', details.AppId);\\r\\n AddValue('json_in', JSON.stringify(details));\\r\\n switch (details.Command) {\\r\\n case \\\"ACTIVATE_OK\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\r\\n break;\\r\\n case \\\"ACTIVATE_FAILS\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\r\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\r\\n break;\\r\\n case \\\"APPSET\\\":\\r\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\r\\n AddConfig(configIds.Password.Password, details.Data.Password);\\r\\n break;\\r\\n case \\\"CONFIG\\\":\\r\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\r\\n break;\\r\\n case \\\"CGFBR\\\":\\r\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\r\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\r\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\r\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\r\\n let commonParam = addEscapeChar(details.Data.ComPar);\\r\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\r\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\r\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\r\\n let lteParam = addEscapeChar(details.Data.LtePar);\\r\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\r\\n let bleParam = addEscapeChar(details.Data.BlePar);\\r\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\r\\n break;\\r\\n case \\\"REBOOTB\\\":\\r\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\r\\n break;\\r\\n case \\\"PWRFB\\\":\\r\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\r\\n break;\\r\\n case \\\"RESETB\\\":\\r\\n AddConfig(configIds.Bracelet.Reset, 'true');\\r\\n break;\\r\\n case \\\"BRAPWUPDATE\\\":\\r\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\r\\n // get password from old device, then set\\r\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\r\\n )\\r\\n break;\\r\\n case \\\"NOTE\\\":\\r\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\r\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\r\\n text = text.split(\\\",\\\").join(\\\" \\\");\\r\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\r\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\r\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\r\\n AddConfig(configIds.Note.Message, value)\\r\\n break;\\r\\n }\\r\\n }\\r\\n\\r\\n function addEscapeChar(json) {\\r\\n if (json === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n let jsonStr = JSON.stringify(json);\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\r\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function changeSingleQuoteToDouble(jsonStr) {\\r\\n if (jsonStr === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\r\\n outStr = outStr + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function sendMessageToLocalhost(str) {\\r\\n if (localTesting) {\\r\\n console.log(\\\"Sending message to local host: \\\" + str);\\r\\n } else {\\r\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\r\\n var c = createConnection(5878, server); // acceptance is 5678 - protocol dev 5878 - dev is 5679 ?\\r\\n c.write(`${str}`);\\r\\n c.end();\\r\\n }\\r\\n AddValue(\\\"ToLocalhost\\\", str);\\r\\n }\\r\\n\\r\\n function createConnection(port, server) {\\r\\n c = net.createConnection(port, server);\\r\\n c.on('error', function(error) {\\r\\n c = createConnection(port, server);\\r\\n });\\r\\n return c;\\r\\n }\\r\\n\\r\\n function decrypt(encdata, password) {\\r\\n var decrypted;\\r\\n var dataarray = encdata.split(\\\";\\\");\\r\\n if (dataarray.length > 5) {\\r\\n return \\\"\\\";\\r\\n }\\r\\n var i;\\r\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\r\\n if (encdata.startsWith(\\\"ACK\\\")) {\\r\\n return encdata;\\r\\n }\\r\\n for (i = 0; i < 3; i++) {\\r\\n part1 = part1 + dataarray[i] + \\\";\\\";\\r\\n }\\r\\n var mid = dataarray[2]; // use the message ID to create the salt\\r\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n // base64 decoding and extract the iv and encrypted data\\r\\n const bData = Buffer.from(enctext, 'base64');\\r\\n const iv = bData.slice(0, 16); // initial 16 chars\\r\\n const text = bData.slice(16); // all the encrypted data\\r\\n // derive key using; 32 byte key length (from salted password and mid)\\r\\n // decrypt the data in part2 and add to part1\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\r\\n try {\\r\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\r\\n } catch (err) {\\r\\n decrypted = undefined;\\r\\n }\\r\\n return decrypted;\\r\\n }\\r\\n\\r\\n function encrypt(text, mid, password) {\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n const iv = _crypto.randomBytes(16); // random initialization vector\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n // set the cipher\\r\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\r\\n // encrypt text\\r\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\r\\n // generate output ( encrypted text )\\r\\n return Buffer.concat([iv, encrypted]).toString('base64');\\r\\n }\\r\\n\\r\\n function AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n deviceParams.push(cvpair);\\r\\n }\\r\\n\\r\\n function AddConfig(configName, newvalue) {\\r\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n var cvpair = {\\r\\n 'code': configName,\\r\\n 'value': newvalue,\\r\\n 'forced': true\\r\\n };\\r\\n configsToSend.push(cvpair);\\r\\n };\\r\\n }\\r\\n\\r\\n function isASCII(str) {\\r\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\r\\n }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n module.exports = {\\r\\n execute_ops\\r\\n }\\r\\n} else { // on server use local defined vars\\r\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n // define global returns\\r\\n msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1744207495},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n // Define array to push device data into. This will be put into the msg array at the end.\\r\\n var deviceParams = [];\\r\\n var configsToSend = [];\\r\\n var tasks = [];\\r\\n const _crypto = require('crypto');\\r\\n // handle ACK\\r\\n if (messageTypeCode == \\\"ACK\\\") {\\r\\n return \\\"\\\";\\r\\n }\\r\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\r\\n var password;\\r\\n if (params.imei == \\\"null\\\") {\\r\\n return msg;\\r\\n }\\r\\n password = params.imei;\\r\\n if (configs.Password.Password === \\\"\\\") {\\r\\n // use imei as default password when not specified\\r\\n } else {\\r\\n // use the password\\r\\n password = configs.Password.Password\\r\\n }\\r\\n let message = decrypt(raw, password);\\r\\n if (message) {\\r\\n // send message internally\\r\\n sendMessageToLocalhost(message);\\r\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n } else {\\r\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n }\\r\\n } else { // General Oysta Template\\r\\n switch (messageTypeLocalCode) {\\r\\n case (\\\"COMM\\\"):\\r\\n process_invent_msg(); //incoming invent commands\\r\\n break;\\r\\n case (\\\"MACB\\\"):\\r\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\r\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\r\\n add_params_to_output();\\r\\n break;\\r\\n case \\\"INFO-GETPWB\\\": // handle GETPWB message\\r\\n //let imei = params.bracelet_imei; // not actually needed ?\\r\\n //let mac = params.BLEMAC; // not actually needed ?\\r\\n //AddValue(\\\"mac\\\", params.bracelet_mac);\\r\\n //AddValue(\\\"key\\\", params.key);\\r\\n //console.log(\\\"mac: \\\" + params.bracelet_mac);\\r\\n let BraceletPW = \\\"\\\"; // until we set it from query below\\r\\n // if(params.bracelet_imei){\\r\\n // if(serverParams.Password){\\r\\n // BraceletPW = serverParams.Password; // query key value table\\r\\n // console.log(BraceletPW); // print for testing reasons\\r\\n // AddConfig(configIds.DeviceConfig.BraceletPW, BraceletPW);//this to return the value\\r\\n // }\\r\\n // }\\r\\n // else {\\r\\n // //return error\\r\\n // }\\r\\n //AddValue(\\\"password\\\", \\\"myNewPassword\\\");\\r\\n //LookupValue(params.ble_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n LookupValue(params.bracelet_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n break;\\r\\n case (\\\"REGISTER\\\"):\\r\\n let ble_mac = params.ble_mac;\\r\\n let iccid = params.iccid;\\r\\n // write values to readonly settings\\r\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\r\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\r\\n // will automtaically Activate on Acceptance\\r\\n if (serverParams.EnvName) {\\r\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\r\\n }\\r\\n }\\r\\n break;\\r\\n case (\\\"CREATE\\\"):\\r\\n // temp fix to filter old messages\\r\\n // const cutoff = 1707523200000; //10.2.2024\\r\\n // let message_id_time = parseInt(params.count_number, 36);\\r\\n // if (message_id_time > cutoff){\\r\\n let c_ble_mac = params.ble_mac;\\r\\n let c_iccid = params.iccid;\\r\\n let new_imei = params.new_imei;\\r\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\r\\n // sendMessageToLocalhost(c_message); \\r\\n tasks = [{\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"sync\\\",\\r\\n \\\"type\\\": \\\"createDevice\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"imei\\\": new_imei,\\r\\n \\\"abortOnError\\\": false,\\r\\n \\\"init\\\": true\\r\\n }),\\r\\n \\\"order\\\": 1\\r\\n }, {\\r\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"async\\\",\\r\\n \\\"type\\\": \\\"sendMessage\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"message\\\": c_message\\r\\n }),\\r\\n \\\"order\\\": 2\\r\\n }]\\r\\n // }\\r\\n break;\\r\\n case (\\\"ALLDATA\\\"):\\r\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\r\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\r\\n let all_data = JSON.parse(json_str);\\r\\n if (\\\"version\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\r\\n };\\r\\n break;\\r\\n default:\\r\\n // all other general messages\\r\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\r\\n add_params_to_output();\\r\\n }\\r\\n // add messagetTypeLocal to output for templates\\r\\n AddValue('local_message_type', messageTypeLocalCode);\\r\\n }\\r\\n msg = {\\r\\n 'values': deviceParams,\\r\\n };\\r\\n\\r\\n function LookupValue(key, type, template) {\\r\\n var cvpair = {\\r\\n key: key, // key to be lookded up\\r\\n type: type, // type of the key\\r\\n template: template // the variable the result will be mapped to\\r\\n };\\r\\n msg.KeyValue = cvpair;\\r\\n }\\r\\n if (configsToSend.length > 0) {\\r\\n msg.configsToSend = configsToSend\\r\\n };\\r\\n if (tasks.length > 0) {\\r\\n msg.tasks = tasks\\r\\n };\\r\\n // commit values to receiver processor\\r\\n console.log(msg);\\r\\n // modify to return the object that contains your data\\r\\n return msg;\\r\\n\\r\\n function add_params_to_output() {\\r\\n if (!params.raw_accuracy) {\\r\\n AddValue('location_accuracy', 9000);\\r\\n } else {\\r\\n AddValue('location_accuracy', params.raw_accuracy);\\r\\n }\\r\\n // generate timestamps if they don't exist\\r\\n if (!params.event_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n if (!params.location_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n //if no lat and long are given, set them to 0, 0\\r\\n if (!params.latitude_raw) {\\r\\n AddValue('latitude', 0);\\r\\n } else {\\r\\n AddValue('latitude', params.latitude_raw);\\r\\n }\\r\\n if (!params.longitude_raw) {\\r\\n AddValue('longitude', 0);\\r\\n } else {\\r\\n AddValue('longitude', params.longitude_raw);\\r\\n }\\r\\n // if (params.temp_bracelet){\\r\\n // AddValue('oysta_labels', 'DegC');\\r\\n // AddValue('single_column_value', params.temp_bracelet);\\r\\n // }\\r\\n }\\r\\n\\r\\n function process_invent_msg() {\\r\\n const details = JSON.parse(raw);\\r\\n // AddValue('imei', details.AppId);\\r\\n AddValue('json_in', JSON.stringify(details));\\r\\n switch (details.Command) {\\r\\n case \\\"ACTIVATE_OK\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\r\\n break;\\r\\n case \\\"ACTIVATE_FAILS\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\r\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\r\\n break;\\r\\n case \\\"APPSET\\\":\\r\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\r\\n AddConfig(configIds.Password.Password, details.Data.Password);\\r\\n break;\\r\\n case \\\"CONFIG\\\":\\r\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\r\\n break;\\r\\n case \\\"CGFBR\\\":\\r\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\r\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\r\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\r\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\r\\n let commonParam = addEscapeChar(details.Data.ComPar);\\r\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\r\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\r\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\r\\n let lteParam = addEscapeChar(details.Data.LtePar);\\r\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\r\\n let bleParam = addEscapeChar(details.Data.BlePar);\\r\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\r\\n break;\\r\\n case \\\"REBOOTB\\\":\\r\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\r\\n break;\\r\\n case \\\"PWRFB\\\":\\r\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\r\\n break;\\r\\n case \\\"RESETB\\\":\\r\\n AddConfig(configIds.Bracelet.Reset, 'true');\\r\\n break;\\r\\n case \\\"BRAPWUPDATE\\\":\\r\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\r\\n // get password from old device, then set\\r\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\r\\n )\\r\\n break;\\r\\n case \\\"NOTE\\\":\\r\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\r\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\r\\n text = text.split(\\\",\\\").join(\\\" \\\");\\r\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\r\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\r\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\r\\n AddConfig(configIds.Note.Message, value)\\r\\n break;\\r\\n }\\r\\n }\\r\\n\\r\\n function addEscapeChar(json) {\\r\\n if (json === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n let jsonStr = JSON.stringify(json);\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\r\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function changeSingleQuoteToDouble(jsonStr) {\\r\\n if (jsonStr === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\r\\n outStr = outStr + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function sendMessageToLocalhost(str) {\\r\\n if (localTesting) {\\r\\n console.log(\\\"Sending message to local host: \\\" + str);\\r\\n } else {\\r\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\r\\n var c = createConnection(5878, server); // acceptance is 5678 - protocol dev 5878 - dev is 5679 ?\\r\\n c.write(`${str}`);\\r\\n c.end();\\r\\n }\\r\\n AddValue(\\\"ToLocalhost\\\", str);\\r\\n }\\r\\n\\r\\n function createConnection(port, server) {\\r\\n c = net.createConnection(port, server);\\r\\n c.on('error', function(error) {\\r\\n c = createConnection(port, server);\\r\\n });\\r\\n return c;\\r\\n }\\r\\n\\r\\n function decrypt(encdata, password) {\\r\\n var decrypted;\\r\\n var dataarray = encdata.split(\\\";\\\");\\r\\n if (dataarray.length > 5) {\\r\\n return \\\"\\\";\\r\\n }\\r\\n var i;\\r\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\r\\n if (encdata.startsWith(\\\"ACK\\\")) {\\r\\n return encdata;\\r\\n }\\r\\n for (i = 0; i < 3; i++) {\\r\\n part1 = part1 + dataarray[i] + \\\";\\\";\\r\\n }\\r\\n var mid = dataarray[2]; // use the message ID to create the salt\\r\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n // base64 decoding and extract the iv and encrypted data\\r\\n const bData = Buffer.from(enctext, 'base64');\\r\\n const iv = bData.slice(0, 16); // initial 16 chars\\r\\n const text = bData.slice(16); // all the encrypted data\\r\\n // derive key using; 32 byte key length (from salted password and mid)\\r\\n // decrypt the data in part2 and add to part1\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\r\\n try {\\r\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\r\\n } catch (err) {\\r\\n decrypted = undefined;\\r\\n }\\r\\n return decrypted;\\r\\n }\\r\\n\\r\\n function encrypt(text, mid, password) {\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n const iv = _crypto.randomBytes(16); // random initialization vector\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n // set the cipher\\r\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\r\\n // encrypt text\\r\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\r\\n // generate output ( encrypted text )\\r\\n return Buffer.concat([iv, encrypted]).toString('base64');\\r\\n }\\r\\n\\r\\n function AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n deviceParams.push(cvpair);\\r\\n }\\r\\n\\r\\n function AddConfig(configName, newvalue) {\\r\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n var cvpair = {\\r\\n 'code': configName,\\r\\n 'value': newvalue,\\r\\n 'forced': true\\r\\n };\\r\\n configsToSend.push(cvpair);\\r\\n };\\r\\n }\\r\\n\\r\\n function isASCII(str) {\\r\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\r\\n }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n module.exports = {\\r\\n execute_ops\\r\\n }\\r\\n} else { // on server use local defined vars\\r\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n // define global returns\\r\\n msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1744208228},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n // Define array to push device data into. This will be put into the msg array at the end.\\r\\n var deviceParams = [];\\r\\n var configsToSend = [];\\r\\n var tasks = [];\\r\\n const _crypto = require('crypto');\\r\\n // handle ACK\\r\\n if (messageTypeCode == \\\"ACK\\\") {\\r\\n return \\\"\\\";\\r\\n }\\r\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\r\\n var password;\\r\\n if (params.imei == \\\"null\\\") {\\r\\n return msg;\\r\\n }\\r\\n password = params.imei;\\r\\n if (configs.Password.Password === \\\"\\\") {\\r\\n // use imei as default password when not specified\\r\\n } else {\\r\\n // use the password\\r\\n password = configs.Password.Password\\r\\n }\\r\\n let message = decrypt(raw, password);\\r\\n if (message) {\\r\\n // send message internally\\r\\n sendMessageToLocalhost(message);\\r\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n } else {\\r\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n }\\r\\n } else { // General Oysta Template\\r\\n switch (messageTypeLocalCode) {\\r\\n case (\\\"COMM\\\"):\\r\\n process_invent_msg(); //incoming invent commands\\r\\n break;\\r\\n case (\\\"MACB\\\"):\\r\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\r\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\r\\n add_params_to_output();\\r\\n break;\\r\\n case \\\"INFO-GETPWB\\\": // handle GETPWB message\\r\\n //let imei = params.bracelet_imei; // not actually needed ?\\r\\n //let mac = params.BLEMAC; // not actually needed ?\\r\\n AddValue(\\\"mac\\\", params.bracelet_mac);\\r\\n //AddValue(\\\"key\\\", params.key);\\r\\n console.log(\\\"mac: \\\" + params.bracelet_mac);\\r\\n let BraceletPW = \\\"\\\"; // until we set it from query below\\r\\n // if(params.bracelet_imei){\\r\\n // if(serverParams.Password){\\r\\n // BraceletPW = serverParams.Password; // query key value table\\r\\n // console.log(BraceletPW); // print for testing reasons\\r\\n // AddConfig(configIds.DeviceConfig.BraceletPW, BraceletPW);//this to return the value\\r\\n // }\\r\\n // }\\r\\n // else {\\r\\n // //return error\\r\\n // }\\r\\n //AddValue(\\\"password\\\", \\\"myNewPassword\\\");\\r\\n //LookupValue(params.ble_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n LookupValue(params.bracelet_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n break;\\r\\n case (\\\"REGISTER\\\"):\\r\\n let ble_mac = params.ble_mac;\\r\\n let iccid = params.iccid;\\r\\n // write values to readonly settings\\r\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\r\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\r\\n // will automtaically Activate on Acceptance\\r\\n if (serverParams.EnvName) {\\r\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\r\\n }\\r\\n }\\r\\n break;\\r\\n case (\\\"CREATE\\\"):\\r\\n // temp fix to filter old messages\\r\\n // const cutoff = 1707523200000; //10.2.2024\\r\\n // let message_id_time = parseInt(params.count_number, 36);\\r\\n // if (message_id_time > cutoff){\\r\\n let c_ble_mac = params.ble_mac;\\r\\n let c_iccid = params.iccid;\\r\\n let new_imei = params.new_imei;\\r\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\r\\n // sendMessageToLocalhost(c_message); \\r\\n tasks = [{\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"sync\\\",\\r\\n \\\"type\\\": \\\"createDevice\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"imei\\\": new_imei,\\r\\n \\\"abortOnError\\\": false,\\r\\n \\\"init\\\": true\\r\\n }),\\r\\n \\\"order\\\": 1\\r\\n }, {\\r\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"async\\\",\\r\\n \\\"type\\\": \\\"sendMessage\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"message\\\": c_message\\r\\n }),\\r\\n \\\"order\\\": 2\\r\\n }]\\r\\n // }\\r\\n break;\\r\\n case (\\\"ALLDATA\\\"):\\r\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\r\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\r\\n let all_data = JSON.parse(json_str);\\r\\n if (\\\"version\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\r\\n };\\r\\n break;\\r\\n default:\\r\\n // all other general messages\\r\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\r\\n add_params_to_output();\\r\\n }\\r\\n // add messagetTypeLocal to output for templates\\r\\n AddValue('local_message_type', messageTypeLocalCode);\\r\\n }\\r\\n var msg = {\\r\\n 'values': deviceParams,\\r\\n };\\r\\n if (configsToSend.length > 0) {\\r\\n msg.configsToSend = configsToSend\\r\\n };\\r\\n if (tasks.length > 0) {\\r\\n msg.tasks = tasks\\r\\n };\\r\\n // commit values to receiver processor\\r\\n console.log(msg);\\r\\n // modify to return the object that contains your data\\r\\n return msg;\\r\\n\\r\\n function add_params_to_output() {\\r\\n if (!params.raw_accuracy) {\\r\\n AddValue('location_accuracy', 9000);\\r\\n } else {\\r\\n AddValue('location_accuracy', params.raw_accuracy);\\r\\n }\\r\\n // generate timestamps if they don't exist\\r\\n if (!params.event_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n if (!params.location_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n //if no lat and long are given, set them to 0, 0\\r\\n if (!params.latitude_raw) {\\r\\n AddValue('latitude', 0);\\r\\n } else {\\r\\n AddValue('latitude', params.latitude_raw);\\r\\n }\\r\\n if (!params.longitude_raw) {\\r\\n AddValue('longitude', 0);\\r\\n } else {\\r\\n AddValue('longitude', params.longitude_raw);\\r\\n }\\r\\n // if (params.temp_bracelet){\\r\\n // AddValue('oysta_labels', 'DegC');\\r\\n // AddValue('single_column_value', params.temp_bracelet);\\r\\n // }\\r\\n }\\r\\n\\r\\n function process_invent_msg() {\\r\\n const details = JSON.parse(raw);\\r\\n // AddValue('imei', details.AppId);\\r\\n AddValue('json_in', JSON.stringify(details));\\r\\n switch (details.Command) {\\r\\n case \\\"ACTIVATE_OK\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\r\\n break;\\r\\n case \\\"ACTIVATE_FAILS\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\r\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\r\\n break;\\r\\n case \\\"APPSET\\\":\\r\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\r\\n AddConfig(configIds.Password.Password, details.Data.Password);\\r\\n break;\\r\\n case \\\"CONFIG\\\":\\r\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\r\\n break;\\r\\n case \\\"CGFBR\\\":\\r\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\r\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\r\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\r\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\r\\n let commonParam = addEscapeChar(details.Data.ComPar);\\r\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\r\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\r\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\r\\n let lteParam = addEscapeChar(details.Data.LtePar);\\r\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\r\\n let bleParam = addEscapeChar(details.Data.BlePar);\\r\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\r\\n break;\\r\\n case \\\"REBOOTB\\\":\\r\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\r\\n break;\\r\\n case \\\"PWRFB\\\":\\r\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\r\\n break;\\r\\n case \\\"RESETB\\\":\\r\\n AddConfig(configIds.Bracelet.Reset, 'true');\\r\\n break;\\r\\n case \\\"BRAPWUPDATE\\\":\\r\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\r\\n // get password from old device, then set\\r\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\r\\n )\\r\\n break;\\r\\n case \\\"NOTE\\\":\\r\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\r\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\r\\n text = text.split(\\\",\\\").join(\\\" \\\");\\r\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\r\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\r\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\r\\n AddConfig(configIds.Note.Message, value)\\r\\n break;\\r\\n }\\r\\n }\\r\\n\\r\\n function addEscapeChar(json) {\\r\\n if (json === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n let jsonStr = JSON.stringify(json);\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\r\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function changeSingleQuoteToDouble(jsonStr) {\\r\\n if (jsonStr === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\r\\n outStr = outStr + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function sendMessageToLocalhost(str) {\\r\\n if (localTesting) {\\r\\n console.log(\\\"Sending message to local host: \\\" + str);\\r\\n } else {\\r\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\r\\n var c = createConnection(5878, server); // acceptance is 5678 - protocol dev 5878 - dev is 5679 ?\\r\\n c.write(`${str}`);\\r\\n c.end();\\r\\n }\\r\\n AddValue(\\\"ToLocalhost\\\", str);\\r\\n }\\r\\n\\r\\n function createConnection(port, server) {\\r\\n c = net.createConnection(port, server);\\r\\n c.on('error', function(error) {\\r\\n c = createConnection(port, server);\\r\\n });\\r\\n return c;\\r\\n }\\r\\n\\r\\n function decrypt(encdata, password) {\\r\\n var decrypted;\\r\\n var dataarray = encdata.split(\\\";\\\");\\r\\n if (dataarray.length > 5) {\\r\\n return \\\"\\\";\\r\\n }\\r\\n var i;\\r\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\r\\n if (encdata.startsWith(\\\"ACK\\\")) {\\r\\n return encdata;\\r\\n }\\r\\n for (i = 0; i < 3; i++) {\\r\\n part1 = part1 + dataarray[i] + \\\";\\\";\\r\\n }\\r\\n var mid = dataarray[2]; // use the message ID to create the salt\\r\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n // base64 decoding and extract the iv and encrypted data\\r\\n const bData = Buffer.from(enctext, 'base64');\\r\\n const iv = bData.slice(0, 16); // initial 16 chars\\r\\n const text = bData.slice(16); // all the encrypted data\\r\\n // derive key using; 32 byte key length (from salted password and mid)\\r\\n // decrypt the data in part2 and add to part1\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\r\\n try {\\r\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\r\\n } catch (err) {\\r\\n decrypted = undefined;\\r\\n }\\r\\n return decrypted;\\r\\n }\\r\\n\\r\\n function encrypt(text, mid, password) {\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n const iv = _crypto.randomBytes(16); // random initialization vector\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n // set the cipher\\r\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\r\\n // encrypt text\\r\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\r\\n // generate output ( encrypted text )\\r\\n return Buffer.concat([iv, encrypted]).toString('base64');\\r\\n }\\r\\n\\r\\n function AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n deviceParams.push(cvpair);\\r\\n }\\r\\n\\r\\n function AddConfig(configName, newvalue) {\\r\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n var cvpair = {\\r\\n 'code': configName,\\r\\n 'value': newvalue,\\r\\n 'forced': true\\r\\n };\\r\\n configsToSend.push(cvpair);\\r\\n };\\r\\n }\\r\\n\\r\\n function isASCII(str) {\\r\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\r\\n }\\r\\n\\r\\n function LookupValue(key, type, template) {\\r\\n var cvpair = {\\r\\n key: key, // key to be lookded up\\r\\n type: type, // type of the key\\r\\n template: template // the variable the result will be mapped to\\r\\n };\\r\\n msg.KeyValue = cvpair;\\r\\n }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n module.exports = {\\r\\n execute_ops\\r\\n }\\r\\n} else { // on server use local defined vars\\r\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n // define global returns\\r\\n msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1744208434},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n // Define array to push device data into. This will be put into the msg array at the end.\\r\\n var deviceParams = [];\\r\\n var configsToSend = [];\\r\\n var tasks = [];\\r\\n const _crypto = require('crypto');\\r\\n // handle ACK\\r\\n if (messageTypeCode == \\\"ACK\\\") {\\r\\n return \\\"\\\";\\r\\n }\\r\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\r\\n var password;\\r\\n if (params.imei == \\\"null\\\") {\\r\\n return msg;\\r\\n }\\r\\n password = params.imei;\\r\\n if (configs.Password.Password === \\\"\\\") {\\r\\n // use imei as default password when not specified\\r\\n } else {\\r\\n // use the password\\r\\n password = configs.Password.Password\\r\\n }\\r\\n let message = decrypt(raw, password);\\r\\n if (message) {\\r\\n // send message internally\\r\\n sendMessageToLocalhost(message);\\r\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n } else {\\r\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n }\\r\\n } else { // General Oysta Template\\r\\n switch (messageTypeLocalCode) {\\r\\n case (\\\"COMM\\\"):\\r\\n process_invent_msg(); //incoming invent commands\\r\\n break;\\r\\n case (\\\"MACB\\\"):\\r\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\r\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\r\\n add_params_to_output();\\r\\n break;\\r\\n case \\\"INFO-GETPWB\\\": // handle GETPWB message\\r\\n //let imei = params.bracelet_imei; // not actually needed ?\\r\\n //let mac = params.BLEMAC; // not actually needed ?\\r\\n //AddValue(\\\"mac\\\", params.bracelet_mac);\\r\\n //AddValue(\\\"key\\\", params.key);\\r\\n //console.log(\\\"mac: \\\" + params.bracelet_mac);\\r\\n //let BraceletPW = \\\"\\\"; // until we set it from query below\\r\\n // if(params.bracelet_imei){\\r\\n // if(serverParams.Password){\\r\\n // BraceletPW = serverParams.Password; // query key value table\\r\\n // console.log(BraceletPW); // print for testing reasons\\r\\n // AddConfig(configIds.DeviceConfig.BraceletPW, BraceletPW);//this to return the value\\r\\n // }\\r\\n // }\\r\\n // else {\\r\\n // //return error\\r\\n // }\\r\\n //AddValue(\\\"password\\\", \\\"myNewPassword\\\");\\r\\n //LookupValue(params.ble_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n LookupValue(params.bracelet_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n break;\\r\\n case (\\\"REGISTER\\\"):\\r\\n let ble_mac = params.ble_mac;\\r\\n let iccid = params.iccid;\\r\\n // write values to readonly settings\\r\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\r\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\r\\n // will automtaically Activate on Acceptance\\r\\n if (serverParams.EnvName) {\\r\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\r\\n }\\r\\n }\\r\\n break;\\r\\n case (\\\"CREATE\\\"):\\r\\n // temp fix to filter old messages\\r\\n // const cutoff = 1707523200000; //10.2.2024\\r\\n // let message_id_time = parseInt(params.count_number, 36);\\r\\n // if (message_id_time > cutoff){\\r\\n let c_ble_mac = params.ble_mac;\\r\\n let c_iccid = params.iccid;\\r\\n let new_imei = params.new_imei;\\r\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\r\\n // sendMessageToLocalhost(c_message); \\r\\n tasks = [{\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"sync\\\",\\r\\n \\\"type\\\": \\\"createDevice\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"imei\\\": new_imei,\\r\\n \\\"abortOnError\\\": false,\\r\\n \\\"init\\\": true\\r\\n }),\\r\\n \\\"order\\\": 1\\r\\n }, {\\r\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"async\\\",\\r\\n \\\"type\\\": \\\"sendMessage\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"message\\\": c_message\\r\\n }),\\r\\n \\\"order\\\": 2\\r\\n }]\\r\\n // }\\r\\n break;\\r\\n case (\\\"ALLDATA\\\"):\\r\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\r\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\r\\n let all_data = JSON.parse(json_str);\\r\\n if (\\\"version\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\r\\n };\\r\\n break;\\r\\n default:\\r\\n // all other general messages\\r\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\r\\n add_params_to_output();\\r\\n }\\r\\n // add messagetTypeLocal to output for templates\\r\\n AddValue('local_message_type', messageTypeLocalCode);\\r\\n }\\r\\n //var msg = {\\r\\n // 'values': deviceParams,\\r\\n //};\\r\\n if (configsToSend.length > 0) {\\r\\n msg.configsToSend = configsToSend\\r\\n };\\r\\n if (tasks.length > 0) {\\r\\n msg.tasks = tasks\\r\\n };\\r\\n // commit values to receiver processor\\r\\n console.log(msg);\\r\\n // modify to return the object that contains your data\\r\\n return msg;\\r\\n\\r\\n function add_params_to_output() {\\r\\n if (!params.raw_accuracy) {\\r\\n AddValue('location_accuracy', 9000);\\r\\n } else {\\r\\n AddValue('location_accuracy', params.raw_accuracy);\\r\\n }\\r\\n // generate timestamps if they don't exist\\r\\n if (!params.event_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n if (!params.location_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n //if no lat and long are given, set them to 0, 0\\r\\n if (!params.latitude_raw) {\\r\\n AddValue('latitude', 0);\\r\\n } else {\\r\\n AddValue('latitude', params.latitude_raw);\\r\\n }\\r\\n if (!params.longitude_raw) {\\r\\n AddValue('longitude', 0);\\r\\n } else {\\r\\n AddValue('longitude', params.longitude_raw);\\r\\n }\\r\\n // if (params.temp_bracelet){\\r\\n // AddValue('oysta_labels', 'DegC');\\r\\n // AddValue('single_column_value', params.temp_bracelet);\\r\\n // }\\r\\n }\\r\\n\\r\\n function process_invent_msg() {\\r\\n const details = JSON.parse(raw);\\r\\n // AddValue('imei', details.AppId);\\r\\n AddValue('json_in', JSON.stringify(details));\\r\\n switch (details.Command) {\\r\\n case \\\"ACTIVATE_OK\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\r\\n break;\\r\\n case \\\"ACTIVATE_FAILS\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\r\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\r\\n break;\\r\\n case \\\"APPSET\\\":\\r\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\r\\n AddConfig(configIds.Password.Password, details.Data.Password);\\r\\n break;\\r\\n case \\\"CONFIG\\\":\\r\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\r\\n break;\\r\\n case \\\"CGFBR\\\":\\r\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\r\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\r\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\r\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\r\\n let commonParam = addEscapeChar(details.Data.ComPar);\\r\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\r\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\r\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\r\\n let lteParam = addEscapeChar(details.Data.LtePar);\\r\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\r\\n let bleParam = addEscapeChar(details.Data.BlePar);\\r\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\r\\n break;\\r\\n case \\\"REBOOTB\\\":\\r\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\r\\n break;\\r\\n case \\\"PWRFB\\\":\\r\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\r\\n break;\\r\\n case \\\"RESETB\\\":\\r\\n AddConfig(configIds.Bracelet.Reset, 'true');\\r\\n break;\\r\\n case \\\"BRAPWUPDATE\\\":\\r\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\r\\n // get password from old device, then set\\r\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\r\\n )\\r\\n break;\\r\\n case \\\"NOTE\\\":\\r\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\r\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\r\\n text = text.split(\\\",\\\").join(\\\" \\\");\\r\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\r\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\r\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\r\\n AddConfig(configIds.Note.Message, value)\\r\\n break;\\r\\n }\\r\\n }\\r\\n\\r\\n function addEscapeChar(json) {\\r\\n if (json === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n let jsonStr = JSON.stringify(json);\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\r\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function changeSingleQuoteToDouble(jsonStr) {\\r\\n if (jsonStr === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\r\\n outStr = outStr + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function sendMessageToLocalhost(str) {\\r\\n if (localTesting) {\\r\\n console.log(\\\"Sending message to local host: \\\" + str);\\r\\n } else {\\r\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\r\\n var c = createConnection(5878, server); // acceptance is 5678 - protocol dev 5878 - dev is 5679 ?\\r\\n c.write(`${str}`);\\r\\n c.end();\\r\\n }\\r\\n AddValue(\\\"ToLocalhost\\\", str);\\r\\n }\\r\\n\\r\\n function createConnection(port, server) {\\r\\n c = net.createConnection(port, server);\\r\\n c.on('error', function(error) {\\r\\n c = createConnection(port, server);\\r\\n });\\r\\n return c;\\r\\n }\\r\\n\\r\\n function decrypt(encdata, password) {\\r\\n var decrypted;\\r\\n var dataarray = encdata.split(\\\";\\\");\\r\\n if (dataarray.length > 5) {\\r\\n return \\\"\\\";\\r\\n }\\r\\n var i;\\r\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\r\\n if (encdata.startsWith(\\\"ACK\\\")) {\\r\\n return encdata;\\r\\n }\\r\\n for (i = 0; i < 3; i++) {\\r\\n part1 = part1 + dataarray[i] + \\\";\\\";\\r\\n }\\r\\n var mid = dataarray[2]; // use the message ID to create the salt\\r\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n // base64 decoding and extract the iv and encrypted data\\r\\n const bData = Buffer.from(enctext, 'base64');\\r\\n const iv = bData.slice(0, 16); // initial 16 chars\\r\\n const text = bData.slice(16); // all the encrypted data\\r\\n // derive key using; 32 byte key length (from salted password and mid)\\r\\n // decrypt the data in part2 and add to part1\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\r\\n try {\\r\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\r\\n } catch (err) {\\r\\n decrypted = undefined;\\r\\n }\\r\\n return decrypted;\\r\\n }\\r\\n\\r\\n function encrypt(text, mid, password) {\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n const iv = _crypto.randomBytes(16); // random initialization vector\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n // set the cipher\\r\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\r\\n // encrypt text\\r\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\r\\n // generate output ( encrypted text )\\r\\n return Buffer.concat([iv, encrypted]).toString('base64');\\r\\n }\\r\\n\\r\\n function AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n deviceParams.push(cvpair);\\r\\n }\\r\\n\\r\\n function AddConfig(configName, newvalue) {\\r\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n var cvpair = {\\r\\n 'code': configName,\\r\\n 'value': newvalue,\\r\\n 'forced': true\\r\\n };\\r\\n configsToSend.push(cvpair);\\r\\n };\\r\\n }\\r\\n\\r\\n function isASCII(str) {\\r\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\r\\n }\\r\\n\\r\\n function LookupValue(key, type, template) {\\r\\n var cvpair = {\\r\\n key: key, // key to be lookded up\\r\\n type: type, // type of the key\\r\\n template: template // the variable the result will be mapped to\\r\\n };\\r\\n msg.KeyValue = cvpair;\\r\\n }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n module.exports = {\\r\\n execute_ops\\r\\n }\\r\\n} else { // on server use local defined vars\\r\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n // define global returns\\r\\n msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1744208682},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n // Define array to push device data into. This will be put into the msg array at the end.\\r\\n var deviceParams = [];\\r\\n var configsToSend = [];\\r\\n var tasks = [];\\r\\n const _crypto = require('crypto');\\r\\n // handle ACK\\r\\n if (messageTypeCode == \\\"ACK\\\") {\\r\\n return \\\"\\\";\\r\\n }\\r\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\r\\n var password;\\r\\n if (params.imei == \\\"null\\\") {\\r\\n return msg;\\r\\n }\\r\\n password = params.imei;\\r\\n if (configs.Password.Password === \\\"\\\") {\\r\\n // use imei as default password when not specified\\r\\n } else {\\r\\n // use the password\\r\\n password = configs.Password.Password\\r\\n }\\r\\n let message = decrypt(raw, password);\\r\\n if (message) {\\r\\n // send message internally\\r\\n sendMessageToLocalhost(message);\\r\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n } else {\\r\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n }\\r\\n } else { // General Oysta Template\\r\\n switch (messageTypeLocalCode) {\\r\\n case (\\\"COMM\\\"):\\r\\n process_invent_msg(); //incoming invent commands\\r\\n break;\\r\\n case (\\\"MACB\\\"):\\r\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\r\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\r\\n add_params_to_output();\\r\\n break;\\r\\n case \\\"INFO-GETPWB\\\": // handle GETPWB message\\r\\n //let imei = params.bracelet_imei; // not actually needed ?\\r\\n //let mac = params.BLEMAC; // not actually needed ?\\r\\n //AddValue(\\\"mac\\\", params.bracelet_mac);\\r\\n //AddValue(\\\"key\\\", params.key);\\r\\n //console.log(\\\"mac: \\\" + params.bracelet_mac);\\r\\n //let BraceletPW = \\\"\\\"; // until we set it from query below\\r\\n // if(params.bracelet_imei){\\r\\n // if(serverParams.Password){\\r\\n // BraceletPW = serverParams.Password; // query key value table\\r\\n // console.log(BraceletPW); // print for testing reasons\\r\\n // AddConfig(configIds.DeviceConfig.BraceletPW, BraceletPW);//this to return the value\\r\\n // }\\r\\n // }\\r\\n // else {\\r\\n // //return error\\r\\n // }\\r\\n //AddValue(\\\"password\\\", \\\"myNewPassword\\\");\\r\\n //LookupValue(params.ble_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n LookupValue(params.bracelet_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n break;\\r\\n case (\\\"REGISTER\\\"):\\r\\n let ble_mac = params.ble_mac;\\r\\n let iccid = params.iccid;\\r\\n // write values to readonly settings\\r\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\r\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\r\\n // will automtaically Activate on Acceptance\\r\\n if (serverParams.EnvName) {\\r\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\r\\n }\\r\\n }\\r\\n break;\\r\\n case (\\\"CREATE\\\"):\\r\\n // temp fix to filter old messages\\r\\n // const cutoff = 1707523200000; //10.2.2024\\r\\n // let message_id_time = parseInt(params.count_number, 36);\\r\\n // if (message_id_time > cutoff){\\r\\n let c_ble_mac = params.ble_mac;\\r\\n let c_iccid = params.iccid;\\r\\n let new_imei = params.new_imei;\\r\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\r\\n // sendMessageToLocalhost(c_message); \\r\\n tasks = [{\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"sync\\\",\\r\\n \\\"type\\\": \\\"createDevice\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"imei\\\": new_imei,\\r\\n \\\"abortOnError\\\": false,\\r\\n \\\"init\\\": true\\r\\n }),\\r\\n \\\"order\\\": 1\\r\\n }, {\\r\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"async\\\",\\r\\n \\\"type\\\": \\\"sendMessage\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"message\\\": c_message\\r\\n }),\\r\\n \\\"order\\\": 2\\r\\n }]\\r\\n // }\\r\\n break;\\r\\n case (\\\"ALLDATA\\\"):\\r\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\r\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\r\\n let all_data = JSON.parse(json_str);\\r\\n if (\\\"version\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\r\\n };\\r\\n break;\\r\\n default:\\r\\n // all other general messages\\r\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\r\\n add_params_to_output();\\r\\n }\\r\\n // add messagetTypeLocal to output for templates\\r\\n AddValue('local_message_type', messageTypeLocalCode);\\r\\n }\\r\\n var msg = {\\r\\n 'values': deviceParams,\\r\\n };\\r\\n if (configsToSend.length > 0) {\\r\\n msg.configsToSend = configsToSend\\r\\n };\\r\\n if (tasks.length > 0) {\\r\\n msg.tasks = tasks\\r\\n };\\r\\n // commit values to receiver processor\\r\\n console.log(msg);\\r\\n // modify to return the object that contains your data\\r\\n return msg;\\r\\n\\r\\n function add_params_to_output() {\\r\\n if (!params.raw_accuracy) {\\r\\n AddValue('location_accuracy', 9000);\\r\\n } else {\\r\\n AddValue('location_accuracy', params.raw_accuracy);\\r\\n }\\r\\n // generate timestamps if they don't exist\\r\\n if (!params.event_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n if (!params.location_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n //if no lat and long are given, set them to 0, 0\\r\\n if (!params.latitude_raw) {\\r\\n AddValue('latitude', 0);\\r\\n } else {\\r\\n AddValue('latitude', params.latitude_raw);\\r\\n }\\r\\n if (!params.longitude_raw) {\\r\\n AddValue('longitude', 0);\\r\\n } else {\\r\\n AddValue('longitude', params.longitude_raw);\\r\\n }\\r\\n // if (params.temp_bracelet){\\r\\n // AddValue('oysta_labels', 'DegC');\\r\\n // AddValue('single_column_value', params.temp_bracelet);\\r\\n // }\\r\\n }\\r\\n\\r\\n function process_invent_msg() {\\r\\n const details = JSON.parse(raw);\\r\\n // AddValue('imei', details.AppId);\\r\\n AddValue('json_in', JSON.stringify(details));\\r\\n switch (details.Command) {\\r\\n case \\\"ACTIVATE_OK\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\r\\n break;\\r\\n case \\\"ACTIVATE_FAILS\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\r\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\r\\n break;\\r\\n case \\\"APPSET\\\":\\r\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\r\\n AddConfig(configIds.Password.Password, details.Data.Password);\\r\\n break;\\r\\n case \\\"CONFIG\\\":\\r\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\r\\n break;\\r\\n case \\\"CGFBR\\\":\\r\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\r\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\r\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\r\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\r\\n let commonParam = addEscapeChar(details.Data.ComPar);\\r\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\r\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\r\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\r\\n let lteParam = addEscapeChar(details.Data.LtePar);\\r\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\r\\n let bleParam = addEscapeChar(details.Data.BlePar);\\r\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\r\\n break;\\r\\n case \\\"REBOOTB\\\":\\r\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\r\\n break;\\r\\n case \\\"PWRFB\\\":\\r\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\r\\n break;\\r\\n case \\\"RESETB\\\":\\r\\n AddConfig(configIds.Bracelet.Reset, 'true');\\r\\n break;\\r\\n case \\\"BRAPWUPDATE\\\":\\r\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\r\\n // get password from old device, then set\\r\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\r\\n )\\r\\n break;\\r\\n case \\\"NOTE\\\":\\r\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\r\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\r\\n text = text.split(\\\",\\\").join(\\\" \\\");\\r\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\r\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\r\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\r\\n AddConfig(configIds.Note.Message, value)\\r\\n break;\\r\\n }\\r\\n }\\r\\n\\r\\n function addEscapeChar(json) {\\r\\n if (json === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n let jsonStr = JSON.stringify(json);\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\r\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function changeSingleQuoteToDouble(jsonStr) {\\r\\n if (jsonStr === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\r\\n outStr = outStr + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function sendMessageToLocalhost(str) {\\r\\n if (localTesting) {\\r\\n console.log(\\\"Sending message to local host: \\\" + str);\\r\\n } else {\\r\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\r\\n var c = createConnection(5878, server); // acceptance is 5678 - protocol dev 5878 - dev is 5679 ?\\r\\n c.write(`${str}`);\\r\\n c.end();\\r\\n }\\r\\n AddValue(\\\"ToLocalhost\\\", str);\\r\\n }\\r\\n\\r\\n function createConnection(port, server) {\\r\\n c = net.createConnection(port, server);\\r\\n c.on('error', function(error) {\\r\\n c = createConnection(port, server);\\r\\n });\\r\\n return c;\\r\\n }\\r\\n\\r\\n function decrypt(encdata, password) {\\r\\n var decrypted;\\r\\n var dataarray = encdata.split(\\\";\\\");\\r\\n if (dataarray.length > 5) {\\r\\n return \\\"\\\";\\r\\n }\\r\\n var i;\\r\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\r\\n if (encdata.startsWith(\\\"ACK\\\")) {\\r\\n return encdata;\\r\\n }\\r\\n for (i = 0; i < 3; i++) {\\r\\n part1 = part1 + dataarray[i] + \\\";\\\";\\r\\n }\\r\\n var mid = dataarray[2]; // use the message ID to create the salt\\r\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n // base64 decoding and extract the iv and encrypted data\\r\\n const bData = Buffer.from(enctext, 'base64');\\r\\n const iv = bData.slice(0, 16); // initial 16 chars\\r\\n const text = bData.slice(16); // all the encrypted data\\r\\n // derive key using; 32 byte key length (from salted password and mid)\\r\\n // decrypt the data in part2 and add to part1\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\r\\n try {\\r\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\r\\n } catch (err) {\\r\\n decrypted = undefined;\\r\\n }\\r\\n return decrypted;\\r\\n }\\r\\n\\r\\n function encrypt(text, mid, password) {\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n const iv = _crypto.randomBytes(16); // random initialization vector\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n // set the cipher\\r\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\r\\n // encrypt text\\r\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\r\\n // generate output ( encrypted text )\\r\\n return Buffer.concat([iv, encrypted]).toString('base64');\\r\\n }\\r\\n\\r\\n function AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n deviceParams.push(cvpair);\\r\\n }\\r\\n\\r\\n function AddConfig(configName, newvalue) {\\r\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n var cvpair = {\\r\\n 'code': configName,\\r\\n 'value': newvalue,\\r\\n 'forced': true\\r\\n };\\r\\n configsToSend.push(cvpair);\\r\\n };\\r\\n }\\r\\n\\r\\n function isASCII(str) {\\r\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\r\\n }\\r\\n\\r\\n function LookupValue(key, type, template) {\\r\\n var cvpair = {\\r\\n key: key, // key to be lookded up\\r\\n type: type, // type of the key\\r\\n template: template // the variable the result will be mapped to\\r\\n };\\r\\n msg.KeyValue = cvpair;\\r\\n }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n module.exports = {\\r\\n execute_ops\\r\\n }\\r\\n} else { // on server use local defined vars\\r\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n // define global returns\\r\\n msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1744208780},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n // Define array to push device data into. This will be put into the msg array at the end.\\r\\n var deviceParams = [];\\r\\n var configsToSend = [];\\r\\n var tasks = [];\\r\\n const _crypto = require('crypto');\\r\\n // handle ACK\\r\\n if (messageTypeCode == \\\"ACK\\\") {\\r\\n return \\\"\\\";\\r\\n }\\r\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\r\\n var password;\\r\\n if (params.imei == \\\"null\\\") {\\r\\n return msg;\\r\\n }\\r\\n password = params.imei;\\r\\n if (configs.Password.Password === \\\"\\\") {\\r\\n // use imei as default password when not specified\\r\\n } else {\\r\\n // use the password\\r\\n password = configs.Password.Password\\r\\n }\\r\\n let message = decrypt(raw, password);\\r\\n if (message) {\\r\\n // send message internally\\r\\n sendMessageToLocalhost(message);\\r\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n } else {\\r\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n }\\r\\n } else { // General Oysta Template\\r\\n switch (messageTypeLocalCode) {\\r\\n case (\\\"COMM\\\"):\\r\\n process_invent_msg(); //incoming invent commands\\r\\n break;\\r\\n case (\\\"MACB\\\"):\\r\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\r\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\r\\n add_params_to_output();\\r\\n break;\\r\\n case \\\"INFO-GETPWB\\\": // handle GETPWB message\\r\\n //let imei = params.bracelet_imei; // not actually needed ?\\r\\n //let mac = params.BLEMAC; // not actually needed ?\\r\\n //AddValue(\\\"mac\\\", params.bracelet_mac);\\r\\n //AddValue(\\\"key\\\", params.key);\\r\\n //console.log(\\\"mac: \\\" + params.bracelet_mac);\\r\\n //let BraceletPW = \\\"\\\"; // until we set it from query below\\r\\n // if(params.bracelet_imei){\\r\\n // if(serverParams.Password){\\r\\n // BraceletPW = serverParams.Password; // query key value table\\r\\n // console.log(BraceletPW); // print for testing reasons\\r\\n // AddConfig(configIds.DeviceConfig.BraceletPW, BraceletPW);//this to return the value\\r\\n // }\\r\\n // }\\r\\n // else {\\r\\n // //return error\\r\\n // }\\r\\n //AddValue(\\\"password\\\", \\\"myNewPassword\\\");\\r\\n //LookupValue(params.ble_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n LookupValue(params.bracelet_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n break;\\r\\n case (\\\"REGISTER\\\"):\\r\\n let ble_mac = params.ble_mac;\\r\\n let iccid = params.iccid;\\r\\n // write values to readonly settings\\r\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\r\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\r\\n // will automtaically Activate on Acceptance\\r\\n if (serverParams.EnvName) {\\r\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\r\\n }\\r\\n }\\r\\n break;\\r\\n case (\\\"CREATE\\\"):\\r\\n // temp fix to filter old messages\\r\\n // const cutoff = 1707523200000; //10.2.2024\\r\\n // let message_id_time = parseInt(params.count_number, 36);\\r\\n // if (message_id_time > cutoff){\\r\\n let c_ble_mac = params.ble_mac;\\r\\n let c_iccid = params.iccid;\\r\\n let new_imei = params.new_imei;\\r\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\r\\n // sendMessageToLocalhost(c_message); \\r\\n tasks = [{\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"sync\\\",\\r\\n \\\"type\\\": \\\"createDevice\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"imei\\\": new_imei,\\r\\n \\\"abortOnError\\\": false,\\r\\n \\\"init\\\": true\\r\\n }),\\r\\n \\\"order\\\": 1\\r\\n }, {\\r\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"async\\\",\\r\\n \\\"type\\\": \\\"sendMessage\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"message\\\": c_message\\r\\n }),\\r\\n \\\"order\\\": 2\\r\\n }]\\r\\n // }\\r\\n break;\\r\\n case (\\\"ALLDATA\\\"):\\r\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\r\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\r\\n let all_data = JSON.parse(json_str);\\r\\n if (\\\"version\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\r\\n };\\r\\n break;\\r\\n default:\\r\\n // all other general messages\\r\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\r\\n add_params_to_output();\\r\\n }\\r\\n // add messagetTypeLocal to output for templates\\r\\n AddValue('local_message_type', messageTypeLocalCode);\\r\\n }\\r\\n msg = {\\r\\n 'values': deviceParams,\\r\\n };\\r\\n if (configsToSend.length > 0) {\\r\\n msg.configsToSend = configsToSend\\r\\n };\\r\\n if (tasks.length > 0) {\\r\\n msg.tasks = tasks\\r\\n };\\r\\n // commit values to receiver processor\\r\\n console.log(msg);\\r\\n // modify to return the object that contains your data\\r\\n return msg;\\r\\n\\r\\n function add_params_to_output() {\\r\\n if (!params.raw_accuracy) {\\r\\n AddValue('location_accuracy', 9000);\\r\\n } else {\\r\\n AddValue('location_accuracy', params.raw_accuracy);\\r\\n }\\r\\n // generate timestamps if they don't exist\\r\\n if (!params.event_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n if (!params.location_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n //if no lat and long are given, set them to 0, 0\\r\\n if (!params.latitude_raw) {\\r\\n AddValue('latitude', 0);\\r\\n } else {\\r\\n AddValue('latitude', params.latitude_raw);\\r\\n }\\r\\n if (!params.longitude_raw) {\\r\\n AddValue('longitude', 0);\\r\\n } else {\\r\\n AddValue('longitude', params.longitude_raw);\\r\\n }\\r\\n // if (params.temp_bracelet){\\r\\n // AddValue('oysta_labels', 'DegC');\\r\\n // AddValue('single_column_value', params.temp_bracelet);\\r\\n // }\\r\\n }\\r\\n\\r\\n function process_invent_msg() {\\r\\n const details = JSON.parse(raw);\\r\\n // AddValue('imei', details.AppId);\\r\\n AddValue('json_in', JSON.stringify(details));\\r\\n switch (details.Command) {\\r\\n case \\\"ACTIVATE_OK\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\r\\n break;\\r\\n case \\\"ACTIVATE_FAILS\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\r\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\r\\n break;\\r\\n case \\\"APPSET\\\":\\r\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\r\\n AddConfig(configIds.Password.Password, details.Data.Password);\\r\\n break;\\r\\n case \\\"CONFIG\\\":\\r\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\r\\n break;\\r\\n case \\\"CGFBR\\\":\\r\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\r\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\r\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\r\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\r\\n let commonParam = addEscapeChar(details.Data.ComPar);\\r\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\r\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\r\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\r\\n let lteParam = addEscapeChar(details.Data.LtePar);\\r\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\r\\n let bleParam = addEscapeChar(details.Data.BlePar);\\r\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\r\\n break;\\r\\n case \\\"REBOOTB\\\":\\r\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\r\\n break;\\r\\n case \\\"PWRFB\\\":\\r\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\r\\n break;\\r\\n case \\\"RESETB\\\":\\r\\n AddConfig(configIds.Bracelet.Reset, 'true');\\r\\n break;\\r\\n case \\\"BRAPWUPDATE\\\":\\r\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\r\\n // get password from old device, then set\\r\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\r\\n )\\r\\n break;\\r\\n case \\\"NOTE\\\":\\r\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\r\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\r\\n text = text.split(\\\",\\\").join(\\\" \\\");\\r\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\r\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\r\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\r\\n AddConfig(configIds.Note.Message, value)\\r\\n break;\\r\\n }\\r\\n }\\r\\n\\r\\n function addEscapeChar(json) {\\r\\n if (json === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n let jsonStr = JSON.stringify(json);\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\r\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function changeSingleQuoteToDouble(jsonStr) {\\r\\n if (jsonStr === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\r\\n outStr = outStr + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function sendMessageToLocalhost(str) {\\r\\n if (localTesting) {\\r\\n console.log(\\\"Sending message to local host: \\\" + str);\\r\\n } else {\\r\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\r\\n var c = createConnection(5878, server); // acceptance is 5678 - protocol dev 5878 - dev is 5679 ?\\r\\n c.write(`${str}`);\\r\\n c.end();\\r\\n }\\r\\n AddValue(\\\"ToLocalhost\\\", str);\\r\\n }\\r\\n\\r\\n function createConnection(port, server) {\\r\\n c = net.createConnection(port, server);\\r\\n c.on('error', function(error) {\\r\\n c = createConnection(port, server);\\r\\n });\\r\\n return c;\\r\\n }\\r\\n\\r\\n function decrypt(encdata, password) {\\r\\n var decrypted;\\r\\n var dataarray = encdata.split(\\\";\\\");\\r\\n if (dataarray.length > 5) {\\r\\n return \\\"\\\";\\r\\n }\\r\\n var i;\\r\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\r\\n if (encdata.startsWith(\\\"ACK\\\")) {\\r\\n return encdata;\\r\\n }\\r\\n for (i = 0; i < 3; i++) {\\r\\n part1 = part1 + dataarray[i] + \\\";\\\";\\r\\n }\\r\\n var mid = dataarray[2]; // use the message ID to create the salt\\r\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n // base64 decoding and extract the iv and encrypted data\\r\\n const bData = Buffer.from(enctext, 'base64');\\r\\n const iv = bData.slice(0, 16); // initial 16 chars\\r\\n const text = bData.slice(16); // all the encrypted data\\r\\n // derive key using; 32 byte key length (from salted password and mid)\\r\\n // decrypt the data in part2 and add to part1\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\r\\n try {\\r\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\r\\n } catch (err) {\\r\\n decrypted = undefined;\\r\\n }\\r\\n return decrypted;\\r\\n }\\r\\n\\r\\n function encrypt(text, mid, password) {\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n const iv = _crypto.randomBytes(16); // random initialization vector\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n // set the cipher\\r\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\r\\n // encrypt text\\r\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\r\\n // generate output ( encrypted text )\\r\\n return Buffer.concat([iv, encrypted]).toString('base64');\\r\\n }\\r\\n\\r\\n function AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n deviceParams.push(cvpair);\\r\\n }\\r\\n\\r\\n function AddConfig(configName, newvalue) {\\r\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n var cvpair = {\\r\\n 'code': configName,\\r\\n 'value': newvalue,\\r\\n 'forced': true\\r\\n };\\r\\n configsToSend.push(cvpair);\\r\\n };\\r\\n }\\r\\n\\r\\n function isASCII(str) {\\r\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\r\\n }\\r\\n\\r\\n function LookupValue(key, type, template) {\\r\\n var cvpair = {\\r\\n key: key, // key to be lookded up\\r\\n type: type, // type of the key\\r\\n template: template // the variable the result will be mapped to\\r\\n };\\r\\n msg.KeyValue = cvpair;\\r\\n }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n module.exports = {\\r\\n execute_ops\\r\\n }\\r\\n} else { // on server use local defined vars\\r\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n // define global returns\\r\\n msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1744209049},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n // Define array to push device data into. This will be put into the msg array at the end.\\r\\n var deviceParams = [];\\r\\n var configsToSend = [];\\r\\n var tasks = [];\\r\\n const _crypto = require('crypto');\\r\\n // handle ACK\\r\\n if (messageTypeCode == \\\"ACK\\\") {\\r\\n return \\\"\\\";\\r\\n }\\r\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\r\\n var password;\\r\\n if (params.imei == \\\"null\\\") {\\r\\n return msg;\\r\\n }\\r\\n password = params.imei;\\r\\n if (configs.Password.Password === \\\"\\\") {\\r\\n // use imei as default password when not specified\\r\\n } else {\\r\\n // use the password\\r\\n password = configs.Password.Password\\r\\n }\\r\\n let message = decrypt(raw, password);\\r\\n if (message) {\\r\\n // send message internally\\r\\n sendMessageToLocalhost(message);\\r\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n } else {\\r\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n }\\r\\n } else { // General Oysta Template\\r\\n switch (messageTypeLocalCode) {\\r\\n case (\\\"COMM\\\"):\\r\\n process_invent_msg(); //incoming invent commands\\r\\n break;\\r\\n case (\\\"MACB\\\"):\\r\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\r\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\r\\n add_params_to_output();\\r\\n break;\\r\\n case \\\"INFO-GETPWB\\\": // handle GETPWB message\\r\\n //let imei = params.bracelet_imei; // not actually needed ?\\r\\n //let mac = params.BLEMAC; // not actually needed ?\\r\\n //AddValue(\\\"mac\\\", params.bracelet_mac);\\r\\n //AddValue(\\\"key\\\", params.key);\\r\\n //console.log(\\\"mac: \\\" + params.bracelet_mac);\\r\\n //let BraceletPW = \\\"\\\"; // until we set it from query below\\r\\n // if(params.bracelet_imei){\\r\\n // if(serverParams.Password){\\r\\n // BraceletPW = serverParams.Password; // query key value table\\r\\n // console.log(BraceletPW); // print for testing reasons\\r\\n // AddConfig(configIds.DeviceConfig.BraceletPW, BraceletPW);//this to return the value\\r\\n // }\\r\\n // }\\r\\n // else {\\r\\n // //return error\\r\\n // }\\r\\n //AddValue(\\\"password\\\", \\\"myNewPassword\\\");\\r\\n //LookupValue(params.ble_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n LookupValue(params.bracelet_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n break;\\r\\n case (\\\"REGISTER\\\"):\\r\\n let ble_mac = params.ble_mac;\\r\\n let iccid = params.iccid;\\r\\n // write values to readonly settings\\r\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\r\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\r\\n // will automtaically Activate on Acceptance\\r\\n if (serverParams.EnvName) {\\r\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\r\\n }\\r\\n }\\r\\n break;\\r\\n case (\\\"CREATE\\\"):\\r\\n // temp fix to filter old messages\\r\\n // const cutoff = 1707523200000; //10.2.2024\\r\\n // let message_id_time = parseInt(params.count_number, 36);\\r\\n // if (message_id_time > cutoff){\\r\\n let c_ble_mac = params.ble_mac;\\r\\n let c_iccid = params.iccid;\\r\\n let new_imei = params.new_imei;\\r\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\r\\n // sendMessageToLocalhost(c_message); \\r\\n tasks = [{\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"sync\\\",\\r\\n \\\"type\\\": \\\"createDevice\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"imei\\\": new_imei,\\r\\n \\\"abortOnError\\\": false,\\r\\n \\\"init\\\": true\\r\\n }),\\r\\n \\\"order\\\": 1\\r\\n }, {\\r\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"async\\\",\\r\\n \\\"type\\\": \\\"sendMessage\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"message\\\": c_message\\r\\n }),\\r\\n \\\"order\\\": 2\\r\\n }]\\r\\n // }\\r\\n break;\\r\\n case (\\\"ALLDATA\\\"):\\r\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\r\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\r\\n let all_data = JSON.parse(json_str);\\r\\n if (\\\"version\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\r\\n };\\r\\n break;\\r\\n default:\\r\\n // all other general messages\\r\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\r\\n add_params_to_output();\\r\\n }\\r\\n // add messagetTypeLocal to output for templates\\r\\n AddValue('local_message_type', messageTypeLocalCode);\\r\\n }\\r\\n msg = {\\r\\n 'values': deviceParams,\\r\\n KeyValue\\r\\n };\\r\\n if (configsToSend.length > 0) {\\r\\n msg.configsToSend = configsToSend\\r\\n };\\r\\n if (tasks.length > 0) {\\r\\n msg.tasks = tasks\\r\\n };\\r\\n // commit values to receiver processor\\r\\n console.log(msg);\\r\\n // modify to return the object that contains your data\\r\\n return msg;\\r\\n\\r\\n function add_params_to_output() {\\r\\n if (!params.raw_accuracy) {\\r\\n AddValue('location_accuracy', 9000);\\r\\n } else {\\r\\n AddValue('location_accuracy', params.raw_accuracy);\\r\\n }\\r\\n // generate timestamps if they don't exist\\r\\n if (!params.event_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n if (!params.location_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n //if no lat and long are given, set them to 0, 0\\r\\n if (!params.latitude_raw) {\\r\\n AddValue('latitude', 0);\\r\\n } else {\\r\\n AddValue('latitude', params.latitude_raw);\\r\\n }\\r\\n if (!params.longitude_raw) {\\r\\n AddValue('longitude', 0);\\r\\n } else {\\r\\n AddValue('longitude', params.longitude_raw);\\r\\n }\\r\\n // if (params.temp_bracelet){\\r\\n // AddValue('oysta_labels', 'DegC');\\r\\n // AddValue('single_column_value', params.temp_bracelet);\\r\\n // }\\r\\n }\\r\\n\\r\\n function process_invent_msg() {\\r\\n const details = JSON.parse(raw);\\r\\n // AddValue('imei', details.AppId);\\r\\n AddValue('json_in', JSON.stringify(details));\\r\\n switch (details.Command) {\\r\\n case \\\"ACTIVATE_OK\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\r\\n break;\\r\\n case \\\"ACTIVATE_FAILS\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\r\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\r\\n break;\\r\\n case \\\"APPSET\\\":\\r\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\r\\n AddConfig(configIds.Password.Password, details.Data.Password);\\r\\n break;\\r\\n case \\\"CONFIG\\\":\\r\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\r\\n break;\\r\\n case \\\"CGFBR\\\":\\r\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\r\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\r\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\r\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\r\\n let commonParam = addEscapeChar(details.Data.ComPar);\\r\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\r\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\r\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\r\\n let lteParam = addEscapeChar(details.Data.LtePar);\\r\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\r\\n let bleParam = addEscapeChar(details.Data.BlePar);\\r\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\r\\n break;\\r\\n case \\\"REBOOTB\\\":\\r\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\r\\n break;\\r\\n case \\\"PWRFB\\\":\\r\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\r\\n break;\\r\\n case \\\"RESETB\\\":\\r\\n AddConfig(configIds.Bracelet.Reset, 'true');\\r\\n break;\\r\\n case \\\"BRAPWUPDATE\\\":\\r\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\r\\n // get password from old device, then set\\r\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\r\\n )\\r\\n break;\\r\\n case \\\"NOTE\\\":\\r\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\r\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\r\\n text = text.split(\\\",\\\").join(\\\" \\\");\\r\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\r\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\r\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\r\\n AddConfig(configIds.Note.Message, value)\\r\\n break;\\r\\n }\\r\\n }\\r\\n\\r\\n function addEscapeChar(json) {\\r\\n if (json === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n let jsonStr = JSON.stringify(json);\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\r\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function changeSingleQuoteToDouble(jsonStr) {\\r\\n if (jsonStr === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\r\\n outStr = outStr + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function sendMessageToLocalhost(str) {\\r\\n if (localTesting) {\\r\\n console.log(\\\"Sending message to local host: \\\" + str);\\r\\n } else {\\r\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\r\\n var c = createConnection(5878, server); // acceptance is 5678 - protocol dev 5878 - dev is 5679 ?\\r\\n c.write(`${str}`);\\r\\n c.end();\\r\\n }\\r\\n AddValue(\\\"ToLocalhost\\\", str);\\r\\n }\\r\\n\\r\\n function createConnection(port, server) {\\r\\n c = net.createConnection(port, server);\\r\\n c.on('error', function(error) {\\r\\n c = createConnection(port, server);\\r\\n });\\r\\n return c;\\r\\n }\\r\\n\\r\\n function decrypt(encdata, password) {\\r\\n var decrypted;\\r\\n var dataarray = encdata.split(\\\";\\\");\\r\\n if (dataarray.length > 5) {\\r\\n return \\\"\\\";\\r\\n }\\r\\n var i;\\r\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\r\\n if (encdata.startsWith(\\\"ACK\\\")) {\\r\\n return encdata;\\r\\n }\\r\\n for (i = 0; i < 3; i++) {\\r\\n part1 = part1 + dataarray[i] + \\\";\\\";\\r\\n }\\r\\n var mid = dataarray[2]; // use the message ID to create the salt\\r\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n // base64 decoding and extract the iv and encrypted data\\r\\n const bData = Buffer.from(enctext, 'base64');\\r\\n const iv = bData.slice(0, 16); // initial 16 chars\\r\\n const text = bData.slice(16); // all the encrypted data\\r\\n // derive key using; 32 byte key length (from salted password and mid)\\r\\n // decrypt the data in part2 and add to part1\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\r\\n try {\\r\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\r\\n } catch (err) {\\r\\n decrypted = undefined;\\r\\n }\\r\\n return decrypted;\\r\\n }\\r\\n\\r\\n function encrypt(text, mid, password) {\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n const iv = _crypto.randomBytes(16); // random initialization vector\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n // set the cipher\\r\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\r\\n // encrypt text\\r\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\r\\n // generate output ( encrypted text )\\r\\n return Buffer.concat([iv, encrypted]).toString('base64');\\r\\n }\\r\\n\\r\\n function AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n deviceParams.push(cvpair);\\r\\n }\\r\\n\\r\\n function AddConfig(configName, newvalue) {\\r\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n var cvpair = {\\r\\n 'code': configName,\\r\\n 'value': newvalue,\\r\\n 'forced': true\\r\\n };\\r\\n configsToSend.push(cvpair);\\r\\n };\\r\\n }\\r\\n\\r\\n function isASCII(str) {\\r\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\r\\n }\\r\\n\\r\\n function LookupValue(key, type, template) {\\r\\n var cvpair = {\\r\\n key: key, // key to be lookded up\\r\\n type: type, // type of the key\\r\\n template: template // the variable the result will be mapped to\\r\\n };\\r\\n msg.KeyValue = cvpair;\\r\\n }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n module.exports = {\\r\\n execute_ops\\r\\n }\\r\\n} else { // on server use local defined vars\\r\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n // define global returns\\r\\n msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1744209157},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n // Define array to push device data into. This will be put into the msg array at the end.\\r\\n var deviceParams = [];\\r\\n var configsToSend = [];\\r\\n var tasks = [];\\r\\n const _crypto = require('crypto');\\r\\n // handle ACK\\r\\n if (messageTypeCode == \\\"ACK\\\") {\\r\\n return \\\"\\\";\\r\\n }\\r\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\r\\n var password;\\r\\n if (params.imei == \\\"null\\\") {\\r\\n return msg;\\r\\n }\\r\\n password = params.imei;\\r\\n if (configs.Password.Password === \\\"\\\") {\\r\\n // use imei as default password when not specified\\r\\n } else {\\r\\n // use the password\\r\\n password = configs.Password.Password\\r\\n }\\r\\n let message = decrypt(raw, password);\\r\\n if (message) {\\r\\n // send message internally\\r\\n sendMessageToLocalhost(message);\\r\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n } else {\\r\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n }\\r\\n } else { // General Oysta Template\\r\\n switch (messageTypeLocalCode) {\\r\\n case (\\\"COMM\\\"):\\r\\n process_invent_msg(); //incoming invent commands\\r\\n break;\\r\\n case (\\\"MACB\\\"):\\r\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\r\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\r\\n add_params_to_output();\\r\\n break;\\r\\n case \\\"INFO-GETPWB\\\": // handle GETPWB message\\r\\n //let imei = params.bracelet_imei; // not actually needed ?\\r\\n //let mac = params.BLEMAC; // not actually needed ?\\r\\n //AddValue(\\\"mac\\\", params.bracelet_mac);\\r\\n //AddValue(\\\"key\\\", params.key);\\r\\n //console.log(\\\"mac: \\\" + params.bracelet_mac);\\r\\n //let BraceletPW = \\\"\\\"; // until we set it from query below\\r\\n // if(params.bracelet_imei){\\r\\n // if(serverParams.Password){\\r\\n // BraceletPW = serverParams.Password; // query key value table\\r\\n // console.log(BraceletPW); // print for testing reasons\\r\\n // AddConfig(configIds.DeviceConfig.BraceletPW, BraceletPW);//this to return the value\\r\\n // }\\r\\n // }\\r\\n // else {\\r\\n // //return error\\r\\n // }\\r\\n //AddValue(\\\"password\\\", \\\"myNewPassword\\\");\\r\\n //LookupValue(params.ble_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n //LookupValue(params.bracelet_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n break;\\r\\n case (\\\"REGISTER\\\"):\\r\\n let ble_mac = params.ble_mac;\\r\\n let iccid = params.iccid;\\r\\n // write values to readonly settings\\r\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\r\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\r\\n // will automtaically Activate on Acceptance\\r\\n if (serverParams.EnvName) {\\r\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\r\\n }\\r\\n }\\r\\n break;\\r\\n case (\\\"CREATE\\\"):\\r\\n // temp fix to filter old messages\\r\\n // const cutoff = 1707523200000; //10.2.2024\\r\\n // let message_id_time = parseInt(params.count_number, 36);\\r\\n // if (message_id_time > cutoff){\\r\\n let c_ble_mac = params.ble_mac;\\r\\n let c_iccid = params.iccid;\\r\\n let new_imei = params.new_imei;\\r\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\r\\n // sendMessageToLocalhost(c_message); \\r\\n tasks = [{\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"sync\\\",\\r\\n \\\"type\\\": \\\"createDevice\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"imei\\\": new_imei,\\r\\n \\\"abortOnError\\\": false,\\r\\n \\\"init\\\": true\\r\\n }),\\r\\n \\\"order\\\": 1\\r\\n }, {\\r\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"async\\\",\\r\\n \\\"type\\\": \\\"sendMessage\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"message\\\": c_message\\r\\n }),\\r\\n \\\"order\\\": 2\\r\\n }]\\r\\n // }\\r\\n break;\\r\\n case (\\\"ALLDATA\\\"):\\r\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\r\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\r\\n let all_data = JSON.parse(json_str);\\r\\n if (\\\"version\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\r\\n };\\r\\n break;\\r\\n default:\\r\\n // all other general messages\\r\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\r\\n add_params_to_output();\\r\\n }\\r\\n // add messagetTypeLocal to output for templates\\r\\n AddValue('local_message_type', messageTypeLocalCode);\\r\\n }\\r\\n msg = {\\r\\n 'values': deviceParams,\\r\\n KeyValue\\r\\n };\\r\\n if (configsToSend.length > 0) {\\r\\n msg.configsToSend = configsToSend\\r\\n };\\r\\n if (tasks.length > 0) {\\r\\n msg.tasks = tasks\\r\\n };\\r\\n var cvpair = {\\r\\n key: \\\"BC572909705E\\\", // key to be lookded up\\r\\n type: \\\"Bracelet\\\", // type of the key\\r\\n template: \\\"password\\\" // the variable the result will be mapped to\\r\\n };\\r\\n msg.KeyValue = cvpair;\\r\\n // commit values to receiver processor\\r\\n console.log(msg);\\r\\n // modify to return the object that contains your data\\r\\n return msg;\\r\\n\\r\\n function add_params_to_output() {\\r\\n if (!params.raw_accuracy) {\\r\\n AddValue('location_accuracy', 9000);\\r\\n } else {\\r\\n AddValue('location_accuracy', params.raw_accuracy);\\r\\n }\\r\\n // generate timestamps if they don't exist\\r\\n if (!params.event_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n if (!params.location_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n //if no lat and long are given, set them to 0, 0\\r\\n if (!params.latitude_raw) {\\r\\n AddValue('latitude', 0);\\r\\n } else {\\r\\n AddValue('latitude', params.latitude_raw);\\r\\n }\\r\\n if (!params.longitude_raw) {\\r\\n AddValue('longitude', 0);\\r\\n } else {\\r\\n AddValue('longitude', params.longitude_raw);\\r\\n }\\r\\n // if (params.temp_bracelet){\\r\\n // AddValue('oysta_labels', 'DegC');\\r\\n // AddValue('single_column_value', params.temp_bracelet);\\r\\n // }\\r\\n }\\r\\n\\r\\n function process_invent_msg() {\\r\\n const details = JSON.parse(raw);\\r\\n // AddValue('imei', details.AppId);\\r\\n AddValue('json_in', JSON.stringify(details));\\r\\n switch (details.Command) {\\r\\n case \\\"ACTIVATE_OK\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\r\\n break;\\r\\n case \\\"ACTIVATE_FAILS\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\r\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\r\\n break;\\r\\n case \\\"APPSET\\\":\\r\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\r\\n AddConfig(configIds.Password.Password, details.Data.Password);\\r\\n break;\\r\\n case \\\"CONFIG\\\":\\r\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\r\\n break;\\r\\n case \\\"CGFBR\\\":\\r\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\r\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\r\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\r\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\r\\n let commonParam = addEscapeChar(details.Data.ComPar);\\r\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\r\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\r\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\r\\n let lteParam = addEscapeChar(details.Data.LtePar);\\r\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\r\\n let bleParam = addEscapeChar(details.Data.BlePar);\\r\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\r\\n break;\\r\\n case \\\"REBOOTB\\\":\\r\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\r\\n break;\\r\\n case \\\"PWRFB\\\":\\r\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\r\\n break;\\r\\n case \\\"RESETB\\\":\\r\\n AddConfig(configIds.Bracelet.Reset, 'true');\\r\\n break;\\r\\n case \\\"BRAPWUPDATE\\\":\\r\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\r\\n // get password from old device, then set\\r\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\r\\n )\\r\\n break;\\r\\n case \\\"NOTE\\\":\\r\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\r\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\r\\n text = text.split(\\\",\\\").join(\\\" \\\");\\r\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\r\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\r\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\r\\n AddConfig(configIds.Note.Message, value)\\r\\n break;\\r\\n }\\r\\n }\\r\\n\\r\\n function addEscapeChar(json) {\\r\\n if (json === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n let jsonStr = JSON.stringify(json);\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\r\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function changeSingleQuoteToDouble(jsonStr) {\\r\\n if (jsonStr === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\r\\n outStr = outStr + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function sendMessageToLocalhost(str) {\\r\\n if (localTesting) {\\r\\n console.log(\\\"Sending message to local host: \\\" + str);\\r\\n } else {\\r\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\r\\n var c = createConnection(5878, server); // acceptance is 5678 - protocol dev 5878 - dev is 5679 ?\\r\\n c.write(`${str}`);\\r\\n c.end();\\r\\n }\\r\\n AddValue(\\\"ToLocalhost\\\", str);\\r\\n }\\r\\n\\r\\n function createConnection(port, server) {\\r\\n c = net.createConnection(port, server);\\r\\n c.on('error', function(error) {\\r\\n c = createConnection(port, server);\\r\\n });\\r\\n return c;\\r\\n }\\r\\n\\r\\n function decrypt(encdata, password) {\\r\\n var decrypted;\\r\\n var dataarray = encdata.split(\\\";\\\");\\r\\n if (dataarray.length > 5) {\\r\\n return \\\"\\\";\\r\\n }\\r\\n var i;\\r\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\r\\n if (encdata.startsWith(\\\"ACK\\\")) {\\r\\n return encdata;\\r\\n }\\r\\n for (i = 0; i < 3; i++) {\\r\\n part1 = part1 + dataarray[i] + \\\";\\\";\\r\\n }\\r\\n var mid = dataarray[2]; // use the message ID to create the salt\\r\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n // base64 decoding and extract the iv and encrypted data\\r\\n const bData = Buffer.from(enctext, 'base64');\\r\\n const iv = bData.slice(0, 16); // initial 16 chars\\r\\n const text = bData.slice(16); // all the encrypted data\\r\\n // derive key using; 32 byte key length (from salted password and mid)\\r\\n // decrypt the data in part2 and add to part1\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\r\\n try {\\r\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\r\\n } catch (err) {\\r\\n decrypted = undefined;\\r\\n }\\r\\n return decrypted;\\r\\n }\\r\\n\\r\\n function encrypt(text, mid, password) {\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n const iv = _crypto.randomBytes(16); // random initialization vector\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n // set the cipher\\r\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\r\\n // encrypt text\\r\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\r\\n // generate output ( encrypted text )\\r\\n return Buffer.concat([iv, encrypted]).toString('base64');\\r\\n }\\r\\n\\r\\n function AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n deviceParams.push(cvpair);\\r\\n }\\r\\n\\r\\n function AddConfig(configName, newvalue) {\\r\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n var cvpair = {\\r\\n 'code': configName,\\r\\n 'value': newvalue,\\r\\n 'forced': true\\r\\n };\\r\\n configsToSend.push(cvpair);\\r\\n };\\r\\n }\\r\\n\\r\\n function isASCII(str) {\\r\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\r\\n }\\r\\n\\r\\n function LookupValue(key, type, template) {\\r\\n var cvpair = {\\r\\n key: key, // key to be lookded up\\r\\n type: type, // type of the key\\r\\n template: template // the variable the result will be mapped to\\r\\n };\\r\\n msg.KeyValue = cvpair;\\r\\n }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n module.exports = {\\r\\n execute_ops\\r\\n }\\r\\n} else { // on server use local defined vars\\r\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n // define global returns\\r\\n msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1744209596},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n // Define array to push device data into. This will be put into the msg array at the end.\\r\\n var deviceParams = [];\\r\\n var configsToSend = [];\\r\\n var tasks = [];\\r\\n const _crypto = require('crypto');\\r\\n // handle ACK\\r\\n if (messageTypeCode == \\\"ACK\\\") {\\r\\n return \\\"\\\";\\r\\n }\\r\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\r\\n var password;\\r\\n if (params.imei == \\\"null\\\") {\\r\\n return msg;\\r\\n }\\r\\n password = params.imei;\\r\\n if (configs.Password.Password === \\\"\\\") {\\r\\n // use imei as default password when not specified\\r\\n } else {\\r\\n // use the password\\r\\n password = configs.Password.Password\\r\\n }\\r\\n let message = decrypt(raw, password);\\r\\n if (message) {\\r\\n // send message internally\\r\\n sendMessageToLocalhost(message);\\r\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n } else {\\r\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n }\\r\\n } else { // General Oysta Template\\r\\n switch (messageTypeLocalCode) {\\r\\n case (\\\"COMM\\\"):\\r\\n process_invent_msg(); //incoming invent commands\\r\\n break;\\r\\n case (\\\"MACB\\\"):\\r\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\r\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\r\\n add_params_to_output();\\r\\n break;\\r\\n case \\\"INFO-GETPWB\\\": // handle GETPWB message\\r\\n //let imei = params.bracelet_imei; // not actually needed ?\\r\\n //let mac = params.BLEMAC; // not actually needed ?\\r\\n //AddValue(\\\"mac\\\", params.bracelet_mac);\\r\\n //AddValue(\\\"key\\\", params.key);\\r\\n //console.log(\\\"mac: \\\" + params.bracelet_mac);\\r\\n //let BraceletPW = \\\"\\\"; // until we set it from query below\\r\\n // if(params.bracelet_imei){\\r\\n // if(serverParams.Password){\\r\\n // BraceletPW = serverParams.Password; // query key value table\\r\\n // console.log(BraceletPW); // print for testing reasons\\r\\n // AddConfig(configIds.DeviceConfig.BraceletPW, BraceletPW);//this to return the value\\r\\n // }\\r\\n // }\\r\\n // else {\\r\\n // //return error\\r\\n // }\\r\\n //AddValue(\\\"password\\\", \\\"myNewPassword\\\");\\r\\n //LookupValue(params.ble_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n //LookupValue(params.bracelet_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n break;\\r\\n case (\\\"REGISTER\\\"):\\r\\n let ble_mac = params.ble_mac;\\r\\n let iccid = params.iccid;\\r\\n // write values to readonly settings\\r\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\r\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\r\\n // will automtaically Activate on Acceptance\\r\\n if (serverParams.EnvName) {\\r\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\r\\n }\\r\\n }\\r\\n break;\\r\\n case (\\\"CREATE\\\"):\\r\\n // temp fix to filter old messages\\r\\n // const cutoff = 1707523200000; //10.2.2024\\r\\n // let message_id_time = parseInt(params.count_number, 36);\\r\\n // if (message_id_time > cutoff){\\r\\n let c_ble_mac = params.ble_mac;\\r\\n let c_iccid = params.iccid;\\r\\n let new_imei = params.new_imei;\\r\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\r\\n // sendMessageToLocalhost(c_message); \\r\\n tasks = [{\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"sync\\\",\\r\\n \\\"type\\\": \\\"createDevice\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"imei\\\": new_imei,\\r\\n \\\"abortOnError\\\": false,\\r\\n \\\"init\\\": true\\r\\n }),\\r\\n \\\"order\\\": 1\\r\\n }, {\\r\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"async\\\",\\r\\n \\\"type\\\": \\\"sendMessage\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"message\\\": c_message\\r\\n }),\\r\\n \\\"order\\\": 2\\r\\n }]\\r\\n // }\\r\\n break;\\r\\n case (\\\"ALLDATA\\\"):\\r\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\r\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\r\\n let all_data = JSON.parse(json_str);\\r\\n if (\\\"version\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\r\\n };\\r\\n break;\\r\\n default:\\r\\n // all other general messages\\r\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\r\\n add_params_to_output();\\r\\n }\\r\\n // add messagetTypeLocal to output for templates\\r\\n AddValue('local_message_type', messageTypeLocalCode);\\r\\n }\\r\\n msg = {\\r\\n 'values': deviceParams,\\r\\n };\\r\\n if (configsToSend.length > 0) {\\r\\n msg.configsToSend = configsToSend\\r\\n };\\r\\n if (tasks.length > 0) {\\r\\n msg.tasks = tasks\\r\\n };\\r\\n var cvpair = {\\r\\n key: \\\"BC572909705E\\\", // key to be lookded up\\r\\n type: \\\"Bracelet\\\", // type of the key\\r\\n template: \\\"password\\\" // the variable the result will be mapped to\\r\\n };\\r\\n msg.KeyValue = cvpair;\\r\\n // commit values to receiver processor\\r\\n console.log(msg);\\r\\n // modify to return the object that contains your data\\r\\n return msg;\\r\\n\\r\\n function add_params_to_output() {\\r\\n if (!params.raw_accuracy) {\\r\\n AddValue('location_accuracy', 9000);\\r\\n } else {\\r\\n AddValue('location_accuracy', params.raw_accuracy);\\r\\n }\\r\\n // generate timestamps if they don't exist\\r\\n if (!params.event_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n if (!params.location_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n //if no lat and long are given, set them to 0, 0\\r\\n if (!params.latitude_raw) {\\r\\n AddValue('latitude', 0);\\r\\n } else {\\r\\n AddValue('latitude', params.latitude_raw);\\r\\n }\\r\\n if (!params.longitude_raw) {\\r\\n AddValue('longitude', 0);\\r\\n } else {\\r\\n AddValue('longitude', params.longitude_raw);\\r\\n }\\r\\n // if (params.temp_bracelet){\\r\\n // AddValue('oysta_labels', 'DegC');\\r\\n // AddValue('single_column_value', params.temp_bracelet);\\r\\n // }\\r\\n }\\r\\n\\r\\n function process_invent_msg() {\\r\\n const details = JSON.parse(raw);\\r\\n // AddValue('imei', details.AppId);\\r\\n AddValue('json_in', JSON.stringify(details));\\r\\n switch (details.Command) {\\r\\n case \\\"ACTIVATE_OK\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\r\\n break;\\r\\n case \\\"ACTIVATE_FAILS\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\r\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\r\\n break;\\r\\n case \\\"APPSET\\\":\\r\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\r\\n AddConfig(configIds.Password.Password, details.Data.Password);\\r\\n break;\\r\\n case \\\"CONFIG\\\":\\r\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\r\\n break;\\r\\n case \\\"CGFBR\\\":\\r\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\r\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\r\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\r\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\r\\n let commonParam = addEscapeChar(details.Data.ComPar);\\r\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\r\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\r\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\r\\n let lteParam = addEscapeChar(details.Data.LtePar);\\r\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\r\\n let bleParam = addEscapeChar(details.Data.BlePar);\\r\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\r\\n break;\\r\\n case \\\"REBOOTB\\\":\\r\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\r\\n break;\\r\\n case \\\"PWRFB\\\":\\r\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\r\\n break;\\r\\n case \\\"RESETB\\\":\\r\\n AddConfig(configIds.Bracelet.Reset, 'true');\\r\\n break;\\r\\n case \\\"BRAPWUPDATE\\\":\\r\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\r\\n // get password from old device, then set\\r\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\r\\n )\\r\\n break;\\r\\n case \\\"NOTE\\\":\\r\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\r\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\r\\n text = text.split(\\\",\\\").join(\\\" \\\");\\r\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\r\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\r\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\r\\n AddConfig(configIds.Note.Message, value)\\r\\n break;\\r\\n }\\r\\n }\\r\\n\\r\\n function addEscapeChar(json) {\\r\\n if (json === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n let jsonStr = JSON.stringify(json);\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\r\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function changeSingleQuoteToDouble(jsonStr) {\\r\\n if (jsonStr === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\r\\n outStr = outStr + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function sendMessageToLocalhost(str) {\\r\\n if (localTesting) {\\r\\n console.log(\\\"Sending message to local host: \\\" + str);\\r\\n } else {\\r\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\r\\n var c = createConnection(5878, server); // acceptance is 5678 - protocol dev 5878 - dev is 5679 ?\\r\\n c.write(`${str}`);\\r\\n c.end();\\r\\n }\\r\\n AddValue(\\\"ToLocalhost\\\", str);\\r\\n }\\r\\n\\r\\n function createConnection(port, server) {\\r\\n c = net.createConnection(port, server);\\r\\n c.on('error', function(error) {\\r\\n c = createConnection(port, server);\\r\\n });\\r\\n return c;\\r\\n }\\r\\n\\r\\n function decrypt(encdata, password) {\\r\\n var decrypted;\\r\\n var dataarray = encdata.split(\\\";\\\");\\r\\n if (dataarray.length > 5) {\\r\\n return \\\"\\\";\\r\\n }\\r\\n var i;\\r\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\r\\n if (encdata.startsWith(\\\"ACK\\\")) {\\r\\n return encdata;\\r\\n }\\r\\n for (i = 0; i < 3; i++) {\\r\\n part1 = part1 + dataarray[i] + \\\";\\\";\\r\\n }\\r\\n var mid = dataarray[2]; // use the message ID to create the salt\\r\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n // base64 decoding and extract the iv and encrypted data\\r\\n const bData = Buffer.from(enctext, 'base64');\\r\\n const iv = bData.slice(0, 16); // initial 16 chars\\r\\n const text = bData.slice(16); // all the encrypted data\\r\\n // derive key using; 32 byte key length (from salted password and mid)\\r\\n // decrypt the data in part2 and add to part1\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\r\\n try {\\r\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\r\\n } catch (err) {\\r\\n decrypted = undefined;\\r\\n }\\r\\n return decrypted;\\r\\n }\\r\\n\\r\\n function encrypt(text, mid, password) {\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n const iv = _crypto.randomBytes(16); // random initialization vector\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n // set the cipher\\r\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\r\\n // encrypt text\\r\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\r\\n // generate output ( encrypted text )\\r\\n return Buffer.concat([iv, encrypted]).toString('base64');\\r\\n }\\r\\n\\r\\n function AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n deviceParams.push(cvpair);\\r\\n }\\r\\n\\r\\n function AddConfig(configName, newvalue) {\\r\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n var cvpair = {\\r\\n 'code': configName,\\r\\n 'value': newvalue,\\r\\n 'forced': true\\r\\n };\\r\\n configsToSend.push(cvpair);\\r\\n };\\r\\n }\\r\\n\\r\\n function isASCII(str) {\\r\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\r\\n }\\r\\n\\r\\n function LookupValue(key, type, template) {\\r\\n var cvpair = {\\r\\n key: key, // key to be lookded up\\r\\n type: type, // type of the key\\r\\n template: template // the variable the result will be mapped to\\r\\n };\\r\\n msg.KeyValue = cvpair;\\r\\n }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n module.exports = {\\r\\n execute_ops\\r\\n }\\r\\n} else { // on server use local defined vars\\r\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n // define global returns\\r\\n msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1744209665},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n // Define array to push device data into. This will be put into the msg array at the end.\\r\\n var deviceParams = [];\\r\\n var configsToSend = [];\\r\\n var tasks = [];\\r\\n var devicekey = \\\"\\\";\\r\\n const _crypto = require('crypto');\\r\\n // handle ACK\\r\\n if (messageTypeCode == \\\"ACK\\\") {\\r\\n return \\\"\\\";\\r\\n }\\r\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\r\\n var password;\\r\\n if (params.imei == \\\"null\\\") {\\r\\n return msg;\\r\\n }\\r\\n password = params.imei;\\r\\n if (configs.Password.Password === \\\"\\\") {\\r\\n // use imei as default password when not specified\\r\\n } else {\\r\\n // use the password\\r\\n password = configs.Password.Password\\r\\n }\\r\\n let message = decrypt(raw, password);\\r\\n if (message) {\\r\\n // send message internally\\r\\n sendMessageToLocalhost(message);\\r\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n } else {\\r\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n }\\r\\n } else { // General Oysta Template\\r\\n switch (messageTypeLocalCode) {\\r\\n case (\\\"COMM\\\"):\\r\\n process_invent_msg(); //incoming invent commands\\r\\n break;\\r\\n case (\\\"MACB\\\"):\\r\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\r\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\r\\n add_params_to_output();\\r\\n break;\\r\\n case \\\"INFO-GETPWB\\\": // handle GETPWB message\\r\\n //let imei = params.bracelet_imei; // not actually needed ?\\r\\n //let mac = params.BLEMAC; // not actually needed ?\\r\\n //AddValue(\\\"mac\\\", params.bracelet_mac);\\r\\n //AddValue(\\\"key\\\", params.key);\\r\\n //console.log(\\\"mac: \\\" + params.bracelet_mac);\\r\\n //let BraceletPW = \\\"\\\"; // until we set it from query below\\r\\n // if(params.bracelet_imei){\\r\\n // if(serverParams.Password){\\r\\n // BraceletPW = serverParams.Password; // query key value table\\r\\n // console.log(BraceletPW); // print for testing reasons\\r\\n // AddConfig(configIds.DeviceConfig.BraceletPW, BraceletPW);//this to return the value\\r\\n // }\\r\\n // }\\r\\n // else {\\r\\n // //return error\\r\\n // }\\r\\n //AddValue(\\\"password\\\", \\\"myNewPassword\\\");\\r\\n devicekey = params.ble_mac;\\r\\n //LookupValue(params.ble_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n //LookupValue(params.bracelet_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n break;\\r\\n case (\\\"REGISTER\\\"):\\r\\n let ble_mac = params.ble_mac;\\r\\n let iccid = params.iccid;\\r\\n // write values to readonly settings\\r\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\r\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\r\\n // will automtaically Activate on Acceptance\\r\\n if (serverParams.EnvName) {\\r\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\r\\n }\\r\\n }\\r\\n break;\\r\\n case (\\\"CREATE\\\"):\\r\\n // temp fix to filter old messages\\r\\n // const cutoff = 1707523200000; //10.2.2024\\r\\n // let message_id_time = parseInt(params.count_number, 36);\\r\\n // if (message_id_time > cutoff){\\r\\n let c_ble_mac = params.ble_mac;\\r\\n let c_iccid = params.iccid;\\r\\n let new_imei = params.new_imei;\\r\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\r\\n // sendMessageToLocalhost(c_message); \\r\\n tasks = [{\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"sync\\\",\\r\\n \\\"type\\\": \\\"createDevice\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"imei\\\": new_imei,\\r\\n \\\"abortOnError\\\": false,\\r\\n \\\"init\\\": true\\r\\n }),\\r\\n \\\"order\\\": 1\\r\\n }, {\\r\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"async\\\",\\r\\n \\\"type\\\": \\\"sendMessage\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"message\\\": c_message\\r\\n }),\\r\\n \\\"order\\\": 2\\r\\n }]\\r\\n // }\\r\\n break;\\r\\n case (\\\"ALLDATA\\\"):\\r\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\r\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\r\\n let all_data = JSON.parse(json_str);\\r\\n if (\\\"version\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\r\\n };\\r\\n break;\\r\\n default:\\r\\n // all other general messages\\r\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\r\\n add_params_to_output();\\r\\n }\\r\\n // add messagetTypeLocal to output for templates\\r\\n AddValue('local_message_type', messageTypeLocalCode);\\r\\n }\\r\\n msg = {\\r\\n 'values': deviceParams,\\r\\n };\\r\\n if (configsToSend.length > 0) {\\r\\n msg.configsToSend = configsToSend\\r\\n };\\r\\n if (tasks.length > 0) {\\r\\n msg.tasks = tasks\\r\\n };\\r\\n var cvpair = {\\r\\n key: devicekey, // key to be lookded up\\r\\n type: \\\"Bracelet\\\", // type of the key\\r\\n template: \\\"password\\\" // the variable the result will be mapped to\\r\\n };\\r\\n msg.KeyValue = cvpair;\\r\\n // commit values to receiver processor\\r\\n console.log(msg);\\r\\n // modify to return the object that contains your data\\r\\n return msg;\\r\\n\\r\\n function add_params_to_output() {\\r\\n if (!params.raw_accuracy) {\\r\\n AddValue('location_accuracy', 9000);\\r\\n } else {\\r\\n AddValue('location_accuracy', params.raw_accuracy);\\r\\n }\\r\\n // generate timestamps if they don't exist\\r\\n if (!params.event_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n if (!params.location_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n //if no lat and long are given, set them to 0, 0\\r\\n if (!params.latitude_raw) {\\r\\n AddValue('latitude', 0);\\r\\n } else {\\r\\n AddValue('latitude', params.latitude_raw);\\r\\n }\\r\\n if (!params.longitude_raw) {\\r\\n AddValue('longitude', 0);\\r\\n } else {\\r\\n AddValue('longitude', params.longitude_raw);\\r\\n }\\r\\n // if (params.temp_bracelet){\\r\\n // AddValue('oysta_labels', 'DegC');\\r\\n // AddValue('single_column_value', params.temp_bracelet);\\r\\n // }\\r\\n }\\r\\n\\r\\n function process_invent_msg() {\\r\\n const details = JSON.parse(raw);\\r\\n // AddValue('imei', details.AppId);\\r\\n AddValue('json_in', JSON.stringify(details));\\r\\n switch (details.Command) {\\r\\n case \\\"ACTIVATE_OK\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\r\\n break;\\r\\n case \\\"ACTIVATE_FAILS\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\r\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\r\\n break;\\r\\n case \\\"APPSET\\\":\\r\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\r\\n AddConfig(configIds.Password.Password, details.Data.Password);\\r\\n break;\\r\\n case \\\"CONFIG\\\":\\r\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\r\\n break;\\r\\n case \\\"CGFBR\\\":\\r\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\r\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\r\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\r\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\r\\n let commonParam = addEscapeChar(details.Data.ComPar);\\r\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\r\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\r\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\r\\n let lteParam = addEscapeChar(details.Data.LtePar);\\r\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\r\\n let bleParam = addEscapeChar(details.Data.BlePar);\\r\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\r\\n break;\\r\\n case \\\"REBOOTB\\\":\\r\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\r\\n break;\\r\\n case \\\"PWRFB\\\":\\r\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\r\\n break;\\r\\n case \\\"RESETB\\\":\\r\\n AddConfig(configIds.Bracelet.Reset, 'true');\\r\\n break;\\r\\n case \\\"BRAPWUPDATE\\\":\\r\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\r\\n // get password from old device, then set\\r\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\r\\n )\\r\\n break;\\r\\n case \\\"NOTE\\\":\\r\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\r\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\r\\n text = text.split(\\\",\\\").join(\\\" \\\");\\r\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\r\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\r\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\r\\n AddConfig(configIds.Note.Message, value)\\r\\n break;\\r\\n }\\r\\n }\\r\\n\\r\\n function addEscapeChar(json) {\\r\\n if (json === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n let jsonStr = JSON.stringify(json);\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\r\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function changeSingleQuoteToDouble(jsonStr) {\\r\\n if (jsonStr === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\r\\n outStr = outStr + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function sendMessageToLocalhost(str) {\\r\\n if (localTesting) {\\r\\n console.log(\\\"Sending message to local host: \\\" + str);\\r\\n } else {\\r\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\r\\n var c = createConnection(5878, server); // acceptance is 5678 - protocol dev 5878 - dev is 5679 ?\\r\\n c.write(`${str}`);\\r\\n c.end();\\r\\n }\\r\\n AddValue(\\\"ToLocalhost\\\", str);\\r\\n }\\r\\n\\r\\n function createConnection(port, server) {\\r\\n c = net.createConnection(port, server);\\r\\n c.on('error', function(error) {\\r\\n c = createConnection(port, server);\\r\\n });\\r\\n return c;\\r\\n }\\r\\n\\r\\n function decrypt(encdata, password) {\\r\\n var decrypted;\\r\\n var dataarray = encdata.split(\\\";\\\");\\r\\n if (dataarray.length > 5) {\\r\\n return \\\"\\\";\\r\\n }\\r\\n var i;\\r\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\r\\n if (encdata.startsWith(\\\"ACK\\\")) {\\r\\n return encdata;\\r\\n }\\r\\n for (i = 0; i < 3; i++) {\\r\\n part1 = part1 + dataarray[i] + \\\";\\\";\\r\\n }\\r\\n var mid = dataarray[2]; // use the message ID to create the salt\\r\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n // base64 decoding and extract the iv and encrypted data\\r\\n const bData = Buffer.from(enctext, 'base64');\\r\\n const iv = bData.slice(0, 16); // initial 16 chars\\r\\n const text = bData.slice(16); // all the encrypted data\\r\\n // derive key using; 32 byte key length (from salted password and mid)\\r\\n // decrypt the data in part2 and add to part1\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\r\\n try {\\r\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\r\\n } catch (err) {\\r\\n decrypted = undefined;\\r\\n }\\r\\n return decrypted;\\r\\n }\\r\\n\\r\\n function encrypt(text, mid, password) {\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n const iv = _crypto.randomBytes(16); // random initialization vector\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n // set the cipher\\r\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\r\\n // encrypt text\\r\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\r\\n // generate output ( encrypted text )\\r\\n return Buffer.concat([iv, encrypted]).toString('base64');\\r\\n }\\r\\n\\r\\n function AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n deviceParams.push(cvpair);\\r\\n }\\r\\n\\r\\n function AddConfig(configName, newvalue) {\\r\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n var cvpair = {\\r\\n 'code': configName,\\r\\n 'value': newvalue,\\r\\n 'forced': true\\r\\n };\\r\\n configsToSend.push(cvpair);\\r\\n };\\r\\n }\\r\\n\\r\\n function isASCII(str) {\\r\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\r\\n }\\r\\n\\r\\n function LookupValue(key, type, template) {\\r\\n var cvpair = {\\r\\n key: key, // key to be lookded up\\r\\n type: type, // type of the key\\r\\n template: template // the variable the result will be mapped to\\r\\n };\\r\\n msg.KeyValue = cvpair;\\r\\n }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n module.exports = {\\r\\n execute_ops\\r\\n }\\r\\n} else { // on server use local defined vars\\r\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n // define global returns\\r\\n msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1744209781},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n // Define array to push device data into. This will be put into the msg array at the end.\\r\\n var deviceParams = [];\\r\\n var configsToSend = [];\\r\\n var tasks = [];\\r\\n var devicekey = \\\"\\\";\\r\\n const _crypto = require('crypto');\\r\\n // handle ACK\\r\\n if (messageTypeCode == \\\"ACK\\\") {\\r\\n return \\\"\\\";\\r\\n }\\r\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\r\\n var password;\\r\\n if (params.imei == \\\"null\\\") {\\r\\n return msg;\\r\\n }\\r\\n password = params.imei;\\r\\n if (configs.Password.Password === \\\"\\\") {\\r\\n // use imei as default password when not specified\\r\\n } else {\\r\\n // use the password\\r\\n password = configs.Password.Password\\r\\n }\\r\\n let message = decrypt(raw, password);\\r\\n if (message) {\\r\\n // send message internally\\r\\n sendMessageToLocalhost(message);\\r\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n } else {\\r\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n }\\r\\n } else { // General Oysta Template\\r\\n switch (messageTypeLocalCode) {\\r\\n case (\\\"COMM\\\"):\\r\\n process_invent_msg(); //incoming invent commands\\r\\n break;\\r\\n case (\\\"MACB\\\"):\\r\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\r\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\r\\n add_params_to_output();\\r\\n break;\\r\\n case \\\"INFO-GETPWB\\\": // handle GETPWB message\\r\\n //let imei = params.bracelet_imei; // not actually needed ?\\r\\n //let mac = params.BLEMAC; // not actually needed ?\\r\\n //AddValue(\\\"mac\\\", params.bracelet_mac);\\r\\n //AddValue(\\\"key\\\", params.key);\\r\\n //console.log(\\\"mac: \\\" + params.bracelet_mac);\\r\\n //let BraceletPW = \\\"\\\"; // until we set it from query below\\r\\n // if(params.bracelet_imei){\\r\\n // if(serverParams.Password){\\r\\n // BraceletPW = serverParams.Password; // query key value table\\r\\n // console.log(BraceletPW); // print for testing reasons\\r\\n // AddConfig(configIds.DeviceConfig.BraceletPW, BraceletPW);//this to return the value\\r\\n // }\\r\\n // }\\r\\n // else {\\r\\n // //return error\\r\\n // }\\r\\n //AddValue(\\\"password\\\", \\\"myNewPassword\\\");\\r\\n devicekey = \\\"BC57290975BC\\\";\\r\\n //LookupValue(params.ble_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n //LookupValue(params.bracelet_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n break;\\r\\n case (\\\"REGISTER\\\"):\\r\\n let ble_mac = params.ble_mac;\\r\\n let iccid = params.iccid;\\r\\n // write values to readonly settings\\r\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\r\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\r\\n // will automtaically Activate on Acceptance\\r\\n if (serverParams.EnvName) {\\r\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\r\\n }\\r\\n }\\r\\n break;\\r\\n case (\\\"CREATE\\\"):\\r\\n // temp fix to filter old messages\\r\\n // const cutoff = 1707523200000; //10.2.2024\\r\\n // let message_id_time = parseInt(params.count_number, 36);\\r\\n // if (message_id_time > cutoff){\\r\\n let c_ble_mac = params.ble_mac;\\r\\n let c_iccid = params.iccid;\\r\\n let new_imei = params.new_imei;\\r\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\r\\n // sendMessageToLocalhost(c_message); \\r\\n tasks = [{\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"sync\\\",\\r\\n \\\"type\\\": \\\"createDevice\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"imei\\\": new_imei,\\r\\n \\\"abortOnError\\\": false,\\r\\n \\\"init\\\": true\\r\\n }),\\r\\n \\\"order\\\": 1\\r\\n }, {\\r\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"async\\\",\\r\\n \\\"type\\\": \\\"sendMessage\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"message\\\": c_message\\r\\n }),\\r\\n \\\"order\\\": 2\\r\\n }]\\r\\n // }\\r\\n break;\\r\\n case (\\\"ALLDATA\\\"):\\r\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\r\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\r\\n let all_data = JSON.parse(json_str);\\r\\n if (\\\"version\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\r\\n };\\r\\n break;\\r\\n default:\\r\\n // all other general messages\\r\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\r\\n add_params_to_output();\\r\\n }\\r\\n // add messagetTypeLocal to output for templates\\r\\n AddValue('local_message_type', messageTypeLocalCode);\\r\\n }\\r\\n msg = {\\r\\n 'values': deviceParams,\\r\\n };\\r\\n if (configsToSend.length > 0) {\\r\\n msg.configsToSend = configsToSend\\r\\n };\\r\\n if (tasks.length > 0) {\\r\\n msg.tasks = tasks\\r\\n };\\r\\n var cvpair = {\\r\\n key: devicekey, // key to be lookded up\\r\\n type: \\\"Bracelet\\\", // type of the key\\r\\n template: \\\"password\\\" // the variable the result will be mapped to\\r\\n };\\r\\n msg.KeyValue = cvpair;\\r\\n // commit values to receiver processor\\r\\n console.log(msg);\\r\\n // modify to return the object that contains your data\\r\\n return msg;\\r\\n\\r\\n function add_params_to_output() {\\r\\n if (!params.raw_accuracy) {\\r\\n AddValue('location_accuracy', 9000);\\r\\n } else {\\r\\n AddValue('location_accuracy', params.raw_accuracy);\\r\\n }\\r\\n // generate timestamps if they don't exist\\r\\n if (!params.event_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n if (!params.location_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n //if no lat and long are given, set them to 0, 0\\r\\n if (!params.latitude_raw) {\\r\\n AddValue('latitude', 0);\\r\\n } else {\\r\\n AddValue('latitude', params.latitude_raw);\\r\\n }\\r\\n if (!params.longitude_raw) {\\r\\n AddValue('longitude', 0);\\r\\n } else {\\r\\n AddValue('longitude', params.longitude_raw);\\r\\n }\\r\\n // if (params.temp_bracelet){\\r\\n // AddValue('oysta_labels', 'DegC');\\r\\n // AddValue('single_column_value', params.temp_bracelet);\\r\\n // }\\r\\n }\\r\\n\\r\\n function process_invent_msg() {\\r\\n const details = JSON.parse(raw);\\r\\n // AddValue('imei', details.AppId);\\r\\n AddValue('json_in', JSON.stringify(details));\\r\\n switch (details.Command) {\\r\\n case \\\"ACTIVATE_OK\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\r\\n break;\\r\\n case \\\"ACTIVATE_FAILS\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\r\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\r\\n break;\\r\\n case \\\"APPSET\\\":\\r\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\r\\n AddConfig(configIds.Password.Password, details.Data.Password);\\r\\n break;\\r\\n case \\\"CONFIG\\\":\\r\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\r\\n break;\\r\\n case \\\"CGFBR\\\":\\r\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\r\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\r\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\r\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\r\\n let commonParam = addEscapeChar(details.Data.ComPar);\\r\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\r\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\r\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\r\\n let lteParam = addEscapeChar(details.Data.LtePar);\\r\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\r\\n let bleParam = addEscapeChar(details.Data.BlePar);\\r\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\r\\n break;\\r\\n case \\\"REBOOTB\\\":\\r\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\r\\n break;\\r\\n case \\\"PWRFB\\\":\\r\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\r\\n break;\\r\\n case \\\"RESETB\\\":\\r\\n AddConfig(configIds.Bracelet.Reset, 'true');\\r\\n break;\\r\\n case \\\"BRAPWUPDATE\\\":\\r\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\r\\n // get password from old device, then set\\r\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\r\\n )\\r\\n break;\\r\\n case \\\"NOTE\\\":\\r\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\r\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\r\\n text = text.split(\\\",\\\").join(\\\" \\\");\\r\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\r\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\r\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\r\\n AddConfig(configIds.Note.Message, value)\\r\\n break;\\r\\n }\\r\\n }\\r\\n\\r\\n function addEscapeChar(json) {\\r\\n if (json === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n let jsonStr = JSON.stringify(json);\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\r\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function changeSingleQuoteToDouble(jsonStr) {\\r\\n if (jsonStr === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\r\\n outStr = outStr + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function sendMessageToLocalhost(str) {\\r\\n if (localTesting) {\\r\\n console.log(\\\"Sending message to local host: \\\" + str);\\r\\n } else {\\r\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\r\\n var c = createConnection(5878, server); // acceptance is 5678 - protocol dev 5878 - dev is 5679 ?\\r\\n c.write(`${str}`);\\r\\n c.end();\\r\\n }\\r\\n AddValue(\\\"ToLocalhost\\\", str);\\r\\n }\\r\\n\\r\\n function createConnection(port, server) {\\r\\n c = net.createConnection(port, server);\\r\\n c.on('error', function(error) {\\r\\n c = createConnection(port, server);\\r\\n });\\r\\n return c;\\r\\n }\\r\\n\\r\\n function decrypt(encdata, password) {\\r\\n var decrypted;\\r\\n var dataarray = encdata.split(\\\";\\\");\\r\\n if (dataarray.length > 5) {\\r\\n return \\\"\\\";\\r\\n }\\r\\n var i;\\r\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\r\\n if (encdata.startsWith(\\\"ACK\\\")) {\\r\\n return encdata;\\r\\n }\\r\\n for (i = 0; i < 3; i++) {\\r\\n part1 = part1 + dataarray[i] + \\\";\\\";\\r\\n }\\r\\n var mid = dataarray[2]; // use the message ID to create the salt\\r\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n // base64 decoding and extract the iv and encrypted data\\r\\n const bData = Buffer.from(enctext, 'base64');\\r\\n const iv = bData.slice(0, 16); // initial 16 chars\\r\\n const text = bData.slice(16); // all the encrypted data\\r\\n // derive key using; 32 byte key length (from salted password and mid)\\r\\n // decrypt the data in part2 and add to part1\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\r\\n try {\\r\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\r\\n } catch (err) {\\r\\n decrypted = undefined;\\r\\n }\\r\\n return decrypted;\\r\\n }\\r\\n\\r\\n function encrypt(text, mid, password) {\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n const iv = _crypto.randomBytes(16); // random initialization vector\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n // set the cipher\\r\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\r\\n // encrypt text\\r\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\r\\n // generate output ( encrypted text )\\r\\n return Buffer.concat([iv, encrypted]).toString('base64');\\r\\n }\\r\\n\\r\\n function AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n deviceParams.push(cvpair);\\r\\n }\\r\\n\\r\\n function AddConfig(configName, newvalue) {\\r\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n var cvpair = {\\r\\n 'code': configName,\\r\\n 'value': newvalue,\\r\\n 'forced': true\\r\\n };\\r\\n configsToSend.push(cvpair);\\r\\n };\\r\\n }\\r\\n\\r\\n function isASCII(str) {\\r\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\r\\n }\\r\\n\\r\\n function LookupValue(key, type, template) {\\r\\n var cvpair = {\\r\\n key: key, // key to be lookded up\\r\\n type: type, // type of the key\\r\\n template: template // the variable the result will be mapped to\\r\\n };\\r\\n msg.KeyValue = cvpair;\\r\\n }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n module.exports = {\\r\\n execute_ops\\r\\n }\\r\\n} else { // on server use local defined vars\\r\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n // define global returns\\r\\n msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1744209893},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n // Define array to push device data into. This will be put into the msg array at the end.\\r\\n var deviceParams = [];\\r\\n var configsToSend = [];\\r\\n var tasks = [];\\r\\n var devicekey = \\\"\\\";\\r\\n const _crypto = require('crypto');\\r\\n // handle ACK\\r\\n if (messageTypeCode == \\\"ACK\\\") {\\r\\n return \\\"\\\";\\r\\n }\\r\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\r\\n var password;\\r\\n if (params.imei == \\\"null\\\") {\\r\\n return msg;\\r\\n }\\r\\n password = params.imei;\\r\\n if (configs.Password.Password === \\\"\\\") {\\r\\n // use imei as default password when not specified\\r\\n } else {\\r\\n // use the password\\r\\n password = configs.Password.Password\\r\\n }\\r\\n let message = decrypt(raw, password);\\r\\n if (message) {\\r\\n // send message internally\\r\\n sendMessageToLocalhost(message);\\r\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n } else {\\r\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n }\\r\\n } else { // General Oysta Template\\r\\n switch (messageTypeLocalCode) {\\r\\n case (\\\"COMM\\\"):\\r\\n process_invent_msg(); //incoming invent commands\\r\\n break;\\r\\n case (\\\"MACB\\\"):\\r\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\r\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\r\\n add_params_to_output();\\r\\n break;\\r\\n case \\\"INFO-GETPWB\\\": // handle GETPWB message\\r\\n //let imei = params.bracelet_imei; // not actually needed ?\\r\\n //let mac = params.BLEMAC; // not actually needed ?\\r\\n //AddValue(\\\"mac\\\", params.bracelet_mac);\\r\\n //AddValue(\\\"key\\\", params.key);\\r\\n //console.log(\\\"mac: \\\" + params.bracelet_mac);\\r\\n //let BraceletPW = \\\"\\\"; // until we set it from query below\\r\\n // if(params.bracelet_imei){\\r\\n // if(serverParams.Password){\\r\\n // BraceletPW = serverParams.Password; // query key value table\\r\\n // console.log(BraceletPW); // print for testing reasons\\r\\n // AddConfig(configIds.DeviceConfig.BraceletPW, BraceletPW);//this to return the value\\r\\n // }\\r\\n // }\\r\\n // else {\\r\\n // //return error\\r\\n // }\\r\\n //AddValue(\\\"password\\\", \\\"myNewPassword\\\");\\r\\n devicekey = params.bracelet_mac;\\r\\n //LookupValue(params.ble_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n //LookupValue(params.bracelet_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n break;\\r\\n case (\\\"REGISTER\\\"):\\r\\n let ble_mac = params.ble_mac;\\r\\n let iccid = params.iccid;\\r\\n // write values to readonly settings\\r\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\r\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\r\\n // will automtaically Activate on Acceptance\\r\\n if (serverParams.EnvName) {\\r\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\r\\n }\\r\\n }\\r\\n break;\\r\\n case (\\\"CREATE\\\"):\\r\\n // temp fix to filter old messages\\r\\n // const cutoff = 1707523200000; //10.2.2024\\r\\n // let message_id_time = parseInt(params.count_number, 36);\\r\\n // if (message_id_time > cutoff){\\r\\n let c_ble_mac = params.ble_mac;\\r\\n let c_iccid = params.iccid;\\r\\n let new_imei = params.new_imei;\\r\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\r\\n // sendMessageToLocalhost(c_message); \\r\\n tasks = [{\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"sync\\\",\\r\\n \\\"type\\\": \\\"createDevice\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"imei\\\": new_imei,\\r\\n \\\"abortOnError\\\": false,\\r\\n \\\"init\\\": true\\r\\n }),\\r\\n \\\"order\\\": 1\\r\\n }, {\\r\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"async\\\",\\r\\n \\\"type\\\": \\\"sendMessage\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"message\\\": c_message\\r\\n }),\\r\\n \\\"order\\\": 2\\r\\n }]\\r\\n // }\\r\\n break;\\r\\n case (\\\"ALLDATA\\\"):\\r\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\r\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\r\\n let all_data = JSON.parse(json_str);\\r\\n if (\\\"version\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\r\\n };\\r\\n break;\\r\\n default:\\r\\n // all other general messages\\r\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\r\\n add_params_to_output();\\r\\n }\\r\\n // add messagetTypeLocal to output for templates\\r\\n AddValue('local_message_type', messageTypeLocalCode);\\r\\n }\\r\\n msg = {\\r\\n 'values': deviceParams,\\r\\n };\\r\\n if (configsToSend.length > 0) {\\r\\n msg.configsToSend = configsToSend\\r\\n };\\r\\n if (tasks.length > 0) {\\r\\n msg.tasks = tasks\\r\\n };\\r\\n var cvpair = {\\r\\n key: devicekey, // key to be lookded up\\r\\n type: \\\"Bracelet\\\", // type of the key\\r\\n template: \\\"password\\\" // the variable the result will be mapped to\\r\\n };\\r\\n msg.KeyValue = cvpair;\\r\\n // commit values to receiver processor\\r\\n console.log(msg);\\r\\n // modify to return the object that contains your data\\r\\n return msg;\\r\\n\\r\\n function add_params_to_output() {\\r\\n if (!params.raw_accuracy) {\\r\\n AddValue('location_accuracy', 9000);\\r\\n } else {\\r\\n AddValue('location_accuracy', params.raw_accuracy);\\r\\n }\\r\\n // generate timestamps if they don't exist\\r\\n if (!params.event_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n if (!params.location_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n //if no lat and long are given, set them to 0, 0\\r\\n if (!params.latitude_raw) {\\r\\n AddValue('latitude', 0);\\r\\n } else {\\r\\n AddValue('latitude', params.latitude_raw);\\r\\n }\\r\\n if (!params.longitude_raw) {\\r\\n AddValue('longitude', 0);\\r\\n } else {\\r\\n AddValue('longitude', params.longitude_raw);\\r\\n }\\r\\n // if (params.temp_bracelet){\\r\\n // AddValue('oysta_labels', 'DegC');\\r\\n // AddValue('single_column_value', params.temp_bracelet);\\r\\n // }\\r\\n }\\r\\n\\r\\n function process_invent_msg() {\\r\\n const details = JSON.parse(raw);\\r\\n // AddValue('imei', details.AppId);\\r\\n AddValue('json_in', JSON.stringify(details));\\r\\n switch (details.Command) {\\r\\n case \\\"ACTIVATE_OK\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\r\\n break;\\r\\n case \\\"ACTIVATE_FAILS\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\r\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\r\\n break;\\r\\n case \\\"APPSET\\\":\\r\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\r\\n AddConfig(configIds.Password.Password, details.Data.Password);\\r\\n break;\\r\\n case \\\"CONFIG\\\":\\r\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\r\\n break;\\r\\n case \\\"CGFBR\\\":\\r\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\r\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\r\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\r\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\r\\n let commonParam = addEscapeChar(details.Data.ComPar);\\r\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\r\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\r\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\r\\n let lteParam = addEscapeChar(details.Data.LtePar);\\r\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\r\\n let bleParam = addEscapeChar(details.Data.BlePar);\\r\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\r\\n break;\\r\\n case \\\"REBOOTB\\\":\\r\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\r\\n break;\\r\\n case \\\"PWRFB\\\":\\r\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\r\\n break;\\r\\n case \\\"RESETB\\\":\\r\\n AddConfig(configIds.Bracelet.Reset, 'true');\\r\\n break;\\r\\n case \\\"BRAPWUPDATE\\\":\\r\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\r\\n // get password from old device, then set\\r\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\r\\n )\\r\\n break;\\r\\n case \\\"NOTE\\\":\\r\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\r\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\r\\n text = text.split(\\\",\\\").join(\\\" \\\");\\r\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\r\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\r\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\r\\n AddConfig(configIds.Note.Message, value)\\r\\n break;\\r\\n }\\r\\n }\\r\\n\\r\\n function addEscapeChar(json) {\\r\\n if (json === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n let jsonStr = JSON.stringify(json);\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\r\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function changeSingleQuoteToDouble(jsonStr) {\\r\\n if (jsonStr === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\r\\n outStr = outStr + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function sendMessageToLocalhost(str) {\\r\\n if (localTesting) {\\r\\n console.log(\\\"Sending message to local host: \\\" + str);\\r\\n } else {\\r\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\r\\n var c = createConnection(5878, server); // acceptance is 5678 - protocol dev 5878 - dev is 5679 ?\\r\\n c.write(`${str}`);\\r\\n c.end();\\r\\n }\\r\\n AddValue(\\\"ToLocalhost\\\", str);\\r\\n }\\r\\n\\r\\n function createConnection(port, server) {\\r\\n c = net.createConnection(port, server);\\r\\n c.on('error', function(error) {\\r\\n c = createConnection(port, server);\\r\\n });\\r\\n return c;\\r\\n }\\r\\n\\r\\n function decrypt(encdata, password) {\\r\\n var decrypted;\\r\\n var dataarray = encdata.split(\\\";\\\");\\r\\n if (dataarray.length > 5) {\\r\\n return \\\"\\\";\\r\\n }\\r\\n var i;\\r\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\r\\n if (encdata.startsWith(\\\"ACK\\\")) {\\r\\n return encdata;\\r\\n }\\r\\n for (i = 0; i < 3; i++) {\\r\\n part1 = part1 + dataarray[i] + \\\";\\\";\\r\\n }\\r\\n var mid = dataarray[2]; // use the message ID to create the salt\\r\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n // base64 decoding and extract the iv and encrypted data\\r\\n const bData = Buffer.from(enctext, 'base64');\\r\\n const iv = bData.slice(0, 16); // initial 16 chars\\r\\n const text = bData.slice(16); // all the encrypted data\\r\\n // derive key using; 32 byte key length (from salted password and mid)\\r\\n // decrypt the data in part2 and add to part1\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\r\\n try {\\r\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\r\\n } catch (err) {\\r\\n decrypted = undefined;\\r\\n }\\r\\n return decrypted;\\r\\n }\\r\\n\\r\\n function encrypt(text, mid, password) {\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n const iv = _crypto.randomBytes(16); // random initialization vector\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n // set the cipher\\r\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\r\\n // encrypt text\\r\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\r\\n // generate output ( encrypted text )\\r\\n return Buffer.concat([iv, encrypted]).toString('base64');\\r\\n }\\r\\n\\r\\n function AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n deviceParams.push(cvpair);\\r\\n }\\r\\n\\r\\n function AddConfig(configName, newvalue) {\\r\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n var cvpair = {\\r\\n 'code': configName,\\r\\n 'value': newvalue,\\r\\n 'forced': true\\r\\n };\\r\\n configsToSend.push(cvpair);\\r\\n };\\r\\n }\\r\\n\\r\\n function isASCII(str) {\\r\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\r\\n }\\r\\n\\r\\n function LookupValue(key, type, template) {\\r\\n var cvpair = {\\r\\n key: key, // key to be lookded up\\r\\n type: type, // type of the key\\r\\n template: template // the variable the result will be mapped to\\r\\n };\\r\\n msg.KeyValue = cvpair;\\r\\n }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n module.exports = {\\r\\n execute_ops\\r\\n }\\r\\n} else { // on server use local defined vars\\r\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n // define global returns\\r\\n msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1744209994},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n // Define array to push device data into. This will be put into the msg array at the end.\\r\\n var deviceParams = [];\\r\\n var configsToSend = [];\\r\\n var tasks = [];\\r\\n //var devicekey = \\\"\\\";\\r\\n const _crypto = require('crypto');\\r\\n // handle ACK\\r\\n if (messageTypeCode == \\\"ACK\\\") {\\r\\n return \\\"\\\";\\r\\n }\\r\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\r\\n var password;\\r\\n if (params.imei == \\\"null\\\") {\\r\\n return msg;\\r\\n }\\r\\n password = params.imei;\\r\\n if (configs.Password.Password === \\\"\\\") {\\r\\n // use imei as default password when not specified\\r\\n } else {\\r\\n // use the password\\r\\n password = configs.Password.Password\\r\\n }\\r\\n let message = decrypt(raw, password);\\r\\n if (message) {\\r\\n // send message internally\\r\\n sendMessageToLocalhost(message);\\r\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n } else {\\r\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n }\\r\\n } else { // General Oysta Template\\r\\n switch (messageTypeLocalCode) {\\r\\n case (\\\"COMM\\\"):\\r\\n process_invent_msg(); //incoming invent commands\\r\\n break;\\r\\n case (\\\"MACB\\\"):\\r\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\r\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\r\\n add_params_to_output();\\r\\n break;\\r\\n case \\\"INFO-GETPWB\\\": // handle GETPWB message\\r\\n //let imei = params.bracelet_imei; // not actually needed ?\\r\\n //let mac = params.BLEMAC; // not actually needed ?\\r\\n //AddValue(\\\"mac\\\", params.bracelet_mac);\\r\\n //AddValue(\\\"key\\\", params.key);\\r\\n //console.log(\\\"mac: \\\" + params.bracelet_mac);\\r\\n //let BraceletPW = \\\"\\\"; // until we set it from query below\\r\\n // if(params.bracelet_imei){\\r\\n // if(serverParams.Password){\\r\\n // BraceletPW = serverParams.Password; // query key value table\\r\\n // console.log(BraceletPW); // print for testing reasons\\r\\n // AddConfig(configIds.DeviceConfig.BraceletPW, BraceletPW);//this to return the value\\r\\n // }\\r\\n // }\\r\\n // else {\\r\\n // //return error\\r\\n // }\\r\\n //AddValue(\\\"password\\\", \\\"myNewPassword\\\");\\r\\n //devicekey = params.bracelet_mac;\\r\\n //LookupValue(params.ble_mac, \\\"Bracelet\\\", \\\"password\\\"); \\r\\n LookupValue(params.bracelet_mac, \\\"Bracelet\\\", \\\"password\\\", msg);\\r\\n break;\\r\\n case (\\\"REGISTER\\\"):\\r\\n let ble_mac = params.ble_mac;\\r\\n let iccid = params.iccid;\\r\\n // write values to readonly settings\\r\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\r\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\r\\n // will automtaically Activate on Acceptance\\r\\n if (serverParams.EnvName) {\\r\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\r\\n }\\r\\n }\\r\\n break;\\r\\n case (\\\"CREATE\\\"):\\r\\n // temp fix to filter old messages\\r\\n // const cutoff = 1707523200000; //10.2.2024\\r\\n // let message_id_time = parseInt(params.count_number, 36);\\r\\n // if (message_id_time > cutoff){\\r\\n let c_ble_mac = params.ble_mac;\\r\\n let c_iccid = params.iccid;\\r\\n let new_imei = params.new_imei;\\r\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\r\\n // sendMessageToLocalhost(c_message); \\r\\n tasks = [{\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"sync\\\",\\r\\n \\\"type\\\": \\\"createDevice\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"imei\\\": new_imei,\\r\\n \\\"abortOnError\\\": false,\\r\\n \\\"init\\\": true\\r\\n }),\\r\\n \\\"order\\\": 1\\r\\n }, {\\r\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"async\\\",\\r\\n \\\"type\\\": \\\"sendMessage\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"message\\\": c_message\\r\\n }),\\r\\n \\\"order\\\": 2\\r\\n }]\\r\\n // }\\r\\n break;\\r\\n case (\\\"ALLDATA\\\"):\\r\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\r\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\r\\n let all_data = JSON.parse(json_str);\\r\\n if (\\\"version\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\r\\n };\\r\\n break;\\r\\n default:\\r\\n // all other general messages\\r\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\r\\n add_params_to_output();\\r\\n }\\r\\n // add messagetTypeLocal to output for templates\\r\\n AddValue('local_message_type', messageTypeLocalCode);\\r\\n }\\r\\n msg = {\\r\\n 'values': deviceParams,\\r\\n };\\r\\n if (configsToSend.length > 0) {\\r\\n msg.configsToSend = configsToSend\\r\\n };\\r\\n if (tasks.length > 0) {\\r\\n msg.tasks = tasks\\r\\n };\\r\\n //var cvpair = {\\r\\n // key: devicekey, // key to be lookded up\\r\\n // type: \\\"Bracelet\\\", // type of the key\\r\\n // template: \\\"password\\\" // the variable the result will be mapped to\\r\\n //};\\r\\n //msg.KeyValue = cvpair;\\r\\n // commit values to receiver processor\\r\\n console.log(msg);\\r\\n // modify to return the object that contains your data\\r\\n return msg;\\r\\n\\r\\n function add_params_to_output() {\\r\\n if (!params.raw_accuracy) {\\r\\n AddValue('location_accuracy', 9000);\\r\\n } else {\\r\\n AddValue('location_accuracy', params.raw_accuracy);\\r\\n }\\r\\n // generate timestamps if they don't exist\\r\\n if (!params.event_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n if (!params.location_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n //if no lat and long are given, set them to 0, 0\\r\\n if (!params.latitude_raw) {\\r\\n AddValue('latitude', 0);\\r\\n } else {\\r\\n AddValue('latitude', params.latitude_raw);\\r\\n }\\r\\n if (!params.longitude_raw) {\\r\\n AddValue('longitude', 0);\\r\\n } else {\\r\\n AddValue('longitude', params.longitude_raw);\\r\\n }\\r\\n // if (params.temp_bracelet){\\r\\n // AddValue('oysta_labels', 'DegC');\\r\\n // AddValue('single_column_value', params.temp_bracelet);\\r\\n // }\\r\\n }\\r\\n\\r\\n function process_invent_msg() {\\r\\n const details = JSON.parse(raw);\\r\\n // AddValue('imei', details.AppId);\\r\\n AddValue('json_in', JSON.stringify(details));\\r\\n switch (details.Command) {\\r\\n case \\\"ACTIVATE_OK\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\r\\n break;\\r\\n case \\\"ACTIVATE_FAILS\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\r\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\r\\n break;\\r\\n case \\\"APPSET\\\":\\r\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\r\\n AddConfig(configIds.Password.Password, details.Data.Password);\\r\\n break;\\r\\n case \\\"CONFIG\\\":\\r\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\r\\n break;\\r\\n case \\\"CGFBR\\\":\\r\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\r\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\r\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\r\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\r\\n let commonParam = addEscapeChar(details.Data.ComPar);\\r\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\r\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\r\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\r\\n let lteParam = addEscapeChar(details.Data.LtePar);\\r\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\r\\n let bleParam = addEscapeChar(details.Data.BlePar);\\r\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\r\\n break;\\r\\n case \\\"REBOOTB\\\":\\r\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\r\\n break;\\r\\n case \\\"PWRFB\\\":\\r\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\r\\n break;\\r\\n case \\\"RESETB\\\":\\r\\n AddConfig(configIds.Bracelet.Reset, 'true');\\r\\n break;\\r\\n case \\\"BRAPWUPDATE\\\":\\r\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\r\\n // get password from old device, then set\\r\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\r\\n )\\r\\n break;\\r\\n case \\\"NOTE\\\":\\r\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\r\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\r\\n text = text.split(\\\",\\\").join(\\\" \\\");\\r\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\r\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\r\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\r\\n AddConfig(configIds.Note.Message, value)\\r\\n break;\\r\\n }\\r\\n }\\r\\n\\r\\n function addEscapeChar(json) {\\r\\n if (json === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n let jsonStr = JSON.stringify(json);\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\r\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function changeSingleQuoteToDouble(jsonStr) {\\r\\n if (jsonStr === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\r\\n outStr = outStr + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function sendMessageToLocalhost(str) {\\r\\n if (localTesting) {\\r\\n console.log(\\\"Sending message to local host: \\\" + str);\\r\\n } else {\\r\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\r\\n var c = createConnection(5878, server); // acceptance is 5678 - protocol dev 5878 - dev is 5679 ?\\r\\n c.write(`${str}`);\\r\\n c.end();\\r\\n }\\r\\n AddValue(\\\"ToLocalhost\\\", str);\\r\\n }\\r\\n\\r\\n function createConnection(port, server) {\\r\\n c = net.createConnection(port, server);\\r\\n c.on('error', function(error) {\\r\\n c = createConnection(port, server);\\r\\n });\\r\\n return c;\\r\\n }\\r\\n\\r\\n function decrypt(encdata, password) {\\r\\n var decrypted;\\r\\n var dataarray = encdata.split(\\\";\\\");\\r\\n if (dataarray.length > 5) {\\r\\n return \\\"\\\";\\r\\n }\\r\\n var i;\\r\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\r\\n if (encdata.startsWith(\\\"ACK\\\")) {\\r\\n return encdata;\\r\\n }\\r\\n for (i = 0; i < 3; i++) {\\r\\n part1 = part1 + dataarray[i] + \\\";\\\";\\r\\n }\\r\\n var mid = dataarray[2]; // use the message ID to create the salt\\r\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n // base64 decoding and extract the iv and encrypted data\\r\\n const bData = Buffer.from(enctext, 'base64');\\r\\n const iv = bData.slice(0, 16); // initial 16 chars\\r\\n const text = bData.slice(16); // all the encrypted data\\r\\n // derive key using; 32 byte key length (from salted password and mid)\\r\\n // decrypt the data in part2 and add to part1\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\r\\n try {\\r\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\r\\n } catch (err) {\\r\\n decrypted = undefined;\\r\\n }\\r\\n return decrypted;\\r\\n }\\r\\n\\r\\n function encrypt(text, mid, password) {\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n const iv = _crypto.randomBytes(16); // random initialization vector\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n // set the cipher\\r\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\r\\n // encrypt text\\r\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\r\\n // generate output ( encrypted text )\\r\\n return Buffer.concat([iv, encrypted]).toString('base64');\\r\\n }\\r\\n\\r\\n function AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n deviceParams.push(cvpair);\\r\\n }\\r\\n\\r\\n function AddConfig(configName, newvalue) {\\r\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n var cvpair = {\\r\\n 'code': configName,\\r\\n 'value': newvalue,\\r\\n 'forced': true\\r\\n };\\r\\n configsToSend.push(cvpair);\\r\\n };\\r\\n }\\r\\n\\r\\n function isASCII(str) {\\r\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\r\\n }\\r\\n\\r\\n function LookupValue(key, type, template, msg) {\\r\\n var cvpair = {\\r\\n key: key, // key to be lookded up\\r\\n type: type, // type of the key\\r\\n template: template // the variable the result will be mapped to\\r\\n };\\r\\n msg.KeyValue = cvpair;\\r\\n }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n module.exports = {\\r\\n execute_ops\\r\\n }\\r\\n} else { // on server use local defined vars\\r\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n // define global returns\\r\\n msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1744210988},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n // Define array to push device data into. This will be put into the msg array at the end.\\r\\n var deviceParams = [];\\r\\n var configsToSend = [];\\r\\n var tasks = [];\\r\\n var devicekey = \\\"\\\";\\r\\n const _crypto = require('crypto');\\r\\n // handle ACK\\r\\n if (messageTypeCode == \\\"ACK\\\") {\\r\\n return \\\"\\\";\\r\\n }\\r\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\r\\n var password;\\r\\n if (params.imei == \\\"null\\\") {\\r\\n return msg;\\r\\n }\\r\\n password = params.imei;\\r\\n if (configs.Password.Password === \\\"\\\") {\\r\\n // use imei as default password when not specified\\r\\n } else {\\r\\n // use the password\\r\\n password = configs.Password.Password\\r\\n }\\r\\n let message = decrypt(raw, password);\\r\\n if (message) {\\r\\n // send message internally\\r\\n sendMessageToLocalhost(message);\\r\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n } else {\\r\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n }\\r\\n } else { // General Oysta Template\\r\\n switch (messageTypeLocalCode) {\\r\\n case (\\\"COMM\\\"):\\r\\n process_invent_msg(); //incoming invent commands\\r\\n break;\\r\\n case (\\\"MACB\\\"):\\r\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\r\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\r\\n add_params_to_output();\\r\\n break;\\r\\n case \\\"INFO-GETPWB\\\": // handle GETPWB message\\r\\n //let imei = params.bracelet_imei; // not actually needed ?\\r\\n //let mac = params.BLEMAC; // not actually needed ?\\r\\n //AddValue(\\\"mac\\\", params.bracelet_mac);\\r\\n //AddValue(\\\"key\\\", params.key);\\r\\n //console.log(\\\"mac: \\\" + params.bracelet_mac);\\r\\n //let BraceletPW = \\\"\\\"; // until we set it from query below\\r\\n // if(params.bracelet_imei){\\r\\n // if(serverParams.Password){\\r\\n // BraceletPW = serverParams.Password; // query key value table\\r\\n // console.log(BraceletPW); // print for testing reasons\\r\\n // AddConfig(configIds.DeviceConfig.BraceletPW, BraceletPW);//this to return the value\\r\\n // }\\r\\n // }\\r\\n // else {\\r\\n // //return error\\r\\n // }\\r\\n //AddValue(\\\"password\\\", \\\"myNewPassword\\\");\\r\\n devicekey = params.bracelet_mac;\\r\\n //LookupValue(params.ble_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n //LookupValue(params.bracelet_mac, \\\"Bracelet\\\", \\\"password\\\"); // think its blemac\\r\\n break;\\r\\n case (\\\"REGISTER\\\"):\\r\\n let ble_mac = params.ble_mac;\\r\\n let iccid = params.iccid;\\r\\n // write values to readonly settings\\r\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\r\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\r\\n // will automtaically Activate on Acceptance\\r\\n if (serverParams.EnvName) {\\r\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\r\\n }\\r\\n }\\r\\n break;\\r\\n case (\\\"CREATE\\\"):\\r\\n // temp fix to filter old messages\\r\\n // const cutoff = 1707523200000; //10.2.2024\\r\\n // let message_id_time = parseInt(params.count_number, 36);\\r\\n // if (message_id_time > cutoff){\\r\\n let c_ble_mac = params.ble_mac;\\r\\n let c_iccid = params.iccid;\\r\\n let new_imei = params.new_imei;\\r\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\r\\n // sendMessageToLocalhost(c_message); \\r\\n tasks = [{\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"sync\\\",\\r\\n \\\"type\\\": \\\"createDevice\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"imei\\\": new_imei,\\r\\n \\\"abortOnError\\\": false,\\r\\n \\\"init\\\": true\\r\\n }),\\r\\n \\\"order\\\": 1\\r\\n }, {\\r\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"async\\\",\\r\\n \\\"type\\\": \\\"sendMessage\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"message\\\": c_message\\r\\n }),\\r\\n \\\"order\\\": 2\\r\\n }]\\r\\n // }\\r\\n break;\\r\\n case (\\\"ALLDATA\\\"):\\r\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\r\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\r\\n let all_data = JSON.parse(json_str);\\r\\n if (\\\"version\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\r\\n };\\r\\n break;\\r\\n default:\\r\\n // all other general messages\\r\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\r\\n add_params_to_output();\\r\\n }\\r\\n // add messagetTypeLocal to output for templates\\r\\n AddValue('local_message_type', messageTypeLocalCode);\\r\\n }\\r\\n msg = {\\r\\n 'values': deviceParams,\\r\\n };\\r\\n if (configsToSend.length > 0) {\\r\\n msg.configsToSend = configsToSend\\r\\n };\\r\\n if (tasks.length > 0) {\\r\\n msg.tasks = tasks\\r\\n };\\r\\n var cvpair = {\\r\\n key: devicekey, // key to be lookded up\\r\\n type: \\\"Bracelet\\\", // type of the key\\r\\n template: \\\"password\\\" // the variable the result will be mapped to\\r\\n };\\r\\n msg.KeyValue = cvpair;\\r\\n // commit values to receiver processor\\r\\n console.log(msg);\\r\\n // modify to return the object that contains your data\\r\\n return msg;\\r\\n\\r\\n function add_params_to_output() {\\r\\n if (!params.raw_accuracy) {\\r\\n AddValue('location_accuracy', 9000);\\r\\n } else {\\r\\n AddValue('location_accuracy', params.raw_accuracy);\\r\\n }\\r\\n // generate timestamps if they don't exist\\r\\n if (!params.event_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n if (!params.location_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n //if no lat and long are given, set them to 0, 0\\r\\n if (!params.latitude_raw) {\\r\\n AddValue('latitude', 0);\\r\\n } else {\\r\\n AddValue('latitude', params.latitude_raw);\\r\\n }\\r\\n if (!params.longitude_raw) {\\r\\n AddValue('longitude', 0);\\r\\n } else {\\r\\n AddValue('longitude', params.longitude_raw);\\r\\n }\\r\\n // if (params.temp_bracelet){\\r\\n // AddValue('oysta_labels', 'DegC');\\r\\n // AddValue('single_column_value', params.temp_bracelet);\\r\\n // }\\r\\n }\\r\\n\\r\\n function process_invent_msg() {\\r\\n const details = JSON.parse(raw);\\r\\n // AddValue('imei', details.AppId);\\r\\n AddValue('json_in', JSON.stringify(details));\\r\\n switch (details.Command) {\\r\\n case \\\"ACTIVATE_OK\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\r\\n break;\\r\\n case \\\"ACTIVATE_FAILS\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\r\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\r\\n break;\\r\\n case \\\"APPSET\\\":\\r\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\r\\n AddConfig(configIds.Password.Password, details.Data.Password);\\r\\n break;\\r\\n case \\\"CONFIG\\\":\\r\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\r\\n break;\\r\\n case \\\"CGFBR\\\":\\r\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\r\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\r\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\r\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\r\\n let commonParam = addEscapeChar(details.Data.ComPar);\\r\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\r\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\r\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\r\\n let lteParam = addEscapeChar(details.Data.LtePar);\\r\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\r\\n let bleParam = addEscapeChar(details.Data.BlePar);\\r\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\r\\n break;\\r\\n case \\\"REBOOTB\\\":\\r\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\r\\n break;\\r\\n case \\\"PWRFB\\\":\\r\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\r\\n break;\\r\\n case \\\"RESETB\\\":\\r\\n AddConfig(configIds.Bracelet.Reset, 'true');\\r\\n break;\\r\\n case \\\"BRAPWUPDATE\\\":\\r\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\r\\n // get password from old device, then set\\r\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\r\\n )\\r\\n break;\\r\\n case \\\"NOTE\\\":\\r\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\r\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\r\\n text = text.split(\\\",\\\").join(\\\" \\\");\\r\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\r\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\r\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\r\\n AddConfig(configIds.Note.Message, value)\\r\\n break;\\r\\n }\\r\\n }\\r\\n\\r\\n function addEscapeChar(json) {\\r\\n if (json === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n let jsonStr = JSON.stringify(json);\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\r\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function changeSingleQuoteToDouble(jsonStr) {\\r\\n if (jsonStr === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\r\\n outStr = outStr + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function sendMessageToLocalhost(str) {\\r\\n if (localTesting) {\\r\\n console.log(\\\"Sending message to local host: \\\" + str);\\r\\n } else {\\r\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\r\\n var c = createConnection(5878, server); // acceptance is 5678 - protocol dev 5878 - dev is 5679 ?\\r\\n c.write(`${str}`);\\r\\n c.end();\\r\\n }\\r\\n AddValue(\\\"ToLocalhost\\\", str);\\r\\n }\\r\\n\\r\\n function createConnection(port, server) {\\r\\n c = net.createConnection(port, server);\\r\\n c.on('error', function(error) {\\r\\n c = createConnection(port, server);\\r\\n });\\r\\n return c;\\r\\n }\\r\\n\\r\\n function decrypt(encdata, password) {\\r\\n var decrypted;\\r\\n var dataarray = encdata.split(\\\";\\\");\\r\\n if (dataarray.length > 5) {\\r\\n return \\\"\\\";\\r\\n }\\r\\n var i;\\r\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\r\\n if (encdata.startsWith(\\\"ACK\\\")) {\\r\\n return encdata;\\r\\n }\\r\\n for (i = 0; i < 3; i++) {\\r\\n part1 = part1 + dataarray[i] + \\\";\\\";\\r\\n }\\r\\n var mid = dataarray[2]; // use the message ID to create the salt\\r\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n // base64 decoding and extract the iv and encrypted data\\r\\n const bData = Buffer.from(enctext, 'base64');\\r\\n const iv = bData.slice(0, 16); // initial 16 chars\\r\\n const text = bData.slice(16); // all the encrypted data\\r\\n // derive key using; 32 byte key length (from salted password and mid)\\r\\n // decrypt the data in part2 and add to part1\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\r\\n try {\\r\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\r\\n } catch (err) {\\r\\n decrypted = undefined;\\r\\n }\\r\\n return decrypted;\\r\\n }\\r\\n\\r\\n function encrypt(text, mid, password) {\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n const iv = _crypto.randomBytes(16); // random initialization vector\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n // set the cipher\\r\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\r\\n // encrypt text\\r\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\r\\n // generate output ( encrypted text )\\r\\n return Buffer.concat([iv, encrypted]).toString('base64');\\r\\n }\\r\\n\\r\\n function AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n deviceParams.push(cvpair);\\r\\n }\\r\\n\\r\\n function AddConfig(configName, newvalue) {\\r\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n var cvpair = {\\r\\n 'code': configName,\\r\\n 'value': newvalue,\\r\\n 'forced': true\\r\\n };\\r\\n configsToSend.push(cvpair);\\r\\n };\\r\\n }\\r\\n\\r\\n function isASCII(str) {\\r\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\r\\n }\\r\\n\\r\\n function LookupValue(key, type, template) {\\r\\n var cvpair = {\\r\\n key: key, // key to be lookded up\\r\\n type: type, // type of the key\\r\\n template: template // the variable the result will be mapped to\\r\\n };\\r\\n msg.KeyValue = cvpair;\\r\\n }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n module.exports = {\\r\\n execute_ops\\r\\n }\\r\\n} else { // on server use local defined vars\\r\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n // define global returns\\r\\n msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1744301752},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\n // Define array to push device data into. This will be put into the msg array at the end.\\n var deviceParams = [];\\n var configsToSend = [];\\n var tasks = [];\\n var keyValueQuery = undefined;\\n const _crypto = require('crypto');\\n // handle ACK\\n if (messageTypeCode == \\\"ACK\\\") {\\n return \\\"\\\";\\n }\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\n var password;\\n if (params.imei == \\\"null\\\") {\\n return msg;\\n }\\n password = params.imei;\\n if (configs.Password.Password === \\\"\\\") {\\n // use imei as default password when not specified\\n } else {\\n // use the password\\n password = configs.Password.Password\\n }\\n let message = decrypt(raw, password);\\n if (message) {\\n // send message internally\\n sendMessageToLocalhost(message);\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\n AddValue(\\\"ack\\\", ack);\\n } else {\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\n AddValue(\\\"ack\\\", ack);\\n }\\n } else { // General Oysta Template\\n switch (messageTypeLocalCode) {\\n case (\\\"COMM\\\"):\\n process_invent_msg(); //incoming invent commands\\n break;\\n case (\\\"MACB\\\"):\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\n add_params_to_output();\\n break;\\n case \\\"INFO-GETPWB\\\": // handle GETPWB message\\n let devicekey = params.bracelet_mac;\\n keyValueQuery = {\\n key: devicekey, // key to be lookded up\\n type: \\\"Bracelet\\\", // type of the key\\n template: \\\"password\\\" // the variable the result will be mapped to\\n };\\n break;\\n case (\\\"REGISTER\\\"):\\n let ble_mac = params.ble_mac;\\n let iccid = params.iccid;\\n // write values to readonly settings\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\n // will automtaically Activate on Acceptance\\n if (serverParams.EnvName) {\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\n }\\n }\\n break;\\n case (\\\"CREATE\\\"):\\n // temp fix to filter old messages\\n // const cutoff = 1707523200000; //10.2.2024\\n // let message_id_time = parseInt(params.count_number, 36);\\n // if (message_id_time > cutoff){\\n let c_ble_mac = params.ble_mac;\\n let c_iccid = params.iccid;\\n let new_imei = params.new_imei;\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\n // sendMessageToLocalhost(c_message); \\n tasks = [{\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\n \\\"option\\\": \\\"sync\\\",\\n \\\"type\\\": \\\"createDevice\\\",\\n \\\"payload\\\": JSON.stringify({\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\n \\\"imei\\\": new_imei,\\n \\\"abortOnError\\\": false,\\n \\\"init\\\": true\\n }),\\n \\\"order\\\": 1\\n }, {\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\n \\\"option\\\": \\\"async\\\",\\n \\\"type\\\": \\\"sendMessage\\\",\\n \\\"payload\\\": JSON.stringify({\\n \\\"message\\\": c_message\\n }),\\n \\\"order\\\": 2\\n }]\\n // }\\n break;\\n case (\\\"ALLDATA\\\"):\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\n let all_data = JSON.parse(json_str);\\n if (\\\"version\\\" in all_data) {\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\n };\\n break;\\n default:\\n // all other general messages\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\n add_params_to_output();\\n }\\n // add messagetTypeLocal to output for templates\\n AddValue('local_message_type', messageTypeLocalCode);\\n }\\n var msg = {\\n 'values': deviceParams,\\n };\\n if (configsToSend.length > 0) {\\n msg.configsToSend = configsToSend\\n };\\n if (tasks.length > 0) {\\n msg.tasks = tasks\\n };\\n if (keyValueQuery) {\\n msg.KeyValue = keyValueQuery\\n }\\n // commit values to receiver processor\\n console.log(msg);\\n // modify to return the object that contains your data\\n return msg;\\n\\n function add_params_to_output() {\\n if (!params.raw_accuracy) {\\n AddValue('location_accuracy', 9000);\\n } else {\\n AddValue('location_accuracy', params.raw_accuracy);\\n }\\n // generate timestamps if they don't exist\\n if (!params.event_time) {\\n AddValue('event_time', moment.utc().unix());\\n }\\n if (!params.location_time) {\\n AddValue('event_time', moment.utc().unix());\\n }\\n //if no lat and long are given, set them to 0, 0\\n if (!params.latitude_raw) {\\n AddValue('latitude', 0);\\n } else {\\n AddValue('latitude', params.latitude_raw);\\n }\\n if (!params.longitude_raw) {\\n AddValue('longitude', 0);\\n } else {\\n AddValue('longitude', params.longitude_raw);\\n }\\n // if (params.temp_bracelet){\\n // AddValue('oysta_labels', 'DegC');\\n // AddValue('single_column_value', params.temp_bracelet);\\n // }\\n }\\n\\n function process_invent_msg() {\\n const details = JSON.parse(raw);\\n // AddValue('imei', details.AppId);\\n AddValue('json_in', JSON.stringify(details));\\n switch (details.Command) {\\n case \\\"ACTIVATE_OK\\\":\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\n break;\\n case \\\"ACTIVATE_FAILS\\\":\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\n break;\\n case \\\"APPSET\\\":\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\n AddConfig(configIds.Password.Password, details.Data.Password);\\n break;\\n case \\\"CONFIG\\\":\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\n break;\\n case \\\"CGFBR\\\":\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\n let commonParam = addEscapeChar(details.Data.ComPar);\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\n let lteParam = addEscapeChar(details.Data.LtePar);\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\n let bleParam = addEscapeChar(details.Data.BlePar);\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\n break;\\n case \\\"REBOOTB\\\":\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\n break;\\n case \\\"PWRFB\\\":\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\n break;\\n case \\\"RESETB\\\":\\n AddConfig(configIds.Bracelet.Reset, 'true');\\n break;\\n case \\\"BRAPWUPDATE\\\":\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\n // get password from old device, then set\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\n )\\n break;\\n case \\\"NOTE\\\":\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\n text = text.split(\\\",\\\").join(\\\" \\\");\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\n AddConfig(configIds.Note.Message, value)\\n break;\\n }\\n }\\n\\n function addEscapeChar(json) {\\n if (json === undefined) {\\n return undefined;\\n }\\n let outStr = \\\"\\\";\\n let jsonStr = JSON.stringify(json);\\n for (let c of jsonStr) {\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\n } else {\\n outStr += c;\\n }\\n };\\n return outStr;\\n }\\n\\n function changeSingleQuoteToDouble(jsonStr) {\\n if (jsonStr === undefined) {\\n return undefined;\\n }\\n let outStr = \\\"\\\";\\n for (let c of jsonStr) {\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\n outStr = outStr + String.fromCharCode(34);\\n } else {\\n outStr += c;\\n }\\n };\\n return outStr;\\n }\\n\\n function sendMessageToLocalhost(str) {\\n if (localTesting) {\\n console.log(\\\"Sending message to local host: \\\" + str);\\n } else {\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\n var c = createConnection(5678, server); // acceptance is 5678 - protocol dev 5878 - dev is 5679 ?\\n c.write(`${str}`);\\n c.end();\\n }\\n AddValue(\\\"ToLocalhost\\\", str);\\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\\n function decrypt(encdata, password) {\\n var decrypted;\\n var dataarray = encdata.split(\\\";\\\");\\n if (dataarray.length > 5) {\\n return \\\"\\\";\\n }\\n var i;\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\n if (encdata.startsWith(\\\"ACK\\\")) {\\n return encdata;\\n }\\n for (i = 0; i < 3; i++) {\\n part1 = part1 + dataarray[i] + \\\";\\\";\\n }\\n var mid = dataarray[2]; // use the message ID to create the salt\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n // base64 decoding and extract the iv and encrypted data\\n const bData = Buffer.from(enctext, 'base64');\\n const iv = bData.slice(0, 16); // initial 16 chars\\n const text = bData.slice(16); // all the encrypted data\\n // derive key using; 32 byte key length (from salted password and mid)\\n // decrypt the data in part2 and add to part1\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\n try {\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\n } catch (err) {\\n decrypted = undefined;\\n }\\n return decrypted;\\n }\\n\\n function encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n }\\n\\n function AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n deviceParams.push(cvpair);\\n }\\n\\n function AddConfig(configName, newvalue) {\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\n var cvpair = {\\n 'code': configName,\\n 'value': newvalue,\\n 'forced': true\\n };\\n configsToSend.push(cvpair);\\n };\\n }\\n\\n function isASCII(str) {\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\n }\\n}\\n// params is not defined locally -> export as module\\nif (typeof(params) === 'undefined') {\\n module.exports = {\\n execute_ops\\n }\\n} else { // on server use local defined vars\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\n // define global returns\\n msg = return_values;\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1747753380},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n // Define array to push device data into. This will be put into the msg array at the end.\\r\\n var deviceParams = [];\\r\\n var configsToSend = [];\\r\\n var tasks = [];\\r\\n var keyValueQuery = undefined;\\r\\n const _crypto = require('crypto');\\r\\n // handle ACK\\r\\n if (messageTypeCode == \\\"ACK\\\") {\\r\\n return \\\"\\\";\\r\\n }\\r\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\r\\n var password;\\r\\n if (params.imei == \\\"null\\\") {\\r\\n return msg;\\r\\n }\\r\\n password = params.imei;\\r\\n if (configs.Password.Password === \\\"\\\") {\\r\\n // use imei as default password when not specified\\r\\n } else {\\r\\n // use the password\\r\\n password = configs.Password.Password\\r\\n }\\r\\n let message = decrypt(raw, password);\\r\\n if (message) {\\r\\n // send message internally\\r\\n sendMessageToLocalhost(message);\\r\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n } else {\\r\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n }\\r\\n } else { // General Oysta Template\\r\\n switch (messageTypeLocalCode) {\\r\\n case (\\\"COMM\\\"):\\r\\n process_invent_msg(); //incoming invent commands\\r\\n break;\\r\\n case (\\\"MACB\\\"):\\r\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\r\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\r\\n add_params_to_output();\\r\\n break;\\r\\n case \\\"INFO-GETPWB\\\": // handle GETPWB message\\r\\n let devicekey = params.bracelet_mac;\\r\\n keyValueQuery = {\\r\\n key: devicekey, // key to be lookded up\\r\\n type: \\\"Bracelet\\\", // type of the key\\r\\n template: \\\"password\\\" // the variable the result will be mapped to\\r\\n };\\r\\n break;\\r\\n case (\\\"REGISTER\\\"):\\r\\n let ble_mac = params.ble_mac;\\r\\n let iccid = params.iccid;\\r\\n // write values to readonly settings\\r\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\r\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\r\\n // will automtaically Activate on Acceptance\\r\\n if (serverParams.EnvName) {\\r\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\r\\n }\\r\\n }\\r\\n break;\\r\\n case (\\\"CREATE\\\"):\\r\\n // temp fix to filter old messages\\r\\n // const cutoff = 1707523200000; //10.2.2024\\r\\n // let message_id_time = parseInt(params.count_number, 36);\\r\\n // if (message_id_time > cutoff){\\r\\n let c_ble_mac = params.ble_mac;\\r\\n let c_iccid = params.iccid;\\r\\n let new_imei = params.new_imei;\\r\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\r\\n // sendMessageToLocalhost(c_message); \\r\\n tasks = [{\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"sync\\\",\\r\\n \\\"type\\\": \\\"createDevice\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"imei\\\": new_imei,\\r\\n \\\"abortOnError\\\": false,\\r\\n \\\"init\\\": true\\r\\n }),\\r\\n \\\"order\\\": 1\\r\\n }, {\\r\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"async\\\",\\r\\n \\\"type\\\": \\\"sendMessage\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"message\\\": c_message\\r\\n }),\\r\\n \\\"order\\\": 2\\r\\n }]\\r\\n // }\\r\\n break;\\r\\n case (\\\"ALLDATA\\\"):\\r\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\r\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\r\\n let all_data = JSON.parse(json_str);\\r\\n if (\\\"version\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\r\\n };\\r\\n if (\\\"backgroundLocation\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.BackgroundLocation, all_data.backgroundLocation);\\r\\n };\\r\\n if (\\\"coarseLocation\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.CoarseLocation, all_data.coarseLocation);\\r\\n };\\r\\n if (\\\"fineLocation\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.FineLocation, all_data.fineLocation);\\r\\n };\\r\\n break;\\r\\n default:\\r\\n // all other general messages\\r\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\r\\n add_params_to_output();\\r\\n }\\r\\n // add messagetTypeLocal to output for templates\\r\\n AddValue('local_message_type', messageTypeLocalCode);\\r\\n }\\r\\n var msg = {\\r\\n 'values': deviceParams,\\r\\n };\\r\\n if (configsToSend.length > 0) {\\r\\n msg.configsToSend = configsToSend\\r\\n };\\r\\n if (tasks.length > 0) {\\r\\n msg.tasks = tasks\\r\\n };\\r\\n if (keyValueQuery) {\\r\\n msg.KeyValue = keyValueQuery\\r\\n }\\r\\n // commit values to receiver processor\\r\\n console.log(msg);\\r\\n // modify to return the object that contains your data\\r\\n return msg;\\r\\n\\r\\n function add_params_to_output() {\\r\\n if (!params.raw_accuracy) {\\r\\n AddValue('location_accuracy', 9000);\\r\\n } else {\\r\\n AddValue('location_accuracy', params.raw_accuracy);\\r\\n }\\r\\n // generate timestamps if they don't exist\\r\\n if (!params.event_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n if (!params.location_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n //if no lat and long are given, set them to 0, 0\\r\\n if (!params.latitude_raw) {\\r\\n AddValue('latitude', 0);\\r\\n } else {\\r\\n AddValue('latitude', params.latitude_raw);\\r\\n }\\r\\n if (!params.longitude_raw) {\\r\\n AddValue('longitude', 0);\\r\\n } else {\\r\\n AddValue('longitude', params.longitude_raw);\\r\\n }\\r\\n // if (params.temp_bracelet){\\r\\n // AddValue('oysta_labels', 'DegC');\\r\\n // AddValue('single_column_value', params.temp_bracelet);\\r\\n // }\\r\\n }\\r\\n\\r\\n function process_invent_msg() {\\r\\n const details = JSON.parse(raw);\\r\\n // AddValue('imei', details.AppId);\\r\\n AddValue('json_in', JSON.stringify(details));\\r\\n switch (details.Command) {\\r\\n case \\\"ACTIVATE_OK\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\r\\n break;\\r\\n case \\\"ACTIVATE_FAILS\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\r\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\r\\n break;\\r\\n case \\\"APPSET\\\":\\r\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\r\\n AddConfig(configIds.Password.Password, details.Data.Password);\\r\\n break;\\r\\n case \\\"CONFIG\\\":\\r\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\r\\n break;\\r\\n case \\\"CGFBR\\\":\\r\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\r\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\r\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\r\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\r\\n let commonParam = addEscapeChar(details.Data.ComPar);\\r\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\r\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\r\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\r\\n let lteParam = addEscapeChar(details.Data.LtePar);\\r\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\r\\n let bleParam = addEscapeChar(details.Data.BlePar);\\r\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\r\\n break;\\r\\n case \\\"REBOOTB\\\":\\r\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\r\\n break;\\r\\n case \\\"PWRFB\\\":\\r\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\r\\n break;\\r\\n case \\\"RESETB\\\":\\r\\n AddConfig(configIds.Bracelet.Reset, 'true');\\r\\n break;\\r\\n case \\\"BRAPWUPDATE\\\":\\r\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\r\\n // get password from old device, then set\\r\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\r\\n )\\r\\n break;\\r\\n case \\\"NOTE\\\":\\r\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\r\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\r\\n text = text.split(\\\",\\\").join(\\\" \\\");\\r\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\r\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\r\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\r\\n AddConfig(configIds.Note.Message, value)\\r\\n break;\\r\\n }\\r\\n }\\r\\n\\r\\n function addEscapeChar(json) {\\r\\n if (json === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n let jsonStr = JSON.stringify(json);\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\r\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function changeSingleQuoteToDouble(jsonStr) {\\r\\n if (jsonStr === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\r\\n outStr = outStr + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function sendMessageToLocalhost(str) {\\r\\n if (localTesting) {\\r\\n console.log(\\\"Sending message to local host: \\\" + str);\\r\\n } else {\\r\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\r\\n var c = createConnection(5678, server); // acceptance is 5678 - protocol dev 5878 - dev is 5679 ?\\r\\n c.write(`${str}`);\\r\\n c.end();\\r\\n }\\r\\n AddValue(\\\"ToLocalhost\\\", str);\\r\\n }\\r\\n\\r\\n function createConnection(port, server) {\\r\\n c = net.createConnection(port, server);\\r\\n c.on('error', function(error) {\\r\\n c = createConnection(port, server);\\r\\n });\\r\\n return c;\\r\\n }\\r\\n\\r\\n function decrypt(encdata, password) {\\r\\n var decrypted;\\r\\n var dataarray = encdata.split(\\\";\\\");\\r\\n if (dataarray.length > 5) {\\r\\n return \\\"\\\";\\r\\n }\\r\\n var i;\\r\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\r\\n if (encdata.startsWith(\\\"ACK\\\")) {\\r\\n return encdata;\\r\\n }\\r\\n for (i = 0; i < 3; i++) {\\r\\n part1 = part1 + dataarray[i] + \\\";\\\";\\r\\n }\\r\\n var mid = dataarray[2]; // use the message ID to create the salt\\r\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n // base64 decoding and extract the iv and encrypted data\\r\\n const bData = Buffer.from(enctext, 'base64');\\r\\n const iv = bData.slice(0, 16); // initial 16 chars\\r\\n const text = bData.slice(16); // all the encrypted data\\r\\n // derive key using; 32 byte key length (from salted password and mid)\\r\\n // decrypt the data in part2 and add to part1\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\r\\n try {\\r\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\r\\n } catch (err) {\\r\\n decrypted = undefined;\\r\\n }\\r\\n return decrypted;\\r\\n }\\r\\n\\r\\n function encrypt(text, mid, password) {\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n const iv = _crypto.randomBytes(16); // random initialization vector\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n // set the cipher\\r\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\r\\n // encrypt text\\r\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\r\\n // generate output ( encrypted text )\\r\\n return Buffer.concat([iv, encrypted]).toString('base64');\\r\\n }\\r\\n\\r\\n function AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n deviceParams.push(cvpair);\\r\\n }\\r\\n\\r\\n function AddConfig(configName, newvalue) {\\r\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n var cvpair = {\\r\\n 'code': configName,\\r\\n 'value': newvalue,\\r\\n 'forced': true\\r\\n };\\r\\n configsToSend.push(cvpair);\\r\\n };\\r\\n }\\r\\n\\r\\n function isASCII(str) {\\r\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\r\\n }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n module.exports = {\\r\\n execute_ops\\r\\n }\\r\\n} else { // on server use local defined vars\\r\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n // define global returns\\r\\n msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1751382743},{"Type":1,"NewValue":"{\"Id\":279,\"Name\":\"VGA\",\"Operation\":\"function execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\\r\\n // Define array to push device data into. This will be put into the msg array at the end.\\r\\n var deviceParams = [];\\r\\n var configsToSend = [];\\r\\n var tasks = [];\\r\\n var keyValueQuery = undefined;\\r\\n const _crypto = require('crypto');\\r\\n // handle ACK\\r\\n if (messageTypeCode == \\\"ACK\\\") {\\r\\n return \\\"\\\";\\r\\n }\\r\\n if (params.encrypted_data) { // encrypted data so needs decrypting\\r\\n var password;\\r\\n if (params.imei == \\\"null\\\") {\\r\\n return msg;\\r\\n }\\r\\n password = params.imei;\\r\\n if (configs.Password.Password === \\\"\\\") {\\r\\n // use imei as default password when not specified\\r\\n } else {\\r\\n // use the password\\r\\n password = configs.Password.Password\\r\\n }\\r\\n let message = decrypt(raw, password);\\r\\n if (message) {\\r\\n // send message internally\\r\\n sendMessageToLocalhost(message);\\r\\n let ack = \\\"ACK-MSG;\\\" + params.count_number + \\\";OK;\\\\n\\\"\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n } else {\\r\\n ack = \\\"unknown message\\\" + \\\" - \\\" + serverParams.imei + \\\" --- \\\" + raw;\\r\\n AddValue(\\\"ack\\\", ack);\\r\\n }\\r\\n } else { // General Oysta Template\\r\\n switch (messageTypeLocalCode) {\\r\\n case (\\\"COMM\\\"):\\r\\n process_invent_msg(); //incoming invent commands\\r\\n break;\\r\\n case (\\\"MACB\\\"):\\r\\n AddConfig(configIds.DeviceConfig.BRAMAC, params.bracelet_mac);\\r\\n AddConfig(configIds.DeviceConfig.braceletIMEI, params.bracelet_imei);\\r\\n add_params_to_output();\\r\\n break;\\r\\n case \\\"INFO-GETPWB\\\": // handle GETPWB message\\r\\n let devicekey = params.bracelet_mac;\\r\\n keyValueQuery = {\\r\\n key: devicekey, // key to be lookded up\\r\\n type: \\\"Bracelet\\\", // type of the key\\r\\n template: \\\"password\\\" // the variable the result will be mapped to\\r\\n };\\r\\n break;\\r\\n case (\\\"REGISTER\\\"):\\r\\n let ble_mac = params.ble_mac;\\r\\n let iccid = params.iccid;\\r\\n // write values to readonly settings\\r\\n AddConfig(configIds.DeviceConfig.BLEMAC, ble_mac);\\r\\n AddConfig(configIds.DeviceConfig.ICCID, iccid);\\r\\n // will automtaically Activate on Acceptance\\r\\n if (serverParams.EnvName) {\\r\\n if (serverParams.EnvName === \\\"acceptance\\\") {\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true')\\r\\n }\\r\\n }\\r\\n break;\\r\\n case (\\\"CREATE\\\"):\\r\\n // temp fix to filter old messages\\r\\n // const cutoff = 1707523200000; //10.2.2024\\r\\n // let message_id_time = parseInt(params.count_number, 36);\\r\\n // if (message_id_time > cutoff){\\r\\n let c_ble_mac = params.ble_mac;\\r\\n let c_iccid = params.iccid;\\r\\n let new_imei = params.new_imei;\\r\\n let c_message = \\\"VGA-001;\\\" + new_imei + \\\";mid=\\\" + params.count_number + \\\";REGISTER=\\\" + c_ble_mac + \\\",\\\" + c_iccid + \\\";\\\";\\r\\n // sendMessageToLocalhost(c_message); \\r\\n tasks = [{\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"sync\\\",\\r\\n \\\"type\\\": \\\"createDevice\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"name\\\": \\\"VGA\\\" + new_imei,\\r\\n \\\"imei\\\": new_imei,\\r\\n \\\"abortOnError\\\": false,\\r\\n \\\"init\\\": true\\r\\n }),\\r\\n \\\"order\\\": 1\\r\\n }, {\\r\\n \\\"name\\\": \\\"Create VGA\\\" + new_imei,\\r\\n \\\"option\\\": \\\"async\\\",\\r\\n \\\"type\\\": \\\"sendMessage\\\",\\r\\n \\\"payload\\\": JSON.stringify({\\r\\n \\\"message\\\": c_message\\r\\n }),\\r\\n \\\"order\\\": 2\\r\\n }]\\r\\n // }\\r\\n break;\\r\\n case (\\\"ALLDATA\\\"):\\r\\n // InterlliCare converts \\\" to ' when parsing, so convert back\\r\\n let json_str = changeSingleQuoteToDouble(params.all_data);\\r\\n let all_data = JSON.parse(json_str);\\r\\n if (\\\"version\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.Version, all_data.version);\\r\\n };\\r\\n if (\\\"backgroundLocation\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.BackgroundLocation, all_data.backgroundLocation);\\r\\n };\\r\\n if (\\\"coarseLocation\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.CoarseLocation, all_data.coarseLocation);\\r\\n };\\r\\n if (\\\"fineLocation\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.FineLocation, all_data.fineLocation);\\r\\n };\\r\\n if (\\\"restarts\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.Restarts, all_data.restarts);\\r\\n };\\r\\n if (\\\"mtbr\\\" in all_data) {\\r\\n AddConfig(configIds.DeviceConfig.MTBR, all_data.mtbr);\\r\\n };\\r\\n break;\\r\\n default:\\r\\n // all other general messages\\r\\n // Generate location_accuracy based on raw_accuracy - currently no conversion\\r\\n add_params_to_output();\\r\\n }\\r\\n // add messagetTypeLocal to output for templates\\r\\n AddValue('local_message_type', messageTypeLocalCode);\\r\\n }\\r\\n var msg = {\\r\\n 'values': deviceParams,\\r\\n };\\r\\n if (configsToSend.length > 0) {\\r\\n msg.configsToSend = configsToSend\\r\\n };\\r\\n if (tasks.length > 0) {\\r\\n msg.tasks = tasks\\r\\n };\\r\\n if (keyValueQuery) {\\r\\n msg.KeyValue = keyValueQuery\\r\\n }\\r\\n // commit values to receiver processor\\r\\n console.log(msg);\\r\\n // modify to return the object that contains your data\\r\\n return msg;\\r\\n\\r\\n function add_params_to_output() {\\r\\n if (!params.raw_accuracy) {\\r\\n AddValue('location_accuracy', 9000);\\r\\n } else {\\r\\n AddValue('location_accuracy', params.raw_accuracy);\\r\\n }\\r\\n // generate timestamps if they don't exist\\r\\n if (!params.event_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n if (!params.location_time) {\\r\\n AddValue('event_time', moment.utc().unix());\\r\\n }\\r\\n //if no lat and long are given, set them to 0, 0\\r\\n if (!params.latitude_raw) {\\r\\n AddValue('latitude', 0);\\r\\n } else {\\r\\n AddValue('latitude', params.latitude_raw);\\r\\n }\\r\\n if (!params.longitude_raw) {\\r\\n AddValue('longitude', 0);\\r\\n } else {\\r\\n AddValue('longitude', params.longitude_raw);\\r\\n }\\r\\n // if (params.temp_bracelet){\\r\\n // AddValue('oysta_labels', 'DegC');\\r\\n // AddValue('single_column_value', params.temp_bracelet);\\r\\n // }\\r\\n }\\r\\n\\r\\n function process_invent_msg() {\\r\\n const details = JSON.parse(raw);\\r\\n // AddValue('imei', details.AppId);\\r\\n AddValue('json_in', JSON.stringify(details));\\r\\n switch (details.Command) {\\r\\n case \\\"ACTIVATE_OK\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'true');\\r\\n break;\\r\\n case \\\"ACTIVATE_FAILS\\\":\\r\\n AddConfig(configIds.DeviceConfig.IVActivated, 'false');\\r\\n AddConfig(configIds.DeviceConfig.IVActivatedFailMessage, details.Data.Text);\\r\\n break;\\r\\n case \\\"APPSET\\\":\\r\\n AddConfig(configIds.CycleInterval.CycleInterval, details.Data.CycConfig);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryLowAlert, details.Data.BatteryLowAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryLowThreshold, details.Data.BatteryLowThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryCriticalAlert, details.Data.BatteryCriticalAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.Batteryalerts.BatteryCriticalThreshold, details.Data.BatteryCriticalThreshold);\\r\\n AddConfig(configIds.Batteryalerts.EnableBatteryChargingAlerts, details.Data.BatteryChargingAlarmEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.EnableDisableNonMovement, details.Data.NoMotionAlertEnabled ? 'true' : 'false');\\r\\n AddConfig(configIds.NonMovement.period, details.Data.NoMotionPeriod);\\r\\n AddConfig(configIds.Password.Password, details.Data.Password);\\r\\n break;\\r\\n case \\\"CONFIG\\\":\\r\\n AddConfig(configIds.DeviceConfig.ConfigMode, details.Data.EnableConfig ? 'true' : 'false');\\r\\n break;\\r\\n case \\\"CGFBR\\\":\\r\\n AddConfig(configIds.Bracelet.LowTemp, details.Data.TempLow);\\r\\n AddConfig(configIds.Bracelet.HighTemp, details.Data.TempHigh);\\r\\n AddConfig(configIds.Bracelet.LowBattery, details.Data.BatLow);\\r\\n AddConfig(configIds.Bracelet.CriticalBattery, details.Data.BatCritical);\\r\\n let commonParam = addEscapeChar(details.Data.ComPar);\\r\\n AddConfig(configIds.Bracelet.CommonParam, commonParam);\\r\\n let cloudParam = addEscapeChar(details.Data.CldPar);\\r\\n AddConfig(configIds.Bracelet.CloudParam, cloudParam);\\r\\n let lteParam = addEscapeChar(details.Data.LtePar);\\r\\n AddConfig(configIds.Bracelet.LTEParam, lteParam);\\r\\n let bleParam = addEscapeChar(details.Data.BlePar);\\r\\n AddConfig(configIds.Bracelet.BLEParam, bleParam);\\r\\n break;\\r\\n case \\\"REBOOTB\\\":\\r\\n AddConfig(configIds.Bracelet.Reboot, 'true');\\r\\n break;\\r\\n case \\\"PWRFB\\\":\\r\\n AddConfig(configIds.Bracelet.PowerOff, 'true');\\r\\n break;\\r\\n case \\\"RESETB\\\":\\r\\n AddConfig(configIds.Bracelet.Reset, 'true');\\r\\n break;\\r\\n case \\\"BRAPWUPDATE\\\":\\r\\n AddValue(\\\"PasswordRecoveryFrom\\\", details.Data.ImeiOld);\\r\\n // get password from old device, then set\\r\\n AddConfig(configIds.Password.BraceletPW, \\\"DoNotChange123\\\" // replace with recovered password, for test this is DoNotChange123\\r\\n )\\r\\n break;\\r\\n case \\\"NOTE\\\":\\r\\n let type = details.Data.Type !== undefined ? details.Data.Type : \\\"TYPE MISSING\\\";\\r\\n let text = details.Data.Text !== undefined ? details.Data.Text : \\\"Text Missing\\\";\\r\\n text = text.split(\\\",\\\").join(\\\" \\\");\\r\\n let id = details.Data.Id !== undefined ? details.Data.Id : \\\"Id Missing\\\";\\r\\n let time = details.Data.Time !== undefined ? details.Data.Time.toString() : '0';\\r\\n let value = time + \\\",\\\" + type + \\\",\\\" + id + \\\",\\\" + text;\\r\\n AddConfig(configIds.Note.Message, value)\\r\\n break;\\r\\n }\\r\\n }\\r\\n\\r\\n function addEscapeChar(json) {\\r\\n if (json === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n let jsonStr = JSON.stringify(json);\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 34) { // replace quote with Escape quote\\r\\n outStr = outStr + String.fromCharCode(92) + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function changeSingleQuoteToDouble(jsonStr) {\\r\\n if (jsonStr === undefined) {\\r\\n return undefined;\\r\\n }\\r\\n let outStr = \\\"\\\";\\r\\n for (let c of jsonStr) {\\r\\n if (c.charCodeAt(0) == 39) { // replace single quote with double quote\\r\\n outStr = outStr + String.fromCharCode(34);\\r\\n } else {\\r\\n outStr += c;\\r\\n }\\r\\n };\\r\\n return outStr;\\r\\n }\\r\\n\\r\\n function sendMessageToLocalhost(str) {\\r\\n if (localTesting) {\\r\\n console.log(\\\"Sending message to local host: \\\" + str);\\r\\n } else {\\r\\n var server = '127.0.0.1'; // replace with 'receiver-tcp' tp load balance\\r\\n var c = createConnection(5678, server); // acceptance is 5678 - protocol dev 5878 - dev is 5679 ?\\r\\n c.write(`${str}`);\\r\\n c.end();\\r\\n }\\r\\n AddValue(\\\"ToLocalhost\\\", str);\\r\\n }\\r\\n\\r\\n function createConnection(port, server) {\\r\\n c = net.createConnection(port, server);\\r\\n c.on('error', function(error) {\\r\\n c = createConnection(port, server);\\r\\n });\\r\\n return c;\\r\\n }\\r\\n\\r\\n function decrypt(encdata, password) {\\r\\n var decrypted;\\r\\n var dataarray = encdata.split(\\\";\\\");\\r\\n if (dataarray.length > 5) {\\r\\n return \\\"\\\";\\r\\n }\\r\\n var i;\\r\\n var part1 = \\\"\\\"; // part1 will hold the type, IMEI and message ID\\r\\n if (encdata.startsWith(\\\"ACK\\\")) {\\r\\n return encdata;\\r\\n }\\r\\n for (i = 0; i < 3; i++) {\\r\\n part1 = part1 + dataarray[i] + \\\";\\\";\\r\\n }\\r\\n var mid = dataarray[2]; // use the message ID to create the salt\\r\\n var enctext = dataarray[3].split(\\\"=\\\")[1]; // the encypted data\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n // base64 decoding and extract the iv and encrypted data\\r\\n const bData = Buffer.from(enctext, 'base64');\\r\\n const iv = bData.slice(0, 16); // initial 16 chars\\r\\n const text = bData.slice(16); // all the encrypted data\\r\\n // derive key using; 32 byte key length (from salted password and mid)\\r\\n // decrypt the data in part2 and add to part1\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n const decipher = _crypto.createDecipheriv('aes-256-cbc', key, iv);\\r\\n try {\\r\\n decrypted = part1 + decipher.update(text, 'binary', 'utf8') + decipher.final('utf8');\\r\\n } catch (err) {\\r\\n decrypted = undefined;\\r\\n }\\r\\n return decrypted;\\r\\n }\\r\\n\\r\\n function encrypt(text, mid, password) {\\r\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\r\\n const iv = _crypto.randomBytes(16); // random initialization vector\\r\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\r\\n // set the cipher\\r\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\r\\n // encrypt text\\r\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\r\\n // generate output ( encrypted text )\\r\\n return Buffer.concat([iv, encrypted]).toString('base64');\\r\\n }\\r\\n\\r\\n function AddValue(p1, p2) {\\r\\n var cvpair = {\\r\\n code: p1,\\r\\n value: p2\\r\\n };\\r\\n deviceParams.push(cvpair);\\r\\n }\\r\\n\\r\\n function AddConfig(configName, newvalue) {\\r\\n if (newvalue !== undefined) { // don't add if newvalue is undefined\\r\\n var cvpair = {\\r\\n 'code': configName,\\r\\n 'value': newvalue,\\r\\n 'forced': true\\r\\n };\\r\\n configsToSend.push(cvpair);\\r\\n };\\r\\n }\\r\\n\\r\\n function isASCII(str) {\\r\\n return /^[\\\\x00-\\\\xFF]*$/.test(str);\\r\\n }\\r\\n}\\r\\n// params is not defined locally -> export as module\\r\\nif (typeof(params) === 'undefined') {\\r\\n module.exports = {\\r\\n execute_ops\\r\\n }\\r\\n} else { // on server use local defined vars\\r\\n let return_values = execute_ops(moment, msg, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\\r\\n // define global returns\\r\\n msg = return_values;\\r\\n}\",\"Type\":0,\"ProtocolActionObjects\":[]}","Timestamp":1751555375}]}],"Groups":[{"Id":5624,"Parent":null,"Name":"Settings","Json":"{\"description\":null,\"columns\":2,\"order\":3,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":5625,"Parent":null,"Name":"Admin config","Json":"{ \"description\": \"Admin config\", \"columns\": 2, \"order\": 1, \"listSize\": 1, \"toTranslate\": [ \"name\", \"description\" ]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":5626,"Parent":null,"Name":"Actions","Json":"{\"description\":\"Power off, real time locate etc.\",\"columns\":1,\"order\":4,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":5627,"Parent":null,"Name":"Notification","Json":"{\"description\":null,\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":5628,"Parent":null,"Name":"Not Implemented","Json":"{\"description\":null,\"columns\":1,\"order\":5,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":5629,"Parent":{"Id":5625,"Name":"Admin config","Json":{"description":"Admin config","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[{"Id":5629,"Name":"DeviceConfig","Json":{"description":"Reset the device with default factory values","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]},{"Id":5630,"Name":"Password","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"DeviceConfig","Json":"{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":5630,"Parent":{"Id":5625,"Name":"Admin config","Json":{"description":"Admin config","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[{"Id":5629,"Name":"DeviceConfig","Json":{"description":"Reset the device with default factory values","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]},{"Id":5630,"Name":"Password","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"Password","Json":"{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":5631,"Parent":{"Id":5624,"Name":"Settings","Json":{"description":null,"columns":2,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5631,"Name":"Cycle Interval","Json":{"description":"Define the period for which the device should send regular location updates, and how frequent those updates are.","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5632,"Name":"Battery alerts","Json":{"description":"Battery alerts","columns":1,"order":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5633,"Name":"Bracelet","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"Cycle Interval","Json":"{ \"description\": \"Define the period for which the device should send regular location updates, and how frequent those updates are.\", \"columns\": 1, \"order\": 2, \"listSize\": 1, \"toTranslate\": [ \"name\", \"description\" ]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":5632,"Parent":{"Id":5624,"Name":"Settings","Json":{"description":null,"columns":2,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5631,"Name":"Cycle Interval","Json":{"description":"Define the period for which the device should send regular location updates, and how frequent those updates are.","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5632,"Name":"Battery alerts","Json":{"description":"Battery alerts","columns":1,"order":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5633,"Name":"Bracelet","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"Battery alerts","Json":"{ \"description\": \"Battery alerts\", \"columns\": 1, \"order\": 5, \"toTranslate\": [ \"name\", \"description\" ]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":5633,"Parent":{"Id":5624,"Name":"Settings","Json":{"description":null,"columns":2,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5631,"Name":"Cycle Interval","Json":{"description":"Define the period for which the device should send regular location updates, and how frequent those updates are.","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5632,"Name":"Battery alerts","Json":{"description":"Battery alerts","columns":1,"order":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5633,"Name":"Bracelet","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"Bracelet","Json":"{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":5634,"Parent":{"Id":5628,"Name":"Not Implemented","Json":{"description":null,"columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5634,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5635,"Name":"Non Movement","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5636,"Name":"Real Time Locate","Json":{"description":"Real Time Locate","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5637,"Name":"Set Server","Json":{"description":"Set Server","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]}]},"Name":"No Activity","Json":"{\"description\":\"No Activity\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":5635,"Parent":{"Id":5628,"Name":"Not Implemented","Json":{"description":null,"columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5634,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5635,"Name":"Non Movement","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5636,"Name":"Real Time Locate","Json":{"description":"Real Time Locate","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5637,"Name":"Set Server","Json":{"description":"Set Server","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]}]},"Name":"Non Movement","Json":"{\"description\":\"\",\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":5636,"Parent":{"Id":5628,"Name":"Not Implemented","Json":{"description":null,"columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5634,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5635,"Name":"Non Movement","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5636,"Name":"Real Time Locate","Json":{"description":"Real Time Locate","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5637,"Name":"Set Server","Json":{"description":"Set Server","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]}]},"Name":"Real Time Locate","Json":"{\"description\":\"Real Time Locate\",\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":5637,"Parent":{"Id":5628,"Name":"Not Implemented","Json":{"description":null,"columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5634,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5635,"Name":"Non Movement","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5636,"Name":"Real Time Locate","Json":{"description":"Real Time Locate","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5637,"Name":"Set Server","Json":{"description":"Set Server","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]}]},"Name":"Set Server","Json":"{\"description\":\"Set Server\",\"columns\":1,\"order\":4,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":5638,"Parent":{"Id":5627,"Name":"Notification","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5638,"Name":"Note","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"Note","Json":"{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]}],"GroupParams":[{"Id":9692,"Group":{"Id":5629,"Name":"DeviceConfig","Json":{"description":"Reset the device with default factory values","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5625,"Name":"Admin config","Json":{"description":"Admin config","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[{"Id":5630,"Name":"Password","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]},"Name":"IV ActivatedFailMessage","Json":"{\"name\":\"IV ActivatedFailMessage\",\"default\":\"\",\"description\":\"Reason for Activation Failure\",\"type\":\"text\",\"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\":6}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":9692,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"IV ActivatedFailMessage\",\"Json\":\"{\\\"name\\\":\\\"IV ActivatedFailMessage\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Reason for Activation Failure\\\",\\\"type\\\":\\\"text\\\",\\\"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\\\":7}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1714640806},{"Type":1,"NewValue":"{\"Id\":9692,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"IV ActivatedFailMessage\",\"Json\":\"{\\\"name\\\":\\\"IV ActivatedFailMessage\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Reason for Activation Failure\\\",\\\"type\\\":\\\"text\\\",\\\"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\\\":10}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751967276},{"Type":1,"NewValue":"{\"Id\":9692,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"IV ActivatedFailMessage\",\"Json\":\"{\\\"name\\\":\\\"IV ActivatedFailMessage\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Reason for Activation Failure\\\",\\\"type\\\":\\\"text\\\",\\\"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\\\":9}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751977808},{"Type":1,"NewValue":"{\"Id\":9692,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"IV ActivatedFailMessage\",\"Json\":\"{\\\"name\\\":\\\"IV ActivatedFailMessage\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Reason for Activation Failure\\\",\\\"type\\\":\\\"text\\\",\\\"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\\\":8}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751977963}],"LanguageId":null,"Tags":[]},{"Id":9689,"Group":{"Id":5629,"Name":"DeviceConfig","Json":{"description":"Reset the device with default factory values","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5625,"Name":"Admin config","Json":{"description":"Admin config","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[{"Id":5630,"Name":"Password","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]},"Name":"ICCID","Json":"{\"name\":\"ICCID\",\"default\":\"\",\"description\":\"SIM ICCID\",\"type\":\"text\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"The ICCID of hte phones SIM card.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":4}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":9689,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"ICCID\",\"Json\":\"{\\\"name\\\":\\\"ICCID\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"SIM ICCID\\\",\\\"type\\\":\\\"text\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":true,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"The ICCID of hte phones SIM card.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":5}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1714640798},{"Type":1,"NewValue":"{\"Id\":9689,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"ICCID\",\"Json\":\"{\\\"name\\\":\\\"ICCID\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"SIM ICCID\\\",\\\"type\\\":\\\"text\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":true,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"The ICCID of hte phones SIM card.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":8}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751967270},{"Type":1,"NewValue":"{\"Id\":9689,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"ICCID\",\"Json\":\"{\\\"name\\\":\\\"ICCID\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"SIM ICCID\\\",\\\"type\\\":\\\"text\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":true,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"The ICCID of hte phones SIM card.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":7}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751977804},{"Type":1,"NewValue":"{\"Id\":9689,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"ICCID\",\"Json\":\"{\\\"name\\\":\\\"ICCID\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"SIM ICCID\\\",\\\"type\\\":\\\"text\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":true,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"The ICCID of hte phones SIM card.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":6}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751977958}],"LanguageId":null,"Tags":[]},{"Id":9690,"Group":{"Id":5629,"Name":"DeviceConfig","Json":{"description":"Reset the device with default factory values","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5625,"Name":"Admin config","Json":{"description":"Admin config","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[{"Id":5630,"Name":"Password","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]},"Name":"IV Activated","Json":"{\"name\":\"IV Activated\",\"default\":\"false\",\"description\":\"Invent Activated ok\",\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Flag that is set when the Invent platform has acknowledged the activation of the device.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":5}","Default":"true","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":9690,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"IV Activated\",\"Json\":\"{\\\"name\\\":\\\"IV Activated\\\",\\\"default\\\":\\\"false\\\",\\\"description\\\":\\\"Invent Activated ok\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Flag that is set when the Invent platform has acknowledged the activation of the device.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":6}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1714640801},{"Type":1,"NewValue":"{\"Id\":9690,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"IV Activated\",\"Json\":\"{\\\"name\\\":\\\"IV Activated\\\",\\\"default\\\":\\\"false\\\",\\\"description\\\":\\\"Invent Activated ok\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Flag that is set when the Invent platform has acknowledged the activation of the device.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":9}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751967273},{"Type":1,"NewValue":"{\"Id\":9690,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"IV Activated\",\"Json\":\"{\\\"name\\\":\\\"IV Activated\\\",\\\"default\\\":\\\"false\\\",\\\"description\\\":\\\"Invent Activated ok\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Flag that is set when the Invent platform has acknowledged the activation of the device.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":8}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751977806},{"Type":1,"NewValue":"{\"Id\":9690,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"IV Activated\",\"Json\":\"{\\\"name\\\":\\\"IV Activated\\\",\\\"default\\\":\\\"false\\\",\\\"description\\\":\\\"Invent Activated ok\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Flag that is set when the Invent platform has acknowledged the activation of the device.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":7}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751977961}],"LanguageId":null,"Tags":[]},{"Id":9691,"Group":{"Id":5629,"Name":"DeviceConfig","Json":{"description":"Reset the device with default factory values","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5625,"Name":"Admin config","Json":{"description":"Admin config","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[{"Id":5630,"Name":"Password","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]},"Name":"Config Mode","Json":"{\"name\":\"Config Mode\",\"default\":\"\",\"description\":\"Config Mode\",\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Enables Config mode on in the app to show additional actions and buttons.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":3}","Default":"false","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":9691,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Config Mode\",\"Json\":\"{\\\"name\\\":\\\"Config Mode\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Config Mode\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Enables Config mode on in the app to show additional actions and buttons.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":4}\",\"Default\":\"false\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1714640794},{"Type":1,"NewValue":"{\"Id\":9691,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Config Mode\",\"Json\":\"{\\\"name\\\":\\\"Config Mode\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Config Mode\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Enables Config mode on in the app to show additional actions and buttons.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":5}\",\"Default\":\"false\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751967261},{"Type":1,"NewValue":"{\"Id\":9691,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Config Mode\",\"Json\":\"{\\\"name\\\":\\\"Config Mode\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Config Mode\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Enables Config mode on in the app to show additional actions and buttons.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":4}\",\"Default\":\"false\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751968957}],"LanguageId":null,"Tags":[]},{"Id":9693,"Group":{"Id":5629,"Name":"DeviceConfig","Json":{"description":"Reset the device with default factory values","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5625,"Name":"Admin config","Json":{"description":"Admin config","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[{"Id":5630,"Name":"Password","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]},"Name":"DisableAck","Json":"{\"name\":\"DisableAck\",\"default\":\"\",\"description\":\"Disable Ack\",\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Disable Acks for testing to simulate IntelliCare failure.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":8}","Default":"false","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":9693,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"DisableAck\",\"Json\":\"{\\\"name\\\":\\\"DisableAck\\\",\\\"default\\\":\\\"false\\\",\\\"description\\\":\\\"Disable Ack\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Disable Acks for testing to simulate IntelliCare failure.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1714640747},{"Type":1,"NewValue":"{\"Id\":9693,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"DisableAck\",\"Json\":\"{\\\"name\\\":\\\"DisableAck\\\",\\\"default\\\":\\\"false\\\",\\\"description\\\":\\\"Disable Ack\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Disable Acks for testing to simulate IntelliCare failure.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":9}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1714640819},{"Type":1,"NewValue":"{\"Id\":9693,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"DisableAck\",\"Json\":\"{\\\"name\\\":\\\"DisableAck\\\",\\\"default\\\":\\\"false\\\",\\\"description\\\":\\\"Disable Ack\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Disable Acks for testing to simulate IntelliCare failure.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":13}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751967286},{"Type":1,"NewValue":"{\"Id\":9693,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"DisableAck\",\"Json\":\"{\\\"name\\\":\\\"DisableAck\\\",\\\"default\\\":\\\"false\\\",\\\"description\\\":\\\"Disable Ack\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Disable Acks for testing to simulate IntelliCare failure.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":12}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751977814},{"Type":1,"NewValue":"{\"Id\":9693,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"DisableAck\",\"Json\":\"{\\\"name\\\":\\\"DisableAck\\\",\\\"default\\\":\\\"false\\\",\\\"description\\\":\\\"Disable Ack\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Disable Acks for testing to simulate IntelliCare failure.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":11}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751977969}],"LanguageId":null,"Tags":[]},{"Id":9666,"Group":{"Id":5629,"Name":"DeviceConfig","Json":{"description":"Reset the device with default factory values","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5625,"Name":"Admin config","Json":{"description":"Admin config","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[{"Id":5630,"Name":"Password","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]},"Name":"Reset","Json":"{\"name\":\"Reset\",\"default\":\"\",\"description\":\"Reset Device\",\"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":[{"Type":1,"NewValue":"{\"Id\":9666,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Reset\",\"Json\":\"{\\\"name\\\":\\\"Reset\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Reset Device\\\",\\\"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\\\":8}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1714640812},{"Type":1,"NewValue":"{\"Id\":9666,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Reset\",\"Json\":\"{\\\"name\\\":\\\"Reset\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Reset Device\\\",\\\"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\\\":12}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751967283},{"Type":1,"NewValue":"{\"Id\":9666,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Reset\",\"Json\":\"{\\\"name\\\":\\\"Reset\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Reset Device\\\",\\\"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\\\":11}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751977812},{"Type":1,"NewValue":"{\"Id\":9666,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Reset\",\"Json\":\"{\\\"name\\\":\\\"Reset\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Reset Device\\\",\\\"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\\\":10}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751977967}],"LanguageId":null,"Tags":[]},{"Id":9686,"Group":{"Id":5629,"Name":"DeviceConfig","Json":{"description":"Reset the device with default factory values","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5625,"Name":"Admin config","Json":{"description":"Admin config","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[{"Id":5630,"Name":"Password","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]},"Name":"BLE MAC","Json":"{\"name\":\"BLE MAC\",\"default\":\"\",\"description\":\"Phone BLE MAC address\",\"type\":\"text\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"The Bluetooth MAC address of the phone.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":0}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":9687,"Group":{"Id":5629,"Name":"DeviceConfig","Json":{"description":"Reset the device with default factory values","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5625,"Name":"Admin config","Json":{"description":"Admin config","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[{"Id":5630,"Name":"Password","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]},"Name":"BRA MAC","Json":"{\"name\":\"BRA MAC\",\"default\":\"\",\"description\":\"Bracelet MAC address\",\"type\":\"text\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"The MAC address of the bracelet.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":1}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":9688,"Group":{"Id":5629,"Name":"DeviceConfig","Json":{"description":"Reset the device with default factory values","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5625,"Name":"Admin config","Json":{"description":"Admin config","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[{"Id":5630,"Name":"Password","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]},"Name":"braceletIMEI","Json":"{\"name\":\"braceletIMEI\",\"default\":\"\",\"description\":\"Bracelet IMEI\",\"type\":\"text\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Readonly field containing the bracelet IMEI.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":2}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":9696,"Group":{"Id":5630,"Name":"Password","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5625,"Name":"Admin config","Json":{"description":"Admin config","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[{"Id":5629,"Name":"DeviceConfig","Json":{"description":"Reset the device with default factory values","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"BraceletPW","Json":"{\"name\":\"BraceletPW\",\"default\":\"\",\"description\":\"Bracelet Password\",\"type\":\"text\",\"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\":9696,\"Group\":{\"Id\":5630,\"Name\":\"Password\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"BraceletPW\",\"Json\":\"{\\\"name\\\":\\\"BraceletPW\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Bracelet Password\\\",\\\"type\\\":\\\"text\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":null,\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716290748}],"LanguageId":null,"Tags":[]},{"Id":9694,"Group":{"Id":5630,"Name":"Password","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5625,"Name":"Admin config","Json":{"description":"Admin config","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[{"Id":5629,"Name":"DeviceConfig","Json":{"description":"Reset the device with default factory values","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"encryption","Json":"{\"name\":\"encryption\",\"default\":\"true\",\"description\":\"enable encryption for commands\",\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"true","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":9694,\"Group\":{\"Id\":5630,\"Name\":\"Password\",\"Json\":{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"encryption\",\"Json\":\"{\\\"name\\\":\\\"encryption\\\",\\\"default\\\":\\\"true\\\",\\\"description\\\":\\\"enable encryption for commands\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":null,\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716290763}],"LanguageId":null,"Tags":[]},{"Id":9695,"Group":{"Id":5630,"Name":"Password","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5625,"Name":"Admin config","Json":{"description":"Admin config","columns":2,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[{"Id":5629,"Name":"DeviceConfig","Json":{"description":"Reset the device with default factory values","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Password","Json":"{\"name\":\"Password\",\"default\":\"\",\"description\":\"Password\",\"type\":\"text\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Password used to encrypt communication between Device and platform.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":9697,"Group":{"Id":5631,"Name":"Cycle Interval","Json":{"description":"Define the period for which the device should send regular location updates, and how frequent those updates are.","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5624,"Name":"Settings","Json":{"description":null,"columns":2,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5632,"Name":"Battery alerts","Json":{"description":"Battery alerts","columns":1,"order":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5633,"Name":"Bracelet","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Cycle Interval","Json":"{\"name\":\"Cycle Interval\",\"default\":\"\",\"description\":\"Cycle Interval\",\"type\":\"number\",\"suffix\":\"seconds\",\"prefix\":null,\"min\":1,\"max\":1440,\"futureOnly\":false,\"integerOnly\":true,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Frequency of location events, in seconds\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":9685,"Group":{"Id":5632,"Name":"Battery alerts","Json":{"description":"Battery alerts","columns":1,"order":5,"toTranslate":["name","description"]},"Parent":{"Id":5624,"Name":"Settings","Json":{"description":null,"columns":2,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5631,"Name":"Cycle Interval","Json":{"description":"Define the period for which the device should send regular location updates, and how frequent those updates are.","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5633,"Name":"Bracelet","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Battery Low Threshold","Json":"{\"name\":\"Battery Low Threshold\",\"default\":\"100\",\"description\":\"Battery Low Threshold\",\"type\":\"number\",\"suffix\":\"%\",\"prefix\":null,\"min\":1,\"max\":99,\"futureOnly\":false,\"integerOnly\":true,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Percentage at which the device sends a low battery alert\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":3}","Default":"100","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":9701,"Group":{"Id":5632,"Name":"Battery alerts","Json":{"description":"Battery alerts","columns":1,"order":5,"toTranslate":["name","description"]},"Parent":{"Id":5624,"Name":"Settings","Json":{"description":null,"columns":2,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5631,"Name":"Cycle Interval","Json":{"description":"Define the period for which the device should send regular location updates, and how frequent those updates are.","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5633,"Name":"Bracelet","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Enable Battery Critical Alert","Json":"{\"name\":\"Enable Battery Critical Alert\",\"default\":\"true\",\"description\":\"Enable Battery Critical Alert\",\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Sends an Alert when the battery is critically low.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":0}","Default":"true","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":9700,"Group":{"Id":5632,"Name":"Battery alerts","Json":{"description":"Battery alerts","columns":1,"order":5,"toTranslate":["name","description"]},"Parent":{"Id":5624,"Name":"Settings","Json":{"description":null,"columns":2,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5631,"Name":"Cycle Interval","Json":{"description":"Define the period for which the device should send regular location updates, and how frequent those updates are.","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5633,"Name":"Bracelet","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Enable Battery Low Alert","Json":"{\"name\":\"Enable Battery Low Alert\",\"default\":\"true\",\"description\":\"Enable Battery Low Alert\",\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":2}","Default":"true","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":9699,"Group":{"Id":5632,"Name":"Battery alerts","Json":{"description":"Battery alerts","columns":1,"order":5,"toTranslate":["name","description"]},"Parent":{"Id":5624,"Name":"Settings","Json":{"description":null,"columns":2,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5631,"Name":"Cycle Interval","Json":{"description":"Define the period for which the device should send regular location updates, and how frequent those updates are.","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5633,"Name":"Bracelet","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Enable Battery Charging Alerts","Json":"{\"name\":\"Enable Battery Charging Alerts\",\"default\":\"true\",\"description\":\"Enable Alerts when charging.\",\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Alerts will be sent when the users connects or disconnects the device to the charging station.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":4}","Default":"true","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":9698,"Group":{"Id":5632,"Name":"Battery alerts","Json":{"description":"Battery alerts","columns":1,"order":5,"toTranslate":["name","description"]},"Parent":{"Id":5624,"Name":"Settings","Json":{"description":null,"columns":2,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5631,"Name":"Cycle Interval","Json":{"description":"Define the period for which the device should send regular location updates, and how frequent those updates are.","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5633,"Name":"Bracelet","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Battery Critical Threshold","Json":"{\"name\":\"Battery Critical Threshold\",\"default\":\"\",\"description\":\"Battery Critical Threshold\",\"type\":\"number\",\"suffix\":\"%\",\"prefix\":null,\"min\":1,\"max\":99,\"futureOnly\":false,\"integerOnly\":true,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Percentage at which the device sends a critical battery alert\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":1}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":9671,"Group":{"Id":5633,"Name":"Bracelet","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5624,"Name":"Settings","Json":{"description":null,"columns":2,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5631,"Name":"Cycle Interval","Json":{"description":"Define the period for which the device should send regular location updates, and how frequent those updates are.","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5632,"Name":"Battery alerts","Json":{"description":"Battery alerts","columns":1,"order":5,"toTranslate":["name","description"]},"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":"LTEParam","Json":"{\"name\":\"LTEParam\",\"default\":\"\",\"description\":\"LTE Parameters\",\"type\":\"text\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"LTE Parameters as defined by SDK as JSON string.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":10}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":9672,"Group":{"Id":5633,"Name":"Bracelet","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5624,"Name":"Settings","Json":{"description":null,"columns":2,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5631,"Name":"Cycle Interval","Json":{"description":"Define the period for which the device should send regular location updates, and how frequent those updates are.","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5632,"Name":"Battery alerts","Json":{"description":"Battery alerts","columns":1,"order":5,"toTranslate":["name","description"]},"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":"BLEParam","Json":"{\"name\":\"BLEParam\",\"default\":\"\",\"description\":\"BLE Parameters\",\"type\":\"text\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"BLE Parameters as defined in SDK as JSON string.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":8}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":9673,"Group":{"Id":5633,"Name":"Bracelet","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5624,"Name":"Settings","Json":{"description":null,"columns":2,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5631,"Name":"Cycle Interval","Json":{"description":"Define the period for which the device should send regular location updates, and how frequent those updates are.","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5632,"Name":"Battery alerts","Json":{"description":"Battery alerts","columns":1,"order":5,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Reboot","Json":"{\"name\":\"Reboot\",\"default\":\"\",\"description\":\"Reboot\",\"type\":\"button\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Reboots the bracelet.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":5}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":9674,"Group":{"Id":5633,"Name":"Bracelet","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5624,"Name":"Settings","Json":{"description":null,"columns":2,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5631,"Name":"Cycle Interval","Json":{"description":"Define the period for which the device should send regular location updates, and how frequent those updates are.","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5632,"Name":"Battery alerts","Json":{"description":"Battery alerts","columns":1,"order":5,"toTranslate":["name","description"]},"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":"PowerOff","Json":"{\"name\":\"PowerOff\",\"default\":\"\",\"description\":\"Power Off\",\"type\":\"button\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Power off the bracelet.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":4}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":9675,"Group":{"Id":5633,"Name":"Bracelet","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5624,"Name":"Settings","Json":{"description":null,"columns":2,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5631,"Name":"Cycle Interval","Json":{"description":"Define the period for which the device should send regular location updates, and how frequent those updates are.","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5632,"Name":"Battery alerts","Json":{"description":"Battery alerts","columns":1,"order":5,"toTranslate":["name","description"]},"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":"Reset","Json":"{\"name\":\"Reset\",\"default\":\"\",\"description\":\"Reset\",\"type\":\"button\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Resets the bracelet.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":6}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":9682,"Group":{"Id":5633,"Name":"Bracelet","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5624,"Name":"Settings","Json":{"description":null,"columns":2,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5631,"Name":"Cycle Interval","Json":{"description":"Define the period for which the device should send regular location updates, and how frequent those updates are.","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5632,"Name":"Battery alerts","Json":{"description":"Battery alerts","columns":1,"order":5,"toTranslate":["name","description"]},"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":"HighTemp","Json":"{\"name\":\"HighTemp\",\"default\":\"\",\"description\":\"High Temperature\",\"type\":\"number\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":true,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Temperature above which a temperature alarm will be raised.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":1}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":9684,"Group":{"Id":5633,"Name":"Bracelet","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5624,"Name":"Settings","Json":{"description":null,"columns":2,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5631,"Name":"Cycle Interval","Json":{"description":"Define the period for which the device should send regular location updates, and how frequent those updates are.","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5632,"Name":"Battery alerts","Json":{"description":"Battery alerts","columns":1,"order":5,"toTranslate":["name","description"]},"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":"LowTemp","Json":"{\"name\":\"LowTemp\",\"default\":\"\",\"description\":\"Low Temperature\",\"type\":\"number\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":true,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Threshold below which a temperature alert will be triggered.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":0}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":9667,"Group":{"Id":5633,"Name":"Bracelet","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5624,"Name":"Settings","Json":{"description":null,"columns":2,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5631,"Name":"Cycle Interval","Json":{"description":"Define the period for which the device should send regular location updates, and how frequent those updates are.","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5632,"Name":"Battery alerts","Json":{"description":"Battery alerts","columns":1,"order":5,"toTranslate":["name","description"]},"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":"LowBattery","Json":"{\"name\":\"LowBattery\",\"default\":\"\",\"description\":\"Low Battery Threshold\",\"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\":2}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":9668,"Group":{"Id":5633,"Name":"Bracelet","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5624,"Name":"Settings","Json":{"description":null,"columns":2,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5631,"Name":"Cycle Interval","Json":{"description":"Define the period for which the device should send regular location updates, and how frequent those updates are.","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5632,"Name":"Battery alerts","Json":{"description":"Battery alerts","columns":1,"order":5,"toTranslate":["name","description"]},"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":"CriticalBattery","Json":"{\"name\":\"CriticalBattery\",\"default\":\"\",\"description\":\"Critical Battery Threshold\",\"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\":3}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":9669,"Group":{"Id":5633,"Name":"Bracelet","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5624,"Name":"Settings","Json":{"description":null,"columns":2,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5631,"Name":"Cycle Interval","Json":{"description":"Define the period for which the device should send regular location updates, and how frequent those updates are.","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5632,"Name":"Battery alerts","Json":{"description":"Battery alerts","columns":1,"order":5,"toTranslate":["name","description"]},"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":"CommonParam","Json":"{\"name\":\"CommonParam\",\"default\":\"\",\"description\":\"Common Parameters\",\"type\":\"text\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Common parameters as defined in the SDK as JSON string.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":7}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":9670,"Group":{"Id":5633,"Name":"Bracelet","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5624,"Name":"Settings","Json":{"description":null,"columns":2,"order":3,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5631,"Name":"Cycle Interval","Json":{"description":"Define the period for which the device should send regular location updates, and how frequent those updates are.","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5632,"Name":"Battery alerts","Json":{"description":"Battery alerts","columns":1,"order":5,"toTranslate":["name","description"]},"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":"CloudParam","Json":"{\"name\":\"CloudParam\",\"default\":\"\",\"description\":\"Cloud Parameters\",\"type\":\"text\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Cloud Parameters as defined by SDK as JSON string.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"],\"order\":9}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":9677,"Group":{"Id":5634,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5628,"Name":"Not Implemented","Json":{"description":null,"columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5635,"Name":"Non Movement","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5636,"Name":"Real Time Locate","Json":{"description":"Real Time Locate","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5637,"Name":"Set Server","Json":{"description":"Set Server","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Enable Disable No Activity","Json":"{\"name\":\"Enable Disable No Activity\",\"default\":\"false\",\"description\":\"Enable Disable No Activity\",\"type\":\"enable\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":null,\"integerOnly\":null,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Enable or disable no activity alerts\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"true","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":9677,\"Group\":{\"Id\":5634,\"Name\":\"No Activity\",\"Json\":{\"description\":\"No Activity\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Enable Disable No Activity\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable No Activity\\\",\\\"default\\\":\\\"true\\\",\\\"description\\\":\\\"Enable Disable No Activity\\\",\\\"type\\\":\\\"enable\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Enable or disable no activity alerts\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716289251}],"LanguageId":null,"Tags":[]},{"Id":9676,"Group":{"Id":5634,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5628,"Name":"Not Implemented","Json":{"description":null,"columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5635,"Name":"Non Movement","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5636,"Name":"Real Time Locate","Json":{"description":"Real Time Locate","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5637,"Name":"Set Server","Json":{"description":"Set Server","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"No Activity","Json":"{\"name\":\"No Activity\",\"default\":\"\",\"description\":\"Set No Activity Events\",\"type\":\"number\",\"suffix\":null,\"prefix\":null,\"min\":5,\"max\":10080,\"futureOnly\":null,\"integerOnly\":true,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Set No Activity Alerts in minutes. If the device does not report in the time frame it triggers a No Activity alert\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":9678,"Group":{"Id":5635,"Name":"Non Movement","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5628,"Name":"Not Implemented","Json":{"description":null,"columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5634,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5636,"Name":"Real Time Locate","Json":{"description":"Real Time Locate","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5637,"Name":"Set Server","Json":{"description":"Set Server","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"period ","Json":"{\"name\":\"period \",\"default\":\"600\",\"description\":\"Period in seconds which defines \\\"non-movement\\\"\",\"type\":\"number\",\"suffix\":null,\"prefix\":null,\"min\":5,\"max\":7200,\"futureOnly\":\"\",\"integerOnly\":true,\"minLength\":null,\"maxLength\":null,\"helpText\":\"\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"600","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":9678,\"Group\":{\"Id\":5635,\"Name\":\"Non Movement\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"period \",\"Json\":\"{\\\"name\\\":\\\"period \\\",\\\"default\\\":\\\"600\\\",\\\"description\\\":\\\"Period in seconds which defines \\\\\\\"non-movement\\\\\\\"\\\",\\\"type\\\":\\\"number\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":5,\\\"max\\\":7200,\\\"futureOnly\\\":false,\\\"integerOnly\\\":true,\\\"isReadOnly\\\":false,\\\"isHidden\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"600\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716289280}],"LanguageId":null,"Tags":[]},{"Id":9679,"Group":{"Id":5635,"Name":"Non Movement","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5628,"Name":"Not Implemented","Json":{"description":null,"columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5634,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5636,"Name":"Real Time Locate","Json":{"description":"Real Time Locate","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5637,"Name":"Set Server","Json":{"description":"Set Server","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Enable Disable NonMovement","Json":"{\"name\":\"Enable Disable NonMovement\",\"default\":\"false\",\"description\":null,\"type\":\"enable\",\"order\":0,\"suffix\":null,\"prefix\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"true","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":9679,\"Group\":{\"Id\":5635,\"Name\":\"Non Movement\",\"Json\":{\"description\":\"\",\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Enable Disable NonMovement\",\"Json\":\"{\\\"name\\\":\\\"Enable Disable NonMovement\\\",\\\"default\\\":\\\"true\\\",\\\"description\\\":null,\\\"type\\\":\\\"enable\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":null,\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716289267}],"LanguageId":null,"Tags":[]},{"Id":9680,"Group":{"Id":5636,"Name":"Real Time Locate","Json":{"description":"Real Time Locate","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5628,"Name":"Not Implemented","Json":{"description":null,"columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5634,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5635,"Name":"Non Movement","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5637,"Name":"Set Server","Json":{"description":"Set Server","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Real Time Locate","Json":"{\"name\":\"Real Time Locate\",\"default\":\"\",\"description\":\"Position Request\",\"type\":\"button\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Real Time Locate\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":9680,\"Group\":{\"Id\":5636,\"Name\":\"Real Time Locate\",\"Json\":{\"description\":\"Real Time Locate\",\"columns\":1,\"order\":2,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":false,\"Deleted\":false,\"Children\":[]},\"Name\":\"Real Time Locate\",\"Json\":\"{\\\"name\\\":\\\"Real Time Locate\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Position Request\\\",\\\"type\\\":\\\"button\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Real Time Locate\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716289318}],"LanguageId":null,"Tags":[]},{"Id":9683,"Group":{"Id":5637,"Name":"Set Server","Json":{"description":"Set Server","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5628,"Name":"Not Implemented","Json":{"description":null,"columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5634,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5635,"Name":"Non Movement","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5636,"Name":"Real Time Locate","Json":{"description":"Real Time Locate","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]},"Name":"Set Primary Server","Json":"{\"name\":\"Set Primary Server\",\"default\":\"\",\"description\":\"Set Primary Server\",\"type\":\"select\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Select which server you wish the device to communicate to\",\"options\":[{\"label\":\"Production Primary\",\"value\":\"52.232.85.255:5678\"},{\"label\":\"Acceptance Primary\",\"value\":\"52.174.17.77:5678\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"],\"order\":0}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":9683,\"Group\":{\"Id\":5637,\"Name\":\"Set Server\",\"Json\":{\"description\":\"Set Server\",\"columns\":1,\"order\":4,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Set Primary Server\",\"Json\":\"{\\\"name\\\":\\\"Set Primary Server\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Set Primary Server\\\",\\\"type\\\":\\\"select\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Select which server you wish the device to communicate to\\\",\\\"options\\\":[{\\\"value\\\":\\\"52.232.85.255:5678\\\",\\\"label\\\":\\\"Production Primary\\\"},{\\\"value\\\":\\\"52.174.17.77:5678\\\",\\\"label\\\":\\\"Acceptance Primary\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716289362}],"LanguageId":null,"Tags":[]},{"Id":9681,"Group":{"Id":5637,"Name":"Set Server","Json":{"description":"Set Server","columns":1,"order":4,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5628,"Name":"Not Implemented","Json":{"description":null,"columns":1,"order":5,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":5634,"Name":"No Activity","Json":{"description":"No Activity","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5635,"Name":"Non Movement","Json":{"description":"","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":5636,"Name":"Real Time Locate","Json":{"description":"Real Time Locate","columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]},"Name":"Set Secondary Server","Json":"{\"name\":\"Set Secondary Server\",\"default\":\"\",\"description\":\"Select Server\",\"type\":\"select\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[{\"label\":\"Production Secondary\",\"value\":\"52.232.85.255:5678\"},{\"label\":\"Acceptance Secondary\",\"value\":\"52.174.17.77:5678\"}],\"toTranslate\":[\"name\",\"description\",\"helpText\",\"label\"],\"order\":1}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":1,"NewValue":"{\"Id\":9681,\"Group\":{\"Id\":5637,\"Name\":\"Set Server\",\"Json\":{\"description\":\"Set Server\",\"columns\":1,\"order\":4,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Set Secondary Server\",\"Json\":\"{\\\"name\\\":\\\"Set Secondary Server\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Select Server\\\",\\\"type\\\":\\\"select\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":null,\\\"options\\\":[{\\\"value\\\":\\\"52.232.85.255:5678\\\",\\\"label\\\":\\\"Production Secondary\\\"},{\\\"value\\\":\\\"52.174.17.77:5678\\\",\\\"label\\\":\\\"Acceptance Secondary\\\"}],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\",\\\"label\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716289376}],"LanguageId":null,"Tags":[]},{"Id":9702,"Group":{"Id":5638,"Name":"Note","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":5627,"Name":"Notification","Json":{"description":null,"columns":1,"order":2,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Message","Json":"{\"name\":\"Message\",\"default\":\"\",\"description\":\"Message\",\"type\":\"text\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Note as Comma sepearted values with Time(s from epoch), Type (INFO|WARNING|...), ID, Text.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":9703,"Group":{"Id":5629,"Name":"DeviceConfig","Json":{"description":"Reset the device with default factory values","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]},"Name":"Clear Message Buffer","Json":"{\"name\":\"Clear Message Buffer\",\"default\":\"\",\"description\":\"Clear Message Buffer\",\"type\":\"button\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Clears the message buffer of unsent messages.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":9703,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Clear Message Buffer\",\"Json\":\"{\\\"name\\\":\\\"Clear Message Buffer\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Clear Message Buffer\\\",\\\"type\\\":\\\"button\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Clears the message buffer of unsent messages.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1710246641},{"Type":0,"NewValue":"{\"Id\":9703,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Clear Message Buffer\",\"Json\":\"{\\\"name\\\":\\\"Clear Message Buffer\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Clear Message Buffer\\\",\\\"type\\\":\\\"button\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Clears the message buffer of unsent messages.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":{\"Id\":4123,\"Protocol\":{\"Id\":206,\"Code\":\"VGA\",\"Version\":\"0.2\",\"FirmwareVersion\":\"\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"ClearBuffer\",\"TemplateSMS\":\"VGCMD-001;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"var configs = [];\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nvar command = \\\"CLRBUF\\\";\\nconst _crypto = require('crypto');\\nif (params.Password.Password === \\\"\\\") {\\n var password = serverParams.Imei;\\n} else {\\n var password = params.Password.Password;\\n}\\nif (params.Password.encryption === \\\"true\\\") {\\n var part2 = encrypt(command, part1, password);\\n} else {\\n var part2 = command;\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":false,\"SendAttempts\":1,\"Order\":null},\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1710246647},{"Type":1,"NewValue":"{\"Id\":9703,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Clear Message Buffer\",\"Json\":\"{\\\"name\\\":\\\"Clear Message Buffer\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Clear Message Buffer\\\",\\\"type\\\":\\\"button\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Clears the message buffer of unsent messages.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":3}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1714640790}],"LanguageId":null,"Tags":[]},{"Id":9703,"Group":{"Id":5629,"Name":"DeviceConfig","Json":{"description":"Reset the device with default factory values","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]},"Name":"Clear Message Buffer","Json":"{\"name\":\"Clear Message Buffer\",\"default\":\"\",\"description\":\"Clear Message Buffer\",\"type\":\"button\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Clears the message buffer of unsent messages.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":{"Id":4123,"Protocol":{"Id":206,"Code":"VGA","Version":"0.2","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"ClearBuffer","TemplateSMS":"VGCMD-001;<>;<>;","Template":"VGCMD-001;<>;<>;[0a]","AckTemplate":null,"Operation":"var configs = [];\nsequenceNumber = (new Date().getTime()).toString(36);\nvar part1 = \"update=\" + sequenceNumber;\nvar command = \"CLRBUF\";\nconst _crypto = require('crypto');\nif (params.Password.Password === \"\") {\n var password = serverParams.Imei;\n} else {\n var password = params.Password.Password;\n}\nif (params.Password.encryption === \"true\") {\n var part2 = encrypt(command, part1, password);\n} else {\n var part2 = command;\n}\nAddValue(\"part1\", part1);\nAddValue(\"part2\", part2);\nAddValue(\"sequenceNumber\", sequenceNumber);\nvar commandConfigs = {\n template: \"main\",\n configs: configs\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction encrypt(text, mid, password) {\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\n const iv = _crypto.randomBytes(16); // random initialization vector\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\n // set the cipher\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\n // encrypt text\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\n // generate output ( encrypted text )\n return Buffer.concat([iv, encrypted]).toString('base64');\n}","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":false,"SendAttempts":1,"Order":null},"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":9704,"Group":{"Id":5629,"Name":"DeviceConfig","Json":{"description":"Reset the device with default factory values","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]},"Name":"Enable Logging","Json":"{\"name\":\"Enable Logging\",\"default\":\"\",\"description\":\"Enable Realtime logging to Kibana.\",\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"false","Command":null,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":9704,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Enable Logging\",\"Json\":\"{\\\"name\\\":\\\"Enable Logging\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Enable Realtime logging to Kibana.\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":null,\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"false\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1710246708},{"Type":0,"NewValue":"{\"Id\":9704,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Enable Logging\",\"Json\":\"{\\\"name\\\":\\\"Enable Logging\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Enable Realtime logging to Kibana.\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":null,\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"false\",\"Command\":{\"Id\":4126,\"Protocol\":{\"Id\":206,\"Code\":\"VGA\",\"Version\":\"0.2\",\"FirmwareVersion\":\"\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"Set RTLog Enable\",\"TemplateSMS\":\"VGCMD-001;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"// write your code here...\\nif (params.DeviceConfig.EnableLogging == \\\"true\\\") {\\n enableLogging = \\\"1\\\";\\n} else {\\n enableLogging = \\\"0\\\";\\n}\\nvar command = \\\"RTLOG=\\\" + enableLogging;\\nvar configs = [];\\nvar configsSMS = []; // for sms template\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nconst _crypto = require('crypto');\\nif (params.Password.Password === \\\"\\\") {\\n var password = serverParams.Imei;\\n} else {\\n var password = params.Password.Password;\\n}\\nif (params.Password.encryption === \\\"true\\\") {\\n var part2 = encrypt(command, part1, password);\\n} else {\\n var part2 = command;\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nAddValueSMS(\\\"part1\\\", part1); //for sms template\\nAddValueSMS(\\\"part2\\\", part2); // for sms template\\nAddValueSMS(\\\"sequenceNumber\\\", sequenceNumber); // for sms template\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs,\\n configsSMS: configsSMS //for sms template\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValueSMS(p1, p2) { //function for sms template\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configsSMS.push(cvpair);\\n}\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":false,\"SendAttempts\":1,\"Order\":null},\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1710246712},{"Type":1,"NewValue":"{\"Id\":9704,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Enable Logging\",\"Json\":\"{\\\"name\\\":\\\"Enable Logging\\\",\\\"default\\\":\\\"false\\\",\\\"description\\\":\\\"Enable Realtime logging to Kibana.\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":null,\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1714640774},{"Type":1,"NewValue":"{\"Id\":9704,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Enable Logging\",\"Json\":\"{\\\"name\\\":\\\"Enable Logging\\\",\\\"default\\\":\\\"false\\\",\\\"description\\\":\\\"Enable Realtime logging to Kibana.\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":null,\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":10}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1714640824},{"Type":1,"NewValue":"{\"Id\":9704,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Enable Logging\",\"Json\":\"{\\\"name\\\":\\\"Enable Logging\\\",\\\"default\\\":\\\"false\\\",\\\"description\\\":\\\"Enable Realtime logging to Kibana.\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":null,\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":14}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751967289},{"Type":1,"NewValue":"{\"Id\":9704,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Enable Logging\",\"Json\":\"{\\\"name\\\":\\\"Enable Logging\\\",\\\"default\\\":\\\"false\\\",\\\"description\\\":\\\"Enable Realtime logging to Kibana.\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":null,\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":13}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751977816},{"Type":1,"NewValue":"{\"Id\":9704,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Enable Logging\",\"Json\":\"{\\\"name\\\":\\\"Enable Logging\\\",\\\"default\\\":\\\"false\\\",\\\"description\\\":\\\"Enable Realtime logging to Kibana.\\\",\\\"type\\\":\\\"checkbox\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":true,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":null,\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":12}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751977971}],"LanguageId":null,"Tags":[]},{"Id":9704,"Group":{"Id":5629,"Name":"DeviceConfig","Json":{"description":"Reset the device with default factory values","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]},"Name":"Enable Logging","Json":"{\"name\":\"Enable Logging\",\"default\":\"\",\"description\":\"Enable Realtime logging to Kibana.\",\"type\":\"checkbox\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"false","Command":{"Id":4126,"Protocol":{"Id":206,"Code":"VGA","Version":"0.2","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"Set RTLog Enable","TemplateSMS":"VGCMD-001;<>;<>;","Template":"VGCMD-001;<>;<>;[0a]","AckTemplate":null,"Operation":"// write your code here...\nif (params.DeviceConfig.EnableLogging == \"true\") {\n enableLogging = \"1\";\n} else {\n enableLogging = \"0\";\n}\nvar command = \"RTLOG=\" + enableLogging;\nvar configs = [];\nvar configsSMS = []; // for sms template\nsequenceNumber = (new Date().getTime()).toString(36);\nvar part1 = \"update=\" + sequenceNumber;\nconst _crypto = require('crypto');\nif (params.Password.Password === \"\") {\n var password = serverParams.Imei;\n} else {\n var password = params.Password.Password;\n}\nif (params.Password.encryption === \"true\") {\n var part2 = encrypt(command, part1, password);\n} else {\n var part2 = command;\n}\nAddValue(\"part1\", part1);\nAddValue(\"part2\", part2);\nAddValue(\"sequenceNumber\", sequenceNumber);\nAddValueSMS(\"part1\", part1); //for sms template\nAddValueSMS(\"part2\", part2); // for sms template\nAddValueSMS(\"sequenceNumber\", sequenceNumber); // for sms template\nvar commandConfigs = {\n template: \"main\",\n configs: configs,\n configsSMS: configsSMS //for sms template\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValueSMS(p1, p2) { //function for sms template\n var cvpair = {\n code: p1,\n value: p2\n };\n configsSMS.push(cvpair);\n}\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction encrypt(text, mid, password) {\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\n const iv = _crypto.randomBytes(16); // random initialization vector\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\n // set the cipher\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\n // encrypt text\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\n // generate output ( encrypted text )\n return Buffer.concat([iv, encrypted]).toString('base64');\n}","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":false,"SendAttempts":1,"Order":null},"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":9705,"Group":{"Id":5629,"Name":"DeviceConfig","Json":{"description":"Reset the device with default factory values","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]},"Name":"Get Logs","Json":"{\"name\":\"Get Logs\",\"default\":\"\",\"description\":\"Get current Logs from the App.\",\"type\":\"button\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Will send logs directly to Kibana.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":9705,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Get Logs\",\"Json\":\"{\\\"name\\\":\\\"Get Logs\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Get current Logs from the App.\\\",\\\"type\\\":\\\"button\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Will send logs directly to Kibana.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1710246766},{"Type":0,"NewValue":"{\"Id\":9705,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Get Logs\",\"Json\":\"{\\\"name\\\":\\\"Get Logs\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Get current Logs from the App.\\\",\\\"type\\\":\\\"button\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Will send logs directly to Kibana.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":{\"Id\":4125,\"Protocol\":{\"Id\":206,\"Code\":\"VGA\",\"Version\":\"0.2\",\"FirmwareVersion\":\"\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"RequestLog\",\"TemplateSMS\":\"VGCMD-001;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"var configs = [];\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nvar command = \\\"REQLOG\\\";\\nconst _crypto = require('crypto');\\nif (params.Password.Password === \\\"\\\") {\\n var password = serverParams.Imei;\\n} else {\\n var password = params.Password.Password;\\n}\\nif (params.Password.encryption === \\\"true\\\") {\\n var part2 = encrypt(command, part1, password);\\n} else {\\n var part2 = command;\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":false,\"SendAttempts\":1,\"Order\":null},\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1710246770},{"Type":1,"NewValue":"{\"Id\":9705,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Get Logs\",\"Json\":\"{\\\"name\\\":\\\"Get Logs\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Get current Logs from the App.\\\",\\\"type\\\":\\\"button\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Will send logs directly to Kibana.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":12}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1714640834},{"Type":1,"NewValue":"{\"Id\":9705,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Get Logs\",\"Json\":\"{\\\"name\\\":\\\"Get Logs\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Get current Logs from the App.\\\",\\\"type\\\":\\\"button\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Will send logs directly to Kibana.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":12}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1714640848},{"Type":1,"NewValue":"{\"Id\":9705,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Get Logs\",\"Json\":\"{\\\"name\\\":\\\"Get Logs\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Get current Logs from the App.\\\",\\\"type\\\":\\\"button\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Will send logs directly to Kibana.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":11}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1714640888},{"Type":1,"NewValue":"{\"Id\":9705,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Get Logs\",\"Json\":\"{\\\"name\\\":\\\"Get Logs\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Get current Logs from the App.\\\",\\\"type\\\":\\\"button\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Will send logs directly to Kibana.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":15}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751967292},{"Type":1,"NewValue":"{\"Id\":9705,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Get Logs\",\"Json\":\"{\\\"name\\\":\\\"Get Logs\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Get current Logs from the App.\\\",\\\"type\\\":\\\"button\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Will send logs directly to Kibana.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":14}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751977818},{"Type":1,"NewValue":"{\"Id\":9705,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Get Logs\",\"Json\":\"{\\\"name\\\":\\\"Get Logs\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Get current Logs from the App.\\\",\\\"type\\\":\\\"button\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Will send logs directly to Kibana.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":13}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751977973}],"LanguageId":null,"Tags":[]},{"Id":9705,"Group":{"Id":5629,"Name":"DeviceConfig","Json":{"description":"Reset the device with default factory values","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]},"Name":"Get Logs","Json":"{\"name\":\"Get Logs\",\"default\":\"\",\"description\":\"Get current Logs from the App.\",\"type\":\"button\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Will send logs directly to Kibana.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":{"Id":4125,"Protocol":{"Id":206,"Code":"VGA","Version":"0.2","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"RequestLog","TemplateSMS":"VGCMD-001;<>;<>;","Template":"VGCMD-001;<>;<>;[0a]","AckTemplate":null,"Operation":"var configs = [];\nsequenceNumber = (new Date().getTime()).toString(36);\nvar part1 = \"update=\" + sequenceNumber;\nvar command = \"REQLOG\";\nconst _crypto = require('crypto');\nif (params.Password.Password === \"\") {\n var password = serverParams.Imei;\n} else {\n var password = params.Password.Password;\n}\nif (params.Password.encryption === \"true\") {\n var part2 = encrypt(command, part1, password);\n} else {\n var part2 = command;\n}\nAddValue(\"part1\", part1);\nAddValue(\"part2\", part2);\nAddValue(\"sequenceNumber\", sequenceNumber);\nvar commandConfigs = {\n template: \"main\",\n configs: configs\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction encrypt(text, mid, password) {\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\n const iv = _crypto.randomBytes(16); // random initialization vector\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\n // set the cipher\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\n // encrypt text\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\n // generate output ( encrypted text )\n return Buffer.concat([iv, encrypted]).toString('base64');\n}","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":false,"SendAttempts":1,"Order":null},"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":9706,"Group":{"Id":5629,"Name":"DeviceConfig","Json":{"description":"Reset the device with default factory values","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]},"Name":"Request Data","Json":"{\"name\":\"Request Data\",\"default\":\"\",\"description\":\"Request All Data command.\",\"type\":\"button\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Will return version and other settings from the app.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":9706,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Request Data\",\"Json\":\"{\\\"name\\\":\\\"Request Data\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Request All Data command.\\\",\\\"type\\\":\\\"button\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Will return version and other settings from the app.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1710246818},{"Type":0,"NewValue":"{\"Id\":9706,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Request Data\",\"Json\":\"{\\\"name\\\":\\\"Request Data\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Request All Data command.\\\",\\\"type\\\":\\\"button\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Will return version and other settings from the app.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":{\"Id\":4124,\"Protocol\":{\"Id\":206,\"Code\":\"VGA\",\"Version\":\"0.2\",\"FirmwareVersion\":\"\",\"Product\":null,\"AvailableVersions\":[],\"HistoryVersions\":[],\"IsChanged\":true},\"Name\":\"RequestData\",\"TemplateSMS\":\"VGCMD-001;<>;<>;\",\"Template\":\"VGCMD-001;<>;<>;[0a]\",\"AckTemplate\":null,\"Operation\":\"var configs = [];\\nsequenceNumber = (new Date().getTime()).toString(36);\\nvar part1 = \\\"update=\\\" + sequenceNumber;\\nvar command = \\\"REQDATA\\\";\\nconst _crypto = require('crypto');\\nif (params.Password.Password === \\\"\\\") {\\n var password = serverParams.Imei;\\n} else {\\n var password = params.Password.Password;\\n}\\nif (params.Password.encryption === \\\"true\\\") {\\n var part2 = encrypt(command, part1, password);\\n} else {\\n var part2 = command;\\n}\\nAddValue(\\\"part1\\\", part1);\\nAddValue(\\\"part2\\\", part2);\\nAddValue(\\\"sequenceNumber\\\", sequenceNumber);\\nvar commandConfigs = {\\n template: \\\"main\\\",\\n configs: configs\\n};\\nmsg.push(JSON.stringify(commandConfigs));\\n\\nfunction AddValue(p1, p2) {\\n var cvpair = {\\n code: p1,\\n value: p2\\n };\\n configs.push(cvpair);\\n}\\n\\nfunction encrypt(text, mid, password) {\\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\\n const iv = _crypto.randomBytes(16); // random initialization vector\\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\\n // set the cipher\\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\\n // encrypt text\\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\\n // generate output ( encrypted text )\\n return Buffer.concat([iv, encrypted]).toString('base64');\\n}\",\"AvoidResending\":false,\"FollowParentSentType\":false,\"SendingType\":0,\"CommandToUpdateId\":null,\"ParentId\":null,\"Parent\":null,\"HasAck\":true,\"HexString\":false,\"SendAttempts\":1,\"Order\":null},\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1710246823},{"Type":1,"NewValue":"{\"Id\":9706,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Request Data\",\"Json\":\"{\\\"name\\\":\\\"Request Data\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Request All Data command.\\\",\\\"type\\\":\\\"button\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Will return version and other settings from the app.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":15}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716278047},{"Type":1,"NewValue":"{\"Id\":9706,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Request Data\",\"Json\":\"{\\\"name\\\":\\\"Request Data\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Request All Data command.\\\",\\\"type\\\":\\\"button\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Will return version and other settings from the app.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":14}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716278063},{"Type":1,"NewValue":"{\"Id\":9706,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Request Data\",\"Json\":\"{\\\"name\\\":\\\"Request Data\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Request All Data command.\\\",\\\"type\\\":\\\"button\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Will return version and other settings from the app.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":19}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751967304},{"Type":1,"NewValue":"{\"Id\":9706,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Request Data\",\"Json\":\"{\\\"name\\\":\\\"Request Data\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Request All Data command.\\\",\\\"type\\\":\\\"button\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Will return version and other settings from the app.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":18}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751977826}],"LanguageId":null,"Tags":[]},{"Id":9706,"Group":{"Id":5629,"Name":"DeviceConfig","Json":{"description":"Reset the device with default factory values","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]},"Name":"Request Data","Json":"{\"name\":\"Request Data\",\"default\":\"\",\"description\":\"Request All Data command.\",\"type\":\"button\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Will return version and other settings from the app.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":{"Id":4124,"Protocol":{"Id":206,"Code":"VGA","Version":"0.2","FirmwareVersion":"","Product":null,"AvailableVersions":[],"HistoryVersions":[],"IsChanged":true},"Name":"RequestData","TemplateSMS":"VGCMD-001;<>;<>;","Template":"VGCMD-001;<>;<>;[0a]","AckTemplate":null,"Operation":"var configs = [];\nsequenceNumber = (new Date().getTime()).toString(36);\nvar part1 = \"update=\" + sequenceNumber;\nvar command = \"REQDATA\";\nconst _crypto = require('crypto');\nif (params.Password.Password === \"\") {\n var password = serverParams.Imei;\n} else {\n var password = params.Password.Password;\n}\nif (params.Password.encryption === \"true\") {\n var part2 = encrypt(command, part1, password);\n} else {\n var part2 = command;\n}\nAddValue(\"part1\", part1);\nAddValue(\"part2\", part2);\nAddValue(\"sequenceNumber\", sequenceNumber);\nvar commandConfigs = {\n template: \"main\",\n configs: configs\n};\nmsg.push(JSON.stringify(commandConfigs));\n\nfunction AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n configs.push(cvpair);\n}\n\nfunction encrypt(text, mid, password) {\n var salt = _crypto.pbkdf2Sync(mid, 'salt', 1000, 64, 'sha1');\n const iv = _crypto.randomBytes(16); // random initialization vector\n const key = _crypto.pbkdf2Sync(password, salt, 3145, 32, 'sha1');\n // set the cipher\n const cipher = _crypto.createCipheriv('aes-256-cbc', key, iv);\n // encrypt text\n const encrypted = Buffer.concat([cipher.update(text, 'utf8'), cipher.final()]);\n // generate output ( encrypted text )\n return Buffer.concat([iv, encrypted]).toString('base64');\n}","AvoidResending":false,"FollowParentSentType":false,"SendingType":0,"CommandToUpdateId":null,"ParentId":null,"Parent":null,"HasAck":true,"HexString":false,"SendAttempts":1,"Order":null},"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":9707,"Group":{"Id":5629,"Name":"DeviceConfig","Json":{"description":"Reset the device with default factory values","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]},"Name":"Version","Json":"{\"name\":\"Version\",\"default\":\"\",\"description\":\"Current Version of the App.\",\"type\":\"text\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Use Button Request Data to update the field.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":9707,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Version\",\"Json\":\"{\\\"name\\\":\\\"Version\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Current Version of the App.\\\",\\\"type\\\":\\\"text\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Use Button Request Data to update the field.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1710246871},{"Type":1,"NewValue":"{\"Id\":9707,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Version\",\"Json\":\"{\\\"name\\\":\\\"Version\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Current Version of the App.\\\",\\\"type\\\":\\\"text\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Use Button Request Data to update the field.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":15}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1714640853},{"Type":1,"NewValue":"{\"Id\":9707,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Version\",\"Json\":\"{\\\"name\\\":\\\"Version\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Current Version of the App.\\\",\\\"type\\\":\\\"text\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Use Button Request Data to update the field.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":16}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716278051},{"Type":1,"NewValue":"{\"Id\":9707,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Version\",\"Json\":\"{\\\"name\\\":\\\"Version\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Current Version of the App.\\\",\\\"type\\\":\\\"text\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Use Button Request Data to update the field.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":15}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716278066},{"Type":1,"NewValue":"{\"Id\":9707,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Version\",\"Json\":\"{\\\"name\\\":\\\"Version\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Current Version of the App.\\\",\\\"type\\\":\\\"text\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Use Button Request Data to update the field.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":20}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751967308},{"Type":1,"NewValue":"{\"Id\":9707,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Version\",\"Json\":\"{\\\"name\\\":\\\"Version\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Current Version of the App.\\\",\\\"type\\\":\\\"text\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Use Button Request Data to update the field.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":19}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751977829}],"LanguageId":null,"Tags":[]},{"Id":11133,"Group":{"Id":5629,"Name":"DeviceConfig","Json":{"description":"Reset the device with default factory values","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]},"Name":"StartTimeLog","Json":"{\"name\":\"StartTimeLog\",\"default\":\"\",\"description\":\"StartTime for Logs request\",\"type\":\"datetime\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":11133,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"StartTimeLog\",\"Json\":\"{\\\"name\\\":\\\"StartTimeLog\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"StartTime for Logs request\\\",\\\"type\\\":\\\"datetime\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":null,\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1714640506},{"Type":1,"NewValue":"{\"Id\":11133,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"StartTimeLog\",\"Json\":\"{\\\"name\\\":\\\"StartTimeLog\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"StartTime for Logs request\\\",\\\"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\\\":13}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1714640842},{"Type":1,"NewValue":"{\"Id\":11133,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"StartTimeLog\",\"Json\":\"{\\\"name\\\":\\\"StartTimeLog\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"StartTime for Logs request\\\",\\\"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\\\":12}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1714642185},{"Type":1,"NewValue":"{\"Id\":11133,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"StartTimeLog\",\"Json\":\"{\\\"name\\\":\\\"StartTimeLog\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"StartTime for Logs request\\\",\\\"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\\\":17}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751967298},{"Type":1,"NewValue":"{\"Id\":11133,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"StartTimeLog\",\"Json\":\"{\\\"name\\\":\\\"StartTimeLog\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"StartTime for Logs request\\\",\\\"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\\\":16}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751977822}],"LanguageId":null,"Tags":[]},{"Id":11134,"Group":{"Id":5629,"Name":"DeviceConfig","Json":{"description":"Reset the device with default factory values","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]},"Name":"EndTimeLog","Json":"{\"name\":\"EndTimeLog\",\"default\":\"\",\"description\":\"Endtime for log request\",\"type\":\"datetime\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":11134,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"EndTimeLog\",\"Json\":\"{\\\"name\\\":\\\"EndTimeLog\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Endtime for log request\\\",\\\"type\\\":\\\"datetime\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":null,\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1714640554},{"Type":1,"NewValue":"{\"Id\":11134,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"EndTimeLog\",\"Json\":\"{\\\"name\\\":\\\"EndTimeLog\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Endtime for log request\\\",\\\"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\\\":11}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1714640828},{"Type":1,"NewValue":"{\"Id\":11134,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"EndTimeLog\",\"Json\":\"{\\\"name\\\":\\\"EndTimeLog\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Endtime for log request\\\",\\\"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\\\":13}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1714642190},{"Type":1,"NewValue":"{\"Id\":11134,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"EndTimeLog\",\"Json\":\"{\\\"name\\\":\\\"EndTimeLog\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Endtime for log request\\\",\\\"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\\\":18}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751967301},{"Type":1,"NewValue":"{\"Id\":11134,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"EndTimeLog\",\"Json\":\"{\\\"name\\\":\\\"EndTimeLog\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Endtime for log request\\\",\\\"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\\\":17}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751977824}],"LanguageId":null,"Tags":[]},{"Id":11226,"Group":{"Id":5629,"Name":"DeviceConfig","Json":{"description":"Reset the device with default factory values","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]},"Name":"Restarts","Json":"{\"name\":\"Restarts\",\"default\":\"\",\"description\":\"Number of Restarts\",\"type\":\"number\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":true,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"When a BLE lockup is detected the app will restart itself to re-enable BLE.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":11226,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Restarts\",\"Json\":\"{\\\"name\\\":\\\"Restarts\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Number of Restarts\\\",\\\"type\\\":\\\"number\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":true,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"When a BLE lockup is detected the app will restart itself to re-enable BLE.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716204701},{"Type":1,"NewValue":"{\"Id\":11226,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Restarts\",\"Json\":\"{\\\"name\\\":\\\"Restarts\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Number of Restarts\\\",\\\"type\\\":\\\"number\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":true,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"When a BLE lockup is detected the app will restart itself to re-enable BLE.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":17}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716278055},{"Type":1,"NewValue":"{\"Id\":11226,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Restarts\",\"Json\":\"{\\\"name\\\":\\\"Restarts\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Number of Restarts\\\",\\\"type\\\":\\\"number\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":true,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"When a BLE lockup is detected the app will restart itself to re-enable BLE.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":16}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716278069},{"Type":1,"NewValue":"{\"Id\":11226,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Restarts\",\"Json\":\"{\\\"name\\\":\\\"Restarts\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Number of Restarts\\\",\\\"type\\\":\\\"number\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":true,\\\"isReadOnly\\\":true,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"When a BLE lockup is detected the app will restart itself to re-enable BLE.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751552278},{"Type":1,"NewValue":"{\"Id\":11226,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Restarts\",\"Json\":\"{\\\"name\\\":\\\"Restarts\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Number of Restarts\\\",\\\"type\\\":\\\"number\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":true,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"When a BLE lockup is detected the app will restart itself to re-enable BLE.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751636693},{"Type":1,"NewValue":"{\"Id\":11226,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Restarts\",\"Json\":\"{\\\"name\\\":\\\"Restarts\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Number of Restarts\\\",\\\"type\\\":\\\"number\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":true,\\\"isReadOnly\\\":true,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"When a BLE lockup is detected the app will restart itself to re-enable BLE.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751638322},{"Type":1,"NewValue":"{\"Id\":11226,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Restarts\",\"Json\":\"{\\\"name\\\":\\\"Restarts\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Number of Restarts\\\",\\\"type\\\":\\\"number\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":true,\\\"isReadOnly\\\":true,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"When a BLE lockup is detected the app will restart itself to re-enable BLE.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":16}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751967295},{"Type":1,"NewValue":"{\"Id\":11226,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Restarts\",\"Json\":\"{\\\"name\\\":\\\"Restarts\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Number of Restarts\\\",\\\"type\\\":\\\"number\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":true,\\\"isReadOnly\\\":true,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"When a BLE lockup is detected the app will restart itself to re-enable BLE.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":15}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751977820},{"Type":1,"NewValue":"{\"Id\":11226,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"Restarts\",\"Json\":\"{\\\"name\\\":\\\"Restarts\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Number of Restarts\\\",\\\"type\\\":\\\"number\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":true,\\\"isReadOnly\\\":true,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"When a BLE lockup is detected the app will restart itself to re-enable BLE.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":14}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751977975}],"LanguageId":null,"Tags":[]},{"Id":11227,"Group":{"Id":5629,"Name":"DeviceConfig","Json":{"description":"Reset the device with default factory values","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]},"Name":"MTBR","Json":"{\"name\":\"MTBR\",\"default\":\"\",\"description\":\"Mean Time Between Restarts\",\"type\":\"number\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"Average time between restarts to fix the BLE issue. Bugger numbers are better.\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":11227,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"MTBR\",\"Json\":\"{\\\"name\\\":\\\"MTBR\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Mean Time Between Restarts\\\",\\\"type\\\":\\\"number\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Average time between restarts to fix the BLE issue. Bugger numbers are better.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716204770},{"Type":1,"NewValue":"{\"Id\":11227,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"MTBR\",\"Json\":\"{\\\"name\\\":\\\"MTBR\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Mean Time Between Restarts\\\",\\\"type\\\":\\\"number\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Average time between restarts to fix the BLE issue. Bugger numbers are better.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":14}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716278044},{"Type":1,"NewValue":"{\"Id\":11227,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"MTBR\",\"Json\":\"{\\\"name\\\":\\\"MTBR\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Mean Time Between Restarts\\\",\\\"type\\\":\\\"number\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Average time between restarts to fix the BLE issue. Bugger numbers are better.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":17}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716278072},{"Type":1,"NewValue":"{\"Id\":11227,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"MTBR\",\"Json\":\"{\\\"name\\\":\\\"MTBR\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Mean Time Between Restarts\\\",\\\"type\\\":\\\"time\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Average time between restarts to fix the BLE issue. Bugger numbers are better.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716543699},{"Type":1,"NewValue":"{\"Id\":11227,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"MTBR\",\"Json\":\"{\\\"name\\\":\\\"MTBR\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Mean Time Between Restarts (hh:mm:ss)\\\",\\\"type\\\":\\\"time\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Average time between restarts to fix the BLE issue. Bugger numbers are better.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716543727},{"Type":1,"NewValue":"{\"Id\":11227,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"MTBR\",\"Json\":\"{\\\"name\\\":\\\"MTBR\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Mean Time Between Restarts (hh:mm:ss)\\\",\\\"type\\\":\\\"time\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Average time between restarts to fix the BLE issue. Bugger numbers are better.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":17}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"Tags\":[]}","Timestamp":1716543763},{"Type":1,"NewValue":"{\"Id\":11227,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"MTBR\",\"Json\":\"{\\\"name\\\":\\\"MTBR\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Mean Time Between Restarts (hh:mm:ss)\\\",\\\"type\\\":\\\"time\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":true,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Average time between restarts to fix the BLE issue. Bugger numbers are better.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751552313},{"Type":1,"NewValue":"{\"Id\":11227,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"MTBR\",\"Json\":\"{\\\"name\\\":\\\"MTBR\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Mean Time Between Restarts (hh:mm:ss)\\\",\\\"type\\\":\\\"time\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":true,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Average time between restarts to fix the BLE issue. Bugger numbers are better.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":11}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751967280},{"Type":1,"NewValue":"{\"Id\":11227,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"MTBR\",\"Json\":\"{\\\"name\\\":\\\"MTBR\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Mean Time Between Restarts (hh:mm:ss)\\\",\\\"type\\\":\\\"time\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":true,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Average time between restarts to fix the BLE issue. Bugger numbers are better.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":10}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751977810},{"Type":1,"NewValue":"{\"Id\":11227,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"MTBR\",\"Json\":\"{\\\"name\\\":\\\"MTBR\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"Mean Time Between Restarts (hh:mm:ss)\\\",\\\"type\\\":\\\"time\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":true,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"Average time between restarts to fix the BLE issue. Bugger numbers are better.\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":9}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751977965}],"LanguageId":null,"Tags":[]},{"Id":12374,"Group":{"Id":5629,"Name":"DeviceConfig","Json":{"description":"Reset the device with default factory values","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]},"Name":"BackgroundLocation","Json":"{\"name\":\"BackgroundLocation\",\"default\":\"\",\"description\":\"BackgroundLocation\",\"type\":\"text\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"BackgroundLocation\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":12374,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"BackgroundLocation\",\"Json\":\"{\\\"name\\\":\\\"BackgroundLocation\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"BackgroundLocation\\\",\\\"type\\\":\\\"text\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"BackgroundLocation\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751374909},{"Type":1,"NewValue":"{\"Id\":12374,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"BackgroundLocation\",\"Json\":\"{\\\"name\\\":\\\"BackgroundLocation\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"BackgroundLocation\\\",\\\"type\\\":\\\"text\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"BackgroundLocation\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":7}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751967267},{"Type":1,"NewValue":"{\"Id\":12374,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"BackgroundLocation\",\"Json\":\"{\\\"name\\\":\\\"BackgroundLocation\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"BackgroundLocation\\\",\\\"type\\\":\\\"text\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"BackgroundLocation\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":20}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751977831}],"LanguageId":null,"Tags":[]},{"Id":12375,"Group":{"Id":5629,"Name":"DeviceConfig","Json":{"description":"Reset the device with default factory values","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]},"Name":"CoarseLocation","Json":"{\"name\":\"CoarseLocation\",\"default\":\"\",\"description\":\"CoarseLocation\",\"type\":\"text\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"CoarseLocation\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":12375,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"CoarseLocation\",\"Json\":\"{\\\"name\\\":\\\"CoarseLocation\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"CoarseLocation\\\",\\\"type\\\":\\\"text\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"CoarseLocation\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751374960},{"Type":1,"NewValue":"{\"Id\":12375,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"CoarseLocation\",\"Json\":\"{\\\"name\\\":\\\"CoarseLocation\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"CoarseLocation\\\",\\\"type\\\":\\\"text\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"CoarseLocation\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":4}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751967258},{"Type":1,"NewValue":"{\"Id\":12375,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"CoarseLocation\",\"Json\":\"{\\\"name\\\":\\\"CoarseLocation\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"CoarseLocation\\\",\\\"type\\\":\\\"text\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"CoarseLocation\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":6}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751968964}],"LanguageId":null,"Tags":[]},{"Id":12376,"Group":{"Id":5629,"Name":"DeviceConfig","Json":{"description":"Reset the device with default factory values","columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":true,"Deleted":false,"Children":[]},"Name":"FineLocation","Json":"{\"name\":\"FineLocation\",\"default\":\"\",\"description\":\"FineLocation\",\"type\":\"text\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":\"FineLocation\",\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[{"Type":0,"NewValue":"{\"Id\":12376,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"FineLocation\",\"Json\":\"{\\\"name\\\":\\\"FineLocation\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"FineLocation\\\",\\\"type\\\":\\\"text\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"FineLocation\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"]}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751374992},{"Type":1,"NewValue":"{\"Id\":12376,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"FineLocation\",\"Json\":\"{\\\"name\\\":\\\"FineLocation\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"FineLocation\\\",\\\"type\\\":\\\"text\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"FineLocation\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":6}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751967264},{"Type":1,"NewValue":"{\"Id\":12376,\"Group\":{\"Id\":5629,\"Name\":\"DeviceConfig\",\"Json\":{\"description\":\"Reset the device with default factory values\",\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]},\"Parent\":null,\"Device\":null,\"DeviceRelated\":false,\"IsList\":false,\"IsAdminOnly\":true,\"Deleted\":false,\"Children\":[]},\"Name\":\"FineLocation\",\"Json\":\"{\\\"name\\\":\\\"FineLocation\\\",\\\"default\\\":\\\"\\\",\\\"description\\\":\\\"FineLocation\\\",\\\"type\\\":\\\"text\\\",\\\"suffix\\\":null,\\\"prefix\\\":null,\\\"min\\\":null,\\\"max\\\":null,\\\"futureOnly\\\":false,\\\"integerOnly\\\":false,\\\"isReadOnly\\\":false,\\\"isHidden\\\":false,\\\"minLength\\\":null,\\\"maxLength\\\":null,\\\"helpText\\\":\\\"FineLocation\\\",\\\"options\\\":[],\\\"toTranslate\\\":[\\\"name\\\",\\\"description\\\",\\\"helpText\\\"],\\\"order\\\":5}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751968961}],"LanguageId":null,"Tags":[]}],"ProtocolChanges":[{"Version":"0.2","UserName":"Sean-Admin","Resource":"MessageType","Name":"ALLDATA","Message":"(Create) (ALLDATA) add ALLDATA messagetype","Timestamp":1710246258},{"Version":"0.2","UserName":"Sean-Admin","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) Ops update - ALLDATA processing","Timestamp":1710246336},{"Version":"0.2","UserName":"Sean-Admin","Resource":"Command","Name":"ClearBuffer","Message":"(Create) (ClearBuffer) create CLRBUF command","Timestamp":1710246421},{"Version":"0.2","UserName":"Sean-Admin","Resource":"Command","Name":"RequestData","Message":"(Create) (RequestData) create REQDATA command","Timestamp":1710246477},{"Version":"0.2","UserName":"Sean-Admin","Resource":"Command","Name":"RequestLog","Message":"(Create) (RequestLog) create REQLOG command","Timestamp":1710246526},{"Version":"0.2","UserName":"Sean-Admin","Resource":"Command","Name":"Set RTLog Enable","Message":"(Create) (Set RTLog Enable) create RTLOG command","Timestamp":1710246587},{"Version":"0.2","UserName":"Sean-Admin","Resource":"GroupParam","Name":"Clear Message Buffer","Message":"(Create) (Clear Message Buffer) Add ClearBuffer button","Timestamp":1710246641},{"Version":"0.2","UserName":"Sean-Admin","Resource":"GroupParam","Name":"Clear Message Buffer","Message":"Associate groupParam Clear Message Buffer to command ClearBuffer","Timestamp":1710246647},{"Version":"0.2","UserName":"Sean-Admin","Resource":"GroupParam","Name":"Enable Logging","Message":"(Create) (Enable Logging) add RTLog checkbox","Timestamp":1710246708},{"Version":"0.2","UserName":"Sean-Admin","Resource":"GroupParam","Name":"Enable Logging","Message":"Associate groupParam Enable Logging to command Set RTLog Enable","Timestamp":1710246712},{"Version":"0.2","UserName":"Sean-Admin","Resource":"GroupParam","Name":"Get Logs","Message":"(Create) (Get Logs) add Request Log button","Timestamp":1710246766},{"Version":"0.2","UserName":"Sean-Admin","Resource":"GroupParam","Name":"Get Logs","Message":"Associate groupParam Get Logs to command RequestLog","Timestamp":1710246770},{"Version":"0.2","UserName":"Sean-Admin","Resource":"GroupParam","Name":"Request Data","Message":"(Create) (Request Data) add request Data command","Timestamp":1710246818},{"Version":"0.2","UserName":"Sean-Admin","Resource":"GroupParam","Name":"Request Data","Message":"Associate groupParam Request Data to command RequestData","Timestamp":1710246823},{"Version":"0.2","UserName":"Sean-Admin","Resource":"GroupParam","Name":"Version","Message":"(Create) (Version) add version field","Timestamp":1710246871},{"Version":"0.2","UserName":"Sean-Admin","Resource":"Protocol","Name":null,"Message":"version and logging","Timestamp":1710246938},{"Version":"0.3","UserName":"Sean-Admin","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) auto-activate for acceptance","Timestamp":1711039145},{"Version":"0.3","UserName":"Sean-Admin","Resource":"Protocol","Name":null,"Message":"Auto-activate on Acceptance only","Timestamp":1711039692},{"Version":"0.4","UserName":"Sean-Admin","Resource":"MessageType","Name":"CYC","Message":"(Update) (CYC) Fix for CYC location_accuracy","Timestamp":1712654533},{"Version":"0.4","UserName":"Sean-Admin","Resource":"MessageType","Name":"ALLDATA","Message":"(Update) (ALLDATA) Fix for ALLDATA location accuracy","Timestamp":1712654568},{"Version":"0.4","UserName":"Sean-Admin","Resource":"Protocol","Name":null,"Message":"Fox for locatin precision for CYC messages","Timestamp":1712655610},{"Version":"0.5","UserName":"Sean-Admin","Resource":"GroupParam","Name":"StartTimeLog","Message":"(Create) (StartTimeLog) adding starttime to LOGREQ","Timestamp":1714640506},{"Version":"0.5","UserName":"Sean-Admin","Resource":"GroupParam","Name":"EndTimeLog","Message":"(Create) (EndTimeLog) Adding endtime to REQLOG","Timestamp":1714640554},{"Version":"0.5","UserName":"Sean-Admin","Resource":"Command","Name":"RequestLog","Message":"(Update) (RequestLog) add start and endtime to REQLOG command","Timestamp":1714640696},{"Version":"0.5","UserName":"Sean-Admin","Resource":"GroupParam","Name":"DisableAck","Message":"(Update) (DisableAck) hiding unused control","Timestamp":1714640747},{"Version":"0.5","UserName":"Sean-Admin","Resource":"GroupParam","Name":"Enable Logging","Message":"(Update) (Enable Logging) hiding realtime logging as not implemented","Timestamp":1714640774},{"Version":"0.5","UserName":"Sean-Admin","Resource":"GroupParam","Name":"Clear Message Buffer","Message":"(Update) (Clear Message Buffer) Reorder Group Params","Timestamp":1714640790},{"Version":"0.5","UserName":"Sean-Admin","Resource":"GroupParam","Name":"Config Mode","Message":"(Update) (Config Mode) Reorder Group Params","Timestamp":1714640794},{"Version":"0.5","UserName":"Sean-Admin","Resource":"GroupParam","Name":"ICCID","Message":"(Update) (ICCID) Reorder Group Params","Timestamp":1714640798},{"Version":"0.5","UserName":"Sean-Admin","Resource":"GroupParam","Name":"IV Activated","Message":"(Update) (IV Activated) Reorder Group Params","Timestamp":1714640801},{"Version":"0.5","UserName":"Sean-Admin","Resource":"GroupParam","Name":"IV ActivatedFailMessage","Message":"(Update) (IV ActivatedFailMessage) Reorder Group Params","Timestamp":1714640806},{"Version":"0.5","UserName":"Sean-Admin","Resource":"GroupParam","Name":"Reset","Message":"(Update) (Reset) Reorder Group Params","Timestamp":1714640812},{"Version":"0.5","UserName":"Sean-Admin","Resource":"GroupParam","Name":"DisableAck","Message":"(Update) (DisableAck) Reorder Group Params","Timestamp":1714640819},{"Version":"0.5","UserName":"Sean-Admin","Resource":"GroupParam","Name":"Enable Logging","Message":"(Update) (Enable Logging) Reorder Group Params","Timestamp":1714640824},{"Version":"0.5","UserName":"Sean-Admin","Resource":"GroupParam","Name":"EndTimeLog","Message":"(Update) (EndTimeLog) Reorder Group Params","Timestamp":1714640828},{"Version":"0.5","UserName":"Sean-Admin","Resource":"GroupParam","Name":"Get Logs","Message":"(Update) (Get Logs) Reorder Group Params","Timestamp":1714640834},{"Version":"0.5","UserName":"Sean-Admin","Resource":"GroupParam","Name":"StartTimeLog","Message":"(Update) (StartTimeLog) Reorder Group Params","Timestamp":1714640842},{"Version":"0.5","UserName":"Sean-Admin","Resource":"GroupParam","Name":"Get Logs","Message":"(Update) (Get Logs) Reorder Group Params","Timestamp":1714640848},{"Version":"0.5","UserName":"Sean-Admin","Resource":"GroupParam","Name":"Version","Message":"(Update) (Version) Reorder Group Params","Timestamp":1714640853},{"Version":"0.5","UserName":"Sean-Admin","Resource":"GroupParam","Name":"Get Logs","Message":"(Update) (Get Logs) Reorder Group Params","Timestamp":1714640888},{"Version":"0.5","UserName":"Sean-Admin","Resource":"GroupParam","Name":"StartTimeLog","Message":"(Update) (StartTimeLog) Reorder Group Params","Timestamp":1714642185},{"Version":"0.5","UserName":"Sean-Admin","Resource":"GroupParam","Name":"EndTimeLog","Message":"(Update) (EndTimeLog) Reorder Group Params","Timestamp":1714642190},{"Version":"0.5","UserName":"Sean-Admin","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) Check ICCID is a number","Timestamp":1714651746},{"Version":"0.5","UserName":"Sean-Admin","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) Moved ICCID check to CREATE message","Timestamp":1715247045},{"Version":"0.5","UserName":"Sean-Admin","Resource":"Protocol","Name":null,"Message":"Log time ranges, hide unused controls, ICCID filtering","Timestamp":1715255881},{"Version":"0.6","UserName":"Sean-Admin","Resource":"GroupParam","Name":"Restarts","Message":"(Create) (Restarts) Add restarts count read only field","Timestamp":1716204701},{"Version":"0.6","UserName":"Sean-Admin","Resource":"GroupParam","Name":"MTBR","Message":"(Create) (MTBR) Add MTBR field","Timestamp":1716204770},{"Version":"0.6","UserName":"Sean-Admin","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) restarts and mtbr json parsing","Timestamp":1716206509},{"Version":"0.6","UserName":"Sean-Admin","Resource":"GroupParam","Name":"MTBR","Message":"(Update) (MTBR) Reorder Group Params","Timestamp":1716278044},{"Version":"0.6","UserName":"Sean-Admin","Resource":"GroupParam","Name":"Request Data","Message":"(Update) (Request Data) Reorder Group Params","Timestamp":1716278047},{"Version":"0.6","UserName":"Sean-Admin","Resource":"GroupParam","Name":"Version","Message":"(Update) (Version) Reorder Group Params","Timestamp":1716278051},{"Version":"0.6","UserName":"Sean-Admin","Resource":"GroupParam","Name":"Restarts","Message":"(Update) (Restarts) Reorder Group Params","Timestamp":1716278055},{"Version":"0.6","UserName":"Sean-Admin","Resource":"GroupParam","Name":"Request Data","Message":"(Update) (Request Data) Reorder Group Params","Timestamp":1716278063},{"Version":"0.6","UserName":"Sean-Admin","Resource":"GroupParam","Name":"Version","Message":"(Update) (Version) Reorder Group Params","Timestamp":1716278066},{"Version":"0.6","UserName":"Sean-Admin","Resource":"GroupParam","Name":"Restarts","Message":"(Update) (Restarts) Reorder Group Params","Timestamp":1716278069},{"Version":"0.6","UserName":"Sean-Admin","Resource":"GroupParam","Name":"MTBR","Message":"(Update) (MTBR) Reorder Group Params","Timestamp":1716278072},{"Version":"0.6","UserName":"Sean-Admin","Resource":"GroupParam","Name":"Enable Disable No Activity","Message":"(Update) (Enable Disable No Activity) hide unused params","Timestamp":1716289251},{"Version":"0.6","UserName":"Sean-Admin","Resource":"GroupParam","Name":"Enable Disable NonMovement","Message":"(Update) (Enable Disable NonMovement) hide unused params","Timestamp":1716289267},{"Version":"0.6","UserName":"Sean-Admin","Resource":"GroupParam","Name":"period ","Message":"(Update) (period ) hide unused params","Timestamp":1716289280},{"Version":"0.6","UserName":"Sean-Admin","Resource":"GroupParam","Name":"Real Time Locate","Message":"(Update) (Real Time Locate) hide unused params","Timestamp":1716289318},{"Version":"0.6","UserName":"Sean-Admin","Resource":"GroupParam","Name":"Set Primary Server","Message":"(Update) (Set Primary Server) hide unused params","Timestamp":1716289362},{"Version":"0.6","UserName":"Sean-Admin","Resource":"GroupParam","Name":"Set Secondary Server","Message":"(Update) (Set Secondary Server) hide unused params","Timestamp":1716289376},{"Version":"0.6","UserName":"Sean-Admin","Resource":"Command","Name":"Battery Charging Alert","Message":"(Update) (Battery Charging Alert) encryption updates","Timestamp":1716290008},{"Version":"0.6","UserName":"Sean-Admin","Resource":"Command","Name":"Battery Critical Alert Setting","Message":"(Update) (Battery Critical Alert Setting) encryption updates","Timestamp":1716290093},{"Version":"0.6","UserName":"Sean-Admin","Resource":"Command","Name":"Battery Low Alert Setting","Message":"(Update) (Battery Low Alert Setting) encryption updates","Timestamp":1716290124},{"Version":"0.6","UserName":"Sean-Admin","Resource":"Command","Name":"ClearBuffer","Message":"(Update) (ClearBuffer) encryption updates","Timestamp":1716290144},{"Version":"0.6","UserName":"Sean-Admin","Resource":"Command","Name":"Cycle Interval","Message":"(Update) (Cycle Interval) encryption updates","Timestamp":1716290163},{"Version":"0.6","UserName":"Sean-Admin","Resource":"Command","Name":"Device Activated","Message":"(Update) (Device Activated) encryption updates","Timestamp":1716290183},{"Version":"0.6","UserName":"Sean-Admin","Resource":"Command","Name":"NonMovement","Message":"(Update) (NonMovement) encryption updates","Timestamp":1716290205},{"Version":"0.6","UserName":"Sean-Admin","Resource":"Command","Name":"PowerOff Bracelet","Message":"(Update) (PowerOff Bracelet) encryption updates","Timestamp":1716290233},{"Version":"0.6","UserName":"Sean-Admin","Resource":"Command","Name":"Real Time Locate","Message":"(Update) (Real Time Locate) encryption updates","Timestamp":1716290253},{"Version":"0.6","UserName":"Sean-Admin","Resource":"Command","Name":"Reboot Bracelet","Message":"(Update) (Reboot Bracelet) encryption updates","Timestamp":1716290275},{"Version":"0.6","UserName":"Sean-Admin","Resource":"Command","Name":"RequestData","Message":"(Update) (RequestData) encryption updates","Timestamp":1716290305},{"Version":"0.6","UserName":"Sean-Admin","Resource":"Command","Name":"RequestLog","Message":"(Update) (RequestLog) encryption updates","Timestamp":1716290326},{"Version":"0.6","UserName":"Sean-Admin","Resource":"Command","Name":"Reset Bracelet","Message":"(Update) (Reset Bracelet) encryption updates","Timestamp":1716290345},{"Version":"0.6","UserName":"Sean-Admin","Resource":"Command","Name":"Reset Device","Message":"(Update) (Reset Device) encryption updates","Timestamp":1716290362},{"Version":"0.6","UserName":"Sean-Admin","Resource":"Command","Name":"Send Notification","Message":"(Update) (Send Notification) encryption updates","Timestamp":1716290378},{"Version":"0.6","UserName":"Sean-Admin","Resource":"Command","Name":"Set Bracelet Password","Message":"(Update) (Set Bracelet Password) encryption updates","Timestamp":1716290394},{"Version":"0.6","UserName":"Sean-Admin","Resource":"Command","Name":"Set Config Enable","Message":"(Update) (Set Config Enable) encryption updates","Timestamp":1716290410},{"Version":"0.6","UserName":"Sean-Admin","Resource":"Command","Name":"Set RTLog Enable","Message":"(Update) (Set RTLog Enable) encryption updates","Timestamp":1716290430},{"Version":"0.6","UserName":"Sean-Admin","Resource":"Command","Name":"Set Server","Message":"(Update) (Set Server) encryption updates","Timestamp":1716290452},{"Version":"0.6","UserName":"Sean-Admin","Resource":"Command","Name":"SetBattery Bracelet","Message":"(Update) (SetBattery Bracelet) encryption updates","Timestamp":1716290471},{"Version":"0.6","UserName":"Sean-Admin","Resource":"Command","Name":"SetBLEParam Bracelet","Message":"(Update) (SetBLEParam Bracelet) encryption updates","Timestamp":1716290492},{"Version":"0.6","UserName":"Sean-Admin","Resource":"Command","Name":"SetCloudParam Bracelet","Message":"(Update) (SetCloudParam Bracelet) encryption updates","Timestamp":1716290513},{"Version":"0.6","UserName":"Sean-Admin","Resource":"Command","Name":"SetCommonParam Bracelet","Message":"(Update) (SetCommonParam Bracelet) encryption updates","Timestamp":1716290530},{"Version":"0.6","UserName":"Sean-Admin","Resource":"Command","Name":"SetLTEParam Bracelet","Message":"(Update) (SetLTEParam Bracelet) encryption updates","Timestamp":1716290549},{"Version":"0.6","UserName":"Sean-Admin","Resource":"Command","Name":"SetTemp Bracelet","Message":"(Update) (SetTemp Bracelet) encryption updates","Timestamp":1716290568},{"Version":"0.6","UserName":"Sean-Admin","Resource":"Command","Name":"Set Password","Message":"(Update) (Set Password) encryption updates","Timestamp":1716290661},{"Version":"0.6","UserName":"Sean-Admin","Resource":"GroupParam","Name":"BraceletPW","Message":"(Update) (BraceletPW) hide unused params","Timestamp":1716290748},{"Version":"0.6","UserName":"Sean-Admin","Resource":"GroupParam","Name":"encryption","Message":"(Update) (encryption) hide unused params","Timestamp":1716290763},{"Version":"0.6","UserName":"Sean-Admin","Resource":"GroupParam","Name":"MTBR","Message":"(Update) (MTBR) change mtbr to time","Timestamp":1716543699},{"Version":"0.6","UserName":"Sean-Admin","Resource":"GroupParam","Name":"MTBR","Message":"(Update) (MTBR) update label","Timestamp":1716543727},{"Version":"0.6","UserName":"Sean-Admin","Resource":"GroupParam","Name":"MTBR","Message":"(Update) (MTBR) Reorder Group Params","Timestamp":1716543763},{"Version":"0.6","UserName":"Sean-Admin","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) change mtbr int to time","Timestamp":1716543912},{"Version":"0.6","UserName":"Sean-Admin","Resource":"Protocol","Name":null,"Message":"encryption, restarts and MTBR params, tidy up","Timestamp":1716972302},{"Version":"0.7","UserName":"Sean-Admin","Resource":"Command","Name":"Device Activated","Message":"(Update) (Device Activated) Increase Device activated retries to 4","Timestamp":1718098112},{"Version":"0.7","UserName":"Sean-Admin","Resource":"Protocol","Name":null,"Message":"Bump version for protocol-dev","Timestamp":1737376303},{"Version":"0.7","UserName":"Test-Admin","Resource":"MessageType","Name":"GETPWB","Message":"(Create) (GETPWB) 1507891 GETPWB message implementation","Timestamp":1741968756},{"Version":"0.7","UserName":"Test-Admin","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) 1507891-GETPWB message implementation","Timestamp":1742311652},{"Version":"0.7","UserName":"Test-Admin","Resource":"MessageType","Name":"GETPWB","Message":"(Update) (GETPWB) 1507891 GETPWB Message Implementation","Timestamp":1742312695},{"Version":"0.8","UserName":"alex.marsden@theaccessgroup.com","Resource":"MessageType","Name":"INFO-GETPWB","Message":"(Create) (INFO-GETPWB) 1507891 - bracelet password message type","Timestamp":1742382959},{"Version":"0.8","UserName":"alex.marsden@theaccessgroup.com","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) 1507891-getbraceletpassword","Timestamp":1742386705},{"Version":"0.8","UserName":"alex.marsden@theaccessgroup.com","Resource":"MessageType","Name":"INFO-GETPWB","Message":"(Update) (INFO-GETPWB) 1507891-passwordbracelet","Timestamp":1742386996},{"Version":"0.8","UserName":"alex.marsden@theaccessgroup.com","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) 1507891-passwordbracelet","Timestamp":1742387419},{"Version":"0.8","UserName":"alex.marsden@theaccessgroup.com","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) 1507894 changes","Timestamp":1744200583},{"Version":"0.8","UserName":"alex.marsden@theaccessgroup.com","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) 1507894 changes","Timestamp":1744200792},{"Version":"0.8","UserName":"alex.marsden@theaccessgroup.com","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) 1507894 changes","Timestamp":1744202227},{"Version":"0.8","UserName":"alex.marsden@theaccessgroup.com","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) 1507894 changes","Timestamp":1744202554},{"Version":"0.8","UserName":"alex.marsden@theaccessgroup.com","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) changes","Timestamp":1744202767},{"Version":"0.8","UserName":"alex.marsden@theaccessgroup.com","Resource":"MessageType","Name":"INFO-GETPWB","Message":"(Update) (INFO-GETPWB) imei to mac","Timestamp":1744202928},{"Version":"0.8","UserName":"alex.marsden@theaccessgroup.com","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) changes","Timestamp":1744202957},{"Version":"0.8","UserName":"alex.marsden@theaccessgroup.com","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) changes","Timestamp":1744203728},{"Version":"0.8","UserName":"alex.marsden@theaccessgroup.com","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) changes","Timestamp":1744203822},{"Version":"0.8","UserName":"alex.marsden@theaccessgroup.com","Resource":"MessageType","Name":"INFO-GETPWB","Message":"(Update) (INFO-GETPWB) changes","Timestamp":1744203836},{"Version":"0.8","UserName":"alex.marsden@theaccessgroup.com","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) changes","Timestamp":1744204411},{"Version":"0.8","UserName":"gaurav.verma@theaccessgroup.com","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) 1507891 - refactor code to add lookup key valuie","Timestamp":1744207495},{"Version":"0.8","UserName":"gaurav.verma@theaccessgroup.com","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) removed new msg object creation","Timestamp":1744208228},{"Version":"0.8","UserName":"alex.marsden@theaccessgroup.com","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) changes","Timestamp":1744208434},{"Version":"0.8","UserName":"gaurav.verma@theaccessgroup.com","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) commenting msg obj. ","Timestamp":1744208682},{"Version":"0.8","UserName":"gaurav.verma@theaccessgroup.com","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) putting var msg back","Timestamp":1744208780},{"Version":"0.8","UserName":"gaurav.verma@theaccessgroup.com","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) remove var from var msg object","Timestamp":1744209049},{"Version":"0.8","UserName":"gaurav.verma@theaccessgroup.com","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) added key value to msg object","Timestamp":1744209157},{"Version":"0.8","UserName":"gaurav.verma@theaccessgroup.com","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) hardcoded msg key value","Timestamp":1744209596},{"Version":"0.8","UserName":"gaurav.verma@theaccessgroup.com","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) removed key value from msg obj","Timestamp":1744209665},{"Version":"0.8","UserName":"gaurav.verma@theaccessgroup.com","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) using devicekey for key","Timestamp":1744209781},{"Version":"0.8","UserName":"gaurav.verma@theaccessgroup.com","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) device key ","Timestamp":1744209893},{"Version":"0.8","UserName":"alex.marsden@theaccessgroup.com","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) use bracelet_mac variable","Timestamp":1744209994},{"Version":"0.8","UserName":"alex.marsden@theaccessgroup.com","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) refactor msg and device key","Timestamp":1744210988},{"Version":"0.8","UserName":"alex.marsden@theaccessgroup.com","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) changes","Timestamp":1744301752},{"Version":"0.8","UserName":"Sean-Admin","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) only create keyValue query when requesting password","Timestamp":1747753380},{"Version":"0.8","UserName":"Sean-Admin","Resource":"Protocol","Name":null,"Message":"password using secure storage","Timestamp":1751276409},{"Version":"0.9","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"BackgroundLocation","Message":"(Create) (BackgroundLocation) 1705861-addbackgroundlocation-device-config","Timestamp":1751374909},{"Version":"0.9","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"CoarseLocation","Message":"(Create) (CoarseLocation) 1705861-add-coarselocation-device-config","Timestamp":1751374960},{"Version":"0.9","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"FineLocation","Message":"(Create) (FineLocation) 1705861-add-finelocation-device-config","Timestamp":1751374992},{"Version":"0.9","UserName":"alex.marsden@theaccessgroup.com","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) 1705861-vga-ops-script-update","Timestamp":1751382743},{"Version":"0.9","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"Restarts","Message":"(Update) (Restarts) 1740967-alldata-make-restarts-readonly","Timestamp":1751552278},{"Version":"0.9","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"MTBR","Message":"(Update) (MTBR) 1740967-alldata-make-mtbr-readonly","Timestamp":1751552313},{"Version":"0.9","UserName":"alex.marsden@theaccessgroup.com","Resource":"Operation","Name":"VGA","Message":"(Update) (VGA) 170967-alldata-add-new-fields-op-script-vga","Timestamp":1751555375},{"Version":"0.9","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"Restarts","Message":"(Update) (Restarts) remove readonly on restarts vga","Timestamp":1751636693},{"Version":"0.9","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"Restarts","Message":"(Update) (Restarts) restarts read only again vga","Timestamp":1751638322},{"Version":"0.9","UserName":"alex.marsden@theaccessgroup.com","Resource":"Protocol","Name":null,"Message":"1740967 - pack for acceptance","Timestamp":1751641886},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"CoarseLocation","Message":"(Update) (CoarseLocation) Reorder Group Params","Timestamp":1751967258},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"Config Mode","Message":"(Update) (Config Mode) Reorder Group Params","Timestamp":1751967261},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"FineLocation","Message":"(Update) (FineLocation) Reorder Group Params","Timestamp":1751967264},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"BackgroundLocation","Message":"(Update) (BackgroundLocation) Reorder Group Params","Timestamp":1751967267},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"ICCID","Message":"(Update) (ICCID) Reorder Group Params","Timestamp":1751967270},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"IV Activated","Message":"(Update) (IV Activated) Reorder Group Params","Timestamp":1751967273},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"IV ActivatedFailMessage","Message":"(Update) (IV ActivatedFailMessage) Reorder Group Params","Timestamp":1751967276},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"MTBR","Message":"(Update) (MTBR) Reorder Group Params","Timestamp":1751967280},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"Reset","Message":"(Update) (Reset) Reorder Group Params","Timestamp":1751967283},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"DisableAck","Message":"(Update) (DisableAck) Reorder Group Params","Timestamp":1751967286},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"Enable Logging","Message":"(Update) (Enable Logging) Reorder Group Params","Timestamp":1751967289},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"Get Logs","Message":"(Update) (Get Logs) Reorder Group Params","Timestamp":1751967292},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"Restarts","Message":"(Update) (Restarts) Reorder Group Params","Timestamp":1751967295},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"StartTimeLog","Message":"(Update) (StartTimeLog) Reorder Group Params","Timestamp":1751967298},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"EndTimeLog","Message":"(Update) (EndTimeLog) Reorder Group Params","Timestamp":1751967301},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"Request Data","Message":"(Update) (Request Data) Reorder Group Params","Timestamp":1751967304},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"Version","Message":"(Update) (Version) Reorder Group Params","Timestamp":1751967308},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"Config Mode","Message":"(Update) (Config Mode) Reorder Group Params","Timestamp":1751968957},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"FineLocation","Message":"(Update) (FineLocation) Reorder Group Params","Timestamp":1751968961},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"CoarseLocation","Message":"(Update) (CoarseLocation) Reorder Group Params","Timestamp":1751968964},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"ICCID","Message":"(Update) (ICCID) Reorder Group Params","Timestamp":1751977804},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"IV Activated","Message":"(Update) (IV Activated) Reorder Group Params","Timestamp":1751977806},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"IV ActivatedFailMessage","Message":"(Update) (IV ActivatedFailMessage) Reorder Group Params","Timestamp":1751977808},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"MTBR","Message":"(Update) (MTBR) Reorder Group Params","Timestamp":1751977810},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"Reset","Message":"(Update) (Reset) Reorder Group Params","Timestamp":1751977812},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"DisableAck","Message":"(Update) (DisableAck) Reorder Group Params","Timestamp":1751977814},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"Enable Logging","Message":"(Update) (Enable Logging) Reorder Group Params","Timestamp":1751977816},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"Get Logs","Message":"(Update) (Get Logs) Reorder Group Params","Timestamp":1751977818},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"Restarts","Message":"(Update) (Restarts) Reorder Group Params","Timestamp":1751977820},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"StartTimeLog","Message":"(Update) (StartTimeLog) Reorder Group Params","Timestamp":1751977822},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"EndTimeLog","Message":"(Update) (EndTimeLog) Reorder Group Params","Timestamp":1751977824},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"Request Data","Message":"(Update) (Request Data) Reorder Group Params","Timestamp":1751977826},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"Version","Message":"(Update) (Version) Reorder Group Params","Timestamp":1751977829},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"BackgroundLocation","Message":"(Update) (BackgroundLocation) Reorder Group Params","Timestamp":1751977831},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"ICCID","Message":"(Update) (ICCID) Reorder Group Params","Timestamp":1751977958},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"IV Activated","Message":"(Update) (IV Activated) Reorder Group Params","Timestamp":1751977961},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"IV ActivatedFailMessage","Message":"(Update) (IV ActivatedFailMessage) Reorder Group Params","Timestamp":1751977963},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"MTBR","Message":"(Update) (MTBR) Reorder Group Params","Timestamp":1751977965},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"Reset","Message":"(Update) (Reset) Reorder Group Params","Timestamp":1751977967},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"DisableAck","Message":"(Update) (DisableAck) Reorder Group Params","Timestamp":1751977969},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"Enable Logging","Message":"(Update) (Enable Logging) Reorder Group Params","Timestamp":1751977971},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"Get Logs","Message":"(Update) (Get Logs) Reorder Group Params","Timestamp":1751977973},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"Restarts","Message":"(Update) (Restarts) Reorder Group Params","Timestamp":1751977975}],"ProtocolActionObjects":[],"Tags":[{"Id":1957,"Name":"ONeCommandSender","BackendAction":"OneCommandSender","Value":"True"},{"Id":1959,"Name":"PermitDuplicates","BackendAction":"PermitReceiverDublicates","Value":"True"}],"MessageCodes":[{"Name":"Alarm - Movement","Description":"At alert on movement ( not fall)","Code":"ALMOV","CanLiveInsights":false},{"Name":"Alarm-Welfare Check","Description":"Welfare check alarm","Code":"ALW","CanLiveInsights":false},{"Name":"Cycle","Description":"Regular, cyclic, events from a device","Code":"CYC","CanLiveInsights":false},{"Name":"Location - other","Description":"Location - other","Code":"LOCN","CanLiveInsights":false},{"Name":"Acknowledge","Description":"Acknowledgment of a command sent to the device","Code":"ACK","CanLiveInsights":false},{"Name":"Battery Charging - On","Description":"Battery Charging - On","Code":"BATCN","CanLiveInsights":false},{"Name":"Check / keep alive / Heartbeat","Description":"Keep alive / heartbeat signal to maintain a connection ","Code":"CHK","CanLiveInsights":false},{"Name":"Alarm - Amber Alert","Description":"Alarm - Amber Alert","Code":"ALA","CanLiveInsights":false},{"Name":"Alarm – Fall","Description":"Alarm – Fall","Code":"ALF","CanLiveInsights":false},{"Name":"Alarm – Non movement","Description":"Alarm – Non movement","Code":"ALNM","CanLiveInsights":false},{"Name":"Alarm - Smoke","Description":"Alarm - Smoke","Code":"ALSM","CanLiveInsights":false},{"Name":"Alarm - Speed","Description":"Alarm - Speed","Code":"ALSP","CanLiveInsights":false},{"Name":"Alarm – Emergency Cancelled","Description":"Alarm – Emergency Cancelled by the user","Code":"ALSOS-C","CanLiveInsights":false},{"Name":"Battery Charging - off","Description":"Battery Charging - off","Code":"BATCF","CanLiveInsights":false},{"Name":"Battery empty","Description":"Battery empty","Code":"BATE","CanLiveInsights":false},{"Name":"Battery full","Description":"Battery full","Code":"BATF","CanLiveInsights":false},{"Name":"Battery low","Description":"Battery low","Code":"BATL","CanLiveInsights":false},{"Name":"Button Press","Description":"Button Press","Code":"BPRS","CanLiveInsights":false},{"Name":"Ebeacon zone in","Description":"Ebeacon zone in","Code":"EBZI","CanLiveInsights":false},{"Name":"Ebeacon zone out","Description":"Ebeacon zone out","Code":"EBZO","CanLiveInsights":false},{"Name":"Location check in","Description":"Location check in","Code":"LCI","CanLiveInsights":false},{"Name":"Location check out","Description":"Location check out","Code":"LCO","CanLiveInsights":false},{"Name":"Reminder not ok","Description":"Reminder not ok","Code":"MRME","CanLiveInsights":false},{"Name":"No Activity","Description":"No Activity","Code":"NACT","CanLiveInsights":false},{"Name":"Power Off","Description":"Power Off","Code":"PWRF","CanLiveInsights":false},{"Name":"Power On","Description":"Power On","Code":"PWRN","CanLiveInsights":false},{"Name":"Vehicle - Driving hours excess","Description":"Vehicle - Driving hours excess","Code":"VDE","CanLiveInsights":false},{"Name":"Vehicle – Fuel cap","Description":"Vehicle – Fuel cap","Code":"VFC","CanLiveInsights":false},{"Name":"Vehicle - Fuel level","Description":"Vehicle - Fuel level","Code":"VFL","CanLiveInsights":false},{"Name":"Vehicle – Harsh braking","Description":"Vehicle – Harsh braking","Code":"VHB","CanLiveInsights":false},{"Name":"Vehicle – Ignition off","Description":"Vehicle – Ignition off","Code":"VIGF","CanLiveInsights":false},{"Name":"Vehicle – Driver not authorized","Description":"Vehicle – Driver not authorized","Code":"VNA","CanLiveInsights":false},{"Name":"Vehicle – Night driving","Description":"Vehicle – Night driving","Code":"VND","CanLiveInsights":false},{"Name":"Vehicle – Ignition on","Description":"Vehicle – Ignition on","Code":"VIGN","CanLiveInsights":false},{"Name":"Vehicle – Seat belt","Description":"Vehicle – Seat belt","Code":"VSB","CanLiveInsights":false},{"Name":"Zone in","Description":"Zone in","Code":"ZNI","CanLiveInsights":false},{"Name":"Zone out","Description":"Zone out","Code":"ZNO","CanLiveInsights":false},{"Name":"Device Status","Description":"Device Status","Code":"STATUS","CanLiveInsights":false},{"Name":"Real time location ","Description":"Real time location ","Code":"RTL","CanLiveInsights":false},{"Name":"Encoded communication","Description":"Encoded communication","Code":"ENC","CanLiveInsights":false},{"Name":"Proximity","Description":"Proximity alert ","Code":"PROX","CanLiveInsights":false},{"Name":"Dummy - do NOT use ","Description":"Dummy template - should not be used","Code":"DUMMY","CanLiveInsights":false},{"Name":"Battery High","Description":"Battery High","Code":"BATH","CanLiveInsights":false},{"Name":"Location - Set Available","Description":"Location - Set Available","Code":"LSA","CanLiveInsights":false},{"Name":"Location - Set Busy","Description":"Location - Set Busy","Code":"LSB","CanLiveInsights":false},{"Name":"Device information","Description":"General Device Information from the device","Code":"INFO","CanLiveInsights":false},{"Name":"Alarm - Tamper","Description":"Alarm - Device Tamper","Code":"ALTAM","CanLiveInsights":false},{"Name":"Communication ","Description":"General communication, initialisation etc.","Code":"COMM","CanLiveInsights":false},{"Name":"Humidity","Description":"Relative humidity","Code":"RH","CanLiveInsights":false},{"Name":"Temperature","Description":"Temperature","Code":"TEMP","CanLiveInsights":false},{"Name":"Alarm - Temperature","Description":"Alarm - Temperature","Code":"ALTEMP","CanLiveInsights":false},{"Name":"Alarm - Humidity","Description":"Alarm - Relative Humidity","Code":"ALRH","CanLiveInsights":false},{"Name":"Proximity End","Description":"Proximity End","Code":"PROX-E","CanLiveInsights":false},{"Name":"Alarm - PIR","Description":"Alarm - PIR","Code":"ALPIR","CanLiveInsights":false},{"Name":"PIR - Movements","Description":"Number of PIR movements detected in reporting period","Code":"PIRM","CanLiveInsights":false},{"Name":"Battery Report","Description":"Battery Voltage Report","Code":"BATR","CanLiveInsights":false},{"Name":"Alarm - Sim Swap","Description":"Alarm - Sim Swap","Code":"ALSS","CanLiveInsights":false},{"Name":"Mileage","Description":"Mileage","Code":"MIL","CanLiveInsights":false},{"Name":"Intrusion","Description":"Intrusion","Code":"INT","CanLiveInsights":false},{"Name":"No Fix Report","Description":"No fix report","Code":"NFR","CanLiveInsights":false},{"Name":"Switched Off Report","Description":"Switched off report","Code":"SOR","CanLiveInsights":false},{"Name":"End - Shift","Description":"End - Shift","Code":"ENDSH","CanLiveInsights":false},{"Name":"Sleep Mode","Description":"Device comes to sleep mode","Code":"SPM","CanLiveInsights":false},{"Name":"Wake Up Device","Description":"Device Wake Up from SleepMode","Code":"WUD","CanLiveInsights":false},{"Name":"Door Closed","Description":"Door Closed","Code":"DRCL","CanLiveInsights":false},{"Name":"Door Open","Description":"Door Open","Code":"DRO","CanLiveInsights":false},{"Name":"Alarm Door Closed","Description":"Alarm Door Closed","Code":"ALDC","CanLiveInsights":false},{"Name":"Alarm Door Open","Description":"Alarm Door Open","Code":"ALDO","CanLiveInsights":false},{"Name":"Alarm - Amber Alert - Snooze","Description":"Amber Alert Alarm - snoozed by user","Code":"ALA-S","CanLiveInsights":false},{"Name":"Amber Alert - On","Description":"Amber Alert Alarm created by User","Code":"ALA-O","CanLiveInsights":false},{"Name":"Reminder OK","Description":"Reminder OK","Code":"MRMK","CanLiveInsights":false},{"Name":"Message - text","Description":"Message- text","Code":"MSG","CanLiveInsights":false},{"Name":"Start - Shift","Description":"Start- Shift","Code":"STSH","CanLiveInsights":false},{"Name":"Beacon","Description":"Beacon","Code":"BT","CanLiveInsights":false},{"Name":"Alarm - Amber Alert - Cancel","Description":"Amber alert alarm, cancelled by user","Code":"ALA-C","CanLiveInsights":false},{"Name":"Alarm-Impact","Description":"Alarm-Impact","Code":"ALI","CanLiveInsights":false},{"Name":"Reminder Snooze ","Description":"Reminder - snooze","Code":"MRM-S","CanLiveInsights":false},{"Name":"Blood Pressure","Description":"Blood Pressure","Code":"HBP","CanLiveInsights":false},{"Name":"Heart Rate","Description":"Heart Rate","Code":"HRT","CanLiveInsights":false},{"Name":"SELFTEST","Description":"Used for Testing Purposes","Code":"TEST","CanLiveInsights":false},{"Name":"Alarm - Fall Cancelled","Description":"Alarm - Fall Cancelled","Code":"ALF-C","CanLiveInsights":false},{"Name":"Alarm – Non Movement Cancelled","Description":"Alarm – Non movement Cancelled by the user","Code":"ALNM-C","CanLiveInsights":false},{"Name":"Insight","Description":"Insight","Code":"INSIGHT","CanLiveInsights":false},{"Name":"Quantity Drunk","Description":"Quantity of liquid drunk ","Code":"QDRNK","CanLiveInsights":false},{"Name":"Bed - in","Description":"Bed or seat sensor ","Code":"BEDIN","CanLiveInsights":false},{"Name":"Bed - Out","Description":"Bed / seat sensor","Code":"BEDOUT","CanLiveInsights":false},{"Name":"Leak sensor","Description":"Leak detected ","Code":"LEAK","CanLiveInsights":false},{"Name":"Light - Lux","Description":"Light levels - LUX ","Code":"LUX","CanLiveInsights":false},{"Name":"Exited","Description":"Exited","Code":"EXIT","CanLiveInsights":false},{"Name":"Entered","Description":"Entered","Code":"ENTER","CanLiveInsights":false},{"Name":"Answered Door","Description":"Answered Door","Code":"ANSWDR","CanLiveInsights":false},{"Name":"Alarm – Emergency","Description":"Alarm – Emergency","Code":"ALSOS","CanLiveInsights":true},{"Name":"Alarm – Gas","Description":"Alarm – Gas ( carbon monixide, carbon dioxide, propane, butane ) ","Code":"ALG","CanLiveInsights":false},{"Name":"Leak Off","Description":"Leak detection has stopped alerting","Code":"LEAK-OFF","CanLiveInsights":false},{"Name":"Question-Answer","Description":"Question - Answer response","Code":"Q-A","CanLiveInsights":false},{"Name":"Visitor Arrived","Description":"Visitor Arrived","Code":"VISARR","CanLiveInsights":true},{"Name":"Visitor Departed","Description":"Visitor Departed","Code":"VISDEP","CanLiveInsights":true},{"Name":"Docked","Description":"Device placed in docking station","Code":"DOCK-IN","CanLiveInsights":false},{"Name":"Undocked","Description":"Device removed from docking station","Code":"DOCK-OUT","CanLiveInsights":false},{"Name":"Gas concentrarion","Description":"Gas concentrarion (ppm)","Code":"GAS","CanLiveInsights":false},{"Name":"Distance ","Description":"Distance measurement, could be level, proximity etc ","Code":"DIST","CanLiveInsights":false},{"Name":"Alarm Distance","Description":"Alarm on distance measurement, could be level, proximity etc ","Code":"ALDIST","CanLiveInsights":false},{"Name":"Welfare OK","Description":"Welfare check has returned OK","Code":"WELFOK","CanLiveInsights":false},{"Name":"Steps","Description":"Step counter","Code":"STEPS","CanLiveInsights":true},{"Name":"Connection","Description":"Connection","Code":"CON","CanLiveInsights":false},{"Name":"Disconnection","Description":"Disconnect","Code":"DISCON","CanLiveInsights":false},{"Name":"Position By Button","Description":"Position By Button","Code":"PBB","CanLiveInsights":false},{"Name":"Alarm Welfare","Description":"Alert welfare not confirmed","Code":"ALA-W","CanLiveInsights":false},{"Name":"Welfare Timer Starts","Description":"Welfare Check in","Code":"WTS","CanLiveInsights":false},{"Name":"Welfare Stops","Description":"Welfare Check out","Code":"WSTP","CanLiveInsights":false},{"Name":"Alarm Ended","Description":"Alarm finished","Code":"ALA-F","CanLiveInsights":false},{"Name":"BRTH - Breath Rate","Description":"Rate of Breathing per minute","Code":"BRTH","CanLiveInsights":false},{"Name":"Sleep State","Description":"Sleep state ","Code":"SLPSTATE","CanLiveInsights":false},{"Name":"Alarm - Tilt","Description":"Alarm - Tilt Alert","Code":"ALTLT","CanLiveInsights":false},{"Name":"Alert – Fall Suspected","Description":"Alert – Fall Suspected","Code":"ALFS","CanLiveInsights":false}]} \ No newline at end of file