Quick Summary (TL;DR):
The SGP40 and SGP41 are Sensirion metal-oxide gas sensors designed for indoor-air-quality monitoring with ESP32, ESPHome and Home Assistant. The biggest difference is simple: SGP40 measures VOC behaviour only, while SGP41 adds a second sensing pixel for oxidizing gases, especially NOx. Both use I²C address 0x59, both need continuous 1 Hz sampling for the Gas Index Algorithm, both work best with real temperature/humidity compensation, and both report a unitless Gas Index rather than a true ppm/ppb concentration. The VOC Index is normally interpreted relative to recent history, with typical conditions mapped around 100; values above 100 indicate more VOC activity than the recent background, while lower values indicate cleaner-than-recent-background conditions. The SGP41 adds a NOx Index that reacts mainly to oxidizing gases such as NO₂/O₃ and can reveal combustion-related indoor-air events that an SGP40 cannot distinguish. For a normal room, bedroom, office or air-purifier trigger, SGP40 is the best-value choice. For a kitchen, gas-cooking environment, garage-adjacent room, urban-air monitor or more complete IAQ station, SGP41 is the better sensor. Neither sensor measures real CO₂, PM2.5 or a specific VOC species, so a complete air-quality node may also use SHT45 for temperature/humidity, SCD40/SCD41 for true CO₂ and PMS5003/SEN6x for particles.
Materials You’ll Need
| Item | Why you need it |
|---|---|
| ESP32 development board | Runs ESPHome/Arduino and the Gas Index processing |
| SGP40 breakout | VOC-only option |
| SGP41 breakout | VOC + NOx option |
| SHT40/SHT45 temperature-humidity sensor | Recommended real compensation source |
| USB cable + stable power supply | Continuous operation is preferable for Gas Index learning |
| Dupont wires | I²C connections |
| Breadboard | Prototype wiring |
| Ventilated enclosure | Lets room air reach the gas sensor without trapping heat |
| Home Assistant + ESPHome | Local logging, graphs and automations |
For a new build, the most useful combinations are ESP32 + SGP40 + SHT45 for a strong VOC monitor, or ESP32 + SGP41 + SHT45 when NOx information is also valuable. The SHT45 can share the same I²C bus.
SGP40 vs SGP41 at a Glance
| Feature | SGP40 | SGP41 |
|---|---|---|
| VOC sensing | Yes | Yes |
| NOx / oxidizing-gas sensing | No | Yes |
| VOC Index | 1–500 / commonly presented 0–500 | 1–500 / commonly presented 0–500 |
| NOx Index | No | 1–500 |
| Raw gas channels | SRAW_VOC | SRAW_VOC + SRAW_NOX |
| I²C address | 0x59 | 0x59 |
| I²C speed | 100 / 400 kHz | 100 / 400 kHz |
| Bare-chip supply | 1.7–3.6 V | 1.7–3.6 V |
| Average operating current | ~2.6 mA class | ~3.0 mA class |
| Response τ63% | <10 s VOC | <10 s VOC; NOx channel also event-oriented |
| On-chip humidity compensation input | Yes | Yes |
| ESPHome platform | sgp4x | sgp4x |
| Best use | General VOC / odour / ventilation monitoring | VOC + combustion/oxidizing-gas awareness |
The Most Important Point: These Sensors Do Not Output ‘VOC ppm’
SGP40 and SGP41 are often sold with descriptions that make them sound like laboratory gas analysers. They are not. They are broadband metal-oxide gas sensors whose raw resistance changes in response to mixtures of gases.
Sensirion therefore recommends processing the raw signal with its Gas Index Algorithm rather than pretending the sensor can uniquely convert a mixed indoor atmosphere into one true VOC concentration.
SGP40 raw response
↓
Sensirion Gas Index Algorithm
↓
VOC Index
SGP41 raw VOC + NOx responses
↓
VOC + NOx Gas Index Algorithms
↓
VOC Index + NOx Index
This is exactly why current ESPHome renamed the old configuration keys voc and nox to voc_index and nox_index: the values are unitless indices, not gas concentrations.
What the VOC Index Actually Means
Sensirion’s VOC Index is designed to behave more like a human nose than a conventional concentration meter. It learns the normal chemical background of the room and reports current VOC conditions relative to that recent history.
VOC Index ≈ 100
→ typical recent VOC background
VOC Index > 100
→ more VOC activity than recent average
VOC Index < 100
→ cleaner than recent average / fresh-air event
The algorithm uses a moving learned baseline and adapts its gain to typical events. That makes the same scale useful in different rooms even though one room may have more permanent off-gassing than another.
The downside is equally important: a VOC Index of 200 does not mean “twice as many ppm” as a VOC Index of 100. It is a relative indoor-air-quality signal.
What Counts as a VOC Event?
- Cooking fumes
- Cleaning products
- Perfume and deodorant
- Paints and solvents
- New furniture / flooring / adhesives
- Alcohol-based products
- Human breath and occupancy-related organics
- Combustion by-products
- Off-gassing plastics and materials
Because SGP40 is broadband, it reacts to many reducing gases and VOC mixtures. It cannot tell Home Assistant “this spike was ethanol” or “this is formaldehyde.” It tells you that the room’s VOC environment has changed.
What the SGP41 Adds: A Dedicated NOx / Oxidizing-Gas Pixel
SGP41 contains an additional sensing element that responds to oxidizing gases. In indoor air, the most relevant group is usually nitrogen oxides, especially NO and NO₂, although the sensor can also respond to gases such as ozone.
That second channel is the entire reason to buy SGP41 over SGP40.
SGP40
└─ VOC pixel
SGP41
├─ VOC pixel
└─ NOx / oxidizing-gas pixel
The NOx Index is especially useful where combustion can occur or outdoor urban pollution can enter the room.
Where NOx Comes From Indoors
- Gas hobs and ovens
- Gas heaters / unflued combustion appliances
- Vehicle exhaust entering from roads or garages
- Outdoor urban pollution entering through windows/ventilation
- Other combustion sources
A gas cooker is one of the clearest SGP41 use cases because cooking can create both VOC and NOx events. SGP40 sees the VOC side; SGP41 gives you another independent signal that can react to the oxidizing-gas component.
The NOx Index Is Also Not a True NO₂ ppm/ppb Meter
The SGP41 datasheet characterises the NOx pixel using NO₂ in clean air, but Sensirion explicitly recommends the NOx Index for real-world indoor use rather than treating the raw MOX response as a precise concentration measurement.
So this is wrong:
NOx Index 100 = 100 ppb NO2 ← WRONG
The correct interpretation is: the NOx Index is a processed indicator of oxidizing-gas conditions relative to the sensor’s learnt environment and algorithm behaviour.
SGP40 vs SGP41 for a Kitchen
Winner: SGP41.
A kitchen is exactly where the extra channel can add information. Frying, baking and cleaning can produce large VOC events; a gas cooker can also create nitrogen oxides. The two indices can therefore behave differently during the same cooking session.
That does not let SGP41 identify the recipe or gas species, but it gives Home Assistant a richer air-quality picture and can improve extractor-fan/ventilation automations.
SGP40 vs SGP41 for a Bedroom
Usually SGP40.
In a bedroom, the more valuable measurements are often CO₂, temperature and humidity. VOC monitoring is useful for perfumes, cleaning products, furniture off-gassing and general IAQ trends, but dedicated NOx sensing is usually less critical unless the room is close to heavy traffic or a combustion source.
A strong bedroom node could therefore be:
SCD41 → real CO2
SHT45 → temperature + humidity
SGP40 → VOC Index
SGP40 vs SGP41 for Urban Apartments
SGP41 becomes more attractive.
If windows face a busy road, outdoor NOx pollution can enter the building. A NOx-sensitive channel can then provide useful trend information alongside particles and VOCs.
For that environment, a more complete node could combine SGP41 with a PM2.5 sensor and CO₂ sensor rather than expecting one gas sensor to represent every air-quality problem.
SGP40 vs SGP41 for Air Purifier Control
For a basic activated-carbon/air-purifier fan trigger, SGP40 is often enough. Sensirion specifically positions SGP40 for air treatment devices and gradual fan control based on VOC Index.
SGP41 is useful when the purifier/ventilation strategy should also react to oxidizing-gas events. Remember that a normal HEPA filter removes particles, not gases; VOC/NOx removal depends on activated carbon or other gas-treatment media and ventilation.
Both Sensors Need Continuous 1 Hz Measurement
This is one of the most important implementation details. The SGP4x Gas Index workflow expects the sensor to be sampled at approximately 1 Hz.
ESPHome handles this internally. Even if Home Assistant is updated only every 30 or 60 seconds, ESPHome continues to drive the SGP4x sensor once per second so the algorithm sees the continuous data stream.
Sensor measurement: 1 sample / second
Home Assistant publish: e.g. every 30–60 seconds
These are NOT the same interval.
This is a good design because Home Assistant does not need 86,400 VOC updates per day, but the Gas Index Algorithm benefits from continuous samples.
Why Deep Sleep Is a Poor Fit
SGP40/SGP41 are not ideal for a node that wakes every five minutes, takes one reading and immediately sleeps. The sensor and algorithm learn the environment over time, and meaningful Gas Index performance depends on continuous operation/history.
If battery life is critical, choose the architecture carefully. For a mains-powered room-air monitor, keeping the ESP32 and SGP4x running continuously is the simplest and most reliable design.
Startup and Learning Time
A newly powered gas sensor should not be treated as fully settled immediately. Sensirion specifies a switch-on period and the VOC algorithm goes through a fast initial adaptation before longer-term learning stabilises the baseline.
Practical Home Assistant rule:
First few minutes → useful for obvious events, but still initializing
First ~1–2 hours → baseline adapting quickly
Longer operation → increasingly representative room history
Do not calibrate thresholds based on the first five minutes after flashing a new node.
ESPHome Baseline Storage
Current ESPHome can store and restore the Gas Index algorithm baseline. This reduces the “start from zero knowledge” effect after a normal reboot.
The default store_baseline: true is normally what you want for a permanently installed air-quality node.
Baseline storage does not magically preserve every second of historical context, but it improves restart behaviour and avoids unnecessary relearning compared with discarding the algorithm state each time.
Temperature and Humidity Compensation
Metal-oxide gas sensor behaviour changes with ambient humidity and temperature. SGP40 and SGP41 therefore accept humidity/temperature values as inputs to the measurement command so the raw gas signal can be compensated.
ESPHome can use an external sensor such as SHT40/SHT45 as the compensation source.
SHT45 temperature ─┐
├→ SGP4x compensated measurement
SHT45 humidity ────┘
If no valid compensation source is available, ESPHome can fall back to reasonable default conditions. That is convenient, but a real nearby temperature/humidity sensor is better when the room varies significantly.
Why SHT45 Is a Particularly Good Companion
SHT45 is accurate, fast and uses I²C. It can share the same SDA/SCL pins as SGP40/SGP41 because the addresses are different.
ESP32 I2C bus
GPIO21 SDA ─────────┬─ SHT45 (0x44)
GPIO22 SCL ─────────┴─ SGP40/SGP41 (0x59)
This gives one ESP32 node temperature, humidity, VOC Index and — with SGP41 — NOx Index using only two GPIOs.
Wiring to ESP32
| SGP40 / SGP41 | ESP32 (typical classic DevKit) | Note |
|---|---|---|
| VIN/VCC | 3.3 V | Safest universal choice; check breakout-board regulator/level shifter if using VIN |
| GND | GND | Common ground |
| SDA | GPIO21 | Example I²C SDA |
| SCL | GPIO22 | Example I²C SCL |
The bare SGP40/SGP41 chip is a 1.7–3.6 V device. Some breakout boards advertise 5 V because the board includes regulation/level shifting. Do not assume every anonymous module does. Powering the breakout from 3.3 V is the safest default for ESP32.
Both sensors use fixed I²C address 0x59, so an SGP40 and SGP41 cannot normally share the same I²C bus simultaneously without a multiplexer. In practice you would choose one, not install both.
ESPHome 2026 Configuration: Important Key Rename
ESPHome 2026.8 renamed the SGP4x sensor keys from voc/nox to voc_index/nox_index.
The old names currently warn and auto-migrate, but ESPHome plans to remove them in 2027.2.0. For a new article/configuration, use the new names now.
ESPHome Configuration: SGP40 Only
i2c:
sda: GPIO21
scl: GPIO22
scan: true
sensor:
- platform: sgp4x
voc_index:
name: "Room VOC Index"
update_interval: 30s
store_baseline: true
ESPHome auto-detects whether the connected SGP4x device is SGP40 or SGP41. If an SGP40 is detected, there is no NOx channel.
ESPHome Configuration: SGP41 VOC + NOx
i2c:
sda: GPIO21
scl: GPIO22
scan: true
sensor:
- platform: sgp4x
voc_index:
name: "Room VOC Index"
nox_index:
name: "Room NOx Index"
update_interval: 30s
store_baseline: true
ESPHome Configuration: SGP41 + SHT45 Compensation
i2c:
sda: GPIO21
scl: GPIO22
scan: true
sensor:
- platform: sht4x
temperature:
name: "Room Temperature"
id: room_temperature
humidity:
name: "Room Humidity"
id: room_humidity
precision: High
update_interval: 30s
- platform: sgp4x
voc_index:
name: "Room VOC Index"
nox_index:
name: "Room NOx Index"
compensation:
temperature_source: room_temperature
humidity_source: room_humidity
update_interval: 30s
store_baseline: true
This is the configuration I would use for an SGP41 Home Assistant node unless another good temperature/humidity sensor is already present.
SGP41 NOx Conditioning
SGP41 has an extra startup step for its NOx sensing pixel. The device performs a short NOx conditioning period before normal dual-channel measurement.
Current ESPHome handles that automatically; its SGP4x implementation runs the NOx conditioning command for the first approximately 10 seconds before switching to the normal SGP41 VOC+NOx measurement command.
You therefore do not need a Home Assistant automation or special startup script just to condition the NOx pixel.
How Fast Do SGP40/41 React?
Sensirion specifies a VOC response time below roughly 10 seconds τ63% under test conditions. That means the sensor element itself can react quickly to a sudden gas event.
The Gas Index output also contains algorithm dynamics, baseline learning and filtering. So the chart you see in Home Assistant is intentionally not the same as simply plotting raw MOX resistance.
Why Raw Values Are Usually Less Useful
The raw SRAW signal is primarily valuable for testing, algorithm research and low-level integration. For normal Home Assistant automations, the processed VOC/NOx Indices are easier to interpret and more stable across changing background conditions.
Raw SRAW value → sensor physics / engineering
Gas Index → application / automation signal
VOC Index Thresholds for Home Assistant
Because VOC Index is adaptive, thresholds should be treated as control heuristics rather than health-limit concentrations.
| VOC Index behaviour | Practical interpretation |
|---|---|
| Around 100 | Typical recent background |
| Below 100 | Cleaner than recent background |
| 120–150+ | Noticeable increase / possible event |
| 200+ | Strong VOC event relative to room history |
| Very high spikes | Cooking, cleaning, solvents, perfume or other major chemical event likely |
Sensirion gives examples of using a fixed VOC Index threshold such as 150 to trigger stronger air-purifier operation. Your best threshold depends on the room and automation objective.
NOx Index Thresholds
NOx Index should also be used as an event/condition indicator rather than converted into a fictional ppb value.
For a kitchen extractor automation, the useful question is not “is this exactly 83 ppb NO₂?” but “has the oxidizing-gas condition risen far above normal during gas cooking?”
Sensirion’s NOx Index documentation illustrates fixed action thresholds as a valid use pattern. Before automating, observe several days of your own Home Assistant history and identify the room’s normal behaviour.
A Good Home Assistant Dashboard
- VOC Index
- NOx Index (SGP41 only)
- Temperature
- Relative humidity
- CO₂ if an SCD4x sensor is present
- PM2.5 if a particle sensor is present
- 24-hour history graph
A single “Air Quality = Good/Bad” badge hides too much information. Keeping the individual signals visible makes it much easier to understand what is happening.
Example Home Assistant Automation: VOC Ventilation
alias: Ventilate on high VOC
trigger:
- platform: numeric_state
entity_id: sensor.room_voc_index
above: 180
for: "00:02:00"
action:
- service: fan.turn_on
target:
entity_id: fan.air_purifier
mode: restart
The delay prevents one short perfume/cleaner spike from repeatedly toggling the fan.
Example Automation: Kitchen NOx Alert
alias: Kitchen oxidizing gas alert
trigger:
- platform: numeric_state
entity_id: sensor.kitchen_nox_index
above: 150
for: "00:01:00"
action:
- service: fan.turn_on
target:
entity_id: fan.kitchen_extractor
mode: restart
Do not copy 150 blindly as a health threshold; it is an automation example. First observe your own SGP41 history and tune the threshold to the desired response.
Can SGP40 or SGP41 Measure CO₂?
No.
Neither sensor contains a true CO₂ measurement cell. A rise in human occupancy can influence VOCs, but VOC is not a substitute for carbon dioxide.
Need real CO2 → SCD30 / SCD40 / SCD41
Need VOC trend → SGP40 / SGP41
Need NOx trend → SGP41
This distinction is important for ventilation. CO₂ is excellent for occupancy/ventilation load; VOC/NOx detect different chemical/combustion events.
Can SGP41 Replace a PM2.5 Sensor?
No. Gas sensors and particle sensors measure different pollutants.
SGP41 → gases
PMS5003 / SEN5x → airborne particles
Frying food can produce both gas and particle events, but one sensor cannot infer the other reliably.
Can SGP41 Detect Carbon Monoxide?
Do not use SGP41 as a life-safety carbon-monoxide alarm. MOX sensors can have cross-sensitivities, but SGP41 is not a certified CO alarm and its VOC/NOx Index outputs are not a calibrated CO concentration.
For life safety, use a certified CO alarm designed for that purpose.
Can SGP41 Detect Natural-Gas Leaks?
Do not use it as a certified combustible-gas safety detector. It may react to some gas mixtures, but that is not the same as guaranteed methane/LPG leak detection at a defined concentration.
SGP40 vs BME688
Both are MOX-based air-quality approaches, but the ecosystems are different.
| Feature | SGP40 | BME688 |
|---|---|---|
| VOC behaviour | Yes, VOC Index | Yes via gas resistance/BSEC2 |
| NOx-specific channel | No | No dedicated NOx channel |
| Temperature/humidity | Needs external sensor | Built in |
| Pressure | No | Built in |
| Gas classification experiments | Not the main focus | BME AI-Studio / heater profiles |
| Simple Home Assistant VOC node | Very strong | Good, but more algorithm stack |
If you want a straightforward high-quality VOC Index plus an accurate SHT45, SGP40 is extremely attractive. If you want pressure and Bosch’s advanced gas-scanning/classification ecosystem, BME688 is more interesting.
SGP41 vs BME688
SGP41 has one decisive advantage for this comparison: a dedicated oxidizing-gas / NOx pixel. BME688 offers richer environmental sensing and programmable gas-scanning, but it does not simply expose the same dedicated NOx Index channel.
For a kitchen or urban-air-quality node where combustion-related gas trends matter, SGP41 has a very clear purpose.
SGP41 vs SEN55 / SEN65 / SEN66
Sensirion’s SEN5x/SEN6x modules integrate more sensors into one larger package. Depending on model they can combine particles, humidity, temperature, VOC, NOx and — in newer SEN6x models — CO₂/formaldehyde.
Choose SGP41 when you are building a small custom PCB/node and only need the gas channels. Choose an integrated SEN module when you want a complete calibrated air-quality platform and do not mind the larger size/cost.
Power Consumption
| Sensor | Typical operating current class | Practical view |
|---|---|---|
| SGP40 | ~2.6 mA average | Low for a continuously heated MOX gas sensor |
| SGP41 | ~3.0 mA average | Slightly higher because of dual gas sensing |
For a USB-powered Home Assistant node, this difference is negligible. For battery power, the bigger issue is the need for continuous 1 Hz operation and algorithm history, not the extra fraction of a milliamp between the sensors.
Enclosure Design
The gas sensor must exchange air with the room. A sealed enclosure destroys response time and can trap heat/contaminants around the sensor.
- Use ventilation openings close to the SGP4x sensor.
- Keep the sensor away from the ESP32 antenna and warm regulators where practical.
- Do not place it directly in the exhaust of a fan unless that is intentional.
- Avoid adhesive/silicone vapours close to the sensor during assembly.
- Do not spray conformal coating over the gas sensor opening.
- Keep condensation and liquid water away from the sensor.
For a comparison between rooms, enclosure geometry should be similar. A sensor behind tiny slots will respond more slowly than the same sensor in open airflow.
Placement in a Room
For general indoor-air monitoring, place the sensor where it samples representative room air — not immediately beside an open window, extractor outlet, perfume shelf or cooker unless the project specifically targets that source.
For a kitchen extractor controller, closer placement to the cooking zone can be useful. For a whole-room IAQ trend sensor, a more representative wall/shelf location is better.
Common Problem: VOC Index Stays Around 100
That can be perfectly normal. The VOC Index intentionally maps the learnt recent background toward its typical offset. If the room chemistry is stable, a value near 100 is expected rather than evidence that the sensor is “stuck.”
Test with a temporary, safe VOC event such as alcohol vapour at a reasonable distance — do not pour liquid onto the sensor — and watch whether the index responds.
Common Problem: VOC Index Changes After Reboot
A reboot interrupts the continuous algorithm history. Keep store_baseline: true and avoid unnecessary power cycling. Expect some readjustment after long outages or when moving the sensor to a completely different room.
Common Problem: NOx Index Is Missing
If ESPHome detects an SGP40, the NOx entity is ignored because the hardware does not contain the second pixel. Check the actual breakout/module marking and the ESPHome logs.
Also use the current nox_index: key on ESPHome 2026.8+ rather than relying on the deprecated nox: spelling.
Common Problem: I²C Scanner Finds Nothing
- Confirm 3.3 V and GND.
- Check SDA/SCL are not swapped.
- Look for address 0x59.
- Check breakout-board pin labels — some use VIN/3V3 differently.
- Keep I²C wiring short during testing.
- Make sure pull-ups exist; most breakouts include them.
Common Problem: Readings React to Humidity Changes
Humidity affects MOX sensing chemistry. That is why the SGP4x measurement command accepts humidity/temperature compensation.
If the project already has an SHT45, feed it into ESPHome’s compensation: block. This will not remove every environmental interaction, but it improves robustness compared with fixed default conditions.
Common Problem: Very High Reading After Cleaning
Cleaning products are a classic VOC source. A large spike after using alcohol, sprays or solvents may be exactly what the SGP40/41 is supposed to detect.
Do not “calibrate it away” immediately. Look at how the index recovers after ventilation and compare the event with your normal room baseline.
Common Problem: Sensor Is Hot
The SGP4x family uses a temperature-controlled micro-hotplate as part of the sensing principle. Some heat generation is normal. The sensor is designed for continuous operation within its specifications.
The relevant concern is enclosure heat affecting a nearby temperature sensor. Place SHT45 far enough away on the PCB or near a separate ventilation opening so it measures room air rather than the SGP4x/ESP32 heat plume.
Should You Tune the Gas Index Algorithm?
ESPHome exposes advanced tuning parameters such as index offset, learning time, gating duration and gain factor.
For most Home Assistant users: leave them at defaults.
Tuning is useful when designing a specific air purifier/HVAC product and validating its behaviour over controlled test events. Changing parameters just because the graph “looks too flat” can make device-to-device comparisons worse.
What ‘Baseline’ Means Here
The baseline is not a factory statement that “clean air equals exactly X ohms.” Indoor rooms always contain some VOC background. The algorithm learns what is typical for the current environment and uses that as a reference.
This is why moving the same SGP40 from a bedroom to a workshop can require time before the index becomes well adapted to the new chemical background.
Best Sensor for Home Assistant
| Use case | Recommended sensor |
|---|---|
| Normal bedroom/living room VOC tracking | SGP40 |
| Kitchen with gas cooking | SGP41 |
| Urban apartment near traffic | SGP41 |
| Air-purifier VOC trigger | SGP40 |
| More complete gas-trend monitor | SGP41 |
| Lowest cost / simplest | SGP40 |
| Need actual CO₂ | Neither — add SCD40/SCD41 |
| Need PM2.5 | Neither — add PMS5003/SEN5x/SEN6x |
Is SGP41 Worth the Extra Cost?
Yes, if you have a reason to care about combustion/oxidizing-gas events.
For a kitchen, gas-heated space, garage-adjacent room or urban-pollution monitor, the second channel gives genuinely different information.
No, if all you want is a general VOC/odour trend. The SGP40 already provides the same core VOC Index architecture at lower cost and slightly lower power.
My 2026 Recommendation
SGP40 = best value VOC monitor
SGP41 = best compact VOC + NOx monitor
Add SHT45 = better humidity/temperature compensation
Add SCD41 = real CO2
Add PMS5003/SENx = particulate matter
For a simple Home Assistant room sensor, I would build ESP32 + SGP40 + SHT45. For a kitchen or higher-end air-quality station, I would choose ESP32 + SGP41 + SHT45.
The biggest mistake is buying SGP41 because it has “more gases” and then treating its outputs as laboratory ppm measurements. Its strength is not precise chemical identification. Its strength is robust, continuous, relative detection of VOC and oxidizing-gas events that can drive useful ventilation and air-treatment automations.
Related ESP32 Guides
- SGP40 ESPHome Guide: ESP32 VOC Sensor for Home Assistant
- ESP32-SHT45 Temperature & Humidity Sensor for Home Assistant
- SHT31 vs SHT40 vs SHT45: Which Sensor Is Best?
- BME280 vs BME680 vs BME688: Which Is Best?
- ESP32 PMS5003 in Home Assistant & ESPHome
- SCD30 vs SCD40 vs SCD41: Which CO₂ Sensor Wins?
Datasheets & External Resources
All manufacturer/framework references are collected here so the main article keeps readers inside esp32.co.uk.
- Sensirion SGP40 Product Page — current VOC sensor positioning, specifications, current draw and supporting documentation.
- Sensirion SGP40 Datasheet — raw VOC signal, I²C address 0x59, electrical specifications and measurement commands.
- Sensirion SGP41 Product Page — current VOC + NOx sensor specifications and application positioning.
- Sensirion SGP41 Datasheet — VOC/NOx raw channels, conditioning, I²C protocol and sensor specifications.
- Sensirion: What Is the VOC Index? — explains the relative 1–500 VOC Index and learned baseline around typical conditions.
- Sensirion: What Is the NOx Index? — explains the SGP41 oxidizing-gas / NOx Index concept.
- ESPHome SGP4x Component — current SGP40/SGP41 configuration, compensation, baseline storage and 1 Hz operation.
- ESPHome 2026.8 Release Notes — documents the 2026 rename from voc/nox to voc_index/nox_index.

