Ruuvi Indoor Air Quality Score (IAQS)

The Ruuvi Indoor Air Quality Score (IAQS) is designed to provide a quick and repeatable overview of the healthiness of current indoor air conditions. The index does not account for temperature or humidity, as these are more closely related to comfort and structural maintenance than to direct health effects. The IAQS considers CO₂ and particulate matter (PM₂.₅), as both can be measured as absolute values and their effects on health and well-being are well studied. The index is calculated by measuring each component’s deviation from its ideal value and using geometric distance to compute a combined “total difference” from the ideal.

Grade
IAQS
CO₂ (ppm)
PM₂.₅ (μg/m³)

Excellent

90 ≤ IAQS ≤ 100

CO₂ ≤ 600

PM₂.₅ ≤ 6

Good

80 ≤ IAQS < 90

600 < CO₂ ≤ 800

6 < PM₂.₅ ≤ 12

Fair

50 ≤ IAQS < 80

800 < CO₂ ≤ 1400

12 < PM₂.₅ ≤ 30

Poor

10 ≤ IAQS < 50

1400 < CO₂ ≤ 2100

30 < PM₂.₅ ≤ 55

Very Poor

0 ≤ IAQS < 10

2100 < CO₂

55 < PM₂.₅

Expressed graphically, the IAQS maps CO₂ and PM₂.₅ as shown below:

The IAQS is calculated using the following formula:

const AQI_MAX    = 100;

const PM25_MAX   = 60,  PM25_MIN = 0;
const PM25_SCALE = AQI_MAX / (PM25_MAX - PM25_MIN);   // ≈ 1.6667

const CO2_MAX    = 2300, CO2_MIN = 420;
const CO2_SCALE  = AQI_MAX / (CO2_MAX - CO2_MIN);     // ≈ 0.05319

function clamp(x, lo, hi){ return Math.min(Math.max(x, lo), hi); }

function calc_aqi(pm25, co2) {
  if(isNaN(pm25) || isNaN(co2)) { return NaN; }

  pm25 = clamp(pm25, PM25_MIN, PM25_MAX);
  co2  = clamp(co2,  CO2_MIN,  CO2_MAX);

  const dx = (pm25 - PM25_MIN) * PM25_SCALE; // 0..100
  const dy = (co2  - CO2_MIN)  * CO2_SCALE;  // 0..100

  const r  = Math.hypot(dx, dy);             // sqrt(dx*dx + dy*dy)
  return clamp(AQI_MAX - r, 0, AQI_MAX);
}

Ruuvi Station apps and Ruuvi Air display the index grade based on the value rounded to the nearest integer. For example, a value of 89.6 is rounded to 90 and displayed as turquoise (“Excellent”), even though the raw value is slightly below the threshold. History graphs also use the rounded color classification; for instance, a sequence of values 89.4, 89.5, and 89.6 transitions from green to turquoise at 89.5.

Last updated