Air-q device any good

Unfortunately they didn’t choose a good name for googling, tons of results with nothing to do with this device, which I found out on a recent release note of home assistant

I have already several sensors, like Netatmo, a DIY MQ131 on Raspberry PI for the Ozone, some $30 tuya stuff I already trashed and sensors inside air purifiers (Dyson PH04, Levoit core 400s).

The Dyson sensors gives me Formaldehyde, VOC, PM2.5, PM10 and NO2. The read values seems more or less plausible, Regarding my Ozone sensor I have no idea, I just did some tests with outdoor air quality station 20km away.

I know I cannot have professional grade sensors for few bucks but I would like to have a decent reading that I can use to compare, and eventually calibrate, other sensors.

My idea was to buy the science version with additional formaldehyde sensor.

Does anyone have some experience with this Air-Q?

Thanks
sugo

Well, just ordered that device, I will review it as soon as I played around it a bit.

Also interested to know if the Air-Q Science edition is required for Home Assistant access, otherwise Pro version looks really good.

my understanding so far is that all the versions works locally with home assistant, science option is needed for more advanced stuff, my guess is you can get raw values instead of just standard API values

I will let you know

Here a first review

TL;DR
Worth the money, but do not excpect a professional quality, this is impossible with less than $2k per sensor.
Sensors are good, more effort could be done to compensate for humidity and temperature, but this job can be done using HA, you will need to dedicate some time anyway.

Small intro:
Professional sensors are REALLY expensive, this device is for amatorial use, still they choose quality sensors in the low cost (less that $100) range. Some gas are really hard to measure, and low cost sensors often have cross sensitivity on other gas, like NO2 sensor is sensitive to O3 and to H2S. Still we can have something good enough paying attention on compensation and calibration. This was impossible just a few years ago.
All the sensors comes factory calibrated, this is good, what is not good is calibration is done ar specific pressure/temperature and humidity. The devices software has autocalibration feature which is terrible, I tried more than a week with confidence, but then I disabled that feature, I read raw values (when possible, some sensors have built in compensations) and then do the math in HA.
I choosed the science version of the device, which in my understanding additionally have mqtt option, not needed for HA, since official integration use HTTP POST queries. I suggest you the Pro version.
The forum looks like only german speaking and the community is quite small, but this will change soon I guess.
The standard airQ integration gather data every 10s, I disabled autopolling and enabled automation every 1min to gather data, it’s more than enough.

I initially did testing indoor, but values were really bad, because of my HVAC system, and when airing the house.
I placed the device outdoor, it’s not water proof but temperature range permit that.

I will share some graph soon, I am still playing around a bit, and I will have to correct the formulas when put the device indoor again. At least I have something to start now.

Easy part first:

Temperature: sensor is TI HDC1080, good enough, considering that the device itself does heat, it has been well compensated.

Relative Humidity: TI HDC1080, very good, first time I see accurate value in <30% range, this is really important since we will use this value for several calibrations/compensations.

Pressure: hard to tell, value is like 3 hPa higher than my Netatmo sensor, which is in line with nearest official meteo station, it can be easily calibrated anyway.

CO2: CM1107, from Cubic, very good one; NDIR Dual-channel Infrared provide more than enough accurate value. Still I added some percentage of humidity compensation. Look in line with Netatmo, but it’s better, more reactive and does not need calibration in fresh air for set of 400ppm, still this function can be enabled but I don’t see a good reason to use it, in fact it’s disabled by default.

  - sensor:
    - name: "AirQ Compensated Calibrated CO2"
      unit_of_measurement: "ppm"
      state: "{{ states('sensor.airq_co2') | float - 5 - 0.9 * states('sensor.airq_humidity') | float }}"

CO: sensor is TGS5141, looks good, plausible values; vendor provides information on how do compensate for temperature.

  - sensor:
    - name: "AirQ Compensated Calibrated CO"
      unit_of_measurement: "mg/m³"
      state: "{{ states('sensor.airq_co') | float - 0.1 * (states('sensor.airq_temperature') | float - 20) / 20 }}"

O2: used sensor is LuminOx LOX-02, manufactured by SST Sensing; it’s quite expensive for the low cost range, it also embed a pressure, temperature and humidity sensor; the manufacter claims to compensate in hardware for pressure and temperature, no mention about humidity compensation, strange enough since a sensor is there; despite those claims the compensation is not good at all, but we can do a good job compensating this value in HA.

  - sensor:
    - name: "AirQ Compensated Calibrated O2"
      unit_of_measurement: "%"
      state: "{{ 0.9987 * states('sensor.airq_oxygen') | float + ( 1021 - states('sensor.airq_pressure') | float ) * 0.001 + 0.029 * (20 - states('sensor.airq_temperature') | float) + states('sensor.airq_absolute_humidity') | float / 55 }}"

Particulate Matter: not easy to judge, values looks plausible, I cannot compare them to official station (less than 10 km away) because I live in a small old village where all the houses are attached toghether, 10 meters high and with tight streets; a lot of houses have wood/pellet stoves, which recent studies say they generate more particulate than fuel engines, and in fact I can smell it. I can see some relation between PM and NO2; since wood stoves generate NO this is a confirmation that measurement are plausible, because following reaction happens: NO + O3 => NO2 + O2. But I have no idea whether the values are good. Compared with sensor inside my Dyson air purifier and other low cost sensors I have, values are like 2x higher. Sensor is the PMSA003 by Plantower, it use Laser Scattering technology, measuring number of paricles larger than 0.3, 0.5, 1, 2.5, 5 and 10 micron in 1 liter, then it calculates PM1, PM2.5 and PM10 in ug/m3. As you may know PM2.5 includes PM1, and PM10 includes PM2.5, making PM1 <= PM2.5 <= PM10. The majority of my measured values are in PM1 and PM2.5, PM10 (excluding the PM2.5 part) look considerably low compared to the ratio I observe on all the official stations; this could be explained by the fact that wood stoves emit more fine particles in respect to traffic from fuel combustion. I will have to find a way to calibrate this.

https://www.nature.com/articles/s12276-020-0405-1

VOC: sensor is SGP30, it uses Multi-Pixel MOX technology, I can only say values are plausible, compared to my other sensors. Not easy to say, sometimes values are 1:1 and sometimes are 1:10, but VOC includes so many compounds that a 1:10 value is still not bad. What I can say is I can clearly see VOC dropping to 0 when I air the room and then slowly grow up, and have peaks when my wife do cooking.
https://sensirion.com/products/catalog/SGP30/

Now the hard part:

NO2/O3/H2S sensors comes from the same manufacter, those sensors are good for measuring immediate healthy risky concentration of gas, but since they range like 0-5 ppm, which is 5000 ppb, and we are looking for max 5 or 10 ppb error, then stuff becomes hard. Still, we can do something. I am confident I found good enough formulas for compansation, this has been done reading some papers, comparing the values with my other sensors, with official professional publicy available sensors, and with empirical attempt. Anyway I cannot be sure measured values are actually good, it’s just my opinion, they looks plausible.

First of all: averaging to reduce the noise:

sensor: 
  - platform: statistics
    name: "Average 1h H2S"
    entity_id: sensor.airq_compensated_calibrated_h2s
    state_characteristic: mean
    max_age:
      minutes: 60
    sampling_size: 60  
    
  - platform: statistics
    name: "Average 1h NO2"
    entity_id: sensor.airq_compensated_calibrated_no2
    state_characteristic: mean
    max_age:
      minutes: 60
    sampling_size: 60  
    
  - platform: statistics
    name: "Average 1h O3"
    entity_id: sensor.airq_compensated_calibrated_o3
    state_characteristic: mean
    max_age:
      minutes: 60
    sampling_size: 60 

NO2: 3SP_NO2_5F-P, it’s claimed not having cross sensitivity, especially for Ozone, for which there’s a filter. Well I found at least a 10 or 15% of cross sensitivity, and the filter is still new, it will be exhausted soon.

  - trigger:
      - platform: time_pattern
        minutes: "/1"
        seconds: "1"   
    sensor:
    - name: "AirQ Compensated Calibrated NO2"
      unit_of_measurement: "µg/m³"
      state: "{{ 0.7 * states('sensor.airq_no2') | float - 0.15 * states('sensor.average_1h_o3') | float(0) - 0.85 * states('sensor.airq_temperature') | float + 0.05 * states('sensor.airq_humidity') | float  }}"

H2S: 3SP_H2S_50-P

  - trigger:
      - platform: time_pattern
        minutes: "/1"
        seconds: "5"   
    sensor:
    - name: "AirQ Compensated Calibrated H2S"
      unit_of_measurement: "µg/m³"
      state: "{{ states('sensor.airq_h2s') | float - 0.04 * (20 - states('sensor.airq_temperature') | float) + 0.18 * states('sensor.average_1h_o3') | float(0) + 0.2 * states('sensor.average_1h_no2') | float(0) - 10 }}"

O3: 3SP_O3_20-P

  - trigger:
      - platform: time_pattern
        minutes: "/1"
        seconds: "10"   
    sensor:
    - name: "AirQ Compensated Calibrated O3"
      unit_of_measurement: "µg/m³"
      state: "{{states('sensor.airq_ozone') | float / 1.1 - 1 * states('sensor.average_1h_no2') | float(0)  + 0.5 * states('sensor.average_1h_h2s') | float(0) }}"

Graph of CO2 over 12h

O2 compensation in pressure, temperature and AH (discontinuity are HA restarts done while trying calibrating other sensors)

I finally placed the device inside again.

Here the reaction on this abrupt change to O2.

First of all, the amount of oxygen (O2) in the atmosphere, assuming there is no water vapor in the atmosphere, is 0.2095 kPa O2 per kPa air or 20.95%. The atmospheric concentration of O2 has remained constant for several hundred years at 20.95%. The percentage is the same at sea level or on Mount Everest.
This is true both outdoor and indoor, except if you live in a perfectly sealed house, in which case you will die for the high CO2 level far before a low O2 level occours.
The only thing that can lower considerably the O2 level is, for example, your house is on fire or some gas leakage is happening, it can be methane, nitrogen or others.
That’s why we want to report relative O2 percentage in dry air, we need a solid value to evaluate a possible health risk.
I would say anything below 20.85% is to be considered suspect.

Significant points in the graph:
A) Device placed indoor
B) HVAC started and messed up the readings
C) Stopped HVAC

I would say that, even if a bit adjustment could be done, we have now a solid O2 value to use, independent from pressure, temperature and humidity.

Just put the device far from any HVAC source

The 2x value of PM, in respect to my other sensors, could be partially explained by the fact that no humidity compansation is in place. With 95% RH and especially when there is fog the impact is huge. But even a 70% RH has impact, more on PM1 than PM10.

I read thie excellent paper and applied something similar, just less complex

This was also an interesting reading

This the caonf in HA:

  - sensor:
    - name: "Average 1h PM1 PM2_5"
      unit_of_measurement: "µg/m³"
      state: "{{ states('sensor.average_1h_pm2_5') | float - states('sensor.average_1h_pm1') | float }}"

  - sensor:
    - name: "Average 1h PM2_5 PM10"
      unit_of_measurement: "µg/m³"
      state: "{{ states('sensor.average_1h_pm10') | float - states('sensor.average_1h_pm2_5') | float }}"
     
  - sensor:
    - name: "AirQ Compensated Calibrated PM1"
      unit_of_measurement: "µg/m³"
      state: "{{ states('sensor.average_1h_pm1') | float / ( 1 + 0.4 / ( 1 / ( states('sensor.airq_humidity') | float / 100 ) - 0.97 )) }}"
      
  - sensor:
    - name: "AirQ Compensated Calibrated PM1 PM2_5"
      unit_of_measurement: "µg/m³"
      state: "{{ states('sensor.average_1h_pm1_pm2_5') | float / ( 1 + 0.3 / ( 1 / ( states('sensor.airq_humidity') | float / 100 ) - 0.97 )) }}"

  - sensor:
    - name: "AirQ Compensated Calibrated PM2_5 PM10"
      unit_of_measurement: "µg/m³"
      state: "{{ states('sensor.average_1h_pm2_5_pm10') | float / ( 1 + 0.1 / ( 1 / ( states('sensor.airq_humidity') | float / 100 ) - 0.97 )) }}"
           
  - sensor:
    - name: "AirQ Compensated Calibrated PM2_5"
      unit_of_measurement: "µg/m³"
      state: "{{ states('sensor.airq_compensated_calibrated_pm1') | float + states('sensor.airq_compensated_calibrated_pm1_pm2_5') | float }}"

  - sensor:
    - name: "AirQ Compensated Calibrated PM10"
      unit_of_measurement: "µg/m³"
      state: "{{ states('sensor.airq_compensated_calibrated_pm2_5') | float + states('sensor.airq_compensated_calibrated_pm2_5_pm10') | float }}"

Thank you very much for the effort,.much appreciated. I own the Air-q sci since several months, but still having some work to do for reliable values. Since the HA integration appeared, it got much easier.