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) }}"