The PureAware Air Quality Sensor (model PureAQS66, firmware V1.025) is a professional-grade ESP32-based environmental monitoring device designed for building automation, HVAC, and indoor air quality management.
It integrates the Sensirion SEN66 multi-parameter sensor and the MS5637 barometric pressure sensor, providing continuous measurement of 11 environmental parameters:
| Parameter | Range | Unit |
|---|---|---|
| CO2 | 0–40,000 | ppm |
| PM1.0 | 0–1,000 | µg/m³ |
| PM2.5 | 0–1,000 | µg/m³ |
| PM4.0 | 0–1,000 | µg/m³ |
| PM10 | 0–1,000 | µg/m³ |
| VOC Index | 1–500 | — (unitless) |
| NOx Index | 1–500 | — (unitless) |
| TVOC (WELL) | derived | µg/m³ |
| Temperature | −40 to +125 | °C |
| Humidity | 0–100 | %RH |
| Barometric Pressure | 300–1,200 | hPa |
Manufacturer: MICRO-ELEMENTS S.R.L.
Serial Number Format: AQS2608-[MAC_ADDRESS]
| Parameter | Value |
|---|---|
| Model | PureAQS66 |
| Hardware Revision | AQS-PureAware-R1.2 |
| Microcontroller | ESP32 (Dual-core Xtensa, 240 MHz) |
| Primary Sensor | Sensirion SEN66 (CO2, PM, VOC, NOx, T, RH) |
| Pressure Sensor | TE Connectivity MS5637 (I2C @ 0x76) |
| Connectivity | WiFi 802.11 b/g/n (2.4 GHz) |
| Protocols | BACnet/IP, Modbus TCP, MQTT, Zabbix, HTTP/REST |
| BACnet Port | 47808 (UDP) |
| Modbus Port | 502 (TCP, async, up to 3 clients) |
| Web Ports | 80, 8080, 8081, 8082 |
| Power Supply | 5V DC, ~300 mA typical |
| Filesystem | LittleFS (OTA + logs + config) |
| Data Logging | 288-entry RAM buffer + 7-day CSV rotation |
| Watchdog Timer | 50 seconds |
| Discovery | mDNS + SSDP |
| Languages | EN, RO, HU, NO, JA |
| Authentication | HTTP Basic Auth (admin/pureaware) |
Mount the device at a height of 1.2–1.8 meters (breathing zone) on a wall, away from:
All sensors are pre-wired on the PCB. If performing custom wiring:
For RS-485 communication:
Connect to Serial2: RX = GPIO 14, TX = GPIO 27 at 115200 baud.
| GPIO | Function | Direction | Notes |
|---|---|---|---|
| 13 | NeoPixel LED | Output | WS2812B, 1 pixel, 800 kHz |
| 22 | Config Button | Input | Internal pull-up (active LOW) |
| 23 | Run Button | Input | Internal pull-up (active LOW) |
| 12 | Status LED | Output | General purpose indicator |
| 2 | RS-485 Control | Output | HIGH = transmit enable |
| 16 | Serial1 RX | Input | RS-485 receive (19200 baud) |
| 17 | Serial1 TX | Output | RS-485 transmit |
| 14 | Serial2 RX | Input | Nextion display (115200 baud) |
| 27 | Serial2 TX | Output | Nextion display |
| 26 | I2C Bus 1 SDA | Bidir | SEN66 sensor (100 kHz) |
| 25 | I2C Bus 1 SCL | Output | SEN66 sensor (100 kHz) |
| 33 | I2C Bus 2 SDA | Bidir | MS5637 @ 0x76 (100 kHz) |
| 32 | I2C Bus 2 SCL | Output | MS5637 @ 0x76 (100 kHz) |
Connect a 5V DC power source via the USB-C port. Typical draw is ~300 mA.
On first power-up (or after pressing the CONFIG button on the back of the device), the device starts in Access Point (AP) mode:
123456789http://192.168.1.25:8080<hostname>-<mac_suffix>.local
(e.g., pureaware-8a0de8.local). Use this to access the device without knowing its IP.
Three operating modes:
| Mode | Description | Use Case |
|---|---|---|
| AP | Creates "PureAware" network | Setup, standalone |
| STA | Connects to existing WiFi | Normal operation |
| OFFLINE | WiFi radio disabled | Air-gapped, power saving |
Mode switching via serial commands on Serial2:
01 01 01 FF FF FF — AP mode02 02 02 FF FF FF — STA mode03 03 03 FF FF FF — OFFLINE modeDiscovery protocols active in STA mode: mDNS, SSDP.
For fixed-IP deployments (common in BMS/HVAC), configure via the web interface:
| Parameter | Default | Description |
|---|---|---|
| Static IP Enable | Disabled | Toggle static IP |
| IP Address | empty | Device IP (e.g., 192.168.1.100) |
| Gateway | empty | Router IP (e.g., 192.168.1.1) |
| Subnet Mask | 255.255.255.0 | Network mask |
| DNS Server | 8.8.8.8 | DNS resolver |
| Port | Function | Authentication |
|---|---|---|
| 80 | Status Dashboard (real-time readings & charts) | None (public) |
| 8080 | Configuration Panel | HTTP Basic Authadmin / pureaware |
| 8081 | OTA Firmware Upload | None |
| 8082 | Nextion Display Upload | None |
The status dashboard features a responsive dark-theme design with real-time sensor readings, 24-hour history charts, and multilingual UI support (5 languages).
V1.025 uses a fully asynchronous MQTT client (non-blocking, based on AsyncClient). The device publishes sensor data as JSON to an MQTT broker at a configurable interval.
| Parameter | Default | Description |
|---|---|---|
| MQTT Enable | Disabled | Toggle MQTT publishing |
| Server | broker.emqx.io | Broker hostname or IP |
| Port | 1883 | Broker TCP port |
| Username | empty | Auth username (optional) |
| Password | empty | Auth password (optional) |
| Topic | hostname | Base publish topic |
| Sensor Name | empty | Friendly name included in JSON payload |
| Interval | 60 seconds | Publish interval (minimum 10 seconds) |
The device publishes to a topic constructed from the configured base topic, the device MAC address suffix, and a /data suffix:
{topic}/{mac6}/data
For example, if the base topic is PureAware_Office and the device MAC suffix is 8a0de8:
PureAware_Office/8a0de8/data
mac6 is the last 6 hex digits of the ESP32 MAC address. This ensures each device has a unique publish topic even when sharing the same base topic.
For quick testing, use the free public EMQX broker:
| Parameter | Value |
|---|---|
| Server | broker.emqx.io |
| Port | 1883 (TCP) / 8083 (WebSocket) |
| WebSocket URL | ws://broker.emqx.io:8083/mqtt |
| Username | emqx |
| Password | public |
PureAware provides companion monitoring applications that connect to the same MQTT broker via WebSocket and display live sensor data from all discovered devices:
monitor_remote.html in any web browser (included in the product package)PureAware_Monitor_Setup.exe (standalone desktop application)PureAware_Monitor_V1.apk on your Android deviceAll three applications auto-discover devices by subscribing to {topic}/# and display live sensor cards with AQI badges, color-coded thresholds, and timeout detection.
In the monitoring app settings, configure:
| Setting | Value |
|---|---|
| Broker | ws://broker.emqx.io:8083/mqtt (or your broker's WebSocket URL) |
| Topic | Same base topic configured on the device |
| User / Pass | Broker credentials (if required) |
Asynchronous Zabbix Sender protocol with a dedicated timer.
| Parameter | Default |
|---|---|
| Zabbix Server | monitor.microelemente.ro |
| Zabbix Port | 55051 |
| Hostname | PureAware_Default |
| Interval | 60 seconds |
The device implements a minimal BACnet/IP server per ASHRAE 135-2020, Annex J, on UDP port 47808.
Enable via the configuration web page. The Device Instance ID is derived from the MAC address by default, or can be set manually (range: 1–4,194,302).
| Object | Instance | Name | Unit |
|---|---|---|---|
| Device | auto (MAC-derived) | hostname | — |
| AI 0 | 0 | CO2 | ppm |
| AI 1 | 1 | PM1.0 | µg/m³ |
| AI 2 | 2 | PM2.5 | µg/m³ |
| AI 3 | 3 | PM4.0 | µg/m³ |
| AI 4 | 4 | PM10 | µg/m³ |
| AI 5 | 5 | VOC Index | No units |
| AI 6 | 6 | NOx Index | No units |
| AI 7 | 7 | TVOC | ppb |
| AI 8 | 8 | Temperature | °C |
| AI 9 | 9 | Humidity | %RH |
| AI 10 | 10 | Pressure | hPa |
Vendor: MICRO-ELEMENTS S.R.L.
Asynchronous Modbus TCP server on port 502, supporting up to 3 simultaneous clients with a 60-second idle timeout.
| Register | Parameter | Unit | Notes |
|---|---|---|---|
| 0 | Device Type | — | Fixed: 1 |
| 1 | VOC Index | — | 1–500 |
| 2 | NOx Index | — | 1–500 |
| 3 | PM1.0 | µg/m³ | Integer |
| 4 | PM2.5 | µg/m³ | Integer |
| 5 | PM4.0 | µg/m³ | Integer |
| 6 | PM10 | µg/m³ | Integer |
| 7 | Temperature | °C × 10 | e.g. 235 = 23.5°C |
| 8 | Humidity | %RH × 10 | e.g. 654 = 65.4% |
| 9 | CO2 | ppm | Integer |
| 10 | TVOC (WELL) | µg/m³ | Integer |
| 11 | Pressure | hPa × 10 | e.g. 10132 = 1013.2 hPa |
The device supports 3 independent alarms with hysteresis, email notifications, and a state machine.
| Parameter | Description |
|---|---|
| Enabled | Enable/disable this alarm |
| Parameter | Monitored value: co2, pm25, pm1, pm4, pm10, voc, nox, tvocw, temp, hum, press |
| Trigger Threshold | Value at which the alarm triggers |
| Hysteresis | Deadband for rearming (prevents oscillation) |
| Direction | 1 = above threshold, 0 = below threshold |
OK ──► Armed ──► Triggered ──► Rearmed ──► OK
(value enters (threshold (value returns
deadband) crossed) below hyst)
| Parameter | Default | Description |
|---|---|---|
| Email Enable | Disabled | Global email toggle |
| SMTP Server | empty | e.g., smtp.gmail.com |
| SMTP Port | 587 | 587 (STARTTLS) or 465 (SSL) |
| TLS | Enabled | STARTTLS or implicit SSL |
| Username | empty | SMTP auth user |
| Password | empty | SMTP auth password |
| From | empty | Sender email address |
| To | empty | Recipient email address |
Schedule automatic WiFi disconnection during specific hours to save power or comply with EMF policies:
| Parameter | Default | Description |
|---|---|---|
| Enable | Disabled | Toggle sleep schedule |
| Start Hour | 22:00 | WiFi off time |
| End Hour | 06:00 | WiFi on time |
The device maintains two layers of data logging:
day0.csv through day6.csvThe device syncs time via NTP when WiFi is available. Three fallback levels ensure timestamps are always present:
http://<ip>:8081.bin firmware fileEvery 24 hours, the device checks https://update.microelemente.ro/firmware.bin for new firmware.
Downloads are staged to LittleFS before flashing, protecting against incomplete downloads.
The optional Nextion HMI display shows real-time sensor data. Connect via Serial2 (GPIO 14/27 at 115200 baud).
Upload display firmware (pureaware_v3.tft) via the web interface on port 8082.
| Color/Pattern | Meaning |
|---|---|
| Green (solid) | Normal operation, WiFi connected |
| Blue (solid) | AP mode active |
| Red (solid) | Error / sensor fault |
| Yellow (blinking) | WiFi connecting |
| Off | LED disabled or OFFLINE mode |
The web interface and email notifications support 5 languages:
Set the language via the configuration web page. Default: en.
| Symptom | Possible Cause | Solution |
|---|---|---|
| No WiFi network visible | Not in AP mode | Press Config button |
| Cannot reach web UI | Wrong port or IP | Use http://<ip> on port 80 or 8080 |
| All sensor values are 0 | SEN66 not initialized | Wait 60s; check I2C Bus 1 wiring |
| Pressure reads 0 | MS5637 disconnected | Verify I2C Bus 2 (GPIO 33/32) |
| BACnet not responding | Not enabled or no WiFi | Enable in config; verify port 47808 not blocked |
| Modbus timeout | Max clients reached | Reduce connections (max 3) |
| Email not sending | SMTP credentials wrong | Check server, port, TLS, credentials |
| Device reboots randomly | Watchdog timeout (50s) | Check power supply; verify I2C not locked |
| Log files missing | LittleFS not mounted | Reflash with correct partition scheme |
| mDNS not resolving | Router blocks mDNS | Use IP address directly or enable SSDP |
To restore factory defaults:
esptool.py --port COMx erase_region 0x9000 0x5000