-
Notifications
You must be signed in to change notification settings - Fork 13
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #162 from artem-barysh-dev/em500-co2
EM500-CO2
- Loading branch information
Showing
19 changed files
with
487 additions
and
0 deletions.
There are no files selected for viewing
39 changes: 39 additions & 0 deletions
39
VENDORS/Milesight/EM500-CO2/ChirpStack/uplink/converter.json
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
{ | ||
"name": "ChirpStack Uplink Decoder for EM500-C02", | ||
"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 = \"EM500-C02\";\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 historyDataList = [];\n for (var i = 0; i < input.length - 2 ; ) {\n var channel_id = input[i++] & 0xff;\n var channel_type = input[i++] & 0xff;\n \n // BATTERY\n if (channel_id === 0x01 && channel_type === 0x75) {\n decoded.battery = input[i];\n i += 1;\n }\n // TEMPERATURE\n else if (channel_id === 0x03 && channel_type === 0x67) {\n decoded.temperature = parseBytesToInt(input, i, 2, false) / 10;\n i += 2;\n \n // ℉\n // decoded.temperature = parseBytesToInt(input, i, 2, false) / 10 * 1.8 + 32;\n // i +=2;\n }\n // HUMIDITY\n else if (channel_id === 0x04 && channel_type === 0x68) {\n decoded.humidity = parseBytesToInt(input, i, 1, false) / 2;\n i += 1;\n }\n // CO2\n else if (channel_id === 0x05 && channel_type === 0x7d) {\n decoded.co2 = parseBytesToInt(input, i, 2, false);\n i += 2;\n }\n // PRESSURE\n else if (channel_id === 0x06 && channel_type === 0x73) {\n decoded.pressure = parseBytesToInt(input, i, 2, false) / 10;\n i += 2;\n }\n // TEMPERATURE CHANGE ALARM\n else if (channel_id === 0x83 && channel_type === 0xd7) {\n decoded.temperature = parseBytesToInt(input, i, 2, false) / 10;\n decoded.temperature_change = parseBytesToInt(input, i + 2, 2, false) / 10;\n decoded.temperature_alarm = readTemperatureAlarm(input[i + 4]);\n i += 5;\n }\n // HISTROY\n else if (channel_id === 0x20 && channel_type === 0xce) {\n var historyData = {\n ts: parseBytesToInt(input, i, 4, false) * 1000,\n values: {\n co2: parseBytesToInt(input, i + 4, 2, false),\n pressure: parseBytesToInt(input, i + 6, 1, false) / 10,\n temperature: parseBytesToInt(input, i + 8, 2, false) / 10,\n humidity: parseBytesToInt(input, i + 10, 1, false, false) / 2\n }\n };\n i += 11;\n \n historyDataList.add(historyData);\n } \n }\n\n output.telemetry = [{\n ts: timestamp,\n values: decoded\n }];\n \n output.telemetry.addAll(historyDataList);\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}\n\nfunction readTemperatureAlarm(type) {\n switch (type) {\n case 0:\n return \"threshold alarm\";\n case 1:\n return \"threshold alarm release\";\n case 2:\n return \"mutation alarm\";\n default:\n return \"unkown\";\n }\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 | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
{ | ||
"integrationName": "ChirpStack integration", | ||
"includeGatewayInfo": "false" | ||
} |
48 changes: 48 additions & 0 deletions
48
VENDORS/Milesight/EM500-CO2/ChirpStack/uplink/payload.json
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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": 85, | ||
"confirmed": false, | ||
"data": "AXVkA2cZAQRocwV9ZwQGc2gn", | ||
"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" | ||
} | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
{ | ||
"deviceName": "Device name 1000000000000001", | ||
"deviceType": "EM500-C02", | ||
"attributes": { | ||
"eui": "1000000000000001", | ||
"devAddr": "20000001", | ||
"fPort": 85, | ||
"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": { | ||
"battery": 100, | ||
"temperature": 28.1, | ||
"humidity": 57.5, | ||
"co2": 1127, | ||
"pressure": 1008.8 | ||
} | ||
}] | ||
} |
Oops, something went wrong.