function Decode(fPort, bytes) { var SENSOR_TEMP = (1 << 1); var SENSOR_RH = (1 << 2); var SENSOR_CO2 = (1 << 3); var TOTAL_DATA_SLOTS = 4; var data = {}; var slot = 0; var sensors = (bytes[0] << 8) | (bytes[1] & 0xFE); var vBat = ((bytes[1] & 0x01) << 8) | bytes[2]; data.Battery = vBat / 100; if(vBat >= 330) data.BatteryStatus = "Good"; else if(vBat < 300) data.BatteryStatus = "Poor"; else data.BatteryStatus = "OK"; for(var i = 1; i < 16; i++) { var d = (bytes[3+(2*slot)] << 8) | (bytes[4+(2*slot)]); if(d > 0x7FFF) d -= 0xFFFF; // Correct for a negative value switch(sensors & (1 << i)) { case SENSOR_TEMP: data.Temperature = d / 100; break; case SENSOR_RH: data.Humidity = d / 10; break; case SENSOR_CO2: data.CO2 = d; break; default: continue; } if(++slot > TOTAL_DATA_SLOTS) break; } return data }