diff --git a/vendor/decentlab/dl-tp-codec.yaml b/vendor/decentlab/dl-tp-codec.yaml new file mode 100644 index 0000000000..c2f9fcbdfe --- /dev/null +++ b/vendor/decentlab/dl-tp-codec.yaml @@ -0,0 +1,170 @@ +uplinkDecoder: + fileName: dl-tp.js + examples: + - description: Example 1 + input: + fPort: 1 + bytes: + [ + 0x02, + 0x3e, + 0x3e, + 0x00, + 0x03, + 0x8a, + 0xbc, + 0x8a, + 0x92, + 0x8a, + 0xa0, + 0x8a, + 0x84, + 0x8a, + 0xb3, + 0x8a, + 0x89, + 0x8a, + 0xc3, + 0x8a, + 0xad, + 0x8a, + 0xb7, + 0x8a, + 0x92, + 0x8a, + 0xa1, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x0a, + 0xfc, + ] + output: + data: + battery_voltage: + displayName: Battery voltage + unit: V + value: 2.812 + device_id: 15934 + protocol_version: 2 + temperature_at_level_0: + displayName: Temperature at level 0 + unit: "\xB0C" + value: 27.48 + temperature_at_level_1: + displayName: Temperature at level 1 + unit: "\xB0C" + value: 27.06 + temperature_at_level_10: + displayName: Temperature at level 10 + unit: "\xB0C" + value: 27.21 + temperature_at_level_11: + displayName: Temperature at level 11 + unit: "\xB0C" + value: -327.68 + temperature_at_level_12: + displayName: Temperature at level 12 + unit: "\xB0C" + value: -327.68 + temperature_at_level_13: + displayName: Temperature at level 13 + unit: "\xB0C" + value: -327.68 + temperature_at_level_14: + displayName: Temperature at level 14 + unit: "\xB0C" + value: -327.68 + temperature_at_level_15: + displayName: Temperature at level 15 + unit: "\xB0C" + value: -327.68 + temperature_at_level_2: + displayName: Temperature at level 2 + unit: "\xB0C" + value: 27.2 + temperature_at_level_3: + displayName: Temperature at level 3 + unit: "\xB0C" + value: 26.92 + temperature_at_level_4: + displayName: Temperature at level 4 + unit: "\xB0C" + value: 27.39 + temperature_at_level_5: + displayName: Temperature at level 5 + unit: "\xB0C" + value: 26.97 + temperature_at_level_6: + displayName: Temperature at level 6 + unit: "\xB0C" + value: 27.55 + temperature_at_level_7: + displayName: Temperature at level 7 + unit: "\xB0C" + value: 27.33 + temperature_at_level_8: + displayName: Temperature at level 8 + unit: "\xB0C" + value: 27.43 + temperature_at_level_9: + displayName: Temperature at level 9 + unit: "\xB0C" + value: 27.06 + - description: Example 2 + input: + fPort: 1 + bytes: [0x02, 0x3e, 0x3e, 0x00, 0x02, 0x0a, 0xfc] + output: + data: + battery_voltage: + displayName: Battery voltage + unit: V + value: 2.812 + device_id: 15934 + protocol_version: 2 + +downlinkEncoder: + fileName: dl-downlink-codec.js + examples: + - description: Set period 3600 seconds and save + input: + data: + command: set period + save + parameter: 3600 + output: + bytes: [0, 2, 14, 16, 72, 164] + fPort: 1 + - description: Set ADR off + input: + data: + command: set adr off + output: + bytes: [0, 7, 0, 0, 229, 177] + fPort: 1 + +downlinkDecoder: + fileName: dl-downlink-codec.js + examples: + - description: Set period 600 seconds + input: + fPort: 1 + bytes: [0x00, 0x01, 0x02, 0x58, 0x7E, 0x51] + output: + data: + command: set period + parameter: 600 + - description: Reset + input: + fPort: 1 + bytes: [0xFE, 0xFE, 0x00, 0x00, 0x3C, 0x50] + output: + data: + command: reset diff --git a/vendor/decentlab/dl-tp.js b/vendor/decentlab/dl-tp.js new file mode 100644 index 0000000000..d42c74f73e --- /dev/null +++ b/vendor/decentlab/dl-tp.js @@ -0,0 +1,137 @@ +var decentlab_decoder = { + PROTOCOL_VERSION: 2, + SENSORS: [ + {length: 16, + values: [{name: 'temperature_at_level_0', + displayName: 'Temperature at level 0', + convert: function (x) { return (x[0] - 32768) / 100; }, + unit: '°C'}, + {name: 'temperature_at_level_1', + displayName: 'Temperature at level 1', + convert: function (x) { return (x[1] - 32768) / 100; }, + unit: '°C'}, + {name: 'temperature_at_level_2', + displayName: 'Temperature at level 2', + convert: function (x) { return (x[2] - 32768) / 100; }, + unit: '°C'}, + {name: 'temperature_at_level_3', + displayName: 'Temperature at level 3', + convert: function (x) { return (x[3] - 32768) / 100; }, + unit: '°C'}, + {name: 'temperature_at_level_4', + displayName: 'Temperature at level 4', + convert: function (x) { return (x[4] - 32768) / 100; }, + unit: '°C'}, + {name: 'temperature_at_level_5', + displayName: 'Temperature at level 5', + convert: function (x) { return (x[5] - 32768) / 100; }, + unit: '°C'}, + {name: 'temperature_at_level_6', + displayName: 'Temperature at level 6', + convert: function (x) { return (x[6] - 32768) / 100; }, + unit: '°C'}, + {name: 'temperature_at_level_7', + displayName: 'Temperature at level 7', + convert: function (x) { return (x[7] - 32768) / 100; }, + unit: '°C'}, + {name: 'temperature_at_level_8', + displayName: 'Temperature at level 8', + convert: function (x) { return (x[8] - 32768) / 100; }, + unit: '°C'}, + {name: 'temperature_at_level_9', + displayName: 'Temperature at level 9', + convert: function (x) { return (x[9] - 32768) / 100; }, + unit: '°C'}, + {name: 'temperature_at_level_10', + displayName: 'Temperature at level 10', + convert: function (x) { return (x[10] - 32768) / 100; }, + unit: '°C'}, + {name: 'temperature_at_level_11', + displayName: 'Temperature at level 11', + convert: function (x) { return (x[11] - 32768) / 100; }, + unit: '°C'}, + {name: 'temperature_at_level_12', + displayName: 'Temperature at level 12', + convert: function (x) { return (x[12] - 32768) / 100; }, + unit: '°C'}, + {name: 'temperature_at_level_13', + displayName: 'Temperature at level 13', + convert: function (x) { return (x[13] - 32768) / 100; }, + unit: '°C'}, + {name: 'temperature_at_level_14', + displayName: 'Temperature at level 14', + convert: function (x) { return (x[14] - 32768) / 100; }, + unit: '°C'}, + {name: 'temperature_at_level_15', + displayName: 'Temperature at level 15', + convert: function (x) { return (x[15] - 32768) / 100; }, + unit: '°C'}]}, + {length: 1, + values: [{name: 'battery_voltage', + displayName: 'Battery voltage', + convert: function (x) { return x[0] / 1000; }, + unit: 'V'}]} + ], + + read_int: function (bytes, pos) { + return (bytes[pos] << 8) + bytes[pos + 1]; + }, + + decode: function (msg) { + var bytes = msg; + var i, j; + if (typeof msg === 'string') { + bytes = []; + for (i = 0; i < msg.length; i += 2) { + bytes.push(parseInt(msg.substring(i, i + 2), 16)); + } + } + + var version = bytes[0]; + if (version != this.PROTOCOL_VERSION) { + return {error: "protocol version " + version + " doesn't match v2"}; + } + + var deviceId = this.read_int(bytes, 1); + var flags = this.read_int(bytes, 3); + var result = {'protocol_version': version, 'device_id': deviceId}; + // decode payload + var pos = 5; + for (i = 0; i < this.SENSORS.length; i++, flags >>= 1) { + if ((flags & 1) !== 1) + continue; + + var sensor = this.SENSORS[i]; + var x = []; + // convert data to 16-bit integer array + for (j = 0; j < sensor.length; j++) { + x.push(this.read_int(bytes, pos)); + pos += 2; + } + + // decode sensor values + for (j = 0; j < sensor.values.length; j++) { + var value = sensor.values[j]; + if ('convert' in value) { + result[value.name] = {displayName: value.displayName, + value: value.convert.bind(this)(x)}; + if ('unit' in value) + result[value.name]['unit'] = value.unit; + } + } + } + return result; + } +}; + +function decodeUplink(input) { + var res = decentlab_decoder.decode(input.bytes); + if (res.error) { + return { + errors: [res.error], + }; + } + return { + data: res, + }; +} diff --git a/vendor/decentlab/dl-tp.png b/vendor/decentlab/dl-tp.png new file mode 100644 index 0000000000..960972298a Binary files /dev/null and b/vendor/decentlab/dl-tp.png differ diff --git a/vendor/decentlab/dl-tp.yaml b/vendor/decentlab/dl-tp.yaml new file mode 100644 index 0000000000..27e4e9259b --- /dev/null +++ b/vendor/decentlab/dl-tp.yaml @@ -0,0 +1,87 @@ +name: DL-TP +description: The Decentlab DL-TP comes with temperature profiling sensors that can be used in monitoring of glaciers, lakes, ocean, permafrost, dike, dam and soils. + +hardwareVersions: + - version: '1' + numeric: 1 + +firmwareVersions: + - version: 1.5.7 + numeric: 157 + hardwareVersions: + - '1' + profiles: + EU863-870: + id: profile-eu868 + lorawanCertified: true + codec: dl-tp-codec + AS923: + id: profile-as923 + lorawanCertified: false + codec: dl-tp-codec + US902-928: + id: profile-us915 + lorawanCertified: true + codec: dl-tp-codec + AU915-928: + id: profile-au915 + lorawanCertified: false + codec: dl-tp-codec + +sensors: + - temperature + +dimensions: + length: 135 + width: 81 + height: 70 + +weight: 400 + +battery: + replaceable: true + type: 2 C alkaline + +operatingConditions: + temperature: + min: -20 + max: 50 + relativeHumidity: + min: 0 + max: 1.0 + +ipCode: IP67 + +keyProvisioning: + - custom +keySecurity: none + +productURL: https://www.decentlab.com/products/temperature-profile-for-lorawan +photos: + main: dl-tp.png + +compliances: + safety: + - body: IEC + norm: EN + standard: 62368-1 + radioEquipment: + - body: ETSI + norm: EN + standard: 301 489-1 + version: 2.2.0 + - body: ETSI + norm: EN + standard: 301 489-3 + version: 2.1.1 + - body: ETSI + norm: EN + standard: 300 220-1 + version: 3.1.1 + - body: ETSI + norm: EN + standard: 300 220-2 + version: 3.1.1 + - body: IEC + norm: EN + standard: 62479:2010 diff --git a/vendor/decentlab/index.yaml b/vendor/decentlab/index.yaml index 8b21462cd0..9e549747d3 100644 --- a/vendor/decentlab/index.yaml +++ b/vendor/decentlab/index.yaml @@ -36,6 +36,7 @@ endDevices: - dl-sht35-002 - dl-smtp - dl-tbrg + - dl-tp - dl-trs11 - dl-trs12 - dl-trs21