// Decode decodes an array of bytes into an object. // - fPort contains the LoRaWAN fPort number // - bytes is an array of bytes, e.g. [225, 230, 255, 0] // The function must return an object, e.g. {"temperature": 22.5} // NOTE: THIS DECODER IS JUST AN EXAMPLE AND IS NOT SUPPORTING ALL ENLESS SENSORS // BUT IT DOES SUPPORT THE MOST COMMON ONES AND THE MAIN PARAMETERS // PLEASE USE THIS CODE AS A STARTING POINT AND ADJUSTING IT TO YOUR NEEDS function Decode(fPort, bytes) { var decoded = {}; decoded.devEUI = LoRaObject.devEUI; decoded.rssi = LoRaObject.rxInfo[0].rssi; var sensorType = bytes[3]; switch(sensorType) { case 0x04: decoded.sensorType = "600-021"; decoded.temperature = readInt16LE(bytes.slice(6, 8)) / 10; decoded.humidity = readInt16LE(bytes.slice(8, 10)) / 10; var battery = bytes[19]; break; case 0x05: decoded.sensorType = "600-022"; decoded.temperature = readInt16LE(bytes.slice(6, 8)) / 10; decoded.humidity = readInt16LE(bytes.slice(8, 10)) / 10; decoded.VOC = readUInt16LE(bytes.slice(10, 12)); var battery = bytes[19]; break; case 0x06: decoded.sensorType = "600-023"; decoded.temperature = readInt16LE(bytes.slice(6, 8)) / 10; decoded.humidity = readInt16LE(bytes.slice(8, 10)) / 10; decoded.VOC = readUInt16LE(bytes.slice(10, 12)); decoded.CO2 = readUInt16LE(bytes.slice(12, 14)); var battery = bytes[19]; break; case 0x07: decoded.sensorType = "600-031"; decoded.temperature1 = readInt16LE(bytes.slice(6, 8)) / 10; decoded.temperature2 = readInt16LE(bytes.slice(8, 10)) / 10; var battery = bytes[13]; break; case 0x08: decoded.sensorType = "600-036"; decoded.Pulse1 = readUInt32LE(bytes.slice(6, 10)); decoded.Pulse2 = readUInt32LE(bytes.slice(10, 14)); decoded.PulseOC = readUInt32LE(bytes.slice(14, 18)); var battery = bytes[21]; break; case 0x09: decoded.sensorType = "600-037"; decoded.Pulse1 = readUInt32LE(bytes.slice(6, 10)); decoded.Pulse2 = readUInt32LE(bytes.slice(10, 14)); decoded.PulseOC = readUInt32LE(bytes.slice(14, 18)); var battery = bytes[21]; break; case 0x0A: decoded.sensorType = "600-038"; decoded.Pulse1 = readUInt32LE(bytes.slice(6, 10)); decoded.Pulse2 = readUInt32LE(bytes.slice(10, 14)); decoded.PulseOC = readUInt32LE(bytes.slice(14, 18)); var battery = bytes[21]; break; case 0x0B: decoded.sensorType = "600-039"; decoded.Pulse1 = readUInt32LE(bytes.slice(6, 10)); decoded.Pulse2 = readUInt32LE(bytes.slice(10, 14)); decoded.PulseOC = readUInt32LE(bytes.slice(14, 18)); var battery = bytes[21]; break; case 0x0C: decoded.sensorType = "600-232"; decoded.temperature1 = readInt16LE(bytes.slice(6, 8)) / 10; decoded.temperature2 = readInt16LE(bytes.slice(8, 10)) / 10; var battery = bytes[13]; break; default: decoded.sensorType = "Error"; } var batteryStatus = battery >> 2 & 0x03; decoded.battery = 100 - batteryStatus * 25; return decoded; } /* ****************************************** * bytes to number ********************************************/ function readUInt16LE(bytes) { var value = (bytes[0] << 8) + bytes[1]; return value & 0xffff; } function readInt16LE(bytes) { var ref = readUInt16LE(bytes); return ref > 0x7fff ? ref - 0x10000 : ref; } function readUInt32LE(bytes) { var value = (bytes[0] << 24) + (bytes[1] << 16) + (bytes[2] << 8) + bytes[3]; return value & 0xffffffff; }