device-accessory/device-accessory
2026-03-09 16:08:46 +00:00

1 line
18 KiB
Plaintext

{"Id":313,"Name":null,"Description":null,"FirmwareVersion":"","InProgress":true,"MessageTypes":[{"Id":8069,"Code":"ACCESSORY-UPDATE","Name":null,"MessageCode":null,"NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"ACCESSORY-UPDATE;<<imei>>;<<event_time>>;<<accessory_type>>;<<update_data>>;","HasTemplateGlobal":false,"ResponseTemplate":"OK","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^ACCESSORY-UPDATE;[^;]*;[^;;]*;[^;;]*;[^;;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":8070,"Code":"COMM","Name":null,"MessageCode":null,"NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":null,"HasTemplateGlobal":true,"ResponseTemplate":"OK","TemplateGlobal":"ACCESSORY<<-->>;","LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"","RegExGlobal":"^ACCESSORY[^;]*;","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":8071,"Code":"BATH","Name":null,"MessageCode":null,"NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"ACCESSORY-BATTERY-OK;<<imei>>;<<event_time>>;<<battery_percentage>>;","HasTemplateGlobal":false,"ResponseTemplate":"OK","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^ACCESSORY-BATTERY-OK;[^;]*;[^;;]*;[^;;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":8072,"Code":"BATL","Name":null,"MessageCode":null,"NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":0,"Template":"ACCESSORY-BATTERY-LOW;<<imei>>;<<event_time>>;<<battery_percentage>>;","HasTemplateGlobal":false,"ResponseTemplate":"OK","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^ACCESSORY-BATTERY-LOW;[^;]*;[^;;]*;[^;;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":8073,"Code":"BATE","Name":null,"MessageCode":null,"NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":1,"Template":"ACCESSORY-BATTERY-CRITICAL;<<imei>>;<<event_time>>;<<battery_percentage>>;","HasTemplateGlobal":false,"ResponseTemplate":"OK","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^ACCESSORY-BATTERY-CRITICAL;[^;]*;[^;;]*;[^;;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]},{"Id":8074,"Code":"BATL","Name":null,"MessageCode":null,"NeedAck":true,"IsAck":false,"IsFailAck":false,"IsAckHexString":false,"NoOperation":false,"Type":2,"Template":"ACCESSORY-BATTERY-WARNING;<<imei>>;<<event_time>>;<<battery_percentage>>;","HasTemplateGlobal":false,"ResponseTemplate":"OK","TemplateGlobal":null,"LongConnection":false,"HexString":false,"AckFirst":false,"ScaipH":false,"DoNotSendCommands":false,"ProtocolsLibraryMethod":null,"ProtocolsLibraryMethodArgs":null,"Command":null,"CacheImei":false,"RegEx":"^ACCESSORY-BATTERY-WARNING;[^;]*;[^;;]*;[^;;]*;","RegExGlobal":"","IsDeviceUpdate":false,"ProtocolActionObjects":[],"Tags":[]}],"Commands":[],"Operations":[{"Id":450,"Name":"Accessory_ops","Operation":"function execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, localTesting) {\n var tasks = [];\n var deviceParams = [];\n var configsToUpdate = [];\n if (globalTemplate == \"False\") {\n //process oystatemplate\n if (messageTypeLocalCode === \"ACCESSORY-UPDATE\") {\n // let data = raw.split(\";\"); \n let access_imei = params.imei; // data[1];\n let event_time = params.event_time; // data[2];\n let accessory_type = params.accessory_type; //data[3];\n let update_data = params.update_data; // data[4];\n // update data is comma seperated key=value pairs\n let data_updates = [];\n let update_data_parts = update_data.split(\",\");\n for (const key_value of update_data_parts) {\n let parts = key_value.split(\"=\");\n let key = parts[0];\n let value = parts[1];\n data_updates.push({\n key: key,\n value: value\n });\n }\n let imei_parts = access_imei.split(\"-\");\n // let access_mac = imei_parts[1]; // extract the unique identifier for the accessory\n let host_imei = imei_parts[0];\n // convert event_time to human readable format for logging and config update\n let event_time_string = moment.unix(event_time).format(\"YYYY-MM-DD HH:mm:ss\");\n //for logging and debugging\n AddValue(\"imei\", access_imei);\n AddValue(\"host_imei\", host_imei);\n AddValue(\"event_time\", event_time_string);\n for (const update of data_updates) {\n AddValue(update.key, update.value);\n }\n AddValue(\"accessory_type\", accessory_type);\n // udpate config UI\n UpdateConfig(configIds.Accessory.LastUpdated, event_time_string);\n UpdateConfig(configIds.Host.HostImei, host_imei);\n UpdateConfig(configIds.Accessory.Type, accessory_type);\n //iterate through update data and process each key value pair\n for (const update of data_updates) {\n let update_data_key = update.key;\n let update_data_value = update.value;\n if (update_data_key.toLowerCase() === \"battery\") {\n let battery_level = parseInt(update_data_value);\n UpdateConfig(configIds.Accessory.Battery, battery_level);\n let response_message = \"\";\n if (battery_level > 50) {\n response_message = \"ACCESSORY-BATTERY-OK;\" + access_imei + \";\" + event_time + \";\" + battery_level + \";\";\n } else if (battery_level <= 50 && battery_level > 20) {\n response_message = \"ACCESSORY-BATTERY-LOW;\" + access_imei + \";\" + event_time + \";\" + battery_level + \";\";\n } else if (battery_level <= 20 && battery_level > 10) {\n response_message = \"ACCESSORY-BATTERY-WARNING;\" + access_imei + \";\" + event_time + \";\" + battery_level + \";\";\n } else if (battery_level <= 10) {\n response_message = \"ACCESSORY-BATTERY-CRITICAL;\" + access_imei + \";\" + event_time + \";\" + battery_level + \";\";\n }\n sendMessageToLocalhost(response_message);\n }\n }\n } // end of acessory update processing\n } else {\n //process global template: imei doesn't exist so create the device then resend message\n let data = raw.split(\";\");\n let access_imei = data[1];\n let imei_parts = access_imei.split(\"-\");\n let access_mac = imei_parts[1]; // extract the unique identifier for the accessory\n let host_imei = imei_parts[0];\n let accessory_type = data[3];\n // sendMessageToLocalhost(message); \n tasks = [{\n \"name\": \"Create accessory \" + access_imei,\n \"option\": \"sync\",\n \"type\": \"createDevice\",\n \"payload\": JSON.stringify({\n \"name\": accessory_type + \"-\" + access_mac,\n \"imei\": access_imei,\n \"parentImei\": host_imei,\n \"protocol\": \"Device Accessory\",\n \"abortOnError\": false,\n \"init\": true\n }),\n \"order\": 1\n }, {\n \"name\": \"Resend message for accessory \" + access_imei,\n \"option\": \"async\",\n \"type\": \"sendMessage\",\n \"payload\": JSON.stringify({\n \"message\": raw\n }),\n \"order\": 2\n }]\n }\n // modify to return the object that contains your data\n var msg = {\n 'values': deviceParams,\n };\n if (tasks.length > 0) {\n msg.tasks = tasks\n };\n if (configsToUpdate.length > 0) {\n msg.configsToUpdate = configsToUpdate\n }\n console.log(msg);\n return msg;\n // helper functions\n function AddValue(p1, p2) {\n var cvpair = {\n code: p1,\n value: p2\n };\n deviceParams.push(cvpair);\n }\n\n function UpdateConfig(configName, newvalue) {\n if (newvalue !== undefined) { // don't add if newvalue is undefined\n var cvpair = {\n 'code': configName,\n 'value': newvalue // ? newvalue : \"Not Defined\" \n };\n configsToUpdate.push(cvpair);\n };\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// params is not defined locally -> export as module\nif (typeof(params) === 'undefined') {\n module.exports = {\n execute_ops\n }\n} else { // on server use local defined vars\n let return_values = execute_ops(moment, msg, net, params, rawFromBytes, raw, oystaTemplate, globalTemplate, arrays, commandsToExecute, serverParams, messageTypeCode, messageTypeLocalCode, messageTypeName, configs, configIds, commandsWaiting, false)\n // define global returns\n msg = return_values;\n}","Type":0,"ProtocolActionObjects":[]}],"Groups":[{"Id":7491,"Parent":null,"Name":"root","Json":"{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":7492,"Parent":{"Id":7491,"Name":"root","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7492,"Name":"Accessory","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7493,"Name":"Host","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"Accessory","Json":"{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]},{"Id":7493,"Parent":{"Id":7491,"Name":"root","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7492,"Name":"Accessory","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},{"Id":7493,"Name":"Host","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Name":"Host","Json":"{\"description\":null,\"columns\":1,\"order\":1,\"listSize\":1,\"toTranslate\":[\"name\",\"description\"]}","DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"LanguageId":null,"ProtocolActionObjects":[]}],"GroupParams":[{"Id":12403,"Group":{"Id":7492,"Name":"Accessory","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7491,"Name":"root","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7493,"Name":"Host","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Type","Json":"{\"name\":\"Type\",\"default\":\"\",\"description\":\"Type\",\"type\":\"text\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12401,"Group":{"Id":7492,"Name":"Accessory","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7491,"Name":"root","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7493,"Name":"Host","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Battery","Json":"{\"name\":\"Battery\",\"default\":\"\",\"description\":\"Battery\",\"type\":\"number\",\"suffix\":\"%\",\"prefix\":null,\"min\":0,\"max\":100,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12402,"Group":{"Id":7492,"Name":"Accessory","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7491,"Name":"root","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7493,"Name":"Host","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Last Updated","Json":"{\"name\":\"Last Updated\",\"default\":\"\",\"description\":\"Last Updated\",\"type\":\"datetime\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":false,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]},{"Id":12400,"Group":{"Id":7493,"Name":"Host","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":{"Id":7491,"Name":"root","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Parent":null,"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[{"Id":7492,"Name":"Accessory","Json":{"description":null,"columns":1,"order":1,"listSize":1,"toTranslate":["name","description"]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]}]},"Device":null,"DeviceRelated":false,"IsList":false,"IsAdminOnly":false,"Deleted":false,"Children":[]},"Name":"Host Imei","Json":"{\"name\":\"Host Imei\",\"default\":\"\",\"description\":null,\"type\":\"text\",\"suffix\":null,\"prefix\":null,\"min\":null,\"max\":null,\"futureOnly\":false,\"integerOnly\":false,\"isReadOnly\":true,\"isHidden\":false,\"minLength\":null,\"maxLength\":null,\"helpText\":null,\"options\":[],\"toTranslate\":[\"name\",\"description\",\"helpText\"]}","Default":"","Command":null,"ProtocolActionObjects":[],"LanguageId":null,"Tags":[]}],"ProtocolChanges":[],"ProtocolActionObjects":[],"Tags":[],"MessageCodes":[]}