Is Apollo Automation AIR-1 Sensor Node Compatible with Home Assistant (ESPHome)?
Compatibility Overview
All-in-one open-source ESPHome air quality node built around a Sensirion SEN55 (particulates, VOC, NOx, temperature and humidity), with a pressure sensor on the board and SCD40 CO2 and MiCS-4514 gas sensors as plug-in add-ons.
Wiring Apollo Automation AIR-1 Sensor Node to the board named in the vendor package
| Module pin | the board named in the vendor package | Note |
|---|---|---|
| USB-C | USB-C 5V supply | The only connection. A 5V phone-style adapter does it; there is no battery. |
| SEN55 | JST cable to the main board | Particulates, VOC and NOx index, temperature and humidity. Plugged in rather than soldered, so it can be replaced. |
| SCD40 (optional) | plug-in add-on | The CO2 sensor. The vendor config declares its entities whether or not it is fitted. |
| MiCS-4514 (optional) | plug-in add-on | The six-gas sensor. Like the SCD40, its entities stay without a value when it is absent. |
| Pressure sensor | soldered to the main board | Driven by the dps310 platform. The config feeds its reading to the SCD40 for pressure compensation. |
| Button | on the main board | A short press flashes the LEDs blue if Home Assistant is connected, green on Wi-Fi only, yellow with neither. Held 3 seconds it turns Prevent Sleep on; held 10 seconds it factory-resets the node. |
| RGB LEDs | on the main board | Three addressable LEDs, off by default. Air Quality LED Source colours them by AQI, CO2 or VOC index. |
Host pins are the ones the configuration on this page uses. Move a pin here and change it in the YAML — they are documented together so they cannot disagree.
Technical Specification Matrix
| Feature / Attribute | Specification / Status |
|---|---|
| Hardware Protocol | Wi-Fi (ESPHome) |
| Bridge Required | NO |
| Border Router Needed | None |
| Hardware Capabilities & Peripherals | PM1.0 / PM2.5 / PM4 / PM10 (µg/m³) VOC Index NOx Index Temperature Humidity Pressure (hPa) CO2 (ppm; SCD40 add-on) Gas Readings (MiCS-4514 add-on) RGB LEDs Note: these entities come from the ESPHome configuration you flash — each one needs its matching component in that YAML before it appears. |
| Pairing Complexity | Plug-and-Play |
| Factory Reset Instruction | Hold onboard BOOT button for 10 seconds to enter AP mode. |
Wire, Flash, Adopt, Check
Wire it up
Follow the wiring table above. The the board named in the vendor package pins there are the ones the configuration uses, so if you move one, change it in both places.
Flash the configuration
Create a new device in the ESPHome dashboard (the Home Assistant add-on) and paste the configuration below into it, or save it as emb_esp32_apollo_air1.yaml and run esphome run emb_esp32_apollo_air1.yaml. The first flash goes over USB. If it is not detected, hold onboard BOOT button for 10 seconds to enter AP mode to put it in download mode. Every update after that is over the air.
Adopt it in Home Assistant
Settings → Devices & Services. A node on the same network shows up as a discovered ESPHome device within a minute of joining Wi-Fi; choose Configure and enter the API encryption key from your secrets.yaml. If discovery does not find it, add the ESPHome integration by hand with the node's IP address.
Check it works
Once the node is added, its page in Home Assistant fills with PM, VOC and NOx values within a minute, CO2 soon after, and the six gas readings three minutes after a cold power-up. A short press on the button flashes the LEDs blue when Home Assistant is connected. CO2 or gas entities that never get a value are an add-on that is missing or not seated; a config that will not compile is an ESPHome older than 2026.7.2; a temperature several degrees above the room is the offset still to be set.
ESPHome Configuration
Starting configuration for Apollo Automation AIR-1 Sensor Node on the board named in the vendor package. Untested on hardware — verify wiring and pins against your own board.
# ESPHome configuration for Apollo Automation AIR-1 Sensor Node
# Host: the board named in the vendor package. Pin numbers below are host-side defaults — any free
# GPIO will do, and you should change them to match your own wiring.
esphome:
name: emb_esp32_apollo_air1
friendly_name: "Apollo Automation AIR-1 Sensor Node"
# The esp32 / esp8266 block comes from the imported package below.
logger:
api:
encryption:
key: !secret api_encryption_key
# ota: is declared by the imported package, with the password the vendor ships.
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
# Apollo publishes the AIR-1's full configuration; a packages: import is
# how it is meant to be used. Everything above this line is the standard
# node boilerplate the package expects you to supply. The package brings
# its own ota: block, so none is declared here — two with different
# passwords fail validation.
packages:
apollo_air1: github://ApolloAutomation/AIR-1/Integrations/ESPHome/AIR-1.yaml
Before you flash:
the !secret values come from your
secrets.yaml, and the GPIO numbers are host-side
defaults rather than properties of this part — change them to match how you actually wired it.
What Appears in Home Assistant
µg/m³ from the SEN55. Four more entities splitting the same readings into size bands (PM 0.3 To 1 µm and so on) are in the package but disabled by default.
With SEN55 Temperature Offset and SEN55 Humidity Offset subtracted. The temperature offset starts at 6.0°C; see the gotchas.
Sensirion index values, measured against what the sensor has learned is normal for the room — not concentrations. VOC Quality puts the VOC index into words, from Improved to Extremely abnormal.
ppm from the SCD40 add-on. The Calibrate SCD40 To 420ppm button and the CO2 Auto Calibration switch sit alongside it.
From the MiCS-4514 add-on. After a cold power-up ESPHome holds these back for three minutes while the sensor warms up.
Pressure in hPa, and a US EPA-scale index worked out from PM2.5 and PM10.
Configuration. Prevent Sleep is on by default and keeps the node awake; turned off, the node reports and deep-sleeps for Sleep Duration minutes at a time. Bluetooth Proxy is off by default. Uptime, RSSI, IP Address and the version entities sit under diagnostics.
Known Problems and Fixes
Needs ESPHome 2026.7.2 or newer
Apollo's package sets min_version: 2026.7.2, because its SEN55 block uses a model option that arrived in that release. An older ESPHome refuses to compile the config. Update ESPHome first.
Change the OTA password
The package's ota: block uses Apollo's shared default password, and Apollo's own comment in the package says to override it. Add substitutions: with ota_password: !secret and a secret of your own, so the AIR-1s on a network do not all share one.
The case warms the temperature
The ESP32-C3 heats the air inside the small case, which is why SEN55 Temperature Offset starts at 6.0°C. Set it, and SEN55 Humidity Offset, against a thermometer you trust beside the unit once it has been running long enough to warm up.
Which way up matters
Apollo has found that with the Apollo side facing up, CO2 readings swing far more than they should. Turning the unit the other way up stops it.
CO2 auto calibration wants fresh air weekly
CO2 Auto Calibration is on by default and assumes the sensor sees outdoor-level air, around 420ppm, at least once a week. In a room that is never aired it pulls the reading low. There, turn it off and press Calibrate SCD40 To 420ppm instead — outdoors or at an open window, after the sensor has sat in the same air for more than three minutes.
"NowCast AQI" is not NowCast
The entity comes from ESPHome's aqi platform, which applies the US EPA breakpoints to the current PM2.5 and PM10 readings. Official NowCast figures average over hours. Expect this one to jump when someone cooks, and do not compare it number for number with an official air-quality site.
Firmware Update installs Apollo's build
The Firmware Update entity pulls Apollo's prebuilt image from their GitHub manifest. It is compiled from Apollo's YAML, not this one, so anything added to this config is gone until your own build goes back on. Update a node you manage from ESPHome by compiling and installing there.
Report a Pinout Error or Submit Tested Code Snippets
Found a pin mapping quirk or built a custom ESPHome YAML driver for Apollo Automation AIR-1 Sensor Node? Submit a pull request or report corrections to our index.
Hardware Correction Reporter (emb-esp32-apollo-air1)
Frequently Asked Questions
Does Apollo Automation AIR-1 Sensor Node work without an internet connection?
How is Apollo Automation AIR-1 Sensor Node powered?
How does Apollo Automation AIR-1 Sensor Node connect to your network?
Alternatives
SEN55 Environmental Sensor Node
The same Sensirion SEN55 on a bare ESP32: particulates, VOC, NOx, temperature and humidity, without the case, the CO2 sensor or the gas add-on.
SCD41 Photoacoustic CO2 Sensor
CO2 on its own node. The SCD41 is the SCD40's sibling, with a single-shot mode the SCD40 lacks.
PMS5003 Laser Particulate Matter Sensor
A low-cost laser particulate sensor on UART, if PM is the only question.
SEN0395 24GHz mmWave Presence Radar
The AIR-1 has no presence radar. A 24GHz mmWave module adds room presence on a second node.