Smart Water
Protect against water damage.
Poor indoor air quality can cause headaches, fatigue, concentration problems and long-term health issues. With smart air quality monitoring you can track CO2, particles and VOC - and automate ventilation.
| Parameter | Danger Level | Symptoms | Sensor |
|---|---|---|---|
| CO2 | Over 1000 ppm | Headache, fatigue, poor concentration | SenseAir S8 |
| PM2.5 | Over 35 µg/m³ | Respiratory problems, allergies | Plantower PMS5003 |
| VOC | Over 500 ppb | Headache, dizziness | SGP30, SGP41 |
| Radon | Over 4 pCi/L | Lung cancer (long-term) | Airthings |
| Humidity | Under 30% / Over 60% | Dry skin, mold | SHT30, DHT22 |
| Product | HA Integration | CO2 | PM2.5 | VOC | Radon | Price |
|---|---|---|---|---|---|---|
| Airthings View Plus | ✅ Cloud API | ✅ | ✅ | ✅ | ✅ | 💰💰💰 |
| Airthings Wave Plus | ✅ BLE | ✅ | ❌ | ✅ | ✅ | 💰💰 |
| Awair Element | ✅ Local API | ✅ | ✅ | ✅ | ❌ | 💰💰 |
| AirGradient ONE | ✅ ESPHome | ✅ | ✅ | ✅ | ❌ | 💰💰 |
| ESPHome DIY | ✅ Local | ✅ | ✅ | ⚠️ | ❌ | 💰 |
Airthings View Plus: ~$300 Airthings Wave Plus: ~$230 Airthings Wave Mini: ~$100
Specialized in radon measurement:
# Settings → Devices → Add Integration# Search "Airthings"
# Requires Airthings API credentials:# 1. Go to dashboard.airthings.com# 2. Integrations → API → Request API Client# 3. Name: "Home Assistant"# 4. Resource Scope: read:device:current_values# 5. Access Type: Confidential# 6. Enable: On# 7. Copy ID and Secret to HA
# Entities created:# - sensor.airthings_co2# - sensor.airthings_radon_short_term# - sensor.airthings_radon_long_term# - sensor.airthings_voc# - sensor.airthings_pm25 (View Plus)# - sensor.airthings_temperature# - sensor.airthings_humidity# - sensor.airthings_pressure# Requires Bluetooth in HA# (USB dongle or ESP32 Bluetooth Proxy)
# Settings → Devices → Add Integration# Search "Airthings BLE"
# Autodiscover finds Wave devices# Serial number (last 6 digits) used for ID
# Benefits of BLE:# - No cloud dependency# - Faster updates# - Works offlineautomation: # Warn on high CO2 - alias: "Air Quality - High CO2" trigger: - platform: numeric_state entity_id: sensor.airthings_co2 above: 1000 for: "00:10:00" action: - service: notify.mobile_app data: title: "🌬️ Open a window!" message: > CO2 level: {{ states('sensor.airthings_co2') }} ppm The air is stuffy - time to ventilate.
# Radon warning - alias: "Air Quality - Radon Warning" trigger: - platform: numeric_state entity_id: sensor.airthings_radon_short_term above: 4 # pCi/L (US standard) action: - service: notify.mobile_app data: title: "☢️ High Radon!" message: > Radon: {{ states('sensor.airthings_radon_short_term') }} pCi/L Consider ventilation or radon mitigation. data: push: sound: name: "alarm.caf"
# Automatic ventilation - alias: "Air Quality - Start Ventilator" trigger: - platform: numeric_state entity_id: sensor.airthings_co2 above: 800 action: - service: fan.turn_on entity_id: fan.ventilation - service: notify.mobile_app data: message: "Ventilator started due to CO2"
- alias: "Air Quality - Stop Ventilator" trigger: - platform: numeric_state entity_id: sensor.airthings_co2 below: 600 action: - service: fan.turn_off entity_id: fan.ventilationBuy: Airthings.com, Amazon
Price: ~$200
Local API without cloud:
# Settings → Devices → Add Integration# Search "Awair"
# Two methods:
# 1. LOCAL (recommended):# - Enable Local API in Awair app# - HA autodiscover finds device# - Polling every 30 seconds
# 2. CLOUD:# - Requires Awair Developer token# - developer.getawair.com# - Up to 24 hours for approval# - Polling every 5 minutes
# Entities:# - sensor.awair_element_co2# - sensor.awair_element_pm25# - sensor.awair_element_voc# - sensor.awair_element_temperature# - sensor.awair_element_humidity# - sensor.awair_element_scoreBuy: Awair.com, Amazon
Price: ~$150 (assembled) DIY kit: ~$95
Open source air quality monitor:
# Since June 2024 AirGradient has# a native HA integration!
# Settings → Devices → Add Integration# Search "AirGradient"
# Autodiscover finds devices on network# Alternative: Flash ESPHome firmware# for 100% local control
esphome: name: airgradient-one platform: ESP32 board: esp32-c3-devkitm-1
wifi: ssid: !secret wifi_ssid password: !secret wifi_password
api: encryption: key: !secret api_encryption_key
# I2C for sensorsi2c: sda: GPIO7 scl: GPIO6
# UART for CO2 and PMuart: - id: uart_pm rx_pin: GPIO20 tx_pin: GPIO21 baud_rate: 9600 - id: uart_co2 rx_pin: GPIO0 tx_pin: GPIO1 baud_rate: 9600
sensor: # CO2 - SenseAir S8 - platform: senseair uart_id: uart_co2 co2: name: "CO2" id: co2 update_interval: 60s
# PM2.5 - Plantower - platform: pmsx003 type: PMSX003 uart_id: uart_pm pm_2_5: name: "PM2.5" id: pm25 pm_10_0: name: "PM10"
# Temperature/Humidity - platform: sht3xd temperature: name: "Temperature" humidity: name: "Humidity" address: 0x44
# VOC Index - platform: sgp4x voc: name: "VOC Index" nox: name: "NOx Index"Components:
Total: ~$82
# Basic ESPHome config for DIYesphome: name: air-quality-diy
esp8266: board: d1_mini
wifi: ssid: !secret wifi_ssid password: !secret wifi_password
api:
i2c: sda: D2 scl: D1
uart: - rx_pin: D5 tx_pin: D6 baud_rate: 9600 id: uart_pm - rx_pin: D7 tx_pin: D8 baud_rate: 9600 id: uart_co2
sensor: - platform: senseair uart_id: uart_co2 co2: name: "CO2" update_interval: 60s
- platform: pmsx003 type: PMSX003 uart_id: uart_pm pm_2_5: name: "PM2.5"
- platform: sht3xd temperature: name: "Temperature" humidity: name: "Humidity" address: 0x44
display: - platform: ssd1306_i2c model: "SSD1306 128x64" address: 0x3C lambda: |- it.printf(0, 0, id(font1), "CO2: %.0f ppm", id(co2).state); it.printf(0, 16, id(font1), "PM2.5: %.0f", id(pm25).state);Resources:
Buy: AirGradient.com, DIY components from AliExpress
| CO2 ppm | Status | Effect |
|---|---|---|
| 400-600 | 🟢 Optimal | Fresh air, good concentration |
| 600-800 | 🟡 Acceptable | Slightly reduced attention |
| 800-1000 | 🟠 Moderate | Headache, fatigue begins |
| 1000-1500 | 🔴 Poor | Clear fatigue, concentration issues |
| 1500-2000 | 🟣 Very poor | Strong headache, dizziness |
| >2000 | ⚫ Dangerous | Nausea, heart palpitations |
automation: # ===== CO2 BASED VENTILATION =====
# Smart ventilator control - alias: "Air - Adaptive Ventilation" trigger: - platform: state entity_id: sensor.airgradient_co2 action: - choose: # High CO2 - full speed - conditions: - condition: numeric_state entity_id: sensor.airgradient_co2 above: 1000 sequence: - service: fan.set_percentage entity_id: fan.ventilation data: percentage: 100 # Moderate CO2 - medium - conditions: - condition: numeric_state entity_id: sensor.airgradient_co2 above: 800 sequence: - service: fan.set_percentage entity_id: fan.ventilation data: percentage: 50 # Normal - turn off - conditions: - condition: numeric_state entity_id: sensor.airgradient_co2 below: 600 sequence: - service: fan.turn_off entity_id: fan.ventilation
# ===== PM2.5 WARNINGS =====
- alias: "Air - High PM2.5" trigger: - platform: numeric_state entity_id: sensor.airgradient_pm25 above: 35 for: "00:15:00" action: - service: notify.mobile_app data: title: "😷 Poor air quality" message: > PM2.5: {{ states('sensor.airgradient_pm25') }} µg/m³ Consider turning on air purifier. - service: switch.turn_on entity_id: switch.air_purifier
- alias: "Air - PM2.5 OK again" trigger: - platform: numeric_state entity_id: sensor.airgradient_pm25 below: 12 for: "00:30:00" action: - service: switch.turn_off entity_id: switch.air_purifier
# ===== VOC MONITORING =====
- alias: "Air - High VOC" trigger: - platform: numeric_state entity_id: sensor.airgradient_voc_index above: 250 action: - service: notify.mobile_app data: title: "🧪 High VOC" message: > VOC Index: {{ states('sensor.airgradient_voc_index') }} Ventilate - possible chemicals in the air.
# ===== BEDROOM AUTOMATION =====
- alias: "Air - Bedroom Night" trigger: - platform: time at: "22:00:00" action: - service: fan.turn_on entity_id: fan.bedroom_ventilation data: percentage: 30 - service: notify.mobile_app data: message: "Night ventilation started"
- alias: "Air - Bedroom Morning" trigger: - platform: time at: "07:00:00" action: - if: - condition: numeric_state entity_id: sensor.bedroom_co2 above: 800 then: - service: fan.set_percentage entity_id: fan.bedroom_ventilation data: percentage: 100 - delay: "00:30:00" - service: fan.turn_off entity_id: fan.bedroom_ventilationtype: vertical-stackcards: # Air quality gauge - type: gauge entity: sensor.airgradient_co2 name: "CO2" min: 400 max: 2000 severity: green: 400 yellow: 800 red: 1000
# All measurements - type: entities title: "🌬️ Air Quality" entities: - entity: sensor.airgradient_co2 name: "CO2" icon: mdi:molecule-co2 - entity: sensor.airgradient_pm25 name: "PM2.5" icon: mdi:blur - entity: sensor.airgradient_voc_index name: "VOC Index" icon: mdi:air-filter - entity: sensor.airgradient_temperature name: "Temperature" - entity: sensor.airgradient_humidity name: "Humidity"
# History - type: history-graph title: "CO2 (24 hours)" entities: - entity: sensor.airgradient_co2 hours_to_show: 24Smart Water
Protect against water damage.
ESP32 Projects
Build more sensors yourself.
Last updated: December 2025