# MODULAIR

| Key              | Value                                                                             |                               |
| ---------------- | --------------------------------------------------------------------------------- | ----------------------------- |
| **Product Name** | MODULAIR                                                                          |                               |
| **SKU(s)**       | MOD-X-015-NORAM                                                                   | For use in North America      |
|                  | MOD-X-015-GLOBAL                                                                  | For use outside North America |
| **Datasheet**    | [Download](https://assets.quant-aq.com/downloads/spec-sheets/modulair.latest.pdf) |                               |

## 1. Introduction and Specs

MODULAIR™ provides real-time estimates of particulate matter concentrations (PM1, PM2.5, and PM10), the particle size distribution, and four gas-phase pollutants (CO, NO, NO2, O3). MODULAIR™ uses the same patented particle measurement technology found in the MODULAIR-PM, which combines nephelometry with single-particle scattering to accurately measure aerosol loadings across a variety of environments.

MODULAIR™ is designed as an internet-connected device and does not work as intended without an internet connection. All MODULAIR™ devices are multi-radio and come equipped with an LTE modem and Wi-Fi, and can seamlessly transition between the two radios.

MODULAIR™ is designed to work with QuantAQ's add-on systems, including the [Smart Solar Power System](https://quant-aq.com/products/smart-solar-power-system) and [Gill Weather Stations](https://quant-aq.com/products/weather-station).

MODULAIR™ is protected by US Patent No. US 12,265,007 as well as multiple pending patents.

### 1.1 Specifications

#### 1.1.1 Air Quality Measurements

| PARAMETER                  | RANGE                          | ACCURACY                    |
| -------------------------- | ------------------------------ | --------------------------- |
| PM1, PM2.5, PM10           | 0 to 2,000 µg/m3               | Please refer to spec sheet. |
| Particle Size Distribution | 0.35 to 40.0 µm (24 size bins) | Not yet determined.         |
| Ozone (O3)                 | 0 to 250 ppb                   | 5 ppb or 20%                |
| Carbon Monoxide (CO)       | 0 to 13,000 ppb                | 70 ppb or 20%               |
| Nitrogen Oxide (NO)        | 0 to 2,500 ppb                 | 5 ppb or 35%                |
| Nitrogen Dioxide (NO2)     | 0 to 2,500 ppb                 | 5 ppb or 35%                |

For more information on the operating principle and performance of the MODULAIR, please refer to the following technical notes:

* QAN-003: [Evaluating the Performance of the MODULAIR-PM Particulate Matter Sensor in Jurupa Valley, CA](https://zenodo.org/records/11200301)
* QAN-004: [Evaluating the MODULAIR gas measurements against EPA Air Sensor Performance Targets](https://zenodo.org/records/14456513)

#### 1.1.2 Power and Communications

<table><thead><tr><th width="254.51171875">PARAMETER</th><th>DETAILS</th></tr></thead><tbody><tr><td>🔋 <strong>Power</strong></td><td>12V <br>1.25W average consumption</td></tr><tr><td>🗼 <strong>Communication</strong></td><td><strong>North America</strong><br>LTE Cat M1 with 2G fallback<br>Wi-Fi (2.4 GHz or 5 GHz)<br><br><strong>Global</strong><br>LTE Cat 1 with 2G/3G fallback<br>Wi-Fi (2.4 GHz or 5 GHz)</td></tr><tr><td>📈 <strong>Data</strong></td><td>Web interface (quant-aq.com)<br>Programmatic access (QuantAQ API)<br>Local storage (µSD Card)</td></tr></tbody></table>

#### 1.1.3 Operating Specifications

<table><thead><tr><th width="268.0703125">PARAMETER</th><th>DETAILS</th></tr></thead><tbody><tr><td>Weatherproof rating</td><td>IP67</td></tr><tr><td>Operating temperature</td><td>-20º to 45ºC</td></tr><tr><td>Operating humidity</td><td>5 to 95%, non-condensing</td></tr><tr><td>Dimensions</td><td>11.04" x 9.04" x 5.72"</td></tr><tr><td>Weight</td><td>6 lbs (2.72 kg)</td></tr></tbody></table>

### 1.2 Certifications

#### 1.2.1 FCC 15(b)

The MODULAIR™ air quality sensor complies with part 15 of the FCC rules for class A devices. Operation is subject to the following two conditions: (1) this device may not cause harmful interference; (2) this device must accept any interference received, including interference that may cause undesired operation. The MODULAIR™ contains a pre-certified multi-radio modem (2AEMI-M404).

<figure><img src="https://3525414418-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FcdMusFauIE4AZkm3CC0c%2Fuploads%2FVSVwXJoSt0nkIqdoFI7d%2Fimage.png?alt=media&#x26;token=3fff0a6c-86bb-4f29-8567-893ce6dfe7cd" alt="" width="188"><figcaption></figcaption></figure>

## 2. Sensor Overview

### 2.1 Top View

Below is a top-down view of the MODULAIR. Air flows in through the port on the sensor base (Figure 2.2) and flows out the upper-right side of the sensor.&#x20;

<figure><img src="https://3525414418-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FcdMusFauIE4AZkm3CC0c%2Fuploads%2F9WQ1MXKJLm5f70Z48Esf%2F1.png?alt=media&#x26;token=ec25a8c2-d746-421b-a921-c69966b99e03" alt=""><figcaption><p>Figure 2.1. A top-down view of the MODULAIR.</p></figcaption></figure>

### 2.2 Base View

The base of the MODULAIR highlights the air inlet port (center) and the three connection ports:

1. **M8 4P Solar Comms**. The upper-left port is for connecting the M8 RS-485 communication cable between the Smart Solar Power System (if purchased) and the MODULAIR. If not in use, ensure the M8 dust cap is in place to prevent damage to the instrument.
2. **M12 4P Power.** The lower-left port is for connecting the M12 power cable from either the Smart Solar Power System or the provided 12V power cable.
3. **M12 5P Weather Station.** The port on the right side is for connecting a supported Gill Weather Station. If not in use, ensure the M12 dust cap is in place to prevent damage to the instrument.

<figure><img src="https://3525414418-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FcdMusFauIE4AZkm3CC0c%2Fuploads%2F224vqKvZf52XMeTWDzet%2F2.png?alt=media&#x26;token=9fd40608-0a25-4cfa-ad5e-6f472a59cc88" alt=""><figcaption><p>Figure 2.2. The MODULAIR base.</p></figcaption></figure>

Power can be provided directly to the M12, 4-pin cable. The pinout is documented below. If you are not using the QuantAQ Smart Solar Power System, you do not need to connect pins 2 and 3; leave them unpopulated.

<figure><img src="https://3525414418-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FcdMusFauIE4AZkm3CC0c%2Fuploads%2FPSNFjdR5YHdp2lxLu2dy%2FMODULAIR-X%20Product%20Manual.png?alt=media&#x26;token=e7dcde0e-5ebe-4145-8efa-541d5879a6b0" alt=""><figcaption></figcaption></figure>

### 2.3 Internal View

#### 2.3.1 Front Panel

The front panel of the MODULAIR can be accessed by opening the lid of the enclosure. The panel provides access to the power switch, SD card, and Status LED, all of which are shown in Figure 2.3.

<figure><img src="https://3525414418-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FcdMusFauIE4AZkm3CC0c%2Fuploads%2F94xpNLuLaaVetQ4ivmk1%2F3.png?alt=media&#x26;token=28183f71-5d21-4dc9-b55e-a36faa077928" alt=""><figcaption><p>Figure 2.3. The internal front panel of the MODULAIR.</p></figcaption></figure>

#### 2.3.2 Core Board

{% hint style="info" %}
Under normal operating circumstances, it should not be necessary to access the Core Board directly. You should only do so under the advisement of the QuantAQ support team.
{% endhint %}

To access the Core Board, open the front panel after unscrewing the screw located just above the µSD card. Once open, you can access the **mode** and **reset** buttons and the **USB debugging port** for streaming logs. When closing the lid, make sure it is aligned such that you do not break off the µSD card slot.

<figure><img src="https://3525414418-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FcdMusFauIE4AZkm3CC0c%2Fuploads%2FjzrCeYSg1gKPhJyiwVtI%2F4.png?alt=media&#x26;token=8e29debe-1782-4c03-81c2-15beba3d3d3d" alt=""><figcaption><p>Figure 2.4. The Core Board that runs the MODULAIR.</p></figcaption></figure>

## 3. Installation and Hardware Setup

### 3.1 Unpacking

When unpacking your MODULAIR, you should expect to find the following:

1. MODULAIR Air Quality Sensor
2. 12V, 2A USB-C Power Brick
3. USB-C to M12 Power Cable
4. Device Registration Card
5. MODULAIR Pole Mount Kit

If any of these components are missing, please contact QuantAQ Support via the in-app chat.

### 3.2 Device Registration

{% hint style="info" %}
You do not need to physically have your MODULAIR present to complete the device registration process. The process can also be completed without powering up your device.
{% endhint %}

Each device ships with a **Registration Card** containing a QR code and a short confirmation code. Follow the instructions below to register your device:

{% stepper %}
{% step %}

### Scan the QR code

Using an internet-connected phone, tablet, or computer, scan the QR code on your Registration Card. It is best to first log in to quant-aq.com on the same device. The QR code should direct you to the registration page on the QuantAQ Cloud.
{% endstep %}

{% step %}

### Fill out the device registration form

Fill out the form presented on your screen.
{% endstep %}

{% step %}

### Enter the claim code

The form will ask you for a **Claim Code,** which can be found on your **Registration Card**. It is a 6-digit alphanumeric code. This ensures only the person in possession of the device can register it.

Once completed, press "Register".
{% endstep %}
{% endstepper %}

### 3.3 Configuring Wi-Fi

{% hint style="warning" %}
Please note that configuring Wi-Fi is \*not\* required for operation. All MODULAIR devices have cellular modems, and Wi-Fi is a fallback in the event you are operating in an area that does not have a reliable cellular connection.
{% endhint %}

{% hint style="info" %}
To use our web-based configuration tool, you must use a computer operating system and browser that supports WebUSB technology. Examples include Chrome, Edge, and Opera browsers on Windows, Mac, Linux, or Chromebook devices.
{% endhint %}

To configure Wi-Fi credentials for your device, use our [web-based configuration tool](https://app.quant-aq.com/wifi-setup) or visit <https://app.quant-aq.com/wifi-setup>. Complete instructions can be found in our [Help Center](https://support.quant-aq.com/en/articles/10947910-configuring-wifi-credentials-on-supported-sensors). The MODULAIR can store up to ten separate credentials before they begin to be overwritten.&#x20;

### 3.4 Installation

{% hint style="info" %}
If the recommended installation hardware does not work for your deployment, please contact QuantAQ Support via the in-app chat, and we will help find a solution.
{% endhint %}

The MODULAIR should be mounted using the provided Pole Mount Kit. The Pole Mount Kit is designed to be installed using either the provided back plates and carriage bolts for smaller posts or hose clamps for larger posts. If an existing pole or post is not available in the location where you will be installing your sensor, we recommend acquiring a tripod or similar.

| Method                                    | Receommended Pole Diameter |
| ----------------------------------------- | -------------------------- |
| Pole Mount Kit with Back Plates           | 1.25" - 2"                 |
| Pole Mount Kit with Hose Clamps or Straps | 2" - 6"                    |

To physically install your sensor, follow these instructions:

{% stepper %}
{% step %}

### Secure the Pole Mount Kit

Secure the Pole Mount Kit to the pole or post using the included carriage bolts and backing plates, or hose clamps if securing to a larger post.

<figure><img src="https://3525414418-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FcdMusFauIE4AZkm3CC0c%2Fuploads%2FAOlXQiXxcLk3DjcRZDIL%2F6.png?alt=media&#x26;token=773ab653-f433-49f3-aecd-4c90ad4e99b7" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Pre-Install the 3/8" 10-32 screws to the MODULAIR

Using the four provided 3/8" 10-32 screws, partially screw install each one into the fasteneres in each corner of the back of the MODULAIR.
{% endstep %}

{% step %}

### Secure the MODULAIR

Slide the four screws through the slots on the Pole Mount Kit and then secure.

<figure><img src="https://3525414418-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FcdMusFauIE4AZkm3CC0c%2Fuploads%2FJnySJUR4k90guam71pN9%2F7.png?alt=media&#x26;token=2e2c4a01-4718-4424-9069-e73bd23337d1" alt=""><figcaption></figcaption></figure>
{% endstep %}

{% step %}

### Install the Power Cord and Power On

Plug in the M12 to USB-C power cable, open the front panel of the MODULAIR, and turn the device *on* by pushing the power switch into the *on* position.

At this point, the Status LED on your MODULAIR will begin to blink, and within a few minutes, should begin breathing cyan, which indicates everything is working.&#x20;
{% endstep %}
{% endstepper %}

### 3.5 Connectivity Considerations

As all QuantAQ products are internet-connected, it is important to consider connectivity when choosing an installation location. There are three primary things to consider:

1. **Antenna Connection.** If your device has an external antenna, ensure it is seated securely and placed at a 90º angle pointing toward the sky.
2. **Antenna Placement.** Do not place the device near metal objects or other sources of RF (i.e., antenna). Keep the antenna at least 18" away from metal objects as they can cause distortions and reflections.
3. **Location and Cellular Availability.** Install your sensor in a location with a known cellular signal on the carriers we support.

## 4. Software and Data

### 4.1 Data Structure and Outputs

There are three ways in which you can access data for the MODULAIR:

1. Raw, 5-second data is stored locally on the µSD card
2. Data can be downloaded as a CSV via the QuantAQ Cloud console
3. Data can be downloaded via the QuantAQ Cloud API

The data formats are slightly different, though largely consistent. Each approach is documented below.

#### 4.1.1 Data stored locally (µSD Card)

Data is collected and saved to an onboard µSD card every 5- 10 seconds (depending on product SKU). Each minute, these values are averaged and pushed to the QuantAQ Cloud, where they are available for you to view, interact with, and download. It is unlikely you will ever *need* the locally stored data, but it is available to you if you would like to use it.&#x20;

On the µSD card, you will find data files with file names like DATA\_{YYYYMMDD}@FW{VERSION}.csv where YYYYMMDD represents the UTC date and VERSION represents the firmware version of the device. In the event a firmware update happens, a new file for that date will be created.&#x20;

<figure><img src="https://3525414418-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FcdMusFauIE4AZkm3CC0c%2Fuploads%2FTHFcw6rSKxI4LLw9ButB%2FScreenshot%202025-05-01%20at%201.35.10%E2%80%AFPM.png?alt=media&#x26;token=bc5b010e-d6b2-4c12-98cd-f7f9a256318b" alt=""><figcaption><p>Figure 4.1. Sample of a data file header. The first three rows include meta data with subsequent rows containing data.</p></figcaption></figure>

Data files are written each day and can be read or analyzed using any programming language or spreadsheet program (e.g., Microsoft Excel). Each file begins with three metadata rows describing the device model (row 1), device ID (row 2), and device serial number (row 3). Row 4 contains the data column headers, and rows 5 and higher contain data. Each row corresponds to a new record.

Table 4.1 below documents the columns available in the downloaded data and what they mean.

<table><thead><tr><th width="201.94140625">COLUMN</th><th width="85.9921875" align="center">UNIT</th><th>Description</th></tr></thead><tbody><tr><td>timestamp</td><td align="center"></td><td>The sample timestamp in ISO format</td></tr><tr><td>fw</td><td align="center"></td><td>The current firmware version</td></tr><tr><td>flag</td><td align="center"></td><td>The status flag corresponding to this record</td></tr><tr><td>soc</td><td align="center">%</td><td>The state of charge of the onboard LiPo battery</td></tr><tr><td>sample_temp</td><td align="center">ºC</td><td>The in-box temperature</td></tr><tr><td>sample_rh</td><td align="center">%</td><td>The in-box relative humidity</td></tr><tr><td>bin0</td><td align="center">p/cm3</td><td>Number of particles per cubic cm in the OPC's bin0 (0.35 - 0.46 µm)</td></tr><tr><td>bin1</td><td align="center">p/cm3</td><td>Number of particles per cubic cm in the OPC's bin1 (0.46 - 0.66 µm)</td></tr><tr><td>bin2</td><td align="center">p/cm3</td><td>Number of particles per cubic cm in the OPC's bin2 (0.66 - 1.0 µm)</td></tr><tr><td>bin3</td><td align="center">p/cm3</td><td>Number of particles per cubic cm in the OPC's bin3 (1.0 - 1.3 µm)</td></tr><tr><td>bin4</td><td align="center">p/cm3</td><td>Number of particles per cubic cm in the OPC's bin4 (1.3 - 1.7 µm)</td></tr><tr><td>bin5</td><td align="center">p/cm3</td><td>Number of particles per cubic cm in the OPC's bin5 (1.7 - 2.3 µm)</td></tr><tr><td>bin6</td><td align="center">p/cm3</td><td>Number of particles per cubic cm in the OPC's bin6 (2.3 - 3.0 µm)</td></tr><tr><td>bin7</td><td align="center">p/cm3</td><td>Number of particles per cubic cm in the OPC's bin7 (3.0 - 4.0 µm)</td></tr><tr><td>bin8</td><td align="center">p/cm3</td><td>Number of particles per cubic cm in the OPC's bin8 (4.0 - 5.2 µm)</td></tr><tr><td>bin9</td><td align="center">p/cm3</td><td>Number of particles per cubic cm in the OPC's bin9 (5.2 - 6.5 µm)</td></tr><tr><td>bin10</td><td align="center">p/cm3</td><td>Number of particles per cubic cm in the OPC's bin10 (6.5 - 8.0 µm)</td></tr><tr><td>bin11</td><td align="center">p/cm3</td><td>Number of particles per cubic cm in the OPC's bin11 (8.0 - 10.0 µm)</td></tr><tr><td>bin12</td><td align="center">p/cm3</td><td>Number of particles per cubic cm in the OPC's bin12 (10.0 - 12.0 µm)</td></tr><tr><td>bin13</td><td align="center">p/cm3</td><td>Number of particles per cubic cm in the OPC's bin13 (12.0 - 14.0 µm)</td></tr><tr><td>bin14</td><td align="center">p/cm3</td><td>Number of particles per cubic cm in the OPC's bin14 (14.0 - 16.0 µm)</td></tr><tr><td>bin15</td><td align="center">p/cm3</td><td>Number of particles per cubic cm in the OPC's bin15 (16.0 - 18.0 µm)</td></tr><tr><td>bin16</td><td align="center">p/cm3</td><td>Number of particles per cubic cm in the OPC's bin16 (18.0 - 20.0 µm)</td></tr><tr><td>bin17</td><td align="center">p/cm3</td><td>Number of particles per cubic cm in the OPC's bin17 (20.0 - 22.0 µm)</td></tr><tr><td>bin18</td><td align="center">p/cm3</td><td>Number of particles per cubic cm in the OPC's bin18 (22.0 - 25.0 µm)</td></tr><tr><td>bin19</td><td align="center">p/cm3</td><td>Number of particles per cubic cm in the OPC's bin19 (25.0 - 28.0 µm)</td></tr><tr><td>bin20</td><td align="center">p/cm3</td><td>Number of particles per cubic cm in the OPC's bin20 (28.0 - 31.0 µm)</td></tr><tr><td>bin21</td><td align="center">p/cm3</td><td>Number of particles per cubic cm in the OPC's bin21 (31.0 - 34.0 µm)</td></tr><tr><td>bin22</td><td align="center">p/cm3</td><td>Number of particles per cubic cm in the OPC's bin22 (34.0 - 37.0 µm)</td></tr><tr><td>bin23</td><td align="center">p/cm3</td><td>Number of particles per cubic cm in the OPC's bin23 (37.0 - 40.0 µm)</td></tr><tr><td>bin1MToF</td><td align="center">ml/s</td><td>Time of flight for particles in OPC bin1</td></tr><tr><td>bin3MToF</td><td align="center">ml/s</td><td>Time of flight for particles in OPC bin3</td></tr><tr><td>bin5MToF</td><td align="center">ml/s</td><td>Time of flight for particles in OPC bin5</td></tr><tr><td>bin7MToF</td><td align="center">ml/s</td><td>Time of flight for particles in OPC bin7</td></tr><tr><td>opc_sample_flow</td><td align="center">ml/s</td><td>OPC sample flow rate</td></tr><tr><td>opc_temp</td><td align="center">ºC</td><td>The internal temperature of the OPC</td></tr><tr><td>opc_rh</td><td align="center">%</td><td>The internal relative humidity of the OPC</td></tr><tr><td>opc_pm1</td><td align="center">µg/m3</td><td>The factory-computed PM1 value for the OPC</td></tr><tr><td>opc_pm25</td><td align="center">µg/m3</td><td>The factory-computed PM2.5 value for the OPC</td></tr><tr><td>opc_pm10</td><td align="center">µg/m3</td><td>The factory-computed PM10 value for the OPC</td></tr><tr><td>opc_laser_status</td><td align="center"></td><td>The laser power of the OPC</td></tr><tr><td>neph_bin0</td><td align="center">p</td><td>Number of particles in bin0 of the nephelometer</td></tr><tr><td>neph_bin1</td><td align="center">p</td><td>Number of particles in bin1 of the nephelometer</td></tr><tr><td>neph_bin2</td><td align="center">p</td><td>Number of particles in bin2 of the nephelometer</td></tr><tr><td>neph_bin3</td><td align="center">p</td><td>Number of particles in bin3 of the nephelometer</td></tr><tr><td>neph_bin4</td><td align="center">p</td><td>Number of particles in bin4 of the nephelometer</td></tr><tr><td>neph_bin5</td><td align="center">p</td><td>Number of particles in bin5 of the nephelometer</td></tr><tr><td>neph_pm1_std</td><td align="center">µg/m3</td><td>The factory computed value for PM1 from the Nephelometer</td></tr><tr><td>neph_pm25_std</td><td align="center">µg/m3</td><td>The factory computed value for PM2.5 from the Nephelometer</td></tr><tr><td>neph_pm10_std</td><td align="center">µg/m3</td><td>The factory computed value for PM10 from the Nephelometer</td></tr><tr><td>neph_pm1_env</td><td align="center">µg/m3</td><td>The factory computed value for PM1 from the Nephelometer</td></tr><tr><td>neph_pm25_env</td><td align="center">µg/m3</td><td>The factory computed value for PM2.5 from the Nephelometer</td></tr><tr><td>neph_pm10_env</td><td align="center">µg/m3</td><td>The factory computed value for PM10 from the Nephelometer</td></tr><tr><td>dd_operating_state</td><td align="center"></td><td>The operating state of the DualDetector</td></tr><tr><td>dd_measurement_state</td><td align="center"></td><td>The measurement state of the DualDetector</td></tr><tr><td>wx_ws</td><td align="center">m/s</td><td>Vector wind speed measured by the Gill weather station, if equipped</td></tr><tr><td>wx_wd</td><td align="center">deg</td><td>Wind direction measured by the Gill weather station, if equipped</td></tr><tr><td>wx_ws_scalar</td><td align="center">m/s</td><td>Scalar wind speed measured by the Gill weather station, if equipped</td></tr><tr><td>wx_u</td><td align="center"></td><td>u component of the wind speed and direction measured by the Gill weather station, if equipped</td></tr><tr><td>wx_v</td><td align="center"></td><td>v component of the wind speed and direction measured by the Gill weather station, if equipped</td></tr><tr><td>wx_pressure</td><td align="center">hPa</td><td>Ambient pressure measured by the Gill weather station, if equipped</td></tr><tr><td>wx_temp</td><td align="center">ºC</td><td>Ambient temperature measured by the Gill weather station, if equipped</td></tr><tr><td>wx_rh</td><td align="center">%</td><td>Ambient relative humidity measured by the Gill weather station, if equipped</td></tr><tr><td>wx_dew_point</td><td align="center">ºC</td><td>Dew point measured by the Gill weather station, if equipped</td></tr><tr><td>co_we</td><td align="center">mV</td><td>Working electrode signal for the CO sensor</td></tr><tr><td>co_ae</td><td align="center">mV</td><td>Auxiliary electrode signal for the CO sensor</td></tr><tr><td>no_we</td><td align="center">mV</td><td>Working electrode signal for the NO sensor</td></tr><tr><td>no_ae</td><td align="center">mV</td><td>Auxiliary electrode signal for the NO sensor</td></tr><tr><td>no2_we</td><td align="center">mV</td><td>Working electrode signal for the NO2 sensor</td></tr><tr><td>no2_ae</td><td align="center">mV</td><td>Auxiliary electrode signal for the NO2 sensor</td></tr><tr><td>o3_we</td><td align="center">mV</td><td>Working electrode signal for the O3 sensor</td></tr><tr><td>o3_ae</td><td align="center">mV</td><td>Auxiliary electrode signal for the O3 sensor</td></tr></tbody></table>

#### 4.1.2 Data stored remotely (QuantAQ Cloud)

Data are pushed to the QuantAQ Cloud with 1-minute time resolution and can be downloaded via the API or via the web app as a CSV. When downloading data, you can select whether you would like to download the *raw* data, *final* data, or *raw+final* data. Generally, the *final* data is what is desired, as it contains the final, cleaned data that is ready for analysis. The *raw* data is well-suited for researchers trying to investigate specific questions. When downloaded, the data is exported as a CSV and contains the following columns:

<table><thead><tr><th width="177.71484375">COLUMN</th><th width="160.375">FILE LOCATION<select multiple><option value="6I745FT8JxR0" label="raw" color="blue"></option><option value="4MiM2XQVepGk" label="final" color="blue"></option></select></th><th width="110.01171875">UNIT</th><th>DESCRIPTION</th></tr></thead><tbody><tr><td>timestamp</td><td><span data-option="6I745FT8JxR0">raw, </span><span data-option="4MiM2XQVepGk">final</span></td><td></td><td>The sample timestamp in ISO format</td></tr><tr><td>timestamp_local</td><td><span data-option="6I745FT8JxR0">raw, </span><span data-option="4MiM2XQVepGk">final</span></td><td></td><td>The local sample timestamp in ISO format</td></tr><tr><td>id</td><td><span data-option="6I745FT8JxR0">raw, </span><span data-option="4MiM2XQVepGk">final</span></td><td></td><td>The record ID</td></tr><tr><td>sn</td><td><span data-option="6I745FT8JxR0">raw, </span><span data-option="4MiM2XQVepGk">final</span></td><td></td><td>The device serial number</td></tr><tr><td>device_state</td><td><span data-option="6I745FT8JxR0">raw</span></td><td></td><td>The device state</td></tr><tr><td>lat</td><td><span data-option="6I745FT8JxR0">raw, </span><span data-option="4MiM2XQVepGk">final</span></td><td></td><td>The device location, latitude</td></tr><tr><td>lon</td><td><span data-option="6I745FT8JxR0">raw, </span><span data-option="4MiM2XQVepGk">final</span></td><td></td><td>The device location, longitude</td></tr><tr><td>sample_rh</td><td><span data-option="6I745FT8JxR0">raw, </span><span data-option="4MiM2XQVepGk">final</span></td><td>%</td><td>The in-box relative humidity</td></tr><tr><td>sample_temp</td><td><span data-option="6I745FT8JxR0">raw, </span><span data-option="4MiM2XQVepGk">final</span></td><td>ºC</td><td>The in-box temperature</td></tr><tr><td>wx_ws</td><td><span data-option="6I745FT8JxR0">raw, </span><span data-option="4MiM2XQVepGk">final</span></td><td>m/s</td><td>Vector wind speed measured by the Gill weather station, if equipped</td></tr><tr><td>wx_wd</td><td><span data-option="6I745FT8JxR0">raw, </span><span data-option="4MiM2XQVepGk">final</span></td><td>deg</td><td>Wind direction measured by the Gill weather station, if equipped</td></tr><tr><td>wx_ws_scalar</td><td><span data-option="6I745FT8JxR0">raw, </span><span data-option="4MiM2XQVepGk">final</span></td><td>m/s</td><td>Scalar wind speed measured by the Gill weather station, if equipped</td></tr><tr><td>wx_u</td><td><span data-option="6I745FT8JxR0">raw</span></td><td></td><td>u component of the wind speed and direction measured by the Gill weather station, if equipped</td></tr><tr><td>wx_v</td><td><span data-option="6I745FT8JxR0">raw</span></td><td></td><td>v component of the wind speed and direction measured by the Gill weather station, if equipped</td></tr><tr><td>wx_pressure</td><td><span data-option="6I745FT8JxR0">raw</span></td><td>hPa</td><td>Ambient pressure measured by the Gill weather station, if equipped</td></tr><tr><td>wx_temp</td><td><span data-option="6I745FT8JxR0">raw</span></td><td>ºC</td><td>Ambient temperature measured by the Gill weather station, if equipped</td></tr><tr><td>wx_rh</td><td><span data-option="6I745FT8JxR0">raw</span></td><td>%</td><td>Ambient relative humidity measured by the Gill weather station, if equipped</td></tr><tr><td>wx_dew_point</td><td><span data-option="6I745FT8JxR0">raw</span></td><td>ºC</td><td>Dew point measured by the Gill weather station, if equipped</td></tr><tr><td>bin0</td><td><span data-option="6I745FT8JxR0">raw</span></td><td>p/cc</td><td>Number of particles per cubic cm in the OPC's bin0 (0.35 - 0.46 µm)</td></tr><tr><td>bin1</td><td><span data-option="6I745FT8JxR0">raw</span></td><td>p/cc</td><td>Number of particles per cubic cm in the OPC's bin1 (0.46 - 0.66 µm)</td></tr><tr><td>bin2</td><td><span data-option="6I745FT8JxR0">raw</span></td><td>p/cc</td><td>Number of particles per cubic cm in the OPC's bin2 (0.66 - 1.0 µm)</td></tr><tr><td>bin3</td><td><span data-option="6I745FT8JxR0">raw</span></td><td>p/cc</td><td>Number of particles per cubic cm in the OPC's bin3 (1.0 - 1.3 µm)</td></tr><tr><td>bin4</td><td><span data-option="6I745FT8JxR0">raw</span></td><td>p/cc</td><td>Number of particles per cubic cm in the OPC's bin4 (1.3 - 1.7 µm)</td></tr><tr><td>bin5</td><td><span data-option="6I745FT8JxR0">raw</span></td><td>p/cc</td><td>Number of particles per cubic cm in the OPC's bin5 (1.7 - 2.3 µm)</td></tr><tr><td>bin6</td><td><span data-option="6I745FT8JxR0">raw</span></td><td>p/cc</td><td>Number of particles per cubic cm in the OPC's bin6 (2.3 - 3.0 µm)</td></tr><tr><td>bin7</td><td><span data-option="6I745FT8JxR0">raw</span></td><td>p/cc</td><td>Number of particles per cubic cm in the OPC's bin7 (3.0 - 4.0 µm)</td></tr><tr><td>bin8</td><td><span data-option="6I745FT8JxR0">raw</span></td><td>p/cc</td><td>Number of particles per cubic cm in the OPC's bin8 (4.0 - 5.2 µm)</td></tr><tr><td>bin9</td><td><span data-option="6I745FT8JxR0">raw</span></td><td>p/cc</td><td>Number of particles per cubic cm in the OPC's bin9 (5.2 - 6.5 µm)</td></tr><tr><td>bin10</td><td><span data-option="6I745FT8JxR0">raw</span></td><td>p/cc</td><td>Number of particles per cubic cm in the OPC's bin10 (6.5 - 8.0 µm)</td></tr><tr><td>bin11</td><td><span data-option="6I745FT8JxR0">raw</span></td><td>p/cc</td><td>Number of particles per cubic cm in the OPC's bin11 (8.0 - 10.0 µm)</td></tr><tr><td>bin12</td><td><span data-option="6I745FT8JxR0">raw</span></td><td>p/cc</td><td>Number of particles per cubic cm in the OPC's bin12 (10.0 - 12.0 µm)</td></tr><tr><td>bin13</td><td><span data-option="6I745FT8JxR0">raw</span></td><td>p/cc</td><td>Number of particles per cubic cm in the OPC's bin13 (12.0 - 14.0 µm)</td></tr><tr><td>bin14</td><td><span data-option="6I745FT8JxR0">raw</span></td><td>p/cc</td><td>Number of particles per cubic cm in the OPC's bin14 (14.0 - 16.0 µm)</td></tr><tr><td>bin15</td><td><span data-option="6I745FT8JxR0">raw</span></td><td>p/cc</td><td>Number of particles per cubic cm in the OPC's bin15 (16.0 - 18.0 µm)</td></tr><tr><td>bin16</td><td><span data-option="6I745FT8JxR0">raw</span></td><td>p/cc</td><td>Number of particles per cubic cm in the OPC's bin16 (18.0 - 20.0 µm)</td></tr><tr><td>bin17</td><td><span data-option="6I745FT8JxR0">raw</span></td><td>p/cc</td><td>Number of particles per cubic cm in the OPC's bin17 (20.0 - 22.0 µm)</td></tr><tr><td>bin18</td><td><span data-option="6I745FT8JxR0">raw</span></td><td>p/cc</td><td>Number of particles per cubic cm in the OPC's bin18 (22.0 - 25.0 µm)</td></tr><tr><td>bin19</td><td><span data-option="6I745FT8JxR0">raw</span></td><td>p/cc</td><td>Number of particles per cubic cm in the OPC's bin19 (25.0 - 28.0 µm)</td></tr><tr><td>bin20</td><td><span data-option="6I745FT8JxR0">raw</span></td><td>p/cc</td><td>Number of particles per cubic cm in the OPC's bin20 (28.0 - 31.0 µm)</td></tr><tr><td>bin21</td><td><span data-option="6I745FT8JxR0">raw</span></td><td>p/cc</td><td>Number of particles per cubic cm in the OPC's bin21 (31.0 - 34.0 µm)</td></tr><tr><td>bin22</td><td><span data-option="6I745FT8JxR0">raw</span></td><td>p/cc</td><td>Number of particles per cubic cm in the OPC's bin22 (34.0 - 37.0 µm)</td></tr><tr><td>bin23</td><td><span data-option="6I745FT8JxR0">raw</span></td><td>p/cc</td><td>Number of particles per cubic cm in the OPC's bin23 (37.0 - 40.0 µm)</td></tr><tr><td>opc_pm1</td><td><span data-option="6I745FT8JxR0">raw</span></td><td>µgm<sup>-3</sup></td><td>The factory-computed PM<sub>1</sub> value for the OPC</td></tr><tr><td>opc_pm25</td><td><span data-option="6I745FT8JxR0">raw</span></td><td>µgm<sup>-3</sup></td><td>The factory-computed PM<sub>2.5</sub> value for the OPC</td></tr><tr><td>opc_pm10</td><td><span data-option="6I745FT8JxR0">raw</span></td><td>µµgm<sup>-3</sup></td><td>The factory-computed PM<sub>10</sub> value for the OPC</td></tr><tr><td>pm1_env</td><td><span data-option="6I745FT8JxR0">raw</span></td><td>µgm<sup>-3</sup></td><td>The factory computed value for PM<sub>1</sub> from the Nephelometer</td></tr><tr><td>pm25_env</td><td><span data-option="6I745FT8JxR0">raw</span></td><td>µgm<sup>-3</sup></td><td>The factory computed value for PM<sub>2.5</sub> from the Nephelometer</td></tr><tr><td>pm10_env</td><td><span data-option="6I745FT8JxR0">raw</span></td><td>µgm<sup>-3</sup></td><td>The factory computed value for PM<sub>10</sub> from the Nephelometer</td></tr><tr><td>neph_bin0</td><td><span data-option="6I745FT8JxR0">raw</span></td><td>p</td><td>Number of particles in bin0 of the nephelometer</td></tr><tr><td>dd_operating_state</td><td><span data-option="6I745FT8JxR0">raw</span></td><td></td><td>The operating state of the DualDetector</td></tr><tr><td>co_we</td><td><span data-option="6I745FT8JxR0">raw</span></td><td>mV</td><td>Working electrode signal for the CO sensor</td></tr><tr><td>co_ae</td><td><span data-option="6I745FT8JxR0">raw</span></td><td>mV</td><td>Auxiliary electrode signal for the CO sensor</td></tr><tr><td>co_diff</td><td><span data-option="6I745FT8JxR0">raw</span></td><td>mV</td><td>Difference between working and auxiliary electrodes for the CO sensor</td></tr><tr><td>no_we</td><td><span data-option="6I745FT8JxR0">raw</span></td><td>mV</td><td>Working electrode signal for the NO sensor</td></tr><tr><td>no_ae</td><td><span data-option="6I745FT8JxR0">raw</span></td><td>mV</td><td>Auxiliary electrode signal for the NO sensor</td></tr><tr><td>no_diff</td><td><span data-option="6I745FT8JxR0">raw</span></td><td>mV</td><td>Difference between working and auxiliary electrodes for the NO sensor</td></tr><tr><td>no2_we</td><td><span data-option="6I745FT8JxR0">raw</span></td><td>mV</td><td>Working electrode signal for the NO<sub>2</sub> sensor</td></tr><tr><td>no2_ae</td><td><span data-option="6I745FT8JxR0">raw</span></td><td>mV</td><td>Auxiliary electrode signal for the NO<sub>2</sub> sensor</td></tr><tr><td>no2_diff</td><td><span data-option="6I745FT8JxR0">raw</span></td><td>mV</td><td>Difference between working and auxiliary electrodes for the NO<sub>2</sub> sensor</td></tr><tr><td>o3_we</td><td><span data-option="6I745FT8JxR0">raw</span></td><td>mV</td><td>Working electrode signal for the O<sub>3</sub> sensor</td></tr><tr><td>o3_ae</td><td><span data-option="6I745FT8JxR0">raw</span></td><td>mV</td><td>Auxiliary electrode signal for the O<sub>3</sub> sensor</td></tr><tr><td>ox_diff</td><td><span data-option="6I745FT8JxR0">raw</span></td><td>mV</td><td>Difference between working and auxiliary electrodes for the O<sub>3</sub> sensor</td></tr><tr><td>pm1</td><td><span data-option="4MiM2XQVepGk">final</span></td><td>µgm<sup>-3</sup></td><td>Final PM<sub>1</sub> value</td></tr><tr><td>pm25</td><td><span data-option="4MiM2XQVepGk">final</span></td><td>µgm<sup>-3</sup></td><td>Final PM<sub>2.5</sub> value</td></tr><tr><td>pm10</td><td><span data-option="4MiM2XQVepGk">final</span></td><td>µgm<sup>-3</sup></td><td>Final PM<sub>10</sub> value</td></tr><tr><td>co</td><td><span data-option="4MiM2XQVepGk">final</span></td><td>ppb</td><td>Final CO value</td></tr><tr><td>no</td><td><span data-option="4MiM2XQVepGk">final</span></td><td>ppb</td><td>Final NO value</td></tr><tr><td>no2</td><td><span data-option="4MiM2XQVepGk">final</span></td><td>ppb</td><td>Final NO<sub>2</sub> value</td></tr><tr><td>o3</td><td><span data-option="4MiM2XQVepGk">final</span></td><td>ppb</td><td>Final O<sub>3</sub> value</td></tr></tbody></table>

### 4.2 Understanding the Status Flag

Each record contains a status flag, stored as an unsigned integer, that describes the state of the device for that exact record. Flags contain encoded information about each of the sub-components onboard the device. They are generated via a bitmask and can be decoded by reversing the procedure. To determine whether a specific flag is set, you can use the bitwise AND operator. If the value of the flag is returned, then the flag is set. If a zero is returned, the flag is *not* set.&#x20;

To make this a bit clearer, let's follow this example. Let's assume the value of the flag is set to "4". We can perform a bitwise AND operation to check the result to see if FLAG\_STARTUP is set.

```
# bit AND - is FLAG_STARTUP set?
>>> 4 & 1
0

# bit AND - is FLAG_NEPH set?
>>> 4 & 4
4
```

The table below describes the available flags, flag values, and a description of what they mean and what action should be taken when they are set.&#x20;

{% hint style="info" %}
Flags are consistent across all QuantAQ products, so there may be flags in the table below that irrelevant to your product.
{% endhint %}

<table><thead><tr><th width="169.62109375">FLAG</th><th width="90.24609375">VALUE</th><th width="221.5234375">WHY IS IT SET?</th><th>WHAT TO DO?</th></tr></thead><tbody><tr><td>FLAG_STARTUP</td><td>1</td><td>This flag is set when the device powers on.</td><td>Remove any rows where this flag is set.</td></tr><tr><td>FLAG_OPC</td><td>2</td><td>This flag is set when the OPC has indicated the data failed to transfer correctly. This can be caused by the fan being off, the laser being off, or the checksum not validating properly.</td><td>Remove any rows where this flag is set.</td></tr><tr><td>FLAG_NEPH</td><td>4</td><td>This flag is set when the nephelometer has indicated the data failed to transfer correctly.</td><td>Remove any rows where this flag is set.</td></tr><tr><td>FLAG_RHTP</td><td>8</td><td>This flag is set when the relative humidity and temperature sensor has failed.</td><td>Remove any rows where this flag is set.</td></tr><tr><td>FLAG_CO</td><td>16</td><td>This flag is set when the CO sensor has failed or data does not meet initial on-board QA/QC.</td><td>Remove any rows where this flag is set.</td></tr><tr><td>FLAG_NO</td><td>32</td><td>This flag is set when the NO sensor has failed or data does not meet initial on-board QA/QC.</td><td>Remove any rows where this flag is set.</td></tr><tr><td>FLAG_NO2</td><td>64</td><td>This flag is set when the NO2 sensor has failed or data does not meet initial on-board QA/QC.</td><td>Remove any rows where this flag is set.</td></tr><tr><td>FLAG_O3</td><td>128</td><td>This flag is set when the O3 sensor has failed or data does not meet initial on-board QA/QC.</td><td>Remove any rows where this flag is set.</td></tr><tr><td>FLAG_CO2</td><td>256</td><td>This flag is set when the CO2 sensor has failed or data does not meet initial on-board QA/QC.</td><td>Remove any rows where this flag is set.</td></tr><tr><td>FLAG_SO2</td><td>512</td><td>This flag is set when the SO2 sensor has failed or data does not meet initial on-board QA/QC.</td><td>Remove any rows where this flag is set.</td></tr><tr><td>FLAG_H2S</td><td>1024</td><td>This flag is set when the H2S sensor has failed or data does not meet initial on-board QA/QC.</td><td>Remove any rows where this flag is set.</td></tr><tr><td>FLAG_BAT</td><td>2048</td><td>This flag is set when the internal LiPo battery is low or dead.</td><td>None.</td></tr><tr><td>FLAG_OVERHEAT</td><td>4096</td><td>This flag is set when the OPC has overheated.</td><td>Contact QuantAQ.</td></tr><tr><td>FLAG_SD</td><td>8192</td><td>This flag is set when the SD card has failed.</td><td>Replace the SD card.</td></tr></tbody></table>

### 4.3 Leveraging QuantAQ's Software Tools

To make data analysis easier, QuantAQ maintains several software programs designed to reduce the time it takes for you to go from data to insight. Below, we highlight several tools and their purpose:

**QuantAQ CLI**

The QuantAQ CLI is a simple Python-based tool for cleaning, munging, and interacting with data from QuantAQ devices.

{% embed url="<https://github.com/quant-aq/cli>" %}

**py-smps**

`py-smps` is a Python library for manipulating and analyzing size-resolved particle data from OPCs, SMPS, or other particle sizing instruments.

{% embed url="<https://github.com/quant-aq/py-smps>" %}

**atmospy**

`atmopsy` is a Python library for analyzing and visualizing air quality data.

{% embed url="<https://github.com/dhhagan/atmospy>" %}

**py-quantaq**

`py-quantaq` is a simple API wrapper for the QuantAQ Cloud API. It is the recommended method for downloading or interacting with data or devices when using Python.

{% embed url="<https://github.com/quant-aq/py-quantaq>" %}

**r-quantaq**

`r-quantaq` is a simple API wrapper for the QuantAQ Cloud API. It is the recommended method for downloading or interacting with data or devices when using R.

{% embed url="<https://github.com/quant-aq/r-quantaq>" %}

## 5. Maintenance and Service

There are no consumable or user-replaceable components to the MODULAIR. If you believe a component is broken or not functioning correctly, please contact Customer Support via the in-app chat.

Additional maintenance and service recommendations are coming soon.

## 6. Changelog

Please see our [public changelog](https://changes.quant-aq.com/) for a full history of all firmware changes.

## 7. Appendix

### 7.1 Status LED

The Status LED on the front panel is used to communicate the status of the internet connection. The LED changes color and pattern, each of which indicates a different state as outlined below. The rate at which the LED blinks comes in two flavors: *blinking* and *breathing,* where breathing implies a slow pulse where the color of the LED fades in and out.

<table><thead><tr><th width="143.58984375">LED COLOR</th><th width="97.0703125">PATTERN</th><th width="167.98046875">MODE</th><th>DESCRIPTION</th></tr></thead><tbody><tr><td>Green</td><td>Blinking</td><td>Looking for Internet</td><td>If your device is blinking green, it is trying to connect to the cellular network. There is no need to take any action.</td></tr><tr><td></td><td>Breathing</td><td>Cloud not Connected</td><td>If your device is breathing green, it has a cellular connection but has not been able to connect to the cloud.</td></tr><tr><td>Cyan</td><td>Blinking</td><td>Connecting to the Cloud</td><td>Blinking cyan indicates the device has a cellular connection and is attempting to connect to the cloud. There is no need to take any action. This will happen each time on device startup.</td></tr><tr><td></td><td>Breathing</td><td>Connected</td><td>When your device is breathing cyan, everything is good and you are happily connected to the internet and the QuantAQ Cloud.</td></tr><tr><td>Magenta</td><td>Blinking</td><td>Firmware Update</td><td>When your device is blinking magenta, it is undergoing an over-the-air firmware update. DO NOT power off when this is happening.</td></tr><tr><td>White</td><td>Breathing</td><td>Internet Off</td><td>If the LED is breathing white, the cellular connection has been turned off. If you did not explicitly turn off the cellular connection via the onboard switch, please notify QuantAQ.</td></tr><tr><td>Red</td><td>Blinking</td><td>System Failure</td><td>A system failure has occurred. This is likely caused by faulty on-board firmware or corrupted memory. Please contact QuantAQ for next steps.</td></tr></tbody></table>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.quant-aq.com/hardware/modulair/modulair-x.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
