How to make CO2 Sensor remain accurate Indoors?

I just purchased my Air Gradient DIY Pro. The hardware itself is excellent and the assembly instructions were great.

But it appears there is a combination of software problems that make the CO2 sensor not actually work indoors.

  1. By default, the sensor does an “Automatic Baseline Calibration” (ABC) every “7-14 days” by taking the lowest reading it has seen and assumes that is the baseline, which will not be accurate for many homes.
    If you do not open all of your doors/windows every 7-14 days, the sensor will ABC wrong and the readings will not be accurate.
    The devs say that “In more then 95% of the indoor rooms we monitor we see ambient levels at least once a week.”
    But several users have explained that this is not true for many homes.

  2. The first recommended fix for inaccurate readings is to “just wait a week or two for it to calibrate”, but this this will not work because of #1. In fact, it will get more wrong every week.

  3. The second recommended fix is manually calibrate your device via some arduino code, but this will not work because the flashing instructions have a bug and currently flash the wrong firmware version and your device will bootloop. The fix is a simple git error but has not been updated since the last release in April 2023.

  4. The third recommended fix is to do one calibration and then disable the ABC. This has been discussed since November 2022 and it is known the sensor itself supports disabling the ABC, there is no code available to do this.

  5. It seems there is a way to trigger a manual calibration remotely for the commercial version of the device (which to my understanding is identical to the DIY). This can been seen on the dashboard, but is not available to DIY users.


Replying with some sources because only allowed to include 2 links per post:

Users explaining why the ABC does not work for them: S8 CO2 sensor reading high?

Users explaning the the flashing code is broken: AirGradient DIY PRO (PCB >3.7) 2.4.1 2023.04.13 Source Code/Sketch?

Replying with more sources because only allowed to include 2 links per post:

Users asking why the Dashboard remote calibration doesn’t work: Air Gradient Pro - CO2 below 400ppm - #3 by Lexifir

Respectfully, your post title is too sensational “Not Usable”.

Just yesterday I manually calibrated my AirGradient. It took a few minutes.

I don’t feel the need to calibrate my unit every week. I calibrate it when I notice it being off (yesterday it was cooler in NYC and with the windows open, it was reading below 400).

I do understand your frustration but I don’t remotely think this device is being marketed as for average consumers. If you are willing to invest some time, you can customize it to your liking, which I did: I turned off ABC and manually calibrated it. Something I can’t do with any other like unit on the market that I’m aware of.

It’s called DIY. That is, Do It Yourself. If you point out the specific language you feel misled you, I’m sure Achim will clarify it. I have no connection to him whatsoever, that’s just my sense of him.

But how did you calibrate it?

You had to manually change the flash firmware from the published instructions to a custom fork after you fixed the build errors. Then you, presumably, wrote your own code to disable the ABC.

Thats about 8 steps further down the DIY difficulty tree the the site makes it sound like when you order.

I guess we can argue the semantics of “how it’s presented” vs “what you get”.

Edit to add: IMO the site is presented as if the Hardware assembly is the DIY part the fancy cloud software is just ready to go.

It’s fine if that is not the case, but its definitely not clear to buyers.

You seem to be fond of exaggeration with the illusion of specifics. How did you calculate 8 times further down the difficulty tree, whatever that is supposed to mean?

If you’re looking for help, it’s best to ask for it, rather than crap on an innovative product that never promised what you are looking for.

@Leubles93 just a few comments from my side:

  1. I find your language aggressive, and the way it’s written is not the way I would like to see a constructive dialogue in this forum. I also fully disagree with your topic title and agree with @makingmark that it is sensational.
  2. We are literally monitoring 1000s of rooms and as I mentioned this is an issue that is not very common.
  3. The DIY kit is open source and you could implement your own remote calibration solution if you so wish.
  4. All CO2 sensors in low-cost monitors use ABC, many 1 day ABC which could indeed be a problem. We specifically chose a high quality one with a seven day ABC.

Having said that, we are currently working on a tighter integration of the DIY monitor with our commercial monitor and our data platform which will then also align better the software calibration, e.g. the remote trigger of the calibration that - as you rightly pointed out - is currently not available for the DIY units .

1 Like

I find your language aggressive, and the way it’s written is not the way I would like to see a constructive dialogue in this forum. I also fully disagree with your topic title and agree with @makingmark that it is sensational.

I updated the original post and title to remove aggressive and sensational language.

We are literally monitoring 1000s of rooms and as I mentioned this is an issue that is not very common.

I linked to other threads where other users were pointing out the same issue in explicit detail like this:

It also sounds like the device will continue to recalibrate its baseline every week, using the assumption that the room reached equilibrium with outside air during that time period. That assumption is incorrect most of the time for many of us. Most people in cold climates do not aerate like that during the winter. In North America it will also be incorrect in the summer, when most spaces are air conditioned.

I of course have no idea which 1000s of rooms you are monitoring, but these other users and I are telling you that the assumption that it will baseline around 400ppm weekly indoors is just a wrong assumption for millions of residences in North America.

The DIY kit is open source and you could implement your own remote calibration solution if you so wish.

I understand that. My original post was expressing the frustration that the way that you sell and market the DIY Kit does not at all imply that you need to write the software improvements yourself in order to get it to work correctly.

Because you think I am being sensational, I will be very specific. Here are quotes from the product page on the front of the website (pictured):

We do also test all components before shipping to ensure you get an accurate and reliable device.
MCU preflashed. No flashing required
24 months AirGradient data platform
Screenshot of online Dashboard

I understand that all of those things are True.

What I am saying is that presentation strongly implies that the software will Just Work.

My post is pointing out that:

  1. It doesn’t Just Work
  2. I came here to try and fix it, and the recommended fixes don’t work either.
  3. People have posted these issues before and you tell them (and now me) essentially: We monitor thousands of these you are wrong. You’re free to fix it yourself.

The work around for the bootloop problem is to flash using the “automatic” flashing button within the build instructions, since it appears to be an earlier version of the software. This solved the problem of the bootloop. I mean, they should really fix the actual error, too, but you will be able to get your device to work again.

However, that will not solve the inherent calibration problem for conditioned spaces: the air temperature and humidity can be radically different indoors and out, and calibrating in one environment will give you inaccurate readings in the other. The farther apart the two conditions are, the worse the error in the reading will be. After manually calibrating outdoors recently, my monitor read 200ppm lower indoors. The ONLY way to fix this would be to know the equations for the effects of temperature and humidity in this particular model of sensor and then write software that would adjust the reading according to the temp and humidity at the time of the reading compared to the conditions at calibration. This should be possible given sufficient information about the sensor properties, but it’s not exactly a DIY proposition.

I suspect that the owner here has a hard time understanding how significant this problem is in our market, because the sealed buildings characteristic of North America are extremely uncommon in Thailand. I imagine it is hard to fathom how much time Americans spend in buildings that don’t even have windows that open. Inadequate ventilation is not just common here, it is the overwhelming norm. OSHA regulations in the US permit workers to be in environments at 5000ppm CO2 for eight hours a day, and buildings are ventilated accordingly at extremely low levels. Most older homes do not have adequate ventilation because as owners have upgraded leaky windows and attics, they have not routinely added active energy recovery ventilation. I would strongly suspect the majority of North American homes and workplaces spend more than half the year without ever coming to environmental equilibrium.

Where I live, summertime daily high temperatures outdoors are typically 10-20 degrees F hotter than inside my house, which I keep at 77. Office buildings are kept MUCH cooler. Relative humidity outdoors is frequently 70-85% , while the house is usually around 50%. Temperature differences can be much more extreme than that in winter, obviously. So it’s simply not feasible to get accurate readings most of the year from a monitor without software compensating for how the temp and humidity will affect the raw sensor output.

I’m writing to other monitor companies to determine which of them do this, but my money is on those that also produce scientific instruments.


So I just got my DIY kit working, and managed to manually calibrate the S8 CO2 sensor, and it seems to match what I’d expect (around 420ppm outdoors, and then matches my Vitalight CO2 monitor indoors) for a little while, then, it settles to be about 65-75ppm lower than the other monitor.

I don’t know which one is correct other than knowing the S8 sensor was wayyy off at first and I had to use the S8_UART code to manually calibrate 2-3x before it showed a plausible reading for outdoors (at first showing 200, then 300).

Is this 65-75ppm lower difference due to temp/humidity issues? And I would have to calibrate in conditions that exactly match my indoor environment to get accurate readings? I would have thought the Vitalight sensor to be similar to the S8 as both are NDIR I believe (specs say MEMSF MTP40-F).

OR, is the S8 giving an accurate reading and the Vitalight reading is off? Both say about 420 outside, different by 5-10.

I’m also in a region where outdoors is 5-10 deg higher with RH around 70-80% vs 45-55% indoors.

Let me make sure I understand: Are you saying the meters are both reading about 420 outside, but the indoor measurements are different from each other by 65-75ppm? If so, yes I would certainly expect that difference to be because the two sensors have different reaction curves to the change in temp/humidity. There can be a great deal of difference between different NDIR sensors. Plus, with a commercial device, you have no information about what the device’s software might be doing

However, it is impossible to say from this if one is more accurate than the other. One could be right and the other wrong. Or they could both be wrong–either equally (if the true value is in between the readings) or to different extents (with one being more wrong than the other).

1 Like

We are actually looking very seriously into this issue in two ways:

Analysing the impact of temperature and humidity on the measurements
We are currently testing the CO2 sensor outdoors against reference instruments and what we see is very little (if at all) impact of humidity and temperature differences.

The reference instrument is humidity and temperature controlled and since we do not see much deviation between the SenseAir (uncontrolled) we can probably assume there is little impact.

It seems that other NDIR sensors are more suspectible to humidity and temperature influence but the SenseAir that we use seem to perform very well.

We will do more direct humidity/temperature analysis in the next days.

Updated PCB and Firmware
We decided to merge our previously closed source indoor monitor AirGradient ONE with the indoor PRO DIY kit and are testing already a combined version. This will also have the ESP32-C3 (similar to our outdoor monitor). In line with this upgrade, we will bring more functionality to the open-source version including the ability for triggered remote calibration and -if possible- switching off the ABC (needs further testing if the S8 supports this). I do expect this new version to be available in the next 2-3 months.

We do actually work very closely with scientists on improving the accuracy on our monitors (see AirGradient Research) and I hope that there was not the wrong impression that we do not care about it. Quite on the contrary. But we are also quite thin on resources so some improvements might take time (more than I sometime like).


Maybe adding one more thing:

Moving monitors and fast temperature / humidity changes are probably not ideal and we have seen monitors that got way off by moving them around. So ideally we come to a solution of being able to trigger a manual baseline calibration remotely and switching off the ABC completely. Then the following could be done:

a) Switch of ABC
b) Installing the monitor in the room
c) Opening the windows for a while
d) Closing the windows to achieve typical temperature / humidity for indoors but nobody stays in the room
e) After the room reached room temperature, trigger a manual calibration

What we need to find out regarding above is the drift of the monitors if the ABC is switched off to understand how often a recalibration would need to be carried out.


To the first part: yes, that is correct.

I guess other than temperature and PM2.5, none of the sensor readings are useful other than directionally and to detect peaks/trends. There was another post about humidity being off with the AirGradient sensor vs several other commercial sensors, and I’m seeing the same thing, and it’s off by a similar amount (higher by 6-8%). They are the inexpensive sensors off Amazon but they all agree with each other within 5%.

The new IKEA air quality monitor that measures PM2.5, temp, humidity, and TVOC trends seems to agree with the AirGradient measurements on humidity. Humidity for general purposes don’t need super high accuracy, I guess probably neither does CO2 as long as it’s within 25-50ppm of actual, 50-100 off starts getting to a pretty high margin of error though imo.

At least the PM2.5 seems fairly accurate (outside it matches what IQAir/AirVisual reports for the local area).

For those of us who might not be able to easily expose a room to outdoor air for recalibration, does the sensor allow us to just manually set the baseline at 420?

It seems indoor CO2 measurements are tricky generally also if the goal is to know how much above outside air indoor readings are, since outdoor CO2 levels might fluctuate 25-50 or more in urban areas. Maybe for those with an outdoor monitor it can include a CO2 sensor in the future and that can be used as the baseline for the indoor sensor? (If some of us want that level of accuracy)

For what it is worth, ESPHome has support for the Senseair S8 and has code already built and tested to trigger a calibration on demand as well as disable calibration:
SenseAir CO_2 Sensor — ESPHome

So with just this block of YAML in my config file, I now have a button in HomeAssistant that I can trigger the calibration as needed, or potentially I could setup an automation that when it reads less than 400, start a calibration, although that logic could be flawed or inconsistent.

There is also code for disabling the ABC, so another button could be created to enable/disable the automatic calibration.

  - platform: template
    name: ${upper_devicename} SenseAir S8 Calibration
    id: senseair_s8_calibrate_button
        - senseair.background_calibration: senseair_s8
        - delay: 70s
        - senseair.background_calibration_result: senseair_s8

I would like to see this potentially used more instead of AirGradient having to write their own code, and if ESPHome isn’t working correctly, submitting a PR for it would benefit even more users

1 Like

Thank you for this. I am planning to add an ESPHome integration page on our website as well. Wanted to do this for a long time but didn’t get to it yet.

If you are interested helping me writing that page would be great. If so please contact me through our support form.

1 Like

@Achim_AirGradient Slightly different question. If I know the indoor CO2 is 729 can I “tell it” to ABC to a value of 729 or must it always be 420?

I haven’t seen a way in ESPHome at least. Only that it will trigger the S8’s internal calibration routine, which assumes a CO2 of 400, even though in the last year the ambient levels are 419

Hello, I apologize for digging up an old thread, but I’m looking to purchase a ONE indoor monitor soon.

Has this issue been resolved in the lastest versions?

I NEVER open the windows, and only the doors when I go out 2-3 times a week. So there is almost never any “fresh air.”

Will this be an issue or have there been adjustments made to the software to make this a non-issue by now?