Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merge QA into Main #173

Merged
merged 58 commits into from
Dec 31, 2024
Merged
Changes from 1 commit
Commits
Show all changes
58 commits
Select commit Hold shift + click to select a range
14077f9
Revert "Added 4 LNS integrations for EM400-MUD"
artem-barysh-dev Dec 11, 2024
0bcc4b8
Added 4 LNS integrations for EM400-TLD
artem-barysh-dev Dec 11, 2024
c7638a7
Added 4 LNS integrations for EM400-UDL
artem-barysh-dev Dec 11, 2024
920d49a
Resolved conflict
artem-barysh-dev Dec 11, 2024
3cb73b6
Resolved conflict
artem-barysh-dev Dec 11, 2024
da90abf
Deleted unused result_1.json
artem-barysh-dev Dec 12, 2024
3b064ef
Deleted unused result_1.json
artem-barysh-dev Dec 12, 2024
2902069
Added 4 LNS integrations for EM500-CO2
artem-barysh-dev Dec 13, 2024
35032e5
Fix Decentlab DL-SHT35-001 type
decentlab Dec 17, 2024
48f2aa9
Add Decentlab DL-SHT35-002
decentlab Dec 17, 2024
08a4927
Updated company logos
artem-barysh-dev Dec 17, 2024
1df7d2f
Added 4 LNS integrations for Clover
artem-barysh-dev Dec 19, 2024
460af4e
Added 4 LNS integrations for Kiwi
artem-barysh-dev Dec 19, 2024
2d40d65
Merge pull request #157 from artem-barysh-dev/em400-tld
ViacheslavKlimov Dec 19, 2024
69046d5
Merge pull request #162 from artem-barysh-dev/em500-co2
ViacheslavKlimov Dec 19, 2024
5722aa5
Merge pull request #158 from artem-barysh-dev/em400-udl
ViacheslavKlimov Dec 19, 2024
b1569a3
Merge branch 'main' of github.com:thingsboard/data-converters into qa
ViacheslavKlimov Dec 19, 2024
399caa2
Merge pull request #168 from decentlab/main
ViacheslavKlimov Dec 19, 2024
5cfd5ec
Merge pull request #170 from artem-barysh-dev/updated-company-logos
ViacheslavKlimov Dec 19, 2024
97106bf
Merge pull request #171 from artem-barysh-dev/clover
ViacheslavKlimov Dec 19, 2024
8a9eeb8
Merge pull request #172 from artem-barysh-dev/kiwi
ViacheslavKlimov Dec 19, 2024
230ed70
Added 4 LNS integrations for Aura
artem-barysh-dev Dec 19, 2024
c7b8a70
Added 4 LNS integrations for Flux
artem-barysh-dev Dec 19, 2024
1fede74
Updated the validation script by adding checks for vendors' photo and…
artem-barysh-dev Dec 23, 2024
4c32451
Merge pull request #176 from thingsboard/fix-validation-script
ViacheslavKlimov Dec 23, 2024
cf37fa2
Added 4 LNS integrations for Comfort
artem-barysh-dev Dec 23, 2024
76ab9f3
Added 4 LNS integrations for Vivid
artem-barysh-dev Dec 24, 2024
1db5067
Added an additional test case for integrating Loriot (Bosch device)
artem-barysh-dev Dec 24, 2024
4a192eb
Fixed mismatch of expected result in Loriot integration
artem-barysh-dev Dec 24, 2024
1eea580
Updated converter
artem-barysh-dev Dec 24, 2024
fe258d1
Added an additional test case for integrating Loriot (SensiEDGE device)
artem-barysh-dev Dec 24, 2024
762462f
Added an additional test case for integrating Loriot (Nwave device)
artem-barysh-dev Dec 24, 2024
ab2932d
Fixed mismatch of expected result files for Bosch device
artem-barysh-dev Dec 24, 2024
9530be3
Added an additional test cases for loriot integration(elsys devices)
artem-barysh-dev Dec 24, 2024
eaefa9e
Added an additional test cases for loriot integration(Netvox devices)
artem-barysh-dev Dec 24, 2024
400178a
Merge pull request #179 from artem-barysh-dev/vivid
ViacheslavKlimov Dec 24, 2024
e239167
Merge pull request #178 from thingsboard/comfort
ViacheslavKlimov Dec 24, 2024
f16f3a3
Merge pull request #175 from thingsboard/flux
ViacheslavKlimov Dec 24, 2024
963218e
Merge pull request #174 from thingsboard/aura
ViacheslavKlimov Dec 24, 2024
3defd9e
Added an additional test cases for loriot integration(Tektelic devices)
artem-barysh-dev Dec 24, 2024
82d191e
Added an additional test case for integrating Loriot (Yobiiq device)
artem-barysh-dev Dec 26, 2024
7bfce90
Added an additional test case for integrating Loriot (Milesight device)
artem-barysh-dev Dec 26, 2024
45802c2
Merge pull request #180 from artem-barysh-dev/fix-bosch-loriot
ViacheslavKlimov Dec 26, 2024
feb3bd0
Merge pull request #181 from artem-barysh-dev/fix-sensiedge-loriot
ViacheslavKlimov Dec 26, 2024
e8fb503
Merge pull request #182 from artem-barysh-dev/fix-nwave-loriot
ViacheslavKlimov Dec 26, 2024
2370050
Merge pull request #183 from artem-barysh-dev/fix-elsys-loriot
ViacheslavKlimov Dec 26, 2024
e4633b4
Merge pull request #184 from artem-barysh-dev/fix-netvox-loriot
ViacheslavKlimov Dec 26, 2024
c2d7aed
Merge pull request #185 from thingsboard/fix-tektelic-loriot
ViacheslavKlimov Dec 26, 2024
5c25324
Merge pull request #186 from thingsboard/fix-yobiiq-loriot
ViacheslavKlimov Dec 26, 2024
c234551
Merge pull request #187 from thingsboard/fix-milesight-loriot
ViacheslavKlimov Dec 26, 2024
6778af2
Added an additional test case for integrating Loriot (Decentlab device)
artem-barysh-dev Dec 26, 2024
9e56357
Fixed result output for dl-dlr2-005
artem-barysh-dev Dec 26, 2024
d0931c9
Fixed result output for dl-dlr2-003
artem-barysh-dev Dec 26, 2024
a36059a
Merge pull request #188 from thingsboard/fix-decentlab-loriot
ViacheslavKlimov Dec 30, 2024
bd48b9a
Added HTTP integration for Milesight devices
ArtemAbrams Dec 30, 2024
7fb584e
Fixed mismatch between payload and result for AM102L
ArtemAbrams Dec 30, 2024
a43034d
Added missing result for AM102 Loriot integration
ArtemAbrams Dec 30, 2024
6a1d39f
Merge pull request #189 from thingsboard/http-integration
ViacheslavKlimov Dec 30, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Updated converter
artem-barysh-dev committed Dec 24, 2024
commit 1eea580996ceb0f3ab1fcc0a4ec6772b64cbe211
9 changes: 7 additions & 2 deletions VENDORS/Bosch/Parking_Lot_Sensor/LORIOT/uplink/converter.json
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
{
"name": "Loriot Uplink Decoder for Bosch parking lot sensor",
"type": "UPLINK",
"debugMode": true,
"debugMode": false,
"debugSettings": {
"failuresEnabled": true,
"allEnabled": false,
"allEnabledUntil": 1735038404143
},
"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 = \"Bosch parking lot sensor\" + data.EUI;\nvar deviceType = \"Parking sensor\";\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 // --- Decoding code --- //\n var decoded = {};\n var fPort = data.port;\n\n if (fPort === 1) { // Parking status\n decoded.type = \"parking status\";\n decoded.occupied = (input[0] & 0x1) === 0x1;\n\n } else if (fPort === 2) { // Heartbeat\n decoded.type = \"heartbeat\";\n decoded.occupied = (input[0] & 0x1) === 0x1;\n if (input.length >= 2) {\n var temperature = input[1];\n decoded.temperature = (temperature & 0x80) != 0 ? temperature - 0x100 : temperature;\n }\n } else if (fPort === 3) { // Start-up\n decoded.type = \"startup\";\n decoded.occupied = (input[16] & 0x1) === 0x1;\n\n var resetCause = input[15];\n if (resetCause === 0x01) {\n decoded.resetCause = \"Watchdog reset\";\n } else if (resetCause === 0x02) {\n decoded.resetCause = \"Power On Reset\";\n } else if (resetCause === 0x03) {\n decoded.resetCause = \"System Request Reset\";\n } else if (resetCause === 0x04) {\n decoded.resetCause = \"External Pin Reset\";\n } else if (resetCause === 0x05) {\n decoded.resetCause = \"Lockup Reset\";\n } else if (resetCause === 0x06) {\n decoded.resetCause = \"Brownout Reset\";\n } else {\n decoded.resetCause = \"Unknown\";\n }\n\n decoded.firmwareVersion = input[14] + \".\" + input[13] + \".\" + input[12];\n var debugInfo = \"\";\n for (int i = 0; i < 12; i++) {\n debugInfo += String.format(\"%02x\", input[i]);\n if (i < 11) {\n debugInfo += \" \";\n }\n } \n decoded.debugInfo = debugInfo;\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 = addDataToMultipleTelemetries(telemetry, addDataToTelemetry);\n }\n else if (telemetry.size == 1) {\n telemetry = addDataToSingleTelemetry(telemetry, addDataToTelemetry);\n }\n else {\n telemetry.add(addDataToTelemetry);\n }\n \n return telemetry;\n}\n\nfunction addDataToMultipleTelemetries(telemetry, addDataToTelemetry) {\n foreach(element : addDataToTelemetry.entrySet()) {\n if(!telemetry[0][\"values\"].keys.contains(element.key)) {\n telemetry[0][\"values\"][element.key] = element.value;\n }\n if (!telemetry[1][\"values\"].keys.contains(element.key)) {\n telemetry[1][\"values\"][element.key] = element.value;\n }\n }\n \n return telemetry;\n}\n\nfunction addDataToSingleTelemetry(telemetry, addDataToTelemetry) {\n foreach(element : addDataToTelemetry.entrySet()) {\n if(!telemetry[0][\"values\"].keys.contains(element.key)) {\n telemetry[0][\"values\"][element.key] = element.value;\n }\n }\n \n return telemetry;\n}",
"tbelDecoder": "var data = decodeToJson(payload);\nvar deviceName = \"Bosch parking lot sensor \" + data.EUI;\nvar deviceType = \"Parking sensor\";\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 // --- Decoding code --- //\n var decoded = {};\n var fPort = data.port;\n\n if (fPort === 1) { // Parking status\n decoded.type = \"parking status\";\n decoded.occupied = (input[0] & 0x1) === 0x1;\n\n } else if (fPort === 2) { // Heartbeat\n decoded.type = \"heartbeat\";\n decoded.occupied = (input[0] & 0x1) === 0x1;\n if (input.length >= 2) {\n var temperature = input[1];\n decoded.temperature = (temperature & 0x80) != 0 ? temperature - 0x100 : temperature;\n }\n } else if (fPort === 3) { // Start-up\n decoded.type = \"startup\";\n decoded.occupied = (input[16] & 0x1) === 0x1;\n\n var resetCause = input[15];\n if (resetCause === 0x01) {\n decoded.resetCause = \"Watchdog reset\";\n } else if (resetCause === 0x02) {\n decoded.resetCause = \"Power On Reset\";\n } else if (resetCause === 0x03) {\n decoded.resetCause = \"System Request Reset\";\n } else if (resetCause === 0x04) {\n decoded.resetCause = \"External Pin Reset\";\n } else if (resetCause === 0x05) {\n decoded.resetCause = \"Lockup Reset\";\n } else if (resetCause === 0x06) {\n decoded.resetCause = \"Brownout Reset\";\n } else {\n decoded.resetCause = \"Unknown\";\n }\n\n decoded.firmwareVersion = input[14] + \".\" + input[13] + \".\" + input[12];\n var debugInfo = \"\";\n for (int i = 0; i < 12; i++) {\n debugInfo += String.format(\"%02x\", input[i]);\n if (i < 11) {\n debugInfo += \" \";\n }\n } \n decoded.debugInfo = debugInfo;\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 = addDataToMultipleTelemetries(telemetry, addDataToTelemetry);\n }\n else if (telemetry.size == 1) {\n telemetry = addDataToSingleTelemetry(telemetry, addDataToTelemetry);\n }\n else {\n telemetry.add(addDataToTelemetry);\n }\n \n return telemetry;\n}\n\nfunction addDataToMultipleTelemetries(telemetry, addDataToTelemetry) {\n foreach(element : addDataToTelemetry.entrySet()) {\n if(!telemetry[0][\"values\"].keys.contains(element.key)) {\n telemetry[0][\"values\"][element.key] = element.value;\n }\n if (!telemetry[1][\"values\"].keys.contains(element.key)) {\n telemetry[1][\"values\"][element.key] = element.value;\n }\n }\n \n return telemetry;\n}\n\nfunction addDataToSingleTelemetry(telemetry, addDataToTelemetry) {\n foreach(element : addDataToTelemetry.entrySet()) {\n if(!telemetry[0][\"values\"].keys.contains(element.key)) {\n telemetry[0][\"values\"][element.key] = element.value;\n }\n }\n \n return telemetry;\n}",
"encoder": null,
"tbelEncoder": null,
"updateOnlyKeys": [