Testing the IKEA Alpstuga

I’m testing the accuracy of an IKEA Alpstuga device (bought 2026-01-29) against an AirGradient ONE (version 9 of the DIY kit). I don’t have the Alpstuga hooked up to any Matter controller so I’m just collecting point-in-time readings.

The Alpstuga is placed on a table in the room while the AirGradient is attached to a wall about 10m away.

My testing methods aren’t scientifically accurate BUT I just wanted to see for myself how the Alpstuga compares to a more renowned device because I’ve seen differing reports on its accuracy online.

Sensors and margin of error

Sensiron has confirmed that the Alpstuga uses their SEN63C sensor module which, according to spec promises the following accuracies:

According to the Alpstuga manual it can take up to 12 hours for the sensor to be fully calibrated for CO2 readings.

In comparison, the AirGradient ONE uses a combination of sensors:

One hour in

After about an hour here’s how the measurements compare. Note that the CO2 should not be considered valid yet.

DeviceCO2PM2.5Temp (°C)Rel. Humidity
Alpstuga399ppm9μg/m³20.934%
AirGradient667ppm2.4μg/m³22.731.9%

The actual possible values according to each device’s measurement compare as follows:

SensorRange Alp.Range AGAggreement within error?
CO2259-539ppm600-734ppm
PM2.58-10μg/m³0-12.4μg/m³
Emote named think-genuine/ea32

Temperature measurements could conceivably be a bit different, since the AirGradient is mounted higher up and in proximity to other electronics.

This can also cause the discrepancy in relative humidity values.

Two hours in

…it’s looking much better.

DeviceCO2PM2.5Temp (°C)Rel. Humidity
Alpstuga503ppm3μg/m³21.034%
AirGradient666ppm0.7μg/m³22.632.1%

Both the CO2 and the PM2.5 are now closer to the AirGradient’s measurements and, adjusting for margins of error, they are actually in agreement!

SensorRange Alp.Range AGAggreement within error?
CO2353-653ppm606-726ppm
PM2.52.7-3.3μg/m³0-10.7μg/m³

The Alpstuga still seems to report a bit low but as a general guideline of “Is it bad enough that I should open a window?” I would consider this okay right now.

Emote named intrigued/c0f5

I had the Alpstuga unplugged for a few seconds about 10 minutes before taking this measurement.

It seems like it started off at a default value of 390ppm for CO2 at first but the sensor seems to have kept its calibration since it jumped up to 500 much quicker than after first plugging it in. The general trend in the next few minutes followed the AirGradient’s readings.

Emote named laugh/56cd

Funnily enough it lost its clock settings.

It remains to be seen how the Alpstuga holds up after its calibration is officially done.

Three and a half hours in

The CO2 measurements are in disagreement again.

DeviceCO2PM2.5Temp (°C)Rel. Humidity
Alpstuga424ppm4μg/m³21.033%
AirGradient630ppm0.5μg/m³22.631.5%

It was fluctuating a bit around this time but 420-ish ppm seemed to be the “baseline” it usually returned to. I’ve moved the Alpstuga around a little bit, maybe that upset it.

SensorRange Alp.Range AGAggreement within error?
CO2282-566ppm571-689ppm
PM2.53.6-4.4μg/m³0-10.5μg/m³

This was the last reading I took before leaving for the day.

The next day (15:10, about 15 hours after the last reading)

As far as I know, the Alpstuga was powered overnight, so this is the first reading after the 12-hour calibration period. The readings of its CO2 sensor can now be considered valid.

The Alpstuga seems to be reading CO2 levels above the AirGradient’s measured concentration now.

DeviceCO2PM2.5Temp (°C)Rel. Humidity
Alpstuga662ppm12μg/m³20.731%
AirGradient580ppm20.1μg/m³23.428.1%

When adjusted for margin of error, there is now again an overlap in possible actual values determined by the Alpstuga and the AirGradient.

SensorRange Alp.Range AGAggreement within error?
CO2496-828.2ppm523-637ppm
PM2.510.8-13.2μg/m³10.1-30.1μg/m³

The next day (17:15)

DeviceCO2PM2.5Temp (°C)Rel. Humidity
Alpstuga593ppm15μg/m³21.029%
AirGradient495ppm10.8μg/m³22.826.8%

Still in agreement.

SensorRange Alp.Range AGAggreement within error?
CO2434-752ppm523-637ppm
PM2.513.5-16.5μg/m³0.8-20.8μg/m³

After airing the room out (17:39)

DeviceCO2PM2.5Temp (°C)Rel. Humidity
Alpstuga423ppm16μg/m³14.937%
AirGradient443ppm9.2μg/m³18.530.6%

SensorRange Alp.Range AGAggreement within error?
CO2281-565ppm390-496ppm
PM2.514.4-17.6μg/m³0-19.2μg/m³

19:18

This one is noteworthy because the sensors actually disagreed for the first time after calibration.

The Alpstuga had people sitting and talking around it at approximately this time but the discrepancy is still somewhat extreme.

Another possible explanation is that the AirGradient metrics are actually an average over time and the CO2 content has increased in a relatively short timespan. I haven’t checked how the AirGradient’s numbers are processed in the dashboard I took them from.

DeviceCO2PM2.5Temp (°C)Rel. Humidity
Alpstuga929ppm9μg/m³19.933%
AirGradient644ppm5.8μg/m³21.729.9%

SensorRange Alp.Range AGAggreement within error?
CO2736-1122ppm584-703ppm
PM2.58.1-10.9μg/m³0-15.8μg/m³

The AirGradient’s concentration did increase by about 260ppm just a few minutes afterwards, so badly mixed air or a running average sound plausible.

A graph showing that the AirGradient’s measured CO2 concentration at 19:16:44 was 636ppm. The graph extends from 17:00, where the concentration starts dipping to around 400ppm to almost 21:00 where the concentration is at 905ppm. There’s a large peak shortly after 20:00.

The same graph with a different time highlighted to make the value visible. The time highlighted is 19:24:44 and the CO2 reading at that time was 790ppm.

20:06

DeviceCO2PM2.5Temp (°C)Rel. Humidity
Alpstuga1014ppm9μg/m³21.631%
AirGradient892ppm18.2μg/m³23.129.8%

SensorRange Alp.Range AGAggreement within error?
CO2813-1215ppm825-959ppm
PM2.58.1-10.9μg/m³8.2-28.2μg/m³

I’ll be updating this post as I capture more readings.