diff --git a/vendor/decentlab/dl-cws-codec.yaml b/vendor/decentlab/dl-cws-codec.yaml new file mode 100644 index 0000000000..003432dfb6 --- /dev/null +++ b/vendor/decentlab/dl-cws-codec.yaml @@ -0,0 +1,89 @@ +uplinkDecoder: + fileName: dl-cws.js + examples: + - description: Example 1 + input: + fPort: 1 + bytes: [0x02, 0x46, 0x39, 0x00, 0x03, 0x8a, 0x77, 0x8a, 0x95, 0x97, 0x7a, 0x87, 0x4c, 0x80, 0x47, 0x8a, 0x5e, 0x0b, 0x74] + output: + data: + air_humidity: + displayName: Air humidity + unit: '%' + value: 60.1 + air_temperature: + displayName: Air temperature + unit: "\xB0C" + value: 27.09 + angle: + displayName: Angle + unit: "\xB0" + value: 71 + battery_voltage: + displayName: Battery voltage + unit: V + value: 2.932 + device_id: 17977 + dew_point: + displayName: Dew point + unit: "\xB0C" + value: 18.68 + protocol_version: 2 + sensor_temperature: + displayName: Sensor temperature + unit: "\xB0C" + value: 26.54 + surface_temperature: + displayName: Surface temperature + unit: "\xB0C" + value: 26.79 + - description: Example 2 + input: + fPort: 1 + bytes: [0x02, 0x46, 0x39, 0x00, 0x02, 0x0b, 0x74] + output: + data: + battery_voltage: + displayName: Battery voltage + unit: V + value: 2.932 + device_id: 17977 + 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-cws.js b/vendor/decentlab/dl-cws.js new file mode 100644 index 0000000000..56899352be --- /dev/null +++ b/vendor/decentlab/dl-cws.js @@ -0,0 +1,100 @@ + +/* https://www.decentlab.com/support */ + +var decentlab_decoder = { + PROTOCOL_VERSION: 2, + SENSORS: [ + {length: 6, + values: [{name: 'surface_temperature', + displayName: 'Surface temperature', + convert: function (x) { return (x[0] - 32768) / 100; }, + unit: '°C'}, + {name: 'air_temperature', + displayName: 'Air temperature', + convert: function (x) { return (x[1] - 32768) / 100; }, + unit: '°C'}, + {name: 'air_humidity', + displayName: 'Air humidity', + convert: function (x) { return (x[2] - 32768) / 100; }, + unit: '%'}, + {name: 'dew_point', + displayName: 'Dew point', + convert: function (x) { return (x[3] - 32768) / 100; }, + unit: '°C'}, + {name: 'angle', + displayName: 'Angle', + convert: function (x) { return (x[4] - 32768); }, + unit: '°'}, + {name: 'sensor_temperature', + displayName: 'Sensor temperature', + convert: function (x) { return (x[5] - 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-cws.png b/vendor/decentlab/dl-cws.png new file mode 100644 index 0000000000..b09d63b986 Binary files /dev/null and b/vendor/decentlab/dl-cws.png differ diff --git a/vendor/decentlab/dl-cws.yaml b/vendor/decentlab/dl-cws.yaml new file mode 100644 index 0000000000..3230e0157f --- /dev/null +++ b/vendor/decentlab/dl-cws.yaml @@ -0,0 +1,92 @@ +name: DL-CWS +description: The Decentlab DL-CWS includes a high-precision infrared pyrometer, temperature, humidity and dew point sensors. It is suitable for use in road weather information systems, winter road maintenance, frost alarming, ice alerting, and smart agriculture. + +hardwareVersions: + - version: '1' + numeric: 1 + +firmwareVersions: + - version: 1.5.7 + numeric: 157 + hardwareVersions: + - '1' + profiles: + EU863-870: + id: profile-eu868 + lorawanCertified: true + codec: dl-cws-codec + AS923: + id: profile-as923 + lorawanCertified: false + codec: dl-cws-codec + US902-928: + id: profile-us915 + lorawanCertified: true + codec: dl-cws-codec + AU915-928: + id: profile-au915 + lorawanCertified: false + codec: dl-cws-codec + +sensors: + - surface temperature + - tilt + - temperature + - humidity + - battery + +dimensions: + length: 135 + width: 81 + height: 70 + +weight: 1800 + +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/high-precision-winter-road-maintenance-sensor-for-lorawan +dataSheetURL: https://cdn.decentlab.com/download/datasheets/Decentlab-DL-CWS-datasheet.pdf +photos: + main: dl-cws.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 b2375ac519..362d3ceb6b 100644 --- a/vendor/decentlab/index.yaml +++ b/vendor/decentlab/index.yaml @@ -3,6 +3,7 @@ endDevices: - dl-atm22 - dl-atm41 - dl-ctd10 + - dl-cws - dl-dlr2-002 - dl-dlr2-003 - dl-dlr2-004