vga/vga
2025-07-08 12:34:58 +00:00

1 line
1.0 MiB
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{"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-<<version>>;<<imei>>;mid=<<count_number>>;MACB=<<bracelet_mac>>,<<bracelet_imei>>;LOTH=<<latitude_raw>>,<<longitude_raw>>,<<raw_accuracy>>,<<altitude>>,<<satellite>>,<<location_time>>;NET=<<net_signal>>;BATP=<<battery_percentage>>;BATPB=<<battery_bracelet>>;TEMPB=<<temp_bracelet>>;TIME=<<event_time>>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<<count_number>>;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-<<version>>;<<imei>>;mid=<<count_number>>;CYC;LOTH=<<latitude>>,<<longitude>>,<<accuracy>>,<<altitude>>,<<satellite>>,<<location_time>>;NET=<<net_signal>>;BATP=<<battery_percentage>>;BATPB=<<battery_bracelet>>;TEMPB=<<temp_bracelet>>;TIME=<<event_time>>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<<count_number>>;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-<<version>>;<<imei>>;mid=<<count_number>>;CYC;LOTH=<<latitude>>,<<longitude>>,<<location_accuracy>>,<<altitude>>,<<satellite>>,<<location_time>>;NET=<<net_signal>>;BATP=<<battery_percentage>>;BATPB=<<battery_bracelet>>;TEMPB=<<temp_bracelet>>;TIME=<<event_time>>;\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":\"ACK-MSG;<<count_number>>;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-<<version>>;<<imei>>;mid=<<count_number>>;enc=<<encrypted_data>>;$$","HasTemplateGlobal":false,"ResponseTemplate":"<<ack>>","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-<<version>>;<<imei>>;mid=<<count_number>>;PWRF;LOTH=<<latitude_raw>>,<<longitude_raw>>,<<raw_accuracy>>,<<altitude>>,<<satellite>>,<<location_time>>;NET=<<net_signal>>;BATP=<<battery_percentage>>;BATPB=<<battery_bracelet>>;TEMPB=<<temp_bracelet>>;TIME=<<event_time>>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<<count_number>>;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-<<version>>;<<imei>>;mid=<<count_number>>;PWRN;LOTH=<<latitude_raw>>,<<longitude_raw>>,<<raw_accuracy>>,<<altitude>>,<<satellite>>,<<location_time>>;NET=<<net_signal>>;BATP=<<battery_percentage>>;BATPB=<<battery_bracelet>>;TEMPB=<<temp_bracelet>>;TIME=<<event_time>>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<<count_number>>;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-<<version>>;<<imei>>;mid=<<count_number>>;ALNM;LOTH=<<latitude_raw>>,<<longitude_raw>>,<<raw_accuracy>>,<<altitude>>,<<satellite>>,<<location_time>>;NET=<<net_signal>>;BATP=<<battery_percentage>>;BATPB=<<battery_bracelet>>;TEMPB=<<temp_bracelet>>;TIME=<<event_time>>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<<count_number>>;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-<<version>>;<<imei>>;mid=<<count_number>>;BATCN;LOTH=<<latitude_raw>>,<<longitude_raw>>,<<raw_accuracy>>,<<altitude>>,<<satellite>>,<<location_time>>;NET=<<net_signal>>;BATP=<<battery_percentage>>;BATPB=<<battery_bracelet>>;TEMPB=<<temp_bracelet>>;TIME=<<event_time>>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<<count_number>>;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-<<version>>;<<imei>>;mid=<<count_number>>;BATCF;LOTH=<<latitude_raw>>,<<longitude_raw>>,<<raw_accuracy>>,<<altitude>>,<<satellite>>,<<location_time>>;NET=<<net_signal>>;BATP=<<battery_percentage>>;BATPB=<<battery_bracelet>>;TEMPB=<<temp_bracelet>>;TIME=<<event_time>>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<<count_number>>;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-<<version>>;<<imei>>;mid=<<count_number>>;BATE;LOTH=<<latitude_raw>>,<<longitude_raw>>,<<raw_accuracy>>,<<altitude>>,<<satellite>>,<<location_time>>;NET=<<net_signal>>;BATP=<<battery_percentage>>;BATPB=<<battery_bracelet>>;TEMPB=<<temp_bracelet>>;TIME=<<event_time>>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<<count_number>>;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-<<version>>;<<imei>>;mid=<<count_number>>;BATL;LOTH=<<latitude_raw>>,<<longitude_raw>>,<<raw_accuracy>>,<<altitude>>,<<satellite>>,<<location_time>>;NET=<<net_signal>>;BATP=<<battery_percentage>>;BATPB=<<battery_bracelet>>;TEMPB=<<temp_bracelet>>;TIME=<<event_time>>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<<count_number>>;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,<<imei>>,<<event_time>>$","HasTemplateGlobal":false,"ResponseTemplate":null,"TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":true,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"\\+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;<<imei>>;<<sequenceNumber>>;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;<<imei>>;<<ignoresequenceNumber>>;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;<<imei>>;<<sequenceNumber>>;ERR;<<errorinfo>>;","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-<<version>>;<<imei>>;mid=<<count_number>>;DISCONB;LOTH=<<latitude_raw>>,<<longitude_raw>>,<<raw_accuracy>>,<<altitude>>,<<satellite>>,<<location_time>>;NET=<<net_signal>>;BATP=<<battery_percentage>>;BATPB=<<battery_bracelet>>;TEMPB=<<temp_bracelet>>;TIME=<<event_time>>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<<count_number>>;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-<<version>>;<<imei>>;mid=<<count_number>>;IS_ACTIVATED;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<<count_number>>;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-<<version>>;<<imei>>;mid=<<count_number>>;ALTAM;LOTH=<<latitude_raw>>,<<longitude_raw>>,<<raw_accuracy>>,<<altitude>>,<<satellite>>,<<location_time>>;NET=<<net_signal>>;BATP=<<battery_percentage>>;BATPB=<<battery_bracelet>>;TEMPB=<<temp_bracelet>>;TIME=<<event_time>>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<<count_number>>;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-<<version>>;<<imei>>;mid=<<count_number>>;ATEMPB;LOTH=<<latitude_raw>>,<<longitude_raw>>,<<raw_accuracy>>,<<altitude>>,<<satellite>>,<<location_time>>;NET=<<net_signal>>;BATP=<<battery_percentage>>;BATPB=<<battery_bracelet>>;TEMPB=<<temp_bracelet>>;TIME=<<event_time>>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<<count_number>>;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-<<version>>;<<imei>>;mid=<<count_number>>;ALNMB;LOTH=<<latitude_raw>>,<<longitude_raw>>,<<raw_accuracy>>,<<altitude>>,<<satellite>>,<<location_time>>;NET=<<net_signal>>;BATP=<<battery_percentage>>;BATPB=<<battery_bracelet>>;TEMPB=<<temp_bracelet>>;TIME=<<event_time>>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<<count_number>>;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-<<version>>;<<imei>>;mid=<<count_number>>;BATEB;LOTH=<<latitude_raw>>,<<longitude_raw>>,<<raw_accuracy>>,<<altitude>>,<<satellite>>,<<location_time>>;NET=<<net_signal>>;BATP=<<battery_percentage>>;BATPB=<<battery_bracelet>>;TEMPB=<<temp_bracelet>>;TIME=<<event_time>>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<<count_number>>;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-<<version>>;<<imei>>;mid=<<count_number>>;BATLB;LOTH=<<latitude_raw>>,<<longitude_raw>>,<<raw_accuracy>>,<<altitude>>,<<satellite>>,<<location_time>>;NET=<<net_signal>>;BATP=<<battery_percentage>>;BATPB=<<battery_bracelet>>;TEMPB=<<temp_bracelet>>;TIME=<<event_time>>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<<count_number>>;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\":\"<<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-<<version>>;<<imei>>;mid=<<count_number>>;REGISTER=<<ble_mac>>,<<iccid>>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<<count_number>>;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-<<version>>;<<imei>>;mid=<<count_number>>;CREATE=<<new_imei>>,<<ble_mac>>,<<iccid>>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<<count_number>>;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\":\"<<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-<<version>>;<<imei>>;mid=<<count_number>>;CONNB;LOTH=<<latitude_raw>>,<<longitude_raw>>,<<raw_accuracy>>,<<altitude>>,<<satellite>>,<<location_time>>;NET=<<net_signal>>;BATP=<<battery_percentage>>;BATPB=<<battery_bracelet>>;TEMPB=<<temp_bracelet>>;TIME=<<event_time>>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<<count_number>>;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-<<version>>;<<imei>>;mid=<<count_number>>;NOTEREAD=<<note_id>>;LOTH=<<latitude_raw>>,<<longitude_raw>>,<<raw_accuracy>>,<<altitude>>,<<satellite>>,<<location_time>>;NET=<<net_signal>>;BATP=<<battery_percentage>>;BATPB=<<battery_bracelet>>;TEMPB=<<temp_bracelet>>;TIME=<<event_time>>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<<count_number>>;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-<<version>>;<<imei>>;mid=<<count_number>>;ALLDATA=<<all_data>>;LOTH=<<latitude>>,<<longitude>>,<<accuracy>>,<<altitude>>,<<satellite>>,<<location_time>>;NET=<<net_signal>>;BATP=<<battery_percentage>>;BATPB=<<battery_bracelet>>;TEMPB=<<temp_bracelet>>;TIME=<<event_time>>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-MSG;<<count_number>>;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-<<version>>;<<imei>>;mid=<<count_number>>;ALLDATA=<<all_data>>;LOTH=<<latitude>>,<<longitude>>,<<accuracy>>,<<altitude>>,<<satellite>>,<<location_time>>;NET=<<net_signal>>;BATP=<<battery_percentage>>;BATPB=<<battery_bracelet>>;TEMPB=<<temp_bracelet>>;TIME=<<event_time>>;\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":\"ACK-MSG;<<count_number>>;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-<<version>>;<<imei>>;mid=<<count_number>>;ALLDATA=<<all_data>>;LOTH=<<latitude>>,<<longitude>>,<<raw_accuracy>>,<<altitude>>,<<satellite>>,<<location_time>>;NET=<<net_signal>>;BATP=<<battery_percentage>>;BATPB=<<battery_bracelet>>;TEMPB=<<temp_bracelet>>;TIME=<<event_time>>;\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":\"ACK-MSG;<<count_number>>;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-<<version>>;<<deviceId>>;mid=<<messageId>>;GETPWB=<<bracelet_imei>>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-PW;<<messageId>>;<<password>>;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-<<version>>;<<deviceId>>;mid=<<messageId>>;GETPWB=<<bracelet_imei>>;\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":\"ACK-PW;<<messageId>>;<<password>>;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-<<version>>;<<imei>>;mid=<<messageId>>;GETPWB=<<bracelet_imei>>;\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":\"ACK-PW;<<messageId>>;<<password>>;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-<<version>>;<<imei>>;mid=<<messageId>>;GETPWB=<<bracelet_imei>>;","HasTemplateGlobal":false,"ResponseTemplate":"ACK-PW;<<messageId>>;<<password>>;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-<<version>>;<<imei>>;mid=<<messageId>>;GETPWB=<<bracelet_imei>>;\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":\"ACK-PW;<<messageId>>;<<password>>;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-<<version>>;<<imei>>;mid=<<count_number>>;GETPWB=<<bracelet_imei>>;\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":\"ACK-PW;<<count_number>>;<<password>>;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-<<version>>;<<imei>>;mid=<<count_number>>;GETPWB=<<ble_mac>>;\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":\"ACK-PW;<<count_number>>;<<password>>;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-<<version>>;<<imei>>;mid=<<count_number>>;GETPWB=<<bracelet_mac>>;\",\"HasTemplateGlobal\":false,\"ResponseTemplate\":\"ACK-PW;<<count_number>>;<<password>>;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;<<part1>>;<<part2>>;","Template":"VGCMD-001;<<part1>>;<<part2>>;[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;<<part1>>;<<part2>>;\",\"Template\":\"VGCMD-001;<<part1>>;<<part2>>;[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;<<part1>>;<<part2>>;","Template":"VGCMD-001;<<part1>>;<<part2>>;[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;<<part1>>;<<part2>>;\",\"Template\":\"VGCMD-001;<<part1>>;<<part2>>;[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;<<part1>>;<<part2>>;\",\"Template\":\"VGCMD-001;<<part1>>;<<part2>>;[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;<<part1>>;<<part2>>;","Template":"VGCMD-001;<<part1>>;<<part2>>;[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;<<part1>>;<<part2>>;\",\"Template\":\"VGCMD-001;<<part1>>;<<part2>>;[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;<<part1>>;<<part2>>;","Template":"VGCMD-001;<<part1>>;<<part2>>;[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;<<part1>>;<<part2>>;\",\"Template\":\"VGCMD-001;<<part1>>;<<part2>>;[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;<<part1>>;<<part2>>;","Template":"VGCMD-001;<<part1>>;<<part2>>;[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;<<part1>>;<<part2>>;\",\"Template\":\"VGCMD-001;<<part1>>;<<part2>>;[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;<<part1>>;<<part2>>;","Template":"VGCMD-001;<<part1>>;<<part2>>;[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;<<part1>>;<<part2>>;\",\"Template\":\"VGCMD-001;<<part1>>;<<part2>>;[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;<<part1>>;<<part2>>;","Template":"VGCMD-001;<<part1>>;<<part2>>;[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;<<part1>>;<<part2>>;\",\"Template\":\"VGCMD-001;<<part1>>;<<part2>>;[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;<<part1>>;<<part2>>;","Template":"VGCMD-001;<<part1>>;<<part2>>;[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;<<part1>>;<<part2>>;\",\"Template\":\"VGCMD-001;<<part1>>;<<part2>>;[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;<<part1>>;<<part2>>;","Template":"VGCMD-001;<<part1>>;<<part2>>;[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;<<part1>>;<<part2>>;\",\"Template\":\"VGCMD-001;<<part1>>;<<part2>>;[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;<<part1>>;<<part2>>;","Template":"VGCMD-001;<<part1>>;<<part2>>;[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;<<part1>>;<<part2>>;\",\"Template\":\"VGCMD-001;<<part1>>;<<part2>>;[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;<<part1>>;<<part2>>;","Template":"VGCMD-001;<<part1>>;<<part2>>;[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;<<part1>>;<<part2>>;\",\"Template\":\"VGCMD-001;<<part1>>;<<part2>>;[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;<<part1>>;<<part2>>;","Template":"VGCMD-001;<<part1>>;<<part2>>;[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;<<part1>>;<<part2>>;\",\"Template\":\"VGCMD-001;<<part1>>;<<part2>>;[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;<<part1>>;<<part2>>;","Template":"VGCMD-001;<<part1>>;<<part2>>;[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;<<part1>>;<<part2>>;\",\"Template\":\"VGCMD-001;<<part1>>;<<part2>>;[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;<<part1>>;<<part2>>;","Template":"VGCMD-001;<<part1>>;<<part2>>;[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;<<part1>>;<<part2>>;\",\"Template\":\"VGCMD-001;<<part1>>;<<part2>>;[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;<<part1>>;<<part2>>;","Template":"VGCMD-001;<<part1>>;<<part2>>;[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;<<part1>>;<<part2>>;\",\"Template\":\"VGCMD-001;<<part1>>;<<part2>>;[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;<<part1>>;<<part2>>;","Template":"VGCMD-001;<<part1>>;<<part2>>;[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;<<part1>>;<<part2>>;\",\"Template\":\"VGCMD-001;<<part1>>;<<part2>>;[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;<<part1>>;<<part2>>;","Template":"VGCMD-001;<<part1>>;<<part2>>;[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;<<part1>>;<<part2>>;\",\"Template\":\"VGCMD-001;<<part1>>;<<part2>>;[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;<<part1>>;<<part2>>;","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;<<part1>>;<<part2>>;\",\"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;<<part1>>;<<part2>>;","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;<<part1>>;<<part2>>;\",\"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;<<part1>>;<<part2>>;","Template":"VGCMD-001;<<part1>>;<<part2>>;[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;<<part1>>;<<part2>>;\",\"Template\":\"VGCMD-001;<<part1>>;<<part2>>;[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;<<part1>>;<<part2>>;","Template":"VGCMD-001;<<part1>>;<<part2>>;[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;<<part1>>;<<part2>>;\",\"Template\":\"VGCMD-001;<<part1>>;<<part2>>;[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;<<part1>>;<<part2>>;","Template":"VGCMD-001;<<part1>>;<<part2>>;[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;<<part1>>;<<part2>>;\",\"Template\":\"VGCMD-001;<<part1>>;<<part2>>;[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;<<part1>>;<<part2>>;","Template":"VGCMD-001;<<part1>>;<<part2>>;[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;<<part1>>;<<part2>>;\",\"Template\":\"VGCMD-001;<<part1>>;<<part2>>;[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;<<part1>>;<<part2>>;\",\"Template\":\"VGCMD-001;<<part1>>;<<part2>>;[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;<<part1>>;<<part2>>;","Template":"VGCMD-001;<<part1>>;<<part2>>;[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;<<part1>>;<<part2>>;\",\"Template\":\"VGCMD-001;<<part1>>;<<part2>>;[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;<<part1>>;<<part2>>;\",\"Template\":\"VGCMD-001;<<part1>>;<<part2>>;[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;<<part1>>;<<part2>>;","Template":"VGCMD-001;<<part1>>;<<part2>>;[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;<<part1>>;<<part2>>;\",\"Template\":\"VGCMD-001;<<part1>>;<<part2>>;[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;<<part1>>;<<part2>>;\",\"Template\":\"VGCMD-001;<<part1>>;<<part2>>;[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;<<part1>>;<<part2>>;\",\"Template\":\"VGCMD-001;<<part1>>;<<part2>>;[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;<<part1>>;<<part2>>;","Template":"VGCMD-001;<<part1>>;<<part2>>;[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;<<part1>>;<<part2>>;\",\"Template\":\"VGCMD-001;<<part1>>;<<part2>>;[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;<<part1>>;<<part2>>;\",\"Template\":\"VGCMD-001;<<part1>>;<<part2>>;[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},{"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\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751978075}],"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},{"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\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751978071}],"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},{"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\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751978073}],"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},{"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\\\":10}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751978082}],"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},{"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\\\":9}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751978080}],"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;<<part1>>;<<part2>>;\",\"Template\":\"VGCMD-001;<<part1>>;<<part2>>;[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;<<part1>>;<<part2>>;","Template":"VGCMD-001;<<part1>>;<<part2>>;[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;<<part1>>;<<part2>>;\",\"Template\":\"VGCMD-001;<<part1>>;<<part2>>;[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},{"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\\\":11}\",\"Default\":\"true\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751978084}],"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;<<part1>>;<<part2>>;","Template":"VGCMD-001;<<part1>>;<<part2>>;[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;<<part1>>;<<part2>>;\",\"Template\":\"VGCMD-001;<<part1>>;<<part2>>;[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},{"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\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751978086}],"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;<<part1>>;<<part2>>;","Template":"VGCMD-001;<<part1>>;<<part2>>;[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;<<part1>>;<<part2>>;\",\"Template\":\"VGCMD-001;<<part1>>;<<part2>>;[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},{"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\\\":17}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751977982},{"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\\\":16}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751978094}],"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;<<part1>>;<<part2>>;","Template":"VGCMD-001;<<part1>>;<<part2>>;[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},{"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\\\":18}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751977984},{"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\\\":17}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751978096}],"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},{"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\\\":15}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751977977},{"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\\\":14}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751978090}],"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},{"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\\\":16}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751977980},{"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\\\":15}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751978092}],"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},{"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\\\":13}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751978088}],"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},{"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\\\":8}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751978077}],"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},{"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\\\":19}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751977986},{"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\\\":18}\",\"Default\":\"\",\"Command\":null,\"ProtocolActionObjects\":[],\"LanguageId\":null,\"Tags\":[]}","Timestamp":1751978098}],"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},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"StartTimeLog","Message":"(Update) (StartTimeLog) Reorder Group Params","Timestamp":1751977977},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"EndTimeLog","Message":"(Update) (EndTimeLog) Reorder Group Params","Timestamp":1751977980},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"Request Data","Message":"(Update) (Request Data) Reorder Group Params","Timestamp":1751977982},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"Version","Message":"(Update) (Version) Reorder Group Params","Timestamp":1751977984},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"CoarseLocation","Message":"(Update) (CoarseLocation) Reorder Group Params","Timestamp":1751977986},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"ICCID","Message":"(Update) (ICCID) Reorder Group Params","Timestamp":1751978071},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"IV Activated","Message":"(Update) (IV Activated) Reorder Group Params","Timestamp":1751978073},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"IV ActivatedFailMessage","Message":"(Update) (IV ActivatedFailMessage) Reorder Group Params","Timestamp":1751978075},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"MTBR","Message":"(Update) (MTBR) Reorder Group Params","Timestamp":1751978077},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"Reset","Message":"(Update) (Reset) Reorder Group Params","Timestamp":1751978080},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"DisableAck","Message":"(Update) (DisableAck) Reorder Group Params","Timestamp":1751978082},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"Enable Logging","Message":"(Update) (Enable Logging) Reorder Group Params","Timestamp":1751978084},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"Get Logs","Message":"(Update) (Get Logs) Reorder Group Params","Timestamp":1751978086},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"Restarts","Message":"(Update) (Restarts) Reorder Group Params","Timestamp":1751978088},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"StartTimeLog","Message":"(Update) (StartTimeLog) Reorder Group Params","Timestamp":1751978090},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"EndTimeLog","Message":"(Update) (EndTimeLog) Reorder Group Params","Timestamp":1751978092},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"Request Data","Message":"(Update) (Request Data) Reorder Group Params","Timestamp":1751978094},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"Version","Message":"(Update) (Version) Reorder Group Params","Timestamp":1751978096},{"Version":"1.0","UserName":"alex.marsden@theaccessgroup.com","Resource":"GroupParam","Name":"CoarseLocation","Message":"(Update) (CoarseLocation) Reorder Group Params","Timestamp":1751978098}],"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}]}