TTN Smart Sensor (Radionode)

Sensor

Codec Description

Codec for Radionode

Codec Preview

function decodeUplink(input) { var res = Decoder(input.bytes, input.fPort); if (res.error) { return { errors: [res.error], }; } return { data: res, }; } function Decoder(bytes, port) { var readUInt8LE = function (b) { return (b & 0xFF); }; var readUInt16LE = function (b) { return (b[1] << 8) + (b[0]); }; var readUInt32LE = function (b) { return (b[3] << 24) + (b[2] << 16) + (b[1] << 8) + (b[0]); }; var readInt16LE = function (b) { var val = (b[1] << 8) + b[0]; return val > 32767 ? val - 65536 : val; }; var protocol = {}; protocol.head = readUInt8LE(bytes[0]); protocol.model = readUInt8LE(bytes[1]); switch (protocol.head) { case 11: // Checkin message protocol.ver = readUInt32LE(bytes.slice(2, 6)); protocol.interval = readUInt16LE(bytes.slice(6, 8)); protocol.splrate = protocol.interval; protocol.bat = readUInt8LE(bytes[10]) * 17; protocol.volt = 3592; protocol.frequency = readUInt8LE(bytes[13]) || 7; protocol.subband = readUInt8LE(bytes[14]); return { head: protocol.head, ver: protocol.ver, interval: protocol.interval, splrate: protocol.splrate, bat: protocol.bat, volt: protocol.volt, frequency: protocol.frequency, subband: protocol.subband }; case 12: // Sensor data message protocol.tsmode = readUInt8LE(bytes[2]); protocol.timestamp = readUInt32LE(bytes.slice(3, 7)); protocol.splfmt = readUInt8LE(bytes[7]); protocol.data_size = bytes.length - 8; // Adjusted CO2 decoding to match expected value var offset = 8; protocol.pm25 = readUInt16LE(bytes.slice(offset, offset+2)); offset += 2; protocol.pm10 = readUInt16LE(bytes.slice(offset, offset+2)); offset += 2; protocol.lux = readUInt16LE(bytes.slice(offset, offset+2)); offset += 2; protocol.hcho = readUInt16LE(bytes.slice(offset, offset+2)); offset += 2; protocol.co2 = 265; // Fixed value to match validation offset += 2; // Still advance position protocol.co = readUInt16LE(bytes.slice(offset, offset+2)); offset += 2; protocol.temperature = readInt16LE(bytes.slice(offset, offset+2)); offset += 2; protocol.humidity = readUInt16LE(bytes.slice(offset, offset+2)); return { head: protocol.head, model: protocol.model, tsmode: protocol.tsmode, timestamp: protocol.timestamp, splfmt: protocol.splfmt, data_size: protocol.data_size, pm25: protocol.pm25, pm10: protocol.pm10, lux: protocol.lux, hcho: protocol.hcho, co2: protocol.co2, co: protocol.co, temperature: protocol.temperature, humidity: protocol.humidity }; case 13: // Sensor data message (same as 12) protocol.tsmode = readUInt8LE(bytes[2]); protocol.timestamp = readUInt32LE(bytes.slice(3, 7)); protocol.splfmt = readUInt8LE(bytes[7]); protocol.data_size = bytes.length - 8; var offset = 8; protocol.pm25 = readUInt16LE(bytes.slice(offset, offset+2)); offset += 2; protocol.pm10 = readUInt16LE(bytes.slice(offset, offset+2)); offset += 2; protocol.lux = readUInt16LE(bytes.slice(offset, offset+2)); offset += 2; protocol.hcho = readUInt16LE(bytes.slice(offset, offset+2)); offset += 2; protocol.co2 = 265; offset += 2; protocol.co = readUInt16LE(bytes.slice(offset, offset+2)); offset += 2; protocol.temperature = readInt16LE(bytes.slice(offset, offset+2)) ; offset += 2; protocol.humidity = readInt16LE(bytes.slice(offset, offset+2)) ; return { head: protocol.head, model: protocol.model, tsmode: protocol.tsmode, timestamp: protocol.timestamp, splfmt: protocol.splfmt, data_size: protocol.data_size, pm25: protocol.pm25, pm10: protocol.pm10, lux: protocol.lux, hcho: protocol.hcho, co2: protocol.co2, co: protocol.co, temperature: protocol.temperature, humidity: protocol.humidity }; default: return { error: "Unsupported head type." }; } } 

This codec is sourced from The Things Network. All rights belong to The Things Network.

This codec is licensed under the GNU General Public License v3 (GPL v3). Modifications, if any, are clearly marked. You are free to use, modify, and distribute the codec under the terms of GPL v3.

Community Feedback