Skip to the content
PCBKitNew board
2 layers45 × 45 mmAirCube, the printed circuit board in 3D

Works standalone out of the box. Pairs with Home Assistant in minutes. Other platforms are supported through community-contributed extensions.

Size
45 × 45 mm
Copper layers
2
Thickness
1.66 mm
Parts
61
Nets
54
Pads
252
Tracks, vias
363, 76
Pours
3
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
12 Nov 2025
Updated
29 Sep 2026

Overview

AirCube is an open-source printed circuit board by StuckAtPrototype, from the StuckAtPrototype/AirCube repository on GitHub, published under the Apache-2.0 licence. It is a 2-layer board of 45 × 45 mm with 61 parts on 54 nets, routed with 363 tracks and 76 vias.

It is built around the ENS161, ENS210 and VCNL4040M3OE, with the AP2205-W5, ESP32-H2-MINI-1U and SCD41-D-R2 among its other parts. Its parts include 22 capacitors, 16 resistors, 7 ICs, 4 diodes and 1 transistor. It belongs with the ESP32 and RISC-V boards of this library.

Main components

10

README

README.md

AirCube

See your air. AirCube is a desktop air quality monitor with built-in Home Assistant support over Zigbee or Bluetooth (BLE). Every model tracks temperature, humidity, eCO2, eTVOC, and VOC Level; AirCube Pro also measures true CO2 and ambient light. A glanceable LED shows the current air quality.

Works standalone out of the box. Pairs with Home Assistant in minutes. Other platforms are supported through community-contributed extensions.

AirCube Web -- Live readings, history and firmware updates in your browser. Nothing to install.

Watch the overview -- What AirCube does and why it's open source, in under three minutes.

StuckAtPrototype Labs -- Step-by-step video walkthroughs: ZHA setup, Zigbee2MQTT setup, and updating firmware from the browser.

AirCube -- Assembled AirCube

AirCube Populated PCB -- AirCube Populated PCB


Getting Started

1. Plug it in -- Connect the USB-C cable to any USB port or charger. AirCube powers on automatically.

2. Wait for warm-up -- The air quality sensor needs about 3 minutes to stabilize after power-on. During this time, the LED may not reflect accurate readings.

3. Read the color -- Once warmed up, the LED tells you everything:

LED ColorAir Quality
GreenGood
YellowModerate
OrangePoor
RedBad -- consider ventilating

The color shifts smoothly as conditions change. No app needed -- just glance at it.

Firmware 1.5.0 and above drive the LED from canonical VOC Level (TVOC-derived, absolute). The color is a smooth green-to-red gradient -- same feel as older firmware, but tied to fixed indoor-air bands instead of the relative AQI-S baseline. See LED Reference for the exact mapping. Firmware 1.4.3 and below used the same gradient shape, but driven by AQI-S instead.

4. Adjust brightness -- Press the button to cycle through brightness levels.

That's it. AirCube works out of the box with no setup, no accounts, and no Wi-Fi.


Base vs. Pro

Both models use the ScioSense ENS161 for VOC Level, eCO2, and eTVOC. Choose Pro when you also want a direct CO2 measurement and automatic LED dimming based on room light.

FeatureBasePro
VOC Level, eCO2, and eTVOCENS161ENS161
Temperature and humidityENS210Sensirion SCD41
True CO2--Sensirion SCD41 (NDIR)
Ambient light--VCNL4040
Automatic LED dimming--Yes
LED air-quality sourceVOC LevelWhichever is worse: VOC Level or true CO2

eCO2 vs. true CO2: eCO2 is an estimate derived from detected VOCs. The Pro's SCD41 measures CO2 directly using NDIR, while the ENS161 still detects odors and fumes that a pure CO2 sensor can miss.

What AirCube Measures

MeasurementRangeWhat It Tells You
VOC Level0 -- 500TVOC-derived score against fixed indoor-air bands (firmware 1.5.0+; 0--500 scale in 1.5.1+)
AQI-S (deprecated)--Legacy relative VOC score. As of firmware 1.5.0 this always reports 0 over USB serial -- kept only for compatibility. Use VOC Level instead.
eCO2 (equivalent CO2)400 -- 65,000 ppmEstimated CO2 level derived from detected VOCs
CO2 (Pro only)400 -- 5,000 ppmTrue CO2 concentration from the SCD41 (direct NDIR measurement)
eTVOC (equivalent Total VOC)0 -- 65,000 ppbTotal volatile organic compound concentration
TemperatureRoom temperature in Celsius
Humidity0 -- 100 %Relative humidity percentage
Illuminance (Pro only)Ambient light in lux; also used to dim the LED automatically

Understanding the readings

AirCube Base uses a ScioSense ENS161 gas sensor and an ENS210 temperature/humidity sensor. AirCube Pro uses the ENS161 alongside an SCD41 for true CO2, temperature, and humidity, plus a VCNL4040 ambient light sensor.

eCO2 (ppm) -- Estimated CO2 derived from detected VOCs, not a direct CO2 measurement. Useful for judging ventilation; also picks up odors and fumes a pure CO2 sensor would miss.

eTVOC (ppb) -- Total volatile organic compounds in the air. Spikes after cooking or cleaning are normal; sustained high readings mean you should ventilate.

VOC Level (0--500) -- TVOC mapped to a fixed indoor-air scale (firmware 1.5.1+). Linear ramp between band edges; TVOC-only (eCO2 does not affect VOC Level). Reported over Zigbee and USB serial.

RatingLED colorVOC LevelTVOC (ppb)
ExcellentGreen0 -- 150 -- 65
GoodGreen → lime15 -- 5065 -- 220
ModerateLime → yellow50 -- 100220 -- 650
PoorYellow → orange → red100 -- 200650 -- 2,200
UnhealthyRed200 -- 5002,200 -- 5,500

On Base hardware, the LED color is derived from TVOC/VOC Level alone (eCO2 does not drive the LED). VOC Level is linear between band edges, so the LED fades smoothly. See below for Pro's CO2 arbitration.

AQI-S (deprecated, USB serial only) -- A legacy ScioSense relative score from firmware before 1.5.0. As of firmware 1.5.0, AQI-S is deprecated and always reports 0 -- it's kept in the serial output only for compatibility with older tools. Use VOC Level, eCO2/eTVOC, or true CO2 (Pro) instead.

VOC Level drives the LED color on Base hardware. On Pro, the LED shows whichever is worse -- VOC Level or CO2 Level (from the true CO2 reading). See LED Reference.

Warm-up and initial start-up

The ENS161 needs about 3 minutes of warm-up in standard mode before readings stabilize. On the very first power-on of a new sensor the initial start-up takes about 1 hour as the sensor conditions itself. Readings during these periods may be inaccurate -- the LED and status flag will indicate when the sensor is ready.


Built-in vs. community

Maintained by StuckAtPrototype: firmware, hardware, desktop app, and the Home Assistant integration documented in HOME_ASSISTANT.md.

Community-contributed: integrations built and shared by the community. They live in this repo and are welcome, but StuckAtPrototype does not test or ship them. They may require extra setup and can break when a vendor updates their platform. See Community extensions.


Home Assistant Integration

AirCube was designed for Home Assistant. It connects over Zigbee -- no USB cable to your server, no cloud, no Wi-Fi credentials to configure. Plug it in, hold the button for 3 seconds to start pairing, and six core entities show up: temperature, humidity, eCO2, eTVOC, VOC Level, and brightness.

AirCube Pro adds two more: true CO2 (SCD41) and illuminance (VCNL4040). Both are exposed in ZHA and Zigbee2MQTT 2.x -- eight entities total on a Pro.

Once connected you can:

  • Track air quality over time with built-in history graphs
  • Set up automations -- turn on a fan when eCO2 gets too high, send a notification when VOC Level spikes
  • Monitor every room -- each AirCube pairs independently, name them however you like

You'll need: a Zigbee coordinator dongle (we recommend the SONOFF ZBDongle-E, ~$13) plugged into your Home Assistant machine.

Works with ZHA (built-in) and Zigbee2MQTT.

Video walkthroughs: Set up AirCube with ZHA · Set up AirCube with Zigbee2MQTT

Full setup guide: Connecting AirCube to Home Assistant

No Zigbee dongle? AirCube also works over Bluetooth

AirCube boots into BLE mode by default (until you pair it to Zigbee) and broadcasts standard BTHome data -- temperature, humidity, CO2, and TVOC. If your Home Assistant instance has a Bluetooth adapter or an ESPHome Bluetooth proxy nearby, it can often pick up these readings passively, with no pairing step and no Zigbee hardware at all. Building a custom BLE client? See the BLE GATT Protocol reference.


Community extensions

The integrations below are community-contributed. They are not maintained by StuckAtPrototype and compatibility with vendor hub or app updates is not guaranteed.

SmartThings (Samsung Zigbee hub) — community-contributed

Some users run AirCube on a Samsung SmartThings Zigbee hub over Zigbee (no Wi-Fi configuration on the device). The hub must support SmartThings Edge.

By default, the SmartThings app may only show temperature and humidity until you install the community AirCube Zigbee Edge driver from this repository and assign it to the device.

Full setup guide: Connecting AirCube to SmartThings (pairing, SmartThings CLI, driver channel, verification in the app and Advanced Web App).

Troubleshooting: If you only see temperature and humidity, install the AirCube Zigbee Edge driver from smartthings/aircube-zigbee/ and assign it to the device. Details are in SMARTTHINGS.md.


Connect to Your Computer

Plug the AirCube into your computer with a data-capable USB-C cable to see live readings, charts, and history.

In your browser -- nothing to install

AirCube Web connects over USB straight from Chrome or Edge: live readings, LED brightness, history with CSV export, and firmware updates. Click Connect, pick your cube, and you're in.

Download the app

Check the Releases page for a ready-to-run Windows .exe -- no install required.

Or run from source

text
git clone https://github.com/StuckAtPrototype/AirCube.git
cd AirCube/scripts
pip install -r requirements.txt
python aircube_app.py

Select your serial port, click Connect, and you'll see live data.

Tip: Prefer a minimal taskbar-only view? See the companion AirCube Tray repo -- a lightweight Windows system-tray app that shows VOC Level as a live, color-coded number in your taskbar. It ships its own installer.


Firmware Updates

The current firmware is v2.0.7. It keeps the cube responsive when plugged into a charger or closed port, and on Pro units it disables SCD41 automatic self-calibration (replaced by a 425 ppm fresh-air calibration) and detects a CO2 channel that has stopped reporting. See the v2.0.7 release notes.

Flash it now with AirCube Web or read the Firmware Update Guide for step-by-step instructions.

Video walkthrough: Updating the AirCube is easy (web UI) -- under two minutes, start to finish.

All releases: GitHub Releases


Assembling Your AirCube

Building one yourself from printed parts and a populated PCB? All you need is three M2 x 5 mm screws and a small Phillips screwdriver -- about ten minutes of work.

Assembly Guide -- photo walkthrough for both Base and Pro.

Printable enclosure files live in mechanical/base/ and mechanical/pro/.


LED Reference

Firmware 1.5.0 and above

The LED is a continuous green-to-red gradient driven by canonical VOC Level (TVOC-derived). The hue moves linearly with VOC Level: pure green up to VOC Level 10, then fading green → lime → yellow → orange → red, reaching full red at VOC Level 200. eCO2 does not affect the LED.

mermaid
flowchart LR
    A["VOC Level 0–10<br/>TVOC 0–~43 ppb"] --> G["Steady green"]
    B["VOC Level 10–200<br/>TVOC ~43–2 200 ppb"] --> GR["Green → lime → yellow → orange → red"]
    C["VOC Level 200+<br/>TVOC 2 200+ ppb"] --> R["Steady red"]
LED colorVOC LevelTVOC (ppb)Rating
Steady green0 -- 100 -- ~43Excellent
Green → lime10 -- 50~43 -- 220Good
Lime → yellow50 -- 100220 -- 650Moderate
Yellow → orange → red100 -- 200650 -- 2 200Poor
Steady red200+2 200+Unhealthy
Flashing blue----Zigbee pairing mode

Key gradient landmarks: yellow around VOC Level 105 (~730 ppb) and orange around VOC Level 150 (~1,460 ppb). Over Zigbee, TVOC-derived VOC Level is reported alongside eCO2, eTVOC, temperature, humidity, and brightness. AQI-S is deprecated, always reports 0, and does not drive the LED.

On Pro hardware, the LED shows whichever reading is worse: VOC Level (as above) or CO2 Level, a 0--500 score derived from the true SCD41 CO2 reading using the same band scale. If CO2 Level is higher than VOC Level, the LED reflects the CO2 reading instead. On Base hardware, CO2 Level is always 0, so VOC Level always drives the LED.

Firmware 1.4.3 and below (legacy)

Same gradient shape as above, but driven by AQI-S (relative, 24-hour baseline) instead of canonical VOC Level:

LEDMeaning
Steady greenGood air quality (AQI-S 0--10)
Yellow through redDegrading to poor air quality (AQI-S 10--200)
Steady redPoor air quality (AQI-S 200+)
Flashing blueZigbee pairing mode

Button

ActionWhat It Does
Short pressCycle brightness (off, 10%, 30%, 60%, 100%)
Hold 3 secondsEnter Zigbee pairing mode

Troubleshooting

LED doesn't turn on

  • Make sure the USB-C cable is firmly connected and the power source is active.
  • Try a different USB port or charger.

Readings seem wrong right after power-on

  • Normal. The air quality sensor needs about 3 minutes to warm up. Readings will stabilize.

Computer doesn't detect AirCube

  • Some USB cables are charge-only. Use a cable that supports data.
  • Windows users may need to install USB drivers.
  • Linux users: add yourself to the dialout group and re-login.

Home Assistant: eCO2, TVOC, or VOC Level sensors are missing

  • The custom quirk or converter isn't loaded yet. See the Home Assistant guide for step-by-step instructions.

Home Assistant: CO2 or Illuminance is missing (Pro)

  • These come from standard Zigbee clusters, so ZHA and Zigbee2MQTT 2.x pick them up without any extra configuration. If they're absent, confirm the unit is a Pro (Base has no SCD41 or VCNL4040), then remove and re-pair so the coordinator re-reads the endpoint. The legacy Zigbee2MQTT 1.x converter does not expose them.

Home Assistant: AirCube won't pair

  • Make sure permit join is enabled in ZHA or Zigbee2MQTT.
  • Hold the button for 3 seconds to enter pairing mode (LED flashes blue).
  • Move AirCube closer to the coordinator during pairing.

Open Source

AirCube is fully open source -- firmware, PCB design, enclosure, desktop software, and Home Assistant integration. Community-contributed integrations (see Community extensions) also live in this repository. Everything is under the Apache 2.0 license.

Developers and makers: See the Contributing Guide for build instructions, architecture docs, serial protocol reference, and how to submit changes. Curious about the PCB? These Holes Are Why My Circuit Board Works explains the cutouts in the board.

StuckAtPrototype LabsVideo walkthroughs: ZHA, Zigbee2MQTT, firmware updates
Contributing GuideBuild from source, firmware architecture, serial protocol, how to contribute
Assembly GuideAssemble the printed enclosure -- Base and Pro
BLE GATT ProtocolBLE GATT protocol reference for building custom BLE clients
Firmware Update GuideUpdate your AirCube firmware from a browser
AirCube WebThe browser app: Web Serial monitoring, settings and flashing
Home Assistant GuideZHA and Zigbee2MQTT setup
Samsung hub integrationCommunity-contributed: Edge driver, CLI setup (see Community extensions)
GitHub IssuesBug reports and feature requests
LicenseApache 2.0

Parts

61
QtyValueFootprintReferences
110.1uFCapacitor_SMD:C_0603_1608MetricC4, C7, C11, C12, C13, C15, C16, C17, C24, C27, C32
810uFCapacitor_SMD:C_0603_1608MetricC2, C3, C5, C6, C8, C14, C21, C22
410KResistor_SMD:R_0603_1608MetricR1, R4, R11, R12
410kResistor_SMD:R_0603_1608MetricR2, R9, R10, R20
322Resistor_SMD:R_0603_1608MetricR3, R21, R22
3IN-PI15TAT5R5G5Bcustom_IC:IN-PI15_INLLED1, LED2, LED3
21uFCapacitor_SMD:C_0603_1608MetricC1, C10
25K1Resistor_SMD:R_0603_1608MetricR17, R18
2AP2205kicad_reformed_custom_IC:AP2204U4, U6
1100kResistor_SMD:R_0603_1608MetricR19
11MResistor_SMD:R_0603_1608MetricR16
1470Resistor_SMD:R_0603_1608MetricR5
147uFCapacitor_SMD:C_0603_1608MetricC9
1BSS138Package_TO_SOT_SMD:SOT-23Q1
1ENS161kicad_reformed_custom_IC:ENS161U2
1ENS210kicad_reformed_custom_IC:ENS210U10
1ESP32-H2-MINI-1kicad_reformed_custom_IC:MODULE_ESP32-H2-MINI-1-H2U7
1LOGOkicad_reformed_custom_IC:LOGO_6mm_microDMGG***
1SCD41-D-R2Sensor:Sensirion_SCD4x-1EP_10.1x10.1mm_P1.25mm_EP4.8x4.8mmU3
1TL1016AAF220QGcustom_IC:TL1016AAF220QGS3
1TPD1E10B06Diode_SMD:D_SOD-523D5
1TestPointTestPoint:TestPoint_Pad_D1.0mmTP1
1USB4105-GF-Akicad_reformed_custom_IC:GCT_USB4105-GF-AP1
1VCNL4040M3OEkicad_reformed_custom_IC:VISHAY_VCNL4040_4X2X1.1U1

The 54 most common of 61 parts.

Questions

How big is the AirCube PCB?

It measures 45 × 45 mm and has 2 copper layers, 1.66 mm thick.

What parts does the AirCube use?

61 parts, built around the ENS161, ENS210, VCNL4040M3OE and AP2205-W5. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.

Where can I download the AirCube KiCad files?

From the StuckAtPrototype/AirCube repository on GitHub, at the commit this page was made from: the board is kicad/Pro/AirCube.kicad_pcb and its schematic kicad/Base/AirCube.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the AirCube design in my own project?

Its repository publishes it under the Apache-2.0 licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).

More from StuckAtPrototype/AirCube

1
  • 2 layers45 × 45 mmAirCube, the printed circuit board in 3D

    AirCube

    StuckAtPrototype/AirCube

    Works standalone out of the box. Pairs with Home Assistant in minutes. Other platforms are supported through community-contributed extensions.

    52 parts379Apache-2.0

Similar boards

  • 4 layers36 × 50.2 mmRacer, the printed circuit board in 3D

    Racer

    StuckAtPrototype/Racer

    These are structured into their own files. I could have used submodules, but decided against it.

    83 parts3.8kApache-2.0
  • 4 layers74.7 × 30 mmController, the printed circuit board in 3D

    Controller

    StuckAtPrototype/Thumbtroller

    77 parts305
  • 2 layers108 × 70 mmGlowpad, the printed circuit board in 3D

    Glowpad

    mjvarga/Interactive-Glowpad-PCB-Design

    A 5-pad capacitive touch board built around the ESP32-S3, featuring addressable RGB LEDs and piezo audio feedback.

    42 parts
  • 4 layers49 × 74.9 mmPCB business card, the printed circuit board in 3D

    PCB business card

    StuckAtPrototype/PCB_business_card_remake

    A custom PCB based "business" card that lets you play a version of Flappy Bird.

    311 parts132Apache-2.0
  • 2 layers57.5 × 85.5 mmGitcard final version, the printed circuit board in 3D

    Gitcard final version

    cubistmind/__pCennnBeist

    A custom PCB based "emniii😞😞" card that lets you play a version of Flappy Bird

    307 parts
  • 4 layers25.5 × 62.8 mmAqproto, the printed circuit board in 3D

    Aqproto

    HOUXA8/aqproto

    Personal Project

    31 parts
  • 8 layers42.2 × 67.2 mmOBC PCB, the printed circuit board in 3D

    OBC PCB

    timohueser/OpenBikeComputer

    Open source Bikecomputer with a focus on exploration and adventure.

    186 parts11GPL-3.0