From 230ed70d00f68985c24eb6ad04398402434b8651 Mon Sep 17 00:00:00 2001 From: thingsboard017 Date: Thu, 19 Dec 2024 17:26:27 +0200 Subject: [PATCH] Added 4 LNS integrations for Aura --- .../Aura/ChirpStack/uplink/converter.json | 39 +++++++++ .../Aura/ChirpStack/uplink/metadata.json | 4 + .../Aura/ChirpStack/uplink/payload.json | 48 +++++++++++ .../Aura/ChirpStack/uplink/result.json | 27 ++++++ .../Aura/LORIOT/uplink/converter.json | 29 +++++++ .../Tektelic/Aura/LORIOT/uplink/metadata.json | 4 + .../Tektelic/Aura/LORIOT/uplink/payload.json | 17 ++++ .../Tektelic/Aura/LORIOT/uplink/result.json | 17 ++++ .../uplink/converter.json | 39 +++++++++ .../ThingsStackCommunity/uplink/metadata.json | 4 + .../ThingsStackCommunity/uplink/payload.json | 54 ++++++++++++ .../ThingsStackCommunity/uplink/result.json | 28 +++++++ .../uplink/converter.json | 40 +++++++++ .../uplink/metadata.json | 4 + .../ThingsStackIndustries/uplink/payload.json | 77 ++++++++++++++++++ .../ThingsStackIndustries/uplink/result.json | 28 +++++++ VENDORS/Tektelic/Aura/info.json | 5 ++ VENDORS/Tektelic/Aura/photo.png | Bin 0 -> 113371 bytes 18 files changed, 464 insertions(+) create mode 100644 VENDORS/Tektelic/Aura/ChirpStack/uplink/converter.json create mode 100644 VENDORS/Tektelic/Aura/ChirpStack/uplink/metadata.json create mode 100644 VENDORS/Tektelic/Aura/ChirpStack/uplink/payload.json create mode 100644 VENDORS/Tektelic/Aura/ChirpStack/uplink/result.json create mode 100644 VENDORS/Tektelic/Aura/LORIOT/uplink/converter.json create mode 100644 VENDORS/Tektelic/Aura/LORIOT/uplink/metadata.json create mode 100644 VENDORS/Tektelic/Aura/LORIOT/uplink/payload.json create mode 100644 VENDORS/Tektelic/Aura/LORIOT/uplink/result.json create mode 100644 VENDORS/Tektelic/Aura/ThingsStackCommunity/uplink/converter.json create mode 100644 VENDORS/Tektelic/Aura/ThingsStackCommunity/uplink/metadata.json create mode 100644 VENDORS/Tektelic/Aura/ThingsStackCommunity/uplink/payload.json create mode 100644 VENDORS/Tektelic/Aura/ThingsStackCommunity/uplink/result.json create mode 100644 VENDORS/Tektelic/Aura/ThingsStackIndustries/uplink/converter.json create mode 100644 VENDORS/Tektelic/Aura/ThingsStackIndustries/uplink/metadata.json create mode 100644 VENDORS/Tektelic/Aura/ThingsStackIndustries/uplink/payload.json create mode 100644 VENDORS/Tektelic/Aura/ThingsStackIndustries/uplink/result.json create mode 100644 VENDORS/Tektelic/Aura/info.json create mode 100644 VENDORS/Tektelic/Aura/photo.png diff --git a/VENDORS/Tektelic/Aura/ChirpStack/uplink/converter.json b/VENDORS/Tektelic/Aura/ChirpStack/uplink/converter.json new file mode 100644 index 00000000..3601cc1d --- /dev/null +++ b/VENDORS/Tektelic/Aura/ChirpStack/uplink/converter.json @@ -0,0 +1,39 @@ +{ + "name": "ChirpStack Uplink Decoder for Aura", + "type": "UPLINK", + "debugMode": false, + "debugSettings": { + "failuresEnabled": true, + "allEnabled": false, + "allEnabledUntil": 1733331880270 + }, + "configuration": { + "scriptLang": "TBEL", + "decoder": null, + "tbelDecoder": "var data = decodeToJson(payload);\nvar deviceName = data.deviceInfo.deviceName + \" \" + data.deviceInfo.devEui;\nvar deviceType = \"Aura\";\nvar groupName = null; // If groupName is not null - created device will be added to the entity group with such name.\nvar customerName = null; // If customerName is not null - created devices will be assigned to customer with such name. \n\n// use assetName and assetType instead of deviceName and deviceType\n// to automatically create assets instead of devices.\n// var assetName = 'Asset A';\n// var assetType = 'building';\n\n// If you want to parse incoming data somehow, you can add your code to this function.\n// input: bytes\n// expected output:\n// {\n// \"attributes\": {\"attributeKey\": \"attributeValue\"},\n// \"telemetry\": [{\"ts\": 1...1, \"values\": {\"telemetryKey\":\"telemetryValue\"}, {\"ts\": 1...2, \"values\": {\"telemetryKey\":\"telemetryValue\"}}]\n// }\n\nfunction decodePayload(input) {\n var output = {\n attributes: {},\n telemetry: []\n };\n \n // --- Decoding code --- //\n var decoded = {};\n var fPort = data.fPort;\n if(fPort == 10) {\n for(var i = 0; i < input.length - 2; ) {\n var key_1 = input[i++] & 0xff;\n var key_2 = input[i++] & 0xff;\n \n if(key_1 == 0x00 && key_2 == 0xFE) {\n decoded.energy_consumption_meter_elapsed = parseBytesToInt(input, i, 4);\n decoded.energy_consumption_meter_consumed = parseBytesToInt(input, i + 4, 4);\n i += 8;\n }\n else if(key_1 == 0x00 && key_2 == 0x00) {\n decoded.energy_consumption_meter_status = parseBytesToInt(input, i, 1);\n if(decoded.energy_consumption_meter_status != 0) {\n decoded.energy_consumption_meter_status != 1;\n }\n }\n else if(key_1 == 0x00 && key_2 == 0x74) {\n decoded.voltmeter = (input[i] << 8) | (input[i + 1] & 0xFF);\n if (decoded.voltmeter != 65535) {\n decoded.voltmeter = decoded.voltmeter * 10;\n }\n \n i += 2;\n }\n else if(key_1 == 0x00 && key_2 == 0x75) {\n decoded.voltmeter = (input[i] << 8) | (input[i + 1] & 0xFF);\n if (decoded.ammeter != 65535) {\n decoded.ammeter = decoded.ammeter * 10;\n }\n \n i += 2;\n }\n else if(key_1 == 0x00 && key_2 == 0x80) {\n decoded.real_power = (input[i] << 8) | (input[i + 1] & 0xFF);\n if (decoded.real_power != 65535) {\n decoded.real_power = decoded.real_power * 10;\n }\n \n i += 2;\n }\n else if(key_1 == 0x01 && key_2 == 0x80) {\n decoded.apparent_power = (input[i] << 8) | (input[i + 1] & 0xFF);\n if (decoded.apparent_power != 65535) {\n decoded.apparent_power = decoded.apparent_power * 10;\n }\n \n i += 2;\n }\n else if(key_1 == 0x00 && key_2 == 0x81) {\n decoded.power_factor_meter = input[i] & 0xFF;\n if (decoded.power_factor_meter != 65535) {\n decoded.power_factor_meter = decoded.power_factor_meter * 100;\n }\n \n i += 1;\n }\n else if(key_1 == 0x00 && key_2 == 0x01) {\n decoded.relay_status = input[i] & 0xFF;\n \n if (decoded.relay_status != 0) {\n decoded.relay_status = 1;\n }\n \n i += 1;\n }\n }\n }\n else if (fPort == 100) {\n for(var i = 0; i < input.length -1; ) {\n var key = input[i++] & 0xff;\n \n if(key == 0x00) {\n output.attributes.eui = bytesToHex(java.util.Arrays.copyRange(input, i, i + 8));\n i += 8;\n }\n else if(key == 0x01) {\n output.attributes.app_eui = bytesToHex(java.util.Arrays.copyRange(input, i, i + 8));\n\t\t\t\ti += 8;\n }\n else if (key == 0x02) {\n output.attributes.app_key = bytesToHex(java.util.Arrays.copyRange(input, i, i + 16));\n i += 16;\n }\n else if (key == 0x03) {\n output.attributes.devAddr = bytesToHex(java.util.Arrays.copyRange(input, i, i + 4));\n i += 4;\n }\n else if(key == 0x04) {\n output.attributes.network_session_key = bytesToHex(java.util.Arrays.copyRange(input, i, i + 16));\n i += 16;\n }\n else if(key == 0x05) {\n output.attributes.app_session_key = bytesToHex(java.util.Arrays.copyRange(input, i, i + 16));\n i += 16;\n }\n else if(key == 0x10) {\n output.attributes.loramac_join_mode = (input[i] >> 7) & 1;\n i += 2;\n }\n else if (key == 0x11) {\n var val = (input[i] >> 4) & 0x0F;\n \n if(val == 0x0C) {\n output.attributes.lora_class = \"Class C\";\n }\n else if(val == 0x0B) {\n output.attributes.lora_class = \"Class B\";\n }\n else if(val == 0x0A) {\n output.attributes.lora_class = \"Class F\";\n }\n else {\n output.attributes.lora_class = \"Invalid\";\n }\n\t\t\t\t\n\t\t\t\toutput.attributes.confirm_mode = (input[i] >> 8) & 1; \n\t\t\t\toutput.attributes.sync_word = (input[i] >> 9) & 1;\n\t\t\t\toutput.attributes.duty_cycle = (input[i] >> 10) & 1;\n\t\t\t\toutput.attributes.adr = (input[i] >> 11) & 1; \n\t\t\t\t\n\t\t\t\ti += 2;\n }\n else if (key == 0x12) {\n output.attributes.dr_number = (((input[i] << 8) | input[i + 1]) >> 8) & 0xF;\n output.attributes.tx_power_number = ((input[i] << 8) | input[i + 1]) & 0xF;\n \n i +=2;\n }\n else if (key == 0x13) {\n output.attributes.frequency = (((input[i] << 32) | (input[i + 1] << 24) | (input[i + 2] << 16) | (input[i + 3] << 8) | input[i + 4]) >> 8) & 0xFFFFFFFF;\n output.attributes.dr_number_rx2 = input[i + 4] & 0xFF;\n \n i += 5;\n }\n else if(key == 0x19) {\n output.attributes.netid_msb = parseBytesToInt(input, i, 2);\n i += 2;\n }\n else if (key == 0x20) {\n output.attributes.seconds_per_core_tick = parseBytesToInt(input, i, 4);\n i += 4;\n }\n else if(key == 0x21) {\n output.attributes.tick_per_battery = parseBytesToInt(input, i, 2);\n i += 2;\n }\n else if(key == 0x71) {\n output.attributes.app_major_version = input[i];\n\t\t\t\toutput.attributes.app_minor_version = input[i + 1];\n\t\t\t\toutput.attributes.app_revision = input[i + 2];\n\t\t\t\toutput.attributes.loramac_major_version = input[i + 3];\n\t\t\t\toutput.attributes.loramac_minor_version = input[i + 4];\n\t\t\t\toutput.attributes.loramac_revision = input[i + 5];\n\t\t\t\toutput.attributes.region = input[i + 7];\n\t\t\t\ti += 7;\n }\n }\n }\n\n output.telemetry = [{\n ts: timestamp,\n values: decoded\n }];\n // --- Decoding code --- //\n return output;\n}\n\n// --- attributes and telemetry objects ---\nvar telemetry = [];\nvar attributes = {};\n// --- attributes and telemetry objects ---\n\n// --- Timestamp parsing\nvar dateString = data.time;\ntimestamp = parseDateToTimestamp(dateString);\n// --- Timestamp parsing\n\n// Passing incoming bytes to decodePayload function, to get custom decoding\nvar customDecoding = decodePayload(base64ToBytes(data.data));\n\n\nattributes.eui = data.deviceInfo.devEui;\n\n// Collecting data to result\nif (customDecoding.?telemetry.size() > 0) {\n if (customDecoding.telemetry instanceof java.util.ArrayList) {\n foreach(telemetryObj: customDecoding.telemetry) {\n if (telemetryObj.ts != null && telemetryObj.values != null) {\n telemetry.add(telemetryObj);\n }\n }\n } else {\n telemetry.putAll(customDecoding.telemetry);\n }\n}\n\nif (customDecoding.?attributes.size() > 0) {\n attributes.putAll(customDecoding.attributes);\n}\n\n// You can add some keys manually to attributes or telemetry\nattributes.eui = data.deviceInfo.?devEui;\nattributes.devAddr = data.devAddr;\nattributes.fPort = data.fPort;\nattributes.applicationId = data.deviceInfo.?applicationId;\nattributes.applicationName = data.deviceInfo.?applicationName;\nattributes.tenantId = data.deviceInfo.?tenantId;\nattributes.tenantName = data.deviceInfo.?tenantName;\nattributes.deviceProfileId = data.deviceInfo.?deviceProfileId;\nattributes.deviceProfileName = data.deviceInfo.?deviceProfileName;\nattributes.frequency = data.txInfo.?frequency;\nattributes.bandwidth = data.txInfo.?modulation.?lora.?bandwidth;\nattributes.spreadingFactor = data.txInfo.?modulation.?lora.?spreadingFactor;\nattributes.codeRate = data.txInfo.?modulation.?lora.?codeRate;\n\nif(Boolean.parseBoolean(metadata[\"includeGatewayInfo\"])) {\n var gatewayInfo = getGatewayInfo();\n var addDataToTelemetry = {};\n addDataToTelemetry.snr = gatewayInfo.snr;\n addDataToTelemetry.rssi = gatewayInfo.rssi;\n addDataToTelemetry.channel = gatewayInfo.channel;\n addDataToTelemetry.rfChain = gatewayInfo.rfChain;\n addDataToTelemetry.fCnt = data.fCnt;\n \n telemetry = processTelemetryData(telemetry, addDataToTelemetry);\n}\n\nvar result = {\n deviceName: deviceName,\n deviceType: deviceType,\n // assetName: assetName,\n // assetType: assetType,\n attributes: attributes,\n telemetry: telemetry\n};\n\naddAdditionalInfoForDeviceMsg(result, customerName, groupName);\n\nreturn result;\n\nfunction addAdditionalInfoForDeviceMsg(deviceInfo, customerName, groupName) {\n if (customerName != null) {\n deviceInfo.customerName = customerName;\n }\n if (groupName != null) {\n deviceInfo.groupName = groupName;\n }\n}\n\nfunction parseDateToTimestamp(dateString) {\n var date = new Date(dateString);\n var timestamp = date.getTime();\n \n // If we cannot parse timestamp - we will use the current timestamp\n if (timestamp == -1) {\n timestamp = Date.now();\n }\n \n return timestamp;\n}\n\nfunction getGatewayInfo() {\n var gatewayList = data.rxInfo;\n var maxRssi = Integer.MIN_VALUE;\n var gatewayInfo = {};\n \n foreach (gateway : gatewayList) {\n if(gateway.rssi > maxRssi) {\n maxRssi = gateway.rssi;\n gatewayInfo = gateway;\n }\n }\n \n return gatewayInfo;\n}\n\nfunction processTelemetryData(telemetry, addDataToTelemetry) {\n if (telemetry.size >= 1) {\n telemetry = addDataToTelemetries(telemetry, addDataToTelemetry);\n }\n else {\n telemetry.add(addDataToTelemetry);\n }\n \n return telemetry;\n}\n\nfunction addDataToTelemetries(telemetries, addDataToTelemetry) {\n foreach(telemetry : telemetries) {\n foreach(element : addDataToTelemetry.entrySet()) {\n if(!telemetry[\"values\"].keys.contains(element.key)) {\n telemetry[\"values\"][element.key] = element.value;\n }\n } \n }\n \n return telemetries;\n}", + "encoder": null, + "tbelEncoder": null, + "updateOnlyKeys": [ + "tenantId", + "tenantName", + "applicationId", + "applicationName", + "deviceProfileId", + "deviceProfileName", + "devAddr", + "fPort", + "frequency", + "bandwidth", + "spreadingFactor", + "codeRate", + "channel", + "rfChain", + "eui", + "battery" + ] + }, + "additionalInfo": { + "description": "" + }, + "edgeTemplate": false +} \ No newline at end of file diff --git a/VENDORS/Tektelic/Aura/ChirpStack/uplink/metadata.json b/VENDORS/Tektelic/Aura/ChirpStack/uplink/metadata.json new file mode 100644 index 00000000..23f54b34 --- /dev/null +++ b/VENDORS/Tektelic/Aura/ChirpStack/uplink/metadata.json @@ -0,0 +1,4 @@ +{ + "integrationName": "ChirpStack integration", + "includeGatewayInfo": "false" +} \ No newline at end of file diff --git a/VENDORS/Tektelic/Aura/ChirpStack/uplink/payload.json b/VENDORS/Tektelic/Aura/ChirpStack/uplink/payload.json new file mode 100644 index 00000000..1ac72155 --- /dev/null +++ b/VENDORS/Tektelic/Aura/ChirpStack/uplink/payload.json @@ -0,0 +1,48 @@ +{ + "deduplicationId": "57433366-50a6-4dc2-8145-2df1bbc70d9e", + "time": "2023-05-22T07:47:05.404859+00:00", + "deviceInfo": { + "tenantId": "52f14cd4-c6f1-4fbd-8f87-4025e1d49242", + "tenantName": "ChirpStack", + "applicationId": "ca739e26-7b67-4f14-b69e-d568c22a5a75", + "applicationName": "Chirpstack application", + "deviceProfileId": "605d08d4-65f5-4d2c-8a5a-3d2457662f79", + "deviceProfileName": "Chirpstack default device profile", + "deviceName": "Device name", + "devEui": "1000000000000001", + "tags": {} + }, + "devAddr": "20000001", + "adr": true, + "dr": 5, + "fCnt": 4, + "fPort": 10, + "confirmed": false, + "data": "AP4AAVGAAABqUAAAAA==", + "rxInfo": [{ + "gatewayId": "6a7e111a10000000", + "uplinkId": 24022, + "time": "2023-05-22T07:47:05.404859+00:00", + "rssi": -35, + "snr": 11.5, + "channel": 2, + "rfChain": 1, + "location": {}, + "context": "EFwMtA==", + "metadata": { + "region_common_name": "EU868", + "region_config_id": "eu868" + }, + "crcStatus": "CRC_OK" + }], + "txInfo": { + "frequency": 868500000, + "modulation": { + "lora": { + "bandwidth": 125000, + "spreadingFactor": 7, + "codeRate": "CR_4_5" + } + } + } +} \ No newline at end of file diff --git a/VENDORS/Tektelic/Aura/ChirpStack/uplink/result.json b/VENDORS/Tektelic/Aura/ChirpStack/uplink/result.json new file mode 100644 index 00000000..d723b7d5 --- /dev/null +++ b/VENDORS/Tektelic/Aura/ChirpStack/uplink/result.json @@ -0,0 +1,27 @@ +{ + "deviceName": "Device name 1000000000000001", + "deviceType": "Aura", + "attributes": { + "eui": "1000000000000001", + "devAddr": "20000001", + "fPort": 10, + "applicationId": "ca739e26-7b67-4f14-b69e-d568c22a5a75", + "applicationName": "Chirpstack application", + "tenantId": "52f14cd4-c6f1-4fbd-8f87-4025e1d49242", + "tenantName": "ChirpStack", + "deviceProfileId": "605d08d4-65f5-4d2c-8a5a-3d2457662f79", + "deviceProfileName": "Chirpstack default device profile", + "frequency": 868500000, + "bandwidth": 125000, + "spreadingFactor": 7, + "codeRate": "CR_4_5" + }, + "telemetry": [{ + "ts": 1684741625404, + "values": { + "energy_consumption_meter_elapsed": 86400, + "energy_consumption_meter_consumed": 27216, + "energy_consumption_meter_status": 0 + } + }] +} \ No newline at end of file diff --git a/VENDORS/Tektelic/Aura/LORIOT/uplink/converter.json b/VENDORS/Tektelic/Aura/LORIOT/uplink/converter.json new file mode 100644 index 00000000..7de9b7ad --- /dev/null +++ b/VENDORS/Tektelic/Aura/LORIOT/uplink/converter.json @@ -0,0 +1,29 @@ +{ + "name": "Loriot Uplink Decoder for Aura", + "type": "UPLINK", + "debugMode": false, + "debugSettings": { + "failuresEnabled": true, + "allEnabled": false, + "allEnabledUntil": 1733331880270 + }, + "configuration": { + "scriptLang": "TBEL", + "decoder": "// Decode an uplink message from a buffer\n// payload - array of bytes\n// metadata - key/value object\n\n/** Decoder **/\n\n// decode payload to string\nvar payloadStr = decodeToString(payload);\n\n// decode payload to JSON\n// var data = decodeToJson(payload);\n\nvar deviceName = 'Device A';\nvar deviceType = 'thermostat';\nvar customerName = 'Customer C';\nvar groupName = 'thermostat devices';\nvar manufacturer = 'Example corporation';\n// use assetName and assetType instead of deviceName and deviceType\n// to automatically create assets instead of devices.\n// var assetName = 'Asset A';\n// var assetType = 'building';\n\n// Result object with device/asset attributes/telemetry data\nvar result = {\n// Use deviceName and deviceType or assetName and assetType, but not both.\n deviceName: deviceName,\n deviceType: deviceType,\n// assetName: assetName,\n// assetType: assetType,\n// customerName: customerName,\n groupName: groupName,\n attributes: {\n model: 'Model A',\n serialNumber: 'SN111',\n integrationName: metadata['integrationName'],\n manufacturer: manufacturer\n },\n telemetry: {\n temperature: 42,\n humidity: 80,\n rawData: payloadStr\n }\n};\n\n/** Helper functions **/\n\nfunction decodeToString(payload) {\n return String.fromCharCode.apply(String, payload);\n}\n\nfunction decodeToJson(payload) {\n // covert payload to string.\n var str = decodeToString(payload);\n\n // parse string to JSON\n var data = JSON.parse(str);\n return data;\n}\n\nreturn result;", + "tbelDecoder": "var data = decodeToJson(payload);\nvar deviceName = data.EUI;\nvar deviceType = \"Aura\";\nvar groupName = null; // If groupName is not null - created device will be added to the entity group with such name.\nvar customerName = null; // If customerName is not null - created devices will be assigned to customer with such name. \n\n// use assetName and assetType instead of deviceName and deviceType\n// to automatically create assets instead of devices.\n// var assetName = 'Asset A';\n// var assetType = 'building';\n\n// If you want to parse incoming data somehow, you can add your code to this function.\n// input: bytes\n// expected output:\n// {\n// \"attributes\": {\"attributeKey\": \"attributeValue\"},\n// \"telemetry\": {\"telemetryKey\": \"telemetryValue\"}\n// }\n\nfunction decodePayload(input) {\n var output = { attributes: {}, telemetry: []};\n \n var decoded = {};\n var fPort = data.port;\n if(fPort == 10) {\n for(var i = 0; i < input.length - 2; ) {\n var key_1 = input[i++] & 0xff;\n var key_2 = input[i++] & 0xff;\n \n if(key_1 == 0x00 && key_2 == 0xFE) {\n decoded.energy_consumption_meter_elapsed = parseBytesToInt(input, i, 4);\n decoded.energy_consumption_meter_consumed = parseBytesToInt(input, i + 4, 4);\n i += 8;\n }\n else if(key_1 == 0x00 && key_2 == 0x00) {\n decoded.energy_consumption_meter_status = parseBytesToInt(input, i, 1);\n if(decoded.energy_consumption_meter_status != 0) {\n decoded.energy_consumption_meter_status != 1;\n }\n }\n else if(key_1 == 0x00 && key_2 == 0x74) {\n decoded.voltmeter = (input[i] << 8) | (input[i + 1] & 0xFF);\n if (decoded.voltmeter != 65535) {\n decoded.voltmeter = decoded.voltmeter * 10;\n }\n \n i += 2;\n }\n else if(key_1 == 0x00 && key_2 == 0x75) {\n decoded.voltmeter = (input[i] << 8) | (input[i + 1] & 0xFF);\n if (decoded.ammeter != 65535) {\n decoded.ammeter = decoded.ammeter * 10;\n }\n \n i += 2;\n }\n else if(key_1 == 0x00 && key_2 == 0x80) {\n decoded.real_power = (input[i] << 8) | (input[i + 1] & 0xFF);\n if (decoded.real_power != 65535) {\n decoded.real_power = decoded.real_power * 10;\n }\n \n i += 2;\n }\n else if(key_1 == 0x01 && key_2 == 0x80) {\n decoded.apparent_power = (input[i] << 8) | (input[i + 1] & 0xFF);\n if (decoded.apparent_power != 65535) {\n decoded.apparent_power = decoded.apparent_power * 10;\n }\n \n i += 2;\n }\n else if(key_1 == 0x00 && key_2 == 0x81) {\n decoded.power_factor_meter = input[i] & 0xFF;\n if (decoded.power_factor_meter != 65535) {\n decoded.power_factor_meter = decoded.power_factor_meter * 100;\n }\n \n i += 1;\n }\n else if(key_1 == 0x00 && key_2 == 0x01) {\n decoded.relay_status = input[i] & 0xFF;\n \n if (decoded.relay_status != 0) {\n decoded.relay_status = 1;\n }\n \n i += 1;\n }\n }\n }\n else if (fPort == 100) {\n for(var i = 0; i < input.length -1; ) {\n var key = input[i++] & 0xff;\n \n if(key == 0x00) {\n output.attributes.eui = bytesToHex(java.util.Arrays.copyRange(input, i, i + 8));\n i += 8;\n }\n else if(key == 0x01) {\n output.attributes.app_eui = bytesToHex(java.util.Arrays.copyRange(input, i, i + 8));\n\t\t\t\ti += 8;\n }\n else if (key == 0x02) {\n output.attributes.app_key = bytesToHex(java.util.Arrays.copyRange(input, i, i + 16));\n i += 16;\n }\n else if (key == 0x03) {\n output.attributes.devAddr = bytesToHex(java.util.Arrays.copyRange(input, i, i + 4));\n i += 4;\n }\n else if(key == 0x04) {\n output.attributes.network_session_key = bytesToHex(java.util.Arrays.copyRange(input, i, i + 16));\n i += 16;\n }\n else if(key == 0x05) {\n output.attributes.app_session_key = bytesToHex(java.util.Arrays.copyRange(input, i, i + 16));\n i += 16;\n }\n else if(key == 0x10) {\n output.attributes.loramac_join_mode = (input[i] >> 7) & 1;\n i += 2;\n }\n else if (key == 0x11) {\n var val = (input[i] >> 4) & 0x0F;\n \n if(val == 0x0C) {\n output.attributes.lora_class = \"Class C\";\n }\n else if(val == 0x0B) {\n output.attributes.lora_class = \"Class B\";\n }\n else if(val == 0x0A) {\n output.attributes.lora_class = \"Class F\";\n }\n else {\n output.attributes.lora_class = \"Invalid\";\n }\n\t\t\t\t\n\t\t\t\toutput.attributes.confirm_mode = (input[i] >> 8) & 1; \n\t\t\t\toutput.attributes.sync_word = (input[i] >> 9) & 1;\n\t\t\t\toutput.attributes.duty_cycle = (input[i] >> 10) & 1;\n\t\t\t\toutput.attributes.adr = (input[i] >> 11) & 1; \n\t\t\t\t\n\t\t\t\ti += 2;\n }\n else if (key == 0x12) {\n output.attributes.dr_number = (((input[i] << 8) | input[i + 1]) >> 8) & 0xF;\n output.attributes.tx_power_number = ((input[i] << 8) | input[i + 1]) & 0xF;\n \n i +=2;\n }\n else if (key == 0x13) {\n output.attributes.frequency = (((input[i] << 32) | (input[i + 1] << 24) | (input[i + 2] << 16) | (input[i + 3] << 8) | input[i + 4]) >> 8) & 0xFFFFFFFF;\n output.attributes.dr_number_rx2 = input[i + 4] & 0xFF;\n \n i += 5;\n }\n else if(key == 0x19) {\n output.attributes.netid_msb = parseBytesToInt(input, i, 2);\n i += 2;\n }\n else if (key == 0x20) {\n output.attributes.seconds_per_core_tick = parseBytesToInt(input, i, 4);\n i += 4;\n }\n else if(key == 0x21) {\n output.attributes.tick_per_battery = parseBytesToInt(input, i, 2);\n i += 2;\n }\n else if(key == 0x71) {\n output.attributes.app_major_version = input[i];\n\t\t\t\toutput.attributes.app_minor_version = input[i + 1];\n\t\t\t\toutput.attributes.app_revision = input[i + 2];\n\t\t\t\toutput.attributes.loramac_major_version = input[i + 3];\n\t\t\t\toutput.attributes.loramac_minor_version = input[i + 4];\n\t\t\t\toutput.attributes.loramac_revision = input[i + 5];\n\t\t\t\toutput.attributes.region = input[i + 7];\n\t\t\t\ti += 7;\n }\n }\n }\n \n output.telemetry = [{\n ts: timestamp,\n values: decoded\n }];\n\n // --- Decoding code --- //\n return output;\n}\n\n// --- attributes and telemetry objects ---\nvar telemetry = [];\nvar attributes = {};\n// --- attributes and telemetry objects ---\n\n// --- Timestamp parsing\ntimestamp = data.ts;\n// --- Timestamp parsing\n\n// Message parsing\n// To avoid paths in the decoded objects we passing false value to function as \"pathInKey\" argument.\n// Warning: pathInKey can cause already found fields to be overwritten with the last value found.\n\nvar uplinkDataList = [];\n\n// Passing incoming bytes to decodePayload function, to get custom decoding\nvar customDecoding = decodePayload(hexToBytes(data.data));\n\n// Collecting data to result\nif (customDecoding.?telemetry.size() > 0) {\n if (customDecoding.telemetry instanceof java.util.ArrayList) {\n foreach(telemetryObj: customDecoding.telemetry) {\n if (telemetryObj.ts != null && telemetryObj.values != null) {\n telemetry.add(telemetryObj);\n }\n }\n } else {\n telemetry.putAll(customDecoding.telemetry);\n }\n}\n\nif (customDecoding.?attributes.size() > 0) {\n attributes.putAll(customDecoding.attributes);\n}\n\n// You can add some keys manually to attributes or telemetry\nattributes.eui = data.EUI;\nattributes.fPort = data.port;\nattributes.frequency = data.freq;\n\nvar isIncludeGatewayInfo = metadata[\"includeGatewayInfo\"];\nif(isIncludeGatewayInfo == true) {\n var addDataToTelemetry = {};\n addDataToTelemetry.rssi = data.rssi;\n addDataToTelemetry.seqno = data.seqno;\n addDataToTelemetry.snr = data.snr;\n addDataToTelemetry.ack = data.ack;\n addDataToTelemetry.toa = data.toa;\n addDataToTelemetry.fCnt = data.fcnt;\n \n telemetry = processTelemetryData(telemetry, addDataToTelemetry);\n}\n\nvar deviceInfo = {\n deviceName: deviceName,\n deviceType: deviceType,\n// assetName: assetName,\n// assetType: assetType,\n attributes: attributes,\n telemetry: telemetry, \n};\n\naddAdditionalInfoForDeviceMsg(deviceInfo, customerName, groupName);\n\nuplinkDataList.add(deviceInfo);\n\nvar gatewayDeviceNamePrefix = \"Gateway \";\nvar gatewayDeviceType = \"Lora gateway\";\nvar gatewayGroupName = null; // If gatewayGroupName is not null - created device will be added to the entity group with such name.\n\nif (data.cmd == \"gw\") {\n foreach( gatewayInfo : data.gws ) {\n var addGatewayInfo = {};\n\n // You can add some keys manually telemetry\n addGatewayInfo.rssi = gatewayInfo.rssi;\n addGatewayInfo.snr = gatewayInfo.snr;\n // You can add some keys manually telemetry\n \n var gatewayInfoMsg = {\n deviceName: gatewayDeviceNamePrefix + gatewayInfo.gweui,\n deviceType: gatewayDeviceType,\n telemetry: [{\n \"ts\": gatewayInfo.ts,\n \"values\": addGatewayInfo\n }],\n attributes: {\n eui: gatewayInfo.gweui\n }\n };\n addAdditionalInfoForDeviceMsg(gatewayInfoMsg, customerName, gatewayGroupName);\n uplinkDataList.add(gatewayInfoMsg);\n }\n}\n\nreturn uplinkDataList;\n\nfunction addAdditionalInfoForDeviceMsg(deviceInfo, customerName, groupName) {\n if (customerName != null) {\n deviceInfo.customerName = customerName;\n }\n if (groupName != null) {\n deviceInfo.groupName = groupName;\n }\n}\n\nfunction processTelemetryData(telemetry, addDataToTelemetry) {\n if (telemetry.size >= 1) {\n telemetry = addDataToTelemetries(telemetry, addDataToTelemetry);\n }\n else {\n telemetry.add(addDataToTelemetry);\n }\n \n return telemetry;\n}\n\nfunction addDataToTelemetries(telemetries, addDataToTelemetry) {\n foreach(telemetry : telemetries) {\n foreach(element : addDataToTelemetry.entrySet()) {\n if(!telemetry[\"values\"].keys.contains(element.key)) {\n telemetry[\"values\"][element.key] = element.value;\n }\n } \n }\n \n return telemetries;\n}", + "encoder": null, + "tbelEncoder": null, + "updateOnlyKeys": [ + "fPort", + "ack", + "eui", + "frequency", + "dr", + "battery" + ] + }, + "additionalInfo": { + "description": "" + }, + "edgeTemplate": false +} \ No newline at end of file diff --git a/VENDORS/Tektelic/Aura/LORIOT/uplink/metadata.json b/VENDORS/Tektelic/Aura/LORIOT/uplink/metadata.json new file mode 100644 index 00000000..ae2ee743 --- /dev/null +++ b/VENDORS/Tektelic/Aura/LORIOT/uplink/metadata.json @@ -0,0 +1,4 @@ +{ + "integrationName": "Loriot integration", + "includeGatewayInfo": "false" +} \ No newline at end of file diff --git a/VENDORS/Tektelic/Aura/LORIOT/uplink/payload.json b/VENDORS/Tektelic/Aura/LORIOT/uplink/payload.json new file mode 100644 index 00000000..0b10cef0 --- /dev/null +++ b/VENDORS/Tektelic/Aura/LORIOT/uplink/payload.json @@ -0,0 +1,17 @@ +{ + "cmd": "rx", + "seqno": 3040, + "EUI": "1000000000000001", + "ts": 1684478801936, + "fcnt": 2, + "port": 10, + "freq": 867500000, + "rssi": -21, + "snr": 10, + "toa": 206, + "dr": "SF9 BW125 4/5", + "ack": false, + "bat": 94, + "offline": false, + "data": "00FE0001518000006A50000000" +} \ No newline at end of file diff --git a/VENDORS/Tektelic/Aura/LORIOT/uplink/result.json b/VENDORS/Tektelic/Aura/LORIOT/uplink/result.json new file mode 100644 index 00000000..c0fbf70e --- /dev/null +++ b/VENDORS/Tektelic/Aura/LORIOT/uplink/result.json @@ -0,0 +1,17 @@ +[{ + "deviceName": "1000000000000001", + "deviceType": "Aura", + "attributes": { + "eui": "1000000000000001", + "fPort": 10, + "frequency": 867500000 + }, + "telemetry": [{ + "ts": 1684478801936, + "values": { + "energy_consumption_meter_elapsed": 86400, + "energy_consumption_meter_consumed": 27216, + "energy_consumption_meter_status": 0 + } + }] +}] \ No newline at end of file diff --git a/VENDORS/Tektelic/Aura/ThingsStackCommunity/uplink/converter.json b/VENDORS/Tektelic/Aura/ThingsStackCommunity/uplink/converter.json new file mode 100644 index 00000000..c5ea9ae3 --- /dev/null +++ b/VENDORS/Tektelic/Aura/ThingsStackCommunity/uplink/converter.json @@ -0,0 +1,39 @@ +{ + "name": "The Things Stack Community Uplink Decoder for Aura", + "type": "UPLINK", + "debugMode": false, + "debugSettings": { + "failuresEnabled": true, + "allEnabled": false, + "allEnabledUntil": 1733331880270 + }, + "configuration": { + "scriptLang": "TBEL", + "decoder": null, + "tbelDecoder": "var data = decodeToJson(payload);\n\nvar deviceName = data.end_device_ids.device_id;\nvar deviceType = \"Aura\";\nvar groupName = null; // If groupName is not null - created device will be added to the entity group with such name.\nvar customerName = null; // If customerName is not null - created devices will be assigned to customer with such name. \n\n// use assetName and assetType instead of deviceName and deviceType\n// to automatically create assets instead of devices.\n// var assetName = 'Asset A';\n// var assetType = 'building';\n\n// If you want to parse incoming data somehow, you can add your code to this function.\n// input: bytes\n// expected output:\n// {\n// \"attributes\": {\"attributeKey\": \"attributeValue\"},\n// \"telemetry\": [{\"ts\": 1...1, \"values\": {\"telemetryKey\":\"telemetryValue\"}, {\"ts\": 1...2, \"values\": {\"telemetryKey\":\"telemetryValue\"}}]\n// }\n\nfunction decodeFrmPayload(input) {\n var output = {\n attributes: {}, telemetry: {}\n };\n \n // --- Decoding code --- //\n var decoded = {};\n var fPort = data.uplink_message.f_port;\n if(fPort == 10) {\n for(var i = 0; i < input.length - 2; ) {\n var key_1 = input[i++] & 0xff;\n var key_2 = input[i++] & 0xff;\n \n if(key_1 == 0x00 && key_2 == 0xFE) {\n decoded.energy_consumption_meter_elapsed = parseBytesToInt(input, i, 4);\n decoded.energy_consumption_meter_consumed = parseBytesToInt(input, i + 4, 4);\n i += 8;\n }\n else if(key_1 == 0x00 && key_2 == 0x00) {\n decoded.energy_consumption_meter_status = parseBytesToInt(input, i, 1);\n if(decoded.energy_consumption_meter_status != 0) {\n decoded.energy_consumption_meter_status != 1;\n }\n }\n else if(key_1 == 0x00 && key_2 == 0x74) {\n decoded.voltmeter = (input[i] << 8) | (input[i + 1] & 0xFF);\n if (decoded.voltmeter != 65535) {\n decoded.voltmeter = decoded.voltmeter * 10;\n }\n \n i += 2;\n }\n else if(key_1 == 0x00 && key_2 == 0x75) {\n decoded.voltmeter = (input[i] << 8) | (input[i + 1] & 0xFF);\n if (decoded.ammeter != 65535) {\n decoded.ammeter = decoded.ammeter * 10;\n }\n \n i += 2;\n }\n else if(key_1 == 0x00 && key_2 == 0x80) {\n decoded.real_power = (input[i] << 8) | (input[i + 1] & 0xFF);\n if (decoded.real_power != 65535) {\n decoded.real_power = decoded.real_power * 10;\n }\n \n i += 2;\n }\n else if(key_1 == 0x01 && key_2 == 0x80) {\n decoded.apparent_power = (input[i] << 8) | (input[i + 1] & 0xFF);\n if (decoded.apparent_power != 65535) {\n decoded.apparent_power = decoded.apparent_power * 10;\n }\n \n i += 2;\n }\n else if(key_1 == 0x00 && key_2 == 0x81) {\n decoded.power_factor_meter = input[i] & 0xFF;\n if (decoded.power_factor_meter != 65535) {\n decoded.power_factor_meter = decoded.power_factor_meter * 100;\n }\n \n i += 1;\n }\n else if(key_1 == 0x00 && key_2 == 0x01) {\n decoded.relay_status = input[i] & 0xFF;\n \n if (decoded.relay_status != 0) {\n decoded.relay_status = 1;\n }\n \n i += 1;\n }\n }\n }\n else if (fPort == 100) {\n for(var i = 0; i < input.length -1; ) {\n var key = input[i++] & 0xff;\n \n if(key == 0x00) {\n output.attributes.eui = bytesToHex(java.util.Arrays.copyRange(input, i, i + 8));\n i += 8;\n }\n else if(key == 0x01) {\n output.attributes.app_eui = bytesToHex(java.util.Arrays.copyRange(input, i, i + 8));\n\t\t\t\ti += 8;\n }\n else if (key == 0x02) {\n output.attributes.app_key = bytesToHex(java.util.Arrays.copyRange(input, i, i + 16));\n i += 16;\n }\n else if (key == 0x03) {\n output.attributes.devAddr = bytesToHex(java.util.Arrays.copyRange(input, i, i + 4));\n i += 4;\n }\n else if(key == 0x04) {\n output.attributes.network_session_key = bytesToHex(java.util.Arrays.copyRange(input, i, i + 16));\n i += 16;\n }\n else if(key == 0x05) {\n output.attributes.app_session_key = bytesToHex(java.util.Arrays.copyRange(input, i, i + 16));\n i += 16;\n }\n else if(key == 0x10) {\n output.attributes.loramac_join_mode = (input[i] >> 7) & 1;\n i += 2;\n }\n else if (key == 0x11) {\n var val = (input[i] >> 4) & 0x0F;\n \n if(val == 0x0C) {\n output.attributes.lora_class = \"Class C\";\n }\n else if(val == 0x0B) {\n output.attributes.lora_class = \"Class B\";\n }\n else if(val == 0x0A) {\n output.attributes.lora_class = \"Class F\";\n }\n else {\n output.attributes.lora_class = \"Invalid\";\n }\n\t\t\t\t\n\t\t\t\toutput.attributes.confirm_mode = (input[i] >> 8) & 1; \n\t\t\t\toutput.attributes.sync_word = (input[i] >> 9) & 1;\n\t\t\t\toutput.attributes.duty_cycle = (input[i] >> 10) & 1;\n\t\t\t\toutput.attributes.adr = (input[i] >> 11) & 1; \n\t\t\t\t\n\t\t\t\ti += 2;\n }\n else if (key == 0x12) {\n output.attributes.dr_number = (((input[i] << 8) | input[i + 1]) >> 8) & 0xF;\n output.attributes.tx_power_number = ((input[i] << 8) | input[i + 1]) & 0xF;\n \n i +=2;\n }\n else if (key == 0x13) {\n output.attributes.frequency = (((input[i] << 32) | (input[i + 1] << 24) | (input[i + 2] << 16) | (input[i + 3] << 8) | input[i + 4]) >> 8) & 0xFFFFFFFF;\n output.attributes.dr_number_rx2 = input[i + 4] & 0xFF;\n \n i += 5;\n }\n else if(key == 0x19) {\n output.attributes.netid_msb = parseBytesToInt(input, i, 2);\n i += 2;\n }\n else if (key == 0x20) {\n output.attributes.seconds_per_core_tick = parseBytesToInt(input, i, 4);\n i += 4;\n }\n else if(key == 0x21) {\n output.attributes.tick_per_battery = parseBytesToInt(input, i, 2);\n i += 2;\n }\n else if(key == 0x71) {\n output.attributes.app_major_version = input[i];\n\t\t\t\toutput.attributes.app_minor_version = input[i + 1];\n\t\t\t\toutput.attributes.app_revision = input[i + 2];\n\t\t\t\toutput.attributes.loramac_major_version = input[i + 3];\n\t\t\t\toutput.attributes.loramac_minor_version = input[i + 4];\n\t\t\t\toutput.attributes.loramac_revision = input[i + 5];\n\t\t\t\toutput.attributes.region = input[i + 7];\n\t\t\t\ti += 7;\n }\n }\n }\n \n output.telemetry = [{\n ts: timestamp,\n values: decoded\n }];\n \n // --- Decoding code --- //\n return output;\n}\n\n\n// --- attributes and telemetry objects ---\nvar telemetry = [];\nvar attributes = {};\n// --- attributes and telemetry objects ---\n\n// --- Timestamp parsing\nvar dateString = data.uplink_message.received_at;\n// If data is simulated or device doesn't send his own date string - we will use date from upcoming message, set by network server\nif ((data.simulated != null && data.simulated) || dateString == null) {\n dateString = data.received_at;\n}\ntimestamp = parseDateToTimestamp(dateString);\n// --- Timestamp parsing\n\n// Message parsing\n// To avoid paths in the decoded objects we passing false value to function as \"pathInKey\" argument.\n// Warning: pathInKey can cause already found fields to be overwritten with the last value found, e.g. receive_at from uplink_message will be written receive_at in the root.\n\n// Passing incoming bytes to decodeFrmPayload function, to get custom decoding\nvar customDecoding = {};\nif (data.uplink_message.get(\"frm_payload\") != null) {\n customDecoding = decodeFrmPayload(base64ToBytes(data.uplink_message.frm_payload));\n}\n\n// Collecting data to result\nif (customDecoding.?telemetry.size() > 0) {\n if (customDecoding.telemetry instanceof java.util.ArrayList) {\n foreach(telemetryObj: customDecoding.telemetry) {\n if (telemetryObj.ts != null && telemetryObj.values != null) {\n telemetry.add(telemetryObj);\n }\n }\n } else {\n telemetry.putAll(customDecoding.telemetry);\n }\n}\n\nif (customDecoding.?attributes.size() > 0) {\n attributes.putAll(customDecoding.attributes);\n}\n\n// You can add some keys manually to attributes or telemetry\nvar applicationId = data.end_device_ids.?application_ids.?application_id;\nvar devAddr = data.end_device_ids.?dev_addr;\nvar spreadingFactor = data.uplink_message.?settings.?data_rate.?lora.?spreading_factor;\nvar codeRate = data.uplink_message.?settings.?data_rate.?lora.?coding_rate;\nvar tenantId = data.uplink_message.?network_ids.?tenant_id;\nattributes.eui = data.end_device_ids.dev_eui;\nattributes.fPort = data.uplink_message.f_port;\nattributes.applicationId = applicationId;\nattributes.devAddr = devAddr;\nattributes.spreadingFactor = spreadingFactor;\nattributes.codeRate = codeRate;\nattributes.tenantId = tenantId;\nattributes.device_id = data.end_device_ids.?device_id;\nattributes.join_eui = data.end_device_ids.?join_eui;\nattributes.net_id = data.uplink_message.?network_ids.?net_id;\nattributes.cluster_id = data.uplink_message.?network_ids.?cluster_id;\nattributes.cluster_adress = data.uplink_message.?network_ids.?cluster_address;\nattributes.bandwidth = data.uplink_message.?settings.?data_rate.?lora.?bandwidth;\nattributes.frequency = data.uplink_message.?settings.?frequency;\n\n\nvar gatewayInfo = getGatewayInfo();\nvar addDataToTelemetry = {};\naddDataToTelemetry.snr = gatewayInfo.snr;\naddDataToTelemetry.rssi = gatewayInfo.rssi;\naddDataToTelemetry.channel = gatewayInfo.channel_index;\naddDataToTelemetry.consumed_airtime = data.uplink_message.?consumed_airtime;\naddDataToTelemetry.fCnt = data.uplink_message.?f_cnt;\n\nvar isIncludeGatewayInfo = metadata[\"includeGatewayInfo\"];\nif(isIncludeGatewayInfo == true) {\n telemetry = processTelemetryData(telemetry, addDataToTelemetry);\n}\n\nvar result = {\n deviceName: deviceName,\n deviceType: deviceType,\n// assetName: assetName,\n// assetType: assetType,\n attributes: attributes,\n telemetry: telemetry\n};\n\naddAdditionalInfoForDeviceMsg(result, customerName, groupName);\n\nreturn result;\n\n\nfunction addAdditionalInfoForDeviceMsg(deviceInfo, customerName, groupName) {\n if (customerName != null) {\n deviceInfo.customerName = customerName;\n }\n if (groupName != null) {\n deviceInfo.groupName = groupName;\n }\n}\n\nfunction parseDateToTimestamp(dateString) {\n var date = new Date(dateString);\n var timestamp = date.getTime();\n \n // If we cannot parse timestamp - we will use the current timestamp\n if (timestamp == -1) {\n timestamp = Date.now();\n }\n \n return timestamp;\n}\n\nfunction getGatewayInfo() {\n var gatewayList = data.uplink_message.?rx_metadata;\n var maxRssi = Integer.MIN_VALUE;\n var gatewayInfo = {};\n \n foreach (gateway : gatewayList) {\n if(gateway.rssi > maxRssi) {\n maxRssi = gateway.rssi;\n gatewayInfo = gateway;\n }\n }\n \n return gatewayInfo;\n}\n\nfunction processTelemetryData(telemetry, addDataToTelemetry) {\n if (telemetry.size >= 1) {\n telemetry = addDataToTelemetries(telemetry, addDataToTelemetry);\n }\n else {\n telemetry.add(addDataToTelemetry);\n }\n \n return telemetry;\n}\n\nfunction addDataToTelemetries(telemetries, addDataToTelemetry) {\n foreach(telemetry : telemetries) {\n foreach(element : addDataToTelemetry.entrySet()) {\n if(!telemetry[\"values\"].keys.contains(element.key)) {\n telemetry[\"values\"][element.key] = element.value;\n }\n } \n }\n \n return telemetries;\n}", + "encoder": null, + "tbelEncoder": null, + "updateOnlyKeys": [ + "fPort", + "bandwidth", + "frequency", + "net_id", + "cluster_id", + "cluster_address", + "device_id", + "join_eui", + "battery", + "eui", + "channel", + "applicationId", + "devAddr", + "spreadingFactor", + "codeRate", + "tenantId" + ] + }, + "additionalInfo": { + "description": "" + }, + "edgeTemplate": false +} \ No newline at end of file diff --git a/VENDORS/Tektelic/Aura/ThingsStackCommunity/uplink/metadata.json b/VENDORS/Tektelic/Aura/ThingsStackCommunity/uplink/metadata.json new file mode 100644 index 00000000..0d75c374 --- /dev/null +++ b/VENDORS/Tektelic/Aura/ThingsStackCommunity/uplink/metadata.json @@ -0,0 +1,4 @@ +{ + "integrationName": "The Things Stack Community integration", + "includeGatewayInfo": "false" +} \ No newline at end of file diff --git a/VENDORS/Tektelic/Aura/ThingsStackCommunity/uplink/payload.json b/VENDORS/Tektelic/Aura/ThingsStackCommunity/uplink/payload.json new file mode 100644 index 00000000..9d86cc7d --- /dev/null +++ b/VENDORS/Tektelic/Aura/ThingsStackCommunity/uplink/payload.json @@ -0,0 +1,54 @@ +{ + "end_device_ids": { + "device_id": "eui-1000000000000001", + "application_ids": { + "application_id": "application-tts-name" + }, + "dev_eui": "1000000000000001", + "join_eui": "2000000000000001", + "dev_addr": "20000001" + }, + "correlation_ids": ["as:up:01H0S7ZJQ9MQPMVY49FT3SE07M", "gs:conn:01H03BQZ9342X3Y86DJ2P704E5", "gs:up:host:01H03BQZ99EGAM52KK1300GFKN", "gs:uplink:01H0S7ZJGS6D9TJSKJN8XNTMAV", "ns:uplink:01H0S7ZJGS9KKD4HTTPKFEMWCV", "rpc:/ttn.lorawan.v3.GsNs/HandleUplink:01H0S7ZJGSF3M38ZRZVTM38DEC", "rpc:/ttn.lorawan.v3.NsAs/HandleUplink:01H0S7ZJQ8R2EH5AA269AKM8DX"], + "received_at": "2023-05-19T05:33:35.848446463Z", + "uplink_message": { + "session_key_id": "AYfqmb0pc/1uRZv9xUydgQ==", + "f_port": 10, + "f_cnt": 10335, + "frm_payload": "AP4AAVGAAABqUAAAAA==", + "rx_metadata": [{ + "gateway_ids": { + "gateway_id": "eui-6a7e111a10000000", + "eui": "6A7E111A10000000" + }, + "time": "2023-05-19T05:33:35.608982Z", + "timestamp": 3893546133, + "rssi": -35, + "channel_rssi": -35, + "snr": 13.2, + "frequency_offset": "69", + "uplink_token": "CiIKIAoUZXVpLTZhN2UxMTFhMTAwMDAwMDASCCThJP/+9k6eEJWZy8AOGgwIr5ScowYQvNbUsQIgiMy8y6jwpwE=", + "channel_index": 3, + "received_at": "2023-05-19T05:33:35.607383681Z" + }], + "settings": { + "data_rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 7, + "coding_rate": "4/5" + } + }, + "frequency": "867100000", + "timestamp": 3893546133, + "time": "2023-05-19T05:33:35.608982Z" + }, + "received_at": "2023-05-19T05:33:35.641841782Z", + "consumed_airtime": "0.056576s", + "network_ids": { + "net_id": "000013", + "tenant_id": "ttn", + "cluster_id": "eu1", + "cluster_address": "eu1.cloud.thethings.network" + } + } +} \ No newline at end of file diff --git a/VENDORS/Tektelic/Aura/ThingsStackCommunity/uplink/result.json b/VENDORS/Tektelic/Aura/ThingsStackCommunity/uplink/result.json new file mode 100644 index 00000000..c03cf49a --- /dev/null +++ b/VENDORS/Tektelic/Aura/ThingsStackCommunity/uplink/result.json @@ -0,0 +1,28 @@ +{ + "deviceName": "eui-1000000000000001", + "deviceType": "Aura", + "attributes": { + "eui": "1000000000000001", + "fPort": 10, + "applicationId": "application-tts-name", + "devAddr": "20000001", + "spreadingFactor": 7, + "codeRate": "4/5", + "tenantId": "ttn", + "device_id": "eui-1000000000000001", + "join_eui": "2000000000000001", + "net_id": "000013", + "cluster_id": "eu1", + "cluster_adress": "eu1.cloud.thethings.network", + "bandwidth": 125000, + "frequency": "867100000" + }, + "telemetry": [{ + "ts": 1684474415641, + "values": { + "energy_consumption_meter_elapsed": 86400, + "energy_consumption_meter_consumed": 27216, + "energy_consumption_meter_status": 0 + } + }] +} \ No newline at end of file diff --git a/VENDORS/Tektelic/Aura/ThingsStackIndustries/uplink/converter.json b/VENDORS/Tektelic/Aura/ThingsStackIndustries/uplink/converter.json new file mode 100644 index 00000000..48f16f1e --- /dev/null +++ b/VENDORS/Tektelic/Aura/ThingsStackIndustries/uplink/converter.json @@ -0,0 +1,40 @@ +{ + "name": "The Things Stack Industries Uplink Decoder for Aura", + "type": "UPLINK", + "debugMode": false, + "debugSettings": { + "failuresEnabled": true, + "allEnabled": false, + "allEnabledUntil": 1733331880270 + }, + "configuration": { + "scriptLang": "TBEL", + "decoder": null, + "tbelDecoder": "var data = decodeToJson(payload);\n\nvar deviceName = data.end_device_ids.device_id;\nvar deviceType = \"Aura\";\nvar groupName = null; // If groupName is not null - created device will be added to the entity group with such name.\nvar customerName = null; // If customerName is not null - created devices will be assigned to customer with such name. \n\n// use assetName and assetType instead of deviceName and deviceType\n// to automatically create assets instead of devices.\n// var assetName = 'Asset A';\n// var assetType = 'building';\n\n// If you want to parse incoming data somehow, you can add your code to this function.\n// input: bytes\n// expected output:\n// {\n// \"attributes\": {\"attributeKey\": \"attributeValue\"},\n// \"telemetry\": [{\"ts\": 1...1, \"values\": {\"telemetryKey\":\"telemetryValue\"}, {\"ts\": 1...2, \"values\": {\"telemetryKey\":\"telemetryValue\"}}]\n// }\n\nfunction decodeFrmPayload(input) {\n var output = { attributes: {}, telemetry: []};\n \n // --- Decoding code --- //\n var decoded = {};\n var fPort = data.uplink_message.f_port;\n if(fPort == 10) {\n for(var i = 0; i < input.length - 2; ) {\n var key_1 = input[i++] & 0xff;\n var key_2 = input[i++] & 0xff;\n \n if(key_1 == 0x00 && key_2 == 0xFE) {\n decoded.energy_consumption_meter_elapsed = parseBytesToInt(input, i, 4);\n decoded.energy_consumption_meter_consumed = parseBytesToInt(input, i + 4, 4);\n i += 8;\n }\n else if(key_1 == 0x00 && key_2 == 0x00) {\n decoded.energy_consumption_meter_status = parseBytesToInt(input, i, 1);\n if(decoded.energy_consumption_meter_status != 0) {\n decoded.energy_consumption_meter_status != 1;\n }\n }\n else if(key_1 == 0x00 && key_2 == 0x74) {\n decoded.voltmeter = (input[i] << 8) | (input[i + 1] & 0xFF);\n if (decoded.voltmeter != 65535) {\n decoded.voltmeter = decoded.voltmeter * 10;\n }\n \n i += 2;\n }\n else if(key_1 == 0x00 && key_2 == 0x75) {\n decoded.voltmeter = (input[i] << 8) | (input[i + 1] & 0xFF);\n if (decoded.ammeter != 65535) {\n decoded.ammeter = decoded.ammeter * 10;\n }\n \n i += 2;\n }\n else if(key_1 == 0x00 && key_2 == 0x80) {\n decoded.real_power = (input[i] << 8) | (input[i + 1] & 0xFF);\n if (decoded.real_power != 65535) {\n decoded.real_power = decoded.real_power * 10;\n }\n \n i += 2;\n }\n else if(key_1 == 0x01 && key_2 == 0x80) {\n decoded.apparent_power = (input[i] << 8) | (input[i + 1] & 0xFF);\n if (decoded.apparent_power != 65535) {\n decoded.apparent_power = decoded.apparent_power * 10;\n }\n \n i += 2;\n }\n else if(key_1 == 0x00 && key_2 == 0x81) {\n decoded.power_factor_meter = input[i] & 0xFF;\n if (decoded.power_factor_meter != 65535) {\n decoded.power_factor_meter = decoded.power_factor_meter * 100;\n }\n \n i += 1;\n }\n else if(key_1 == 0x00 && key_2 == 0x01) {\n decoded.relay_status = input[i] & 0xFF;\n \n if (decoded.relay_status != 0) {\n decoded.relay_status = 1;\n }\n \n i += 1;\n }\n }\n }\n else if (fPort == 100) {\n for(var i = 0; i < input.length -1; ) {\n var key = input[i++] & 0xff;\n \n if(key == 0x00) {\n output.attributes.eui = bytesToHex(java.util.Arrays.copyRange(input, i, i + 8));\n i += 8;\n }\n else if(key == 0x01) {\n output.attributes.app_eui = bytesToHex(java.util.Arrays.copyRange(input, i, i + 8));\n\t\t\t\ti += 8;\n }\n else if (key == 0x02) {\n output.attributes.app_key = bytesToHex(java.util.Arrays.copyRange(input, i, i + 16));\n i += 16;\n }\n else if (key == 0x03) {\n output.attributes.devAddr = bytesToHex(java.util.Arrays.copyRange(input, i, i + 4));\n i += 4;\n }\n else if(key == 0x04) {\n output.attributes.network_session_key = bytesToHex(java.util.Arrays.copyRange(input, i, i + 16));\n i += 16;\n }\n else if(key == 0x05) {\n output.attributes.app_session_key = bytesToHex(java.util.Arrays.copyRange(input, i, i + 16));\n i += 16;\n }\n else if(key == 0x10) {\n output.attributes.loramac_join_mode = (input[i] >> 7) & 1;\n i += 2;\n }\n else if (key == 0x11) {\n var val = (input[i] >> 4) & 0x0F;\n \n if(val == 0x0C) {\n output.attributes.lora_class = \"Class C\";\n }\n else if(val == 0x0B) {\n output.attributes.lora_class = \"Class B\";\n }\n else if(val == 0x0A) {\n output.attributes.lora_class = \"Class F\";\n }\n else {\n output.attributes.lora_class = \"Invalid\";\n }\n\t\t\t\t\n\t\t\t\toutput.attributes.confirm_mode = (input[i] >> 8) & 1; \n\t\t\t\toutput.attributes.sync_word = (input[i] >> 9) & 1;\n\t\t\t\toutput.attributes.duty_cycle = (input[i] >> 10) & 1;\n\t\t\t\toutput.attributes.adr = (input[i] >> 11) & 1; \n\t\t\t\t\n\t\t\t\ti += 2;\n }\n else if (key == 0x12) {\n output.attributes.dr_number = (((input[i] << 8) | input[i + 1]) >> 8) & 0xF;\n output.attributes.tx_power_number = ((input[i] << 8) | input[i + 1]) & 0xF;\n \n i +=2;\n }\n else if (key == 0x13) {\n output.attributes.frequency = (((input[i] << 32) | (input[i + 1] << 24) | (input[i + 2] << 16) | (input[i + 3] << 8) | input[i + 4]) >> 8) & 0xFFFFFFFF;\n output.attributes.dr_number_rx2 = input[i + 4] & 0xFF;\n \n i += 5;\n }\n else if(key == 0x19) {\n output.attributes.netid_msb = parseBytesToInt(input, i, 2);\n i += 2;\n }\n else if (key == 0x20) {\n output.attributes.seconds_per_core_tick = parseBytesToInt(input, i, 4);\n i += 4;\n }\n else if(key == 0x21) {\n output.attributes.tick_per_battery = parseBytesToInt(input, i, 2);\n i += 2;\n }\n else if(key == 0x71) {\n output.attributes.app_major_version = input[i];\n\t\t\t\toutput.attributes.app_minor_version = input[i + 1];\n\t\t\t\toutput.attributes.app_revision = input[i + 2];\n\t\t\t\toutput.attributes.loramac_major_version = input[i + 3];\n\t\t\t\toutput.attributes.loramac_minor_version = input[i + 4];\n\t\t\t\toutput.attributes.loramac_revision = input[i + 5];\n\t\t\t\toutput.attributes.region = input[i + 7];\n\t\t\t\ti += 7;\n }\n }\n }\n \n output.telemetry = [{\n ts: timestamp,\n values: decoded\n }];\n\n // --- Decoding code --- //\n return output;\n}\n\n// --- attributes and telemetry objects ---\nvar telemetry = [];\nvar attributes = {};\n// --- attributes and telemetry objects ---\n\n// --- Timestamp parsing\nvar dateString = data.uplink_message.received_at;\n\nif ((data.simulated != null && data.simulated) || dateString == null) {\n dateString = data.received_at;\n}\n\ntimestamp = parseDateToTimestamp(dateString);\n// --- Timestamp parsing\n\n// Message parsing\n// To avoid paths in the decoded objects we passing false value to function as \"pathInKey\" argument.\n// Warning: pathInKey can cause already found fields to be overwritten with the last value found, e.g. receive_at from uplink_message will be written receive_at in the root.\n\n// Passing incoming bytes to decodeFrmPayload function, to get custom decoding\nvar customDecoding = {};\nif (data.uplink_message.get(\"frm_payload\") != null) {\n customDecoding = decodeFrmPayload(base64ToBytes(data.uplink_message.frm_payload));\n}\n\n// Collecting data to result\nif (customDecoding.?telemetry.size() > 0) {\n if (customDecoding.telemetry instanceof java.util.ArrayList) {\n foreach(telemetryObj: customDecoding.telemetry) {\n if (telemetryObj.ts != null && telemetryObj.values != null) {\n telemetry.add(telemetryObj);\n }\n }\n } else {\n telemetry.putAll(customDecoding.telemetry);\n }\n}\n\nif (customDecoding.?attributes.size() > 0) {\n attributes.putAll(customDecoding.attributes);\n}\n\n// You can add some keys manually to attributes or telemetry\nvar applicationId = data.end_device_ids.?application_ids.?application_id;\nvar devAddr = data.end_device_ids.?dev_addr;\nvar spreadingFactor = data.uplink_message.?settings.?data_rate.?lora.?spreading_factor;\nvar codeRate = data.uplink_message.?settings.?data_rate.?lora.?coding_rate;\nvar tenantId = data.uplink_message.?network_ids.?tenant_id;\nattributes.eui = data.end_device_ids.dev_eui;\nattributes.fPort = data.uplink_message.f_port;\nattributes.applicationId = applicationId;\nattributes.devAddr = devAddr;\nattributes.spreadingFactor = spreadingFactor;\nattributes.codeRate = codeRate;\nattributes.tenantId = tenantId;\nattributes.device_id = data.end_device_ids.?device_id;\nattributes.join_eui = data.end_device_ids.?join_eui;\nattributes.net_id = data.uplink_message.?network_ids.?net_id;\nattributes.cluster_id = data.uplink_message.?network_ids.?cluster_id;\nattributes.cluster_address = data.uplink_message.?network_ids.?cluster_address;\nattributes.bandwidth = data.uplink_message.?settings.?data_rate.?lora.?bandwidth;\nattributes.frequency = data.uplink_message.?settings.?frequency;\n\nvar isIncludeGatewayInfo = metadata[\"includeGatewayInfo\"];\nif(isIncludeGatewayInfo == true) {\n var gatewayInfo = getGatewayInfo();\n var addDataToTelemetry = {};\n addDataToTelemetry.snr = gatewayInfo.snr;\n addDataToTelemetry.rssi = gatewayInfo.rssi;\n addDataToTelemetry.channel = gatewayInfo.channel_index;\n addDataToTelemetry.consumed_airtime = data.uplink_message.?consumed_airtime;\n addDataToTelemetry.fCnt = data.uplink_message.?f_cnt;\n\n telemetry = processTelemetryData(telemetry, addDataToTelemetry);\n}\n\nvar result = {\n deviceName: deviceName,\n deviceType: deviceType,\n // assetName: assetName,\n // assetType: assetType,\n attributes: attributes,\n telemetry: telemetry\n};\n\naddAdditionalInfoForDeviceMsg(result, customerName, groupName);\n\nreturn result;\n\nfunction addAdditionalInfoForDeviceMsg(deviceInfo, customerName, groupName) {\n if (customerName != null) {\n deviceInfo.customerName = customerName;\n }\n if (groupName != null) {\n deviceInfo.groupName = groupName;\n }\n}\n\nfunction parseDateToTimestamp(dateString) {\n var date = new Date(dateString);\n var timestamp = date.getTime();\n \n // If we cannot parse timestamp - we will use the current timestamp\n if (timestamp == -1) {\n timestamp = Date.now();\n }\n \n return timestamp;\n}\n\nfunction getGatewayInfo() {\n var gatewayList = data.uplink_message.?rx_metadata;\n var maxRssi = Integer. MIN_VALUE;\n var gatewayInfo = {};\n \n foreach (gateway : gatewayList) {\n if(gateway.rssi > maxRssi) {\n maxRssi = gateway.rssi;\n gatewayInfo = gateway;\n }\n }\n \n return gatewayInfo;\n}\n\nfunction processTelemetryData(telemetry, addDataToTelemetry) {\n if (telemetry.size >= 1) {\n telemetry = addDataToTelemetries(telemetry, addDataToTelemetry);\n }\n else {\n telemetry.add(addDataToTelemetry);\n }\n \n return telemetry;\n}\n\nfunction addDataToTelemetries(telemetries, addDataToTelemetry) {\n foreach(telemetry : telemetries) {\n foreach(element : addDataToTelemetry.entrySet()) {\n if(!telemetry[\"values\"].keys.contains(element.key)) {\n telemetry[\"values\"][element.key] = element.value;\n }\n } \n }\n \n return telemetries;\n}", + "encoder": null, + "tbelEncoder": null, + "updateOnlyKeys": [ + "fPort", + "bandwidth", + "frequency", + "net_id", + "cluster_id", + "cluster_address", + "tenant_address", + "device_id", + "join_eui", + "eui", + "channel", + "devAddr", + "spreadingFactor", + "codeRate", + "tenantId", + "applicationId", + "battery" + ] + }, + "additionalInfo": { + "description": "" + }, + "edgeTemplate": false +} \ No newline at end of file diff --git a/VENDORS/Tektelic/Aura/ThingsStackIndustries/uplink/metadata.json b/VENDORS/Tektelic/Aura/ThingsStackIndustries/uplink/metadata.json new file mode 100644 index 00000000..23f54b34 --- /dev/null +++ b/VENDORS/Tektelic/Aura/ThingsStackIndustries/uplink/metadata.json @@ -0,0 +1,4 @@ +{ + "integrationName": "ChirpStack integration", + "includeGatewayInfo": "false" +} \ No newline at end of file diff --git a/VENDORS/Tektelic/Aura/ThingsStackIndustries/uplink/payload.json b/VENDORS/Tektelic/Aura/ThingsStackIndustries/uplink/payload.json new file mode 100644 index 00000000..31db41d3 --- /dev/null +++ b/VENDORS/Tektelic/Aura/ThingsStackIndustries/uplink/payload.json @@ -0,0 +1,77 @@ +{ + "end_device_ids": { + "device_id": "eui-1000000000000001", + "application_ids": { + "application_id": "application-tti-name" + }, + "dev_eui": "1000000000000001", + "join_eui": "2000000000000001", + "dev_addr": "20000001" + }, + "correlation_ids": ["as:up:01H0PZDGB1NW6NAPD815NGHPF6", "gs:conn:01H0FJRSXSYT7VKNYXJ89F95XT", "gs:up:host:01H0FJRSY3MZMGPPFBQ4FZV4T8", "gs:uplink:01H0PZDG4HHGFRTXRTXD4PFTH7", "ns:uplink:01H0PZDG4JZ3BM0K6J89EQK1J7", "rpc:/ttn.lorawan.v3.GsNs/HandleUplink:01H0PZDG4J02F85RYFPCNSNXCR", "rpc:/ttn.lorawan.v3.NsAs/HandleUplink:01H0PZDGB081PMP806BJHNHX1A"], + "received_at": "2023-05-18T08:25:26.112483370Z", + "uplink_message": { + "session_key_id": "AYfg8rhha5n+FWx0ZaAprA==", + "f_port": 10, + "f_cnt": 5017, + "frm_payload": "AP4AAVGAAABqUAAAAA==", + "rx_metadata": [{ + "gateway_ids": { + "gateway_id": "eui-6A7E111A10000000", + "eui": "6A7E111A10000000" + }, + "time": "2023-05-18T08:25:25.885310Z", + "timestamp": 818273765, + "rssi": -24, + "channel_rssi": -24, + "snr": 12, + "frequency_offset": "671", + "uplink_token": "CiIKIAoUZXVpLTZBN0UxMTFBMTAwMDAwMDASCCThJP/+9k6eEOW7l4YDGgwI9cGXowYQ5KPhrwMgiI2rp+jpOA=", + "channel_index": 2, + "received_at": "2023-05-18T08:25:25.869324983Z" + }, { + "gateway_ids": { + "gateway_id": "packetbroker" + }, + "packet_broker": { + "message_id": "01H0PZDG4MF9AYSMNY44MAVTDH", + "forwarder_net_id": "000013", + "forwarder_tenant_id": "ttn", + "forwarder_cluster_id": "eu1.cloud.thethings.network", + "forwarder_gateway_eui": "6A7E111A10000000", + "forwarder_gateway_id": "eui-6a7e111a10000000", + "home_network_net_id": "000013", + "home_network_tenant_id": "tenant", + "home_network_cluster_id": "eu1.cloud.thethings.industries" + }, + "time": "2023-05-18T08:25:25.885310Z", + "rssi": -24, + "channel_rssi": -24, + "snr": 12, + "frequency_offset": "671", + "uplink_token": "eyJnIjoiWlhsS2FHSkhZMmxQYVVwQ1RWUkpORkl3VGs1VE1XTnBURU5LYkdKdFRXbFBhVXBDVFZSSk5GSXdUazVKYVhkcFlWaFphVTlwU201a01uaGhWVlJvZDFSWFVuRmlSM1JtVFcxT2RVbHBkMmxrUjBadVNXcHZhV05ZY0RKT1IyeExaREpSZVZwR1pIUmpNRXBLVlVoR2RFNVZkR3BWVTBvNUxua3paVVJTWVRaM1lXOU1kbTQwVm5sdmIyWmlPWGN1ZUhCZmVrcElaa3hIWlZadGRVUlFVeTVuYlRaVlZXRXdkakpHV0VKMGJUUjZaMjVXUkVoeGVHRjRaMlJKTlVkS1VsbERhemc1VDNCbk5rVk1iM1JDUkVZM1VWbHdZbEJDTkdOblNqWjBlbkphYUV4MFRVMHhZMVZFTTFac01XdExURUo0YURaMFExTnhhMVJsWWw4eE5FdHlVVXcyZUhsRWFFbEhlakJITXpoTE0xaFdlRzR5VUVjMk4wNUViME5WTkhoTmRrazFZVk5oWkUwd2FXVnFjR294VGtoMFduZHlZMDFxVlVGNmRsbERUazlNY2s5eFdVeFpWMk5XTG1WVFFYVkpNVkptT1U5NWRqUTNhSEoxTUZoalYxRT0iLCJhIjp7ImZuaWQiOiIwMDAwMTMiLCJmdGlkIjoidHRuIiwiZmNpZCI6ImV1MS5jbG91ZC50aGV0aGluZ3MubmV0d29yayJ9fQ==", + "received_at": "2023-05-18T08:25:25.906038642Z" + }], + "settings": { + "data_rate": { + "lora": { + "bandwidth": 125000, + "spreading_factor": 7, + "coding_rate": "4/5" + } + }, + "frequency": "868500000", + "timestamp": 818273765, + "time": "2023-05-18T08:25:25.885310Z" + }, + "received_at": "2023-05-18T08:25:25.906399073Z", + "consumed_airtime": "0.097536s", + "network_ids": { + "net_id": "000013", + "tenant_id": "tenant", + "cluster_id": "eu1", + "cluster_address": "eu1.cloud.thethings.industries", + "tenant_address": "tenant.eu1.cloud.thethings.industries" + } + } +} \ No newline at end of file diff --git a/VENDORS/Tektelic/Aura/ThingsStackIndustries/uplink/result.json b/VENDORS/Tektelic/Aura/ThingsStackIndustries/uplink/result.json new file mode 100644 index 00000000..6c5224e2 --- /dev/null +++ b/VENDORS/Tektelic/Aura/ThingsStackIndustries/uplink/result.json @@ -0,0 +1,28 @@ +{ + "deviceName": "eui-1000000000000001", + "deviceType": "Aura", + "attributes": { + "eui": "1000000000000001", + "fPort": 10, + "applicationId": "application-tti-name", + "devAddr": "20000001", + "spreadingFactor": 7, + "codeRate": "4/5", + "tenantId": "tenant", + "device_id": "eui-1000000000000001", + "join_eui": "2000000000000001", + "net_id": "000013", + "cluster_id": "eu1", + "cluster_address": "eu1.cloud.thethings.industries", + "bandwidth": 125000, + "frequency": "868500000" + }, + "telemetry": [{ + "ts": 1684398325906, + "values": { + "energy_consumption_meter_elapsed": 86400, + "energy_consumption_meter_consumed": 27216, + "energy_consumption_meter_status": 0 + } + }] +} \ No newline at end of file diff --git a/VENDORS/Tektelic/Aura/info.json b/VENDORS/Tektelic/Aura/info.json new file mode 100644 index 00000000..94656046 --- /dev/null +++ b/VENDORS/Tektelic/Aura/info.json @@ -0,0 +1,5 @@ +{ + "url": "https://tektelic.com/products/sensors/aura-smart-ac-switch/", + "label": "Aura: Enhanced energy monitoring and remote control for smart homes, offices and facilities", + "description": "AURA is a 120V Smart Switch with the form factor of a standard AC Decorator-style rocker switch, incorporating a LoRa radio with power control and monitoring circuitry. It provides features such as power on-off control and status, as well as precise measurement of consumed energy (kWh), line voltage (Vrms), load current (Arms), load power (real, reactive, and apparent, W), and load power factor. AURA is a Class C device that enables real-time control and telemetry inquiry." +} \ No newline at end of file diff --git a/VENDORS/Tektelic/Aura/photo.png b/VENDORS/Tektelic/Aura/photo.png new file mode 100644 index 0000000000000000000000000000000000000000..e43d3a0c0dd970c4fa497feee3ee9aaccc5739f9 GIT binary patch literal 113371 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�{ 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