# Modbus Protocol

This device communicates using the Modbus RTU protocol over the RS-485 standard.

## Device Address

This device's preconfigured user-definable address is **0x15**. Users can change the address using the holding registers.

## Modbus Function Codes

The following Modbus function codes are functional with this device.

<table><thead><tr><th width="196">Command Register</th><th width="142">Function</th><th width="311">Description</th><th>Bytes</th><th data-hidden>Function</th><th data-hidden data-type="number">Length (Bytes)</th><th data-hidden>Description</th></tr></thead><tbody><tr><td>0x03</td><td>Read holding registers</td><td>Returns configuration parameters</td><td>2</td><td>Read holding registers</td><td>2</td><td>Stores last read measurements</td></tr><tr><td>0x04</td><td>Read input registers</td><td>Returns measured readings and statistics</td><td>2</td><td>Read input register</td><td>null</td><td></td></tr><tr><td>0x06</td><td>Write single register</td><td>Writes a single configuration parameter</td><td>2</td><td>Write single keep register</td><td>null</td><td></td></tr><tr><td>0x10</td><td>Write multiple registers</td><td>Writes multiple configuration parameters</td><td>2 x N</td><td>Write multiple keep register</td><td>null</td><td></td></tr></tbody></table>

## Device Registers

The following registers are available with this device.

<table><thead><tr><th width="237">Register Type</th><th width="165">Register Address</th><th width="238">Description</th><th data-type="number">Bytes</th></tr></thead><tbody><tr><td>Input Register (R)</td><td>0x0001</td><td>Air Quality Index (Actual)</td><td>2</td></tr><tr><td>Input Register (R)</td><td>0x0002</td><td>Air Quality Index (Average)</td><td>2</td></tr><tr><td>Input Register (R)</td><td>0x0003</td><td>Air Quality Index (Min)</td><td>2</td></tr><tr><td>Input Register (R)</td><td>0x0004</td><td>Air Quality Index (Max)</td><td>2</td></tr><tr><td>Input Register (R)</td><td>0x0005</td><td>Air Quality Index (Std. Dev.)</td><td>2</td></tr><tr><td>Input Register (R)</td><td>0x0006</td><td>VOC Index (Actual)</td><td>2</td></tr><tr><td>Input Register (R)</td><td>0x0007</td><td>VOC Index (Average)</td><td>2</td></tr><tr><td>Input Register (R)</td><td>0x0008</td><td>VOC Index (Min)</td><td>2</td></tr><tr><td>Input Register (R)</td><td>0x0009</td><td>VOC Index (Max)</td><td>2</td></tr><tr><td>Input Register (R)</td><td>0x000A</td><td>VOC Index (Std. Dev.)</td><td>2</td></tr><tr><td>Input Register (R)</td><td>0x000B</td><td>NOx Index (Actual)</td><td>2</td></tr><tr><td>Input Register (R)</td><td>0x000C</td><td>NOx Index (Average)</td><td>2</td></tr><tr><td>Input Register (R)</td><td>0x000D</td><td>NOx Index (Min)</td><td>2</td></tr><tr><td>Input Register (R)</td><td>0x000E</td><td>NOx Index (Max)</td><td>2</td></tr><tr><td>Input Register (R)</td><td>0x000F</td><td>NOx Index (Std. Dev.)</td><td>2</td></tr><tr><td>Input Register (R)</td><td>0x0010</td><td>PM 1.0 (Actual)</td><td>2</td></tr><tr><td>Input Register (R)</td><td>0x0011</td><td>PM 1.0 (Average)</td><td>2</td></tr><tr><td>Input Register (R)</td><td>0x0012</td><td>PM 1.0 (Min)</td><td>2</td></tr><tr><td>Input Register (R)</td><td>0x0013</td><td>PM 1.0 (Max)</td><td>2</td></tr><tr><td>Input Register (R)</td><td>0x0014</td><td>PM 1.0 (Std. Dev.)</td><td>2</td></tr><tr><td>Input Register (R)</td><td>0x0015</td><td>PM 2.5 (Actual)</td><td>2</td></tr><tr><td>Input Register (R)</td><td>0x0016</td><td>PM 2.5 (Average)</td><td>2</td></tr><tr><td>Input Register (R)</td><td>0x0017</td><td>PM 2.5 (Min)</td><td>2</td></tr><tr><td>Input Register (R)</td><td>0x0018</td><td>PM 2.5 (Max)</td><td>2</td></tr><tr><td>Input Register (R)</td><td>0x0019</td><td>PM 2.5 (Std. Dev.)</td><td>2</td></tr><tr><td>Input Register (R)</td><td>0x001A</td><td>PM 4.0 (Actual)</td><td>2</td></tr><tr><td>Input Register (R)</td><td>0x001B</td><td>PM 4.0 (Average)</td><td>2</td></tr><tr><td>Input Register (R)</td><td>0x001C</td><td>PM 4.0 (Min)</td><td>2</td></tr><tr><td>Input Register (R)</td><td>0x001D</td><td>PM 4.0 (Max)</td><td>2</td></tr><tr><td>Input Register (R)</td><td>0x001E</td><td>PM 4.0 (Std. Dev.)</td><td>2</td></tr><tr><td>Input Register (R)</td><td>0x001F</td><td>PM 10 (Actual)</td><td>2</td></tr><tr><td>Input Register (R)</td><td>0x0020</td><td>PM 10 (Average)</td><td>2</td></tr><tr><td>Input Register (R)</td><td>0x0021</td><td>PM 10 (Min)</td><td>2</td></tr><tr><td>Input Register (R)</td><td>0x0022</td><td>PM 10 (Max)</td><td>2</td></tr><tr><td>Input Register (R)</td><td>0x0023</td><td>PM 10 (Std. Dev.)</td><td>2</td></tr><tr><td>Input Register (R)</td><td>0x0024</td><td>CO2 (Actual)</td><td>2</td></tr><tr><td>Input Register (R)</td><td>0x0025</td><td>CO2 (Average)</td><td>2</td></tr><tr><td>Input Register (R)</td><td>0x0026</td><td>CO2 (Min)</td><td>2</td></tr><tr><td>Input Register (R)</td><td>0x0027</td><td>CO2 (Max)</td><td>2</td></tr><tr><td>Input Register (R)</td><td>0x0028</td><td>CO2 (Std. Dev.)</td><td>2</td></tr><tr><td>Input Register (R)</td><td>0x0029</td><td>Device Pitch (Actual)</td><td>2</td></tr><tr><td>Input Register (R)</td><td>0x002A</td><td>Device Roll (Actual)</td><td>2</td></tr><tr><td>Input Register (R)</td><td>0x002B</td><td>Device Temperature</td><td>2</td></tr><tr><td>Holding Register (R/W)</td><td>0x0101</td><td>Device Address</td><td>2</td></tr><tr><td>Holding Register (R/W)</td><td>0x0102</td><td>Baud Rate</td><td>2</td></tr><tr><td>Holding Register (R/W)</td><td>0x0103</td><td>Statistics Period (Secs)</td><td>2</td></tr><tr><td>Holding Register (R/W)</td><td>0x0104</td><td>IMU Correction (Pitch)</td><td>2</td></tr><tr><td>Holding Register (R/W)</td><td>0x0105</td><td>IMU Correction (Roll)</td><td>2</td></tr></tbody></table>

## Communication Syntax

### Reading sensor data

The host device can read one or more sensor data by calling the starting register address.

**Request from the host:** Device address \[1 Byte] + Function code (0x04) \[1 Byte] + Input register start address \[2 Bytes MSB first] + Requested register length \[2 Bytes MSB first] + CRC \[2 Bytes MSB first]

**Response from the device:** Device address \[1 Byte] + Function code (0x04) \[1 Byte] + Response register length in Bytes \[1 Byte] + Register 1 \[2 Bytes MSB first] + Register N \[2 Bytes MSB first] + CRC \[2 Bytes MSB first]

### Reading configuration register

The host device can read one or more configuration registers by calling the starting register address.

**Request from the host:** Device address \[1 Byte] + Function code (0x03) \[1 Byte] + Holding register start address \[2 Bytes MSB first] + Requested register length \[2 Bytes MSB first] + CRC \[2 Bytes MSB first]

**Response from the device:** Device address \[1 Byte] + Function code (0x03) \[1 Byte] + Response register length in Bytes \[1 Byte], Register 1 \[2 Bytes MSB first] + Register N \[2 Bytes MSB first] + CRC \[2 Bytes MSB first]

### Writing single configuration register

The host device can write one configuration register.

**Command from the host:** Device address \[1 Byte] + Function code (0x06) \[1 Byte] + Holding register address \[2 Bytes MSB first] + Value to be set \[2 Bytes MSB first] + CRC \[2 Bytes MSB first]

**Response from the device:** Device address \[1 Byte] + Function code (0x06) \[1 Byte] + Holding register address \[1 Byte] + Value set \[2 Bytes MSB first] + CRC \[2 Bytes MSB first]

### Writing multiple configuration registers

The host device can write multiple configuration registers.

**Command from the host:** Device address \[1 Byte] + Function code (0x10) \[1 Byte] + Holding register start address \[2 Bytes MSB first] + Requested register length \[2 Bytes] + Configuration values length in Bytes \[1 Byte] + Value to be set 1 \[2 Bytes MSB first] + Value to be set N \[2 Bytes MSB first] + CRC \[2 Bytes MSB first]

**Response from the device:** Device address \[1 Byte] + Function code (0x10) \[1 Byte] + Holding register start address \[1 Byte], Value set \[2 Bytes MSB first], CRC \[2 Bytes MSB first]


---

# 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.evolion.io/hw/environmental-monitoring/air-quality-sensor/modbus-protocol.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.
