# Custom Implementation

Message formats, symbols, and integration flows for advanced Soracom LTE-M Button integration.

In most cases, the platform integration provided by Soracom allows you to focus on building your application without worrying about how to implement hardware or firmware functionality, or how to decode/encode messages coming from or going to the Soracom LTE-M Button.

However, in some cases, you may prefer to process the messages on your own, such as to build your own interface for configuring and managing buttons, or inspecting packets for troubleshooting.

Below are the technical specifications for how binary data coming from or going to the Soracom LTE-M Button is implemented.

## Implementation Overview

The Soracom LTE-M Button is programmed to send messages in a UDP packet using a custom binary data format, allowing it to consume significantly less data compared to other common data formats or protocols and to minimize battery usage. The platform integration provided by Soracom takes care of decoding the binary data from (and encoding binary data responses to) the button into an easier-to-use JSON format.

The Soracom LTE-M Button leverages multiple Soracom services in order to provide full platform integration. Messages sent by the button are processed as follows:

![High level diagram of Soracom LTE-M Button integration](https://docs.soracom.io/_astro/01-implementation.BGC4Iprh_1ic1yx.webp)

1. The button sends a binary message to [Unified Endpoint](https://docs.soracom.io/en/services/unified-endpoint).

2. The binary message is decoded by [Binary Parser](https://docs.soracom.io/en/services/binary-parser) into JSON using the symbol and message format specifications below.

3. The decoded message is processed by [Soracom Orbit](https://docs.soracom.io/en/services/orbit) in order to update the [SIM tags](https://docs.soracom.io/en/services/air/tags) that correspond to the button, allowing you to check button details such as **operation mode** and **battery voltage** from the User Console.

4. The JSON data is then sent to any Soracom platform services you have enabled for handling the data, such as [Soracom Beam](https://docs.soracom.io/en/services/beam) or [Soracom Funk](https://docs.soracom.io/en/services/funk) for forwarding the message to an external server or cloud function, or [Soracom Harvest Data](https://docs.soracom.io/en/services/harvest) to store the message in Soracom.

5. Finally, if the message sent was a **Status message**, Soracom Orbit will also check if the button's current configuration matches the configuration you specified. If any changes are required, Soracom Orbit will construct a **Set Configuration message** using the symbol and message format specification below and send the binary message back to the button to apply the necessary configuration. Otherwise Soracom Orbit simply sends a **Server ACK message**.

### Service Integration

By default, all of the services above (except for Soracom Beam, Soracom Funk, or Soracom Harvest Data) are automatically configured when you create a Soracom LTE-M Button group and should provide enough flexibility for most applications.

However, if you want to build your own system for processing button messages, you may need to manually configure the Binary Parser, Soracom Orbit, and Unified Endpoint settings, or reimplement their functionality using the symbol and message format specifications below, depending on your application requirements. The following table summarizes each of the necessary service configurations:

| <br>Service | <br>Configuration | <br>Function | <br>Can be manually implemented? |
| - | - | - | - |
| [Binary Parser](https://docs.soracom.io/en/services/binary-parser) | - **Format** - `@soracom.button` | Converts uplink messages from binary to JSON | Yes |
| [Soracom Orbit](https://docs.soracom.io/en/services/orbit) | - **[Code SRN](https://docs.soracom.io/en/developers/soracom-resource-name)** - `srn:soracom:OP0052363844:g:Soralet:soracom-lte-m-button-configuration/$LATEST`\*1<br>- **Content Type** - `application/json`<br>- **Direction** - Downlink<br>- **Use metadata** - Enabled | Updates SIM tags and constructs binary messages to send back to the button | Yes\*2, \*3 |
| [Unified Endpoint](https://docs.soracom.io/en/services/unified-endpoint) | - **Format** - Custom<br>- **Custom response on success**<br>- **Status Code** - `200`<br>- **Content Type** - `application/octet-stream`<br>- **Skip status code** - Enabled<br>- **Custom response on failure**<br>- **Status Code** - `400`<br>- **Content Type** - `application/octet-stream`<br>- **Skip status code** - Enabled | Allows sending downlink messages to the button in binary | No\*4 |

1. This Soracom Orbit Soralet specified by this **[Code SRN](https://docs.soracom.io/en/developers/soracom-resource-name)** is officially developed and maintained by Soracom.
2. You can use the Soracom API to update SIM tags without using Soracom Orbit.
3. You can construct binary messages to send back to your button without using Soracom Orbit. However, if you want to use Soracom Orbit, you must also enable and configure [Metadata Service](https://docs.soracom.io/en/services/air/metadata-service#configuration) User data.
4. Configuring Unified Endpoint is not required but may prevent **Set Configuration messages** from being delivered correctly.

### Uplink and Downlink Message Flow

When a button sends an uplink message, it expects a response from the server in order to confirm that the uplink message was successfully received. The server should respond with the **Server ACK message**. If the server does not respond, the button will assume that the uplink message was not received and attempt to send the message again.

![Diagram of message flow](https://docs.soracom.io/_astro/02-message-flow.B5MKoEQF_1o1UFC.webp)

When modifying a button's configuration, the server should first wait for an uplink **Status message** from the button. Once the server receives the message, it can respond with a **Set Configuration message** containing the configuration options to apply. The button will send an **OOB message** to indicate that it successfully received the **Set Configuration message** and applied the configuration.

![Diagram of configuration flow](https://docs.soracom.io/_astro/03-configuration-flow.CmVKBaQM_Zg18iu.webp)

## Symbols

Symbols are the parameters or variables represented in the binary data sent from (uplink) or to (downlink) a button, and their possible values and unit conversions.

### Uplink Symbols

| Symbol | Length/Type | Values | Description | Decoded by Binary Parser |
| - | - | - | - | - |
| **prod\_type** | 3-bit fixed value | `001` - Soracom LTE-M Button | Indicates the product type. | Yes |
| **f\_ack** | 1-bit boolean | `0` - false `1` - true | Indicates if the server needs to send an ACK downlink message. | Yes |
| **msg\_type** | 4-bit enum | `0000` - Status message `0001` - Event message `0010` - Timer message `0011` - Heartbeat message `0101` - Alert message (firmware 3134 only) `0110` - Event with Temperature message `1111` - OOB message (others) - Reserved | Indicates the type of message sent by the button. | Yes |
| **seq\_number** | 16-bit unsigned integer | Range: 0–4,095 | Indicates the number of messages sent by the button, excluding retries. | Yes |
| **batt\_vol** | 8-bit unsigned integer | Range: 0–255 | Indicates the current battery voltage, in increments of 100mV. | Yes\*5 |
| **fw\_ver** | 16-bit hexadecimal | `0x2220` - Firmware version 2220 `0x3134` - Firmware version 3134 | Indicates the firmware version of the button. | Yes |
| **hw\_ver** | 16-bit hexadecimal | `0x0102` - Hardware version 102 | Indicates the hardware version of the button. | Yes |
| **curr\_oper** | 4-bit enum | `0001` - [Timer](https://docs.soracom.io/en/devices/soracom-lte-m-button/operation-modes/timer) `0010` - [Event](https://docs.soracom.io/en/devices/soracom-lte-m-button/operation-modes/event) `0011` - [Event + Timer](https://docs.soracom.io/en/devices/soracom-lte-m-button/operation-modes/event-and-timer) `0100` - [Event + Heartbeat](https://docs.soracom.io/en/devices/soracom-lte-m-button/operation-modes/event-and-heartbeat) `0101` - [Alert](https://docs.soracom.io/en/devices/soracom-lte-m-button/operation-modes/alert) (firmware 3134 only) `0110` - [Alert + Heartbeat](https://docs.soracom.io/en/devices/soracom-lte-m-button/operation-modes/alert-and-heartbeat) (firmware 3134 only) (others) - Reserved | Indicates the current operation mode of the button. | Yes |
| **curr\_sync** | 1-bit boolean | `0` - false `1` - true (firmware 3134 only) | Indicates if the button will automatically send a Status message once every 24 hours. | Yes |
| **curr\_debounce** | 1-bit boolean | `0` - false `1` - true | Indicates if the button will apply a debounce to reduce false external I/O detections. Applies only when the external I/O mode is configured as [Edge Detection](https://docs.soracom.io/en/devices/soracom-lte-m-button/io-modes/edge-detection) or [Pulse Detection](https://docs.soracom.io/en/devices/soracom-lte-m-button/io-modes/pulse-detection). | Yes |
| **curr\_ext\_io** | 2-bit enum | `00` - Disabled `01` - [Edge Detection](https://docs.soracom.io/en/devices/soracom-lte-m-button/io-modes/edge-detection) `10` - [Pulse Detection](https://docs.soracom.io/en/devices/soracom-lte-m-button/io-modes/pulse-detection) `11` - [Temperature Sensor](https://docs.soracom.io/en/devices/soracom-lte-m-button/io-modes/temperature-sensor) | Indicates the current external I/O mode. | Yes |
| **curr\_ul\_freq** or **applied\_freq** | 8-bit unsigned integer | Range: 1–144 `1` - 1 message per day (once every 24 hours) `2` - 2 messages per day (once every 12 hours) `3` - 3 messages per day (once every 8 hours) (etc) | Indicates the interval at which the button will automatically send a **Timer message** or **Heartbeat message**. | Yes |
| **curr\_nw\_standby** | 4-bit unsigned integer | Range: 0–15 (firmware 3134 only) `0` - Disconnect immediately `1` - Standby for 1 second `2` - Standby for 2 seconds `3` - Standby for 3 seconds (etc) | Indicates how long the button will stay connected to the network in order to send additional messages without reconnecting. Applies only when the operation mode is configured as [Alert](https://docs.soracom.io/en/devices/soracom-lte-m-button/operation-modes/alert) or [Alert + Heartbeat](https://docs.soracom.io/en/devices/soracom-lte-m-button/operation-modes/alert-and-heartbeat). | Yes |
| **detect\_type** | 8-bit enum | `00000001` - Single short click `00000010` - Double short click `00000100` - Single long click `11000000` - Rising edge `11000001` - Falling edge (others) - Reserved | Indicates the type of click detected from the built-in button, or from the external I/O when configured as [Edge Detection](https://docs.soracom.io/en/devices/soracom-lte-m-button/io-modes/edge-detection) or [Pulse Detection](https://docs.soracom.io/en/devices/soracom-lte-m-button/io-modes/pulse-detection). | Yes |
| **short\_summary\__#_** | 8-bit unsigned integer | Range: 0–255 | Indicates how many short clicks were detected from the built-in button, or from the external I/O when configured as [Pulse Detection](https://docs.soracom.io/en/devices/soracom-lte-m-button/io-modes/pulse-detection). | Yes |
| **long\_summary\__#_** | 8-bit unsigned integer | Range: 0–255 | Indicates how many long clicks were detected from the built-in button, or from the external I/O when configured as [Pulse Detection](https://docs.soracom.io/en/devices/soracom-lte-m-button/io-modes/pulse-detection). | Yes |
| **double\_summary\__#_** | 8-bit unsigned integer | Range: 0–255 | Indicates how many double clicks were detected from the built-in button, or from the external I/O when configured as [Pulse Detection](https://docs.soracom.io/en/devices/soracom-lte-m-button/io-modes/pulse-detection). | Yes |
| **edge\_summary\__#_** | 8-bit unsigned integer | Range: 0–255 | Indicates how many rising or falling edge events were detected from the external I/O when configured as [Edge Detection](https://docs.soracom.io/en/devices/soracom-lte-m-button/io-modes/edge-detection). | Yes |
| **temp\_summary\__#_** | 16-bit signed integer | Range: -32,768–32,767 | Indicates the temperature measured from an attached [Temperature Sensor](https://docs.soracom.io/en/devices/soracom-lte-m-button/io-modes/temperature-sensor), in increments of 0.01 degrees (°C). | Yes\*6 |
| **temp\_cur** | 16-bit signed integer | Range: -32,768–32,767 | Indicates the temperature measured from an attached [Temperature Sensor](https://docs.soracom.io/en/devices/soracom-lte-m-button/io-modes/temperature-sensor), in increments of 0.01 degrees (°C). | Yes\*6 |
| **crc** | 8-bit checksum | CRC-8 checksum | Used to detect if any data was accidentally changed during transmission. | Yes\*7 |

1. Binary Parser will automatically convert the integer value to units of mV.
2. Binary Parser will automatically convert the integer value units of degrees (°C).
3. Instead of simply decoding the CRC-8 checksum, Binary Parser will verify the checksum and return true or false if the checksum matches.

### Downlink Symbols

| Symbol | Length/Type | Values | Description | Decoded by Binary Parser |
| - | - | - | - | - |
| **res\_type** | 4-bit enum | `1010` - Server ACK message `1110` - Set Configuration message (others) - Reserved | Indicates the type of response sent by the server. | |
| **flow\_ctrl** | 8-bit fixed value | `00000001` - Enabled (others) - Reserved | Configures the button to reply with an OOB message. | |
| **conf\_oper** | 4-bit enum | `0001` - [Timer](https://docs.soracom.io/en/devices/soracom-lte-m-button/operation-modes/timer) `0010` - [Event](https://docs.soracom.io/en/devices/soracom-lte-m-button/operation-modes/event) `0011` - [Event + Timer](https://docs.soracom.io/en/devices/soracom-lte-m-button/operation-modes/event-and-timer) `0100` - [Event + Heartbeat](https://docs.soracom.io/en/devices/soracom-lte-m-button/operation-modes/event-and-heartbeat) `0101` - [Alert](https://docs.soracom.io/en/devices/soracom-lte-m-button/operation-modes/alert) (firmware 3134 only) `0110` - [Alert + Heartbeat](https://docs.soracom.io/en/devices/soracom-lte-m-button/operation-modes/alert-and-heartbeat) (firmware 3134 only) (others) - Reserved | Configures the current operation mode of the button. | |
| **conf\_sync** | 1-bit boolean | `0` - false `1` - true (firmware 3134 only) | Configures the button to automatically send a Status message once every 24 hours. | |
| **conf\_debounce** | 1-bit boolean | `0` - false `1` - true | Configures the button to apply a debounce to reduce false external I/O detections. Applies only when the external I/O mode is configured as [Edge Detection](https://docs.soracom.io/en/devices/soracom-lte-m-button/io-modes/edge-detection) or [Pulse Detection](https://docs.soracom.io/en/devices/soracom-lte-m-button/io-modes/pulse-detection). | |
| **conf\_ext\_io** | 2-bit enum | `00` - Disabled `01` - [Edge Detection](https://docs.soracom.io/en/devices/soracom-lte-m-button/io-modes/edge-detection) `10` - [Pulse Detection](https://docs.soracom.io/en/devices/soracom-lte-m-button/io-modes/pulse-detection) `11` - [Temperature Sensor](https://docs.soracom.io/en/devices/soracom-lte-m-button/io-modes/temperature-sensor) | Configures the external I/O mode. | |
| **conf\_ul\_freq** | 8-bit unsigned integer | Range: 1–144 `1` - 1 message per day (once every 24 hours) `2` - 2 messages per day (once every 12 hours) `3` - 3 messages per day (once every 8 hours) (etc) | Configures the interval at which the button will automatically send a **Timer message** or **Heartbeat message**. | |
| **conf\_nw\_standby** | 4-bit unsigned integer | Range: 0–15 (firmware 3134 only) `0` - Disconnect immediately `1` - Standby for 1 second `2` - Standby for 2 seconds `3` - Standby for 3 seconds (etc) | Configures how long the button will stay connected to the network in order to send additional messages without reconnecting. Applies only when the operation mode is configured as [Alert](https://docs.soracom.io/en/devices/soracom-lte-m-button/operation-modes/alert) or [Alert + Heartbeat](https://docs.soracom.io/en/devices/soracom-lte-m-button/operation-modes/alert-and-heartbeat). | |
| **crc** | 8-bit checksum | CRC-8 checksum | Used to detect if any data was accidentally changed during transmission. | |

### Checksum Algorithm

Each uplink and downlink message includes a CRC-8 checksum (SMBus), which the server and button can use to verify the message contents. The checksum value is calculated from the first byte to (N-1)th bytes.

- Initial = `0x00`
- Polynomial = `0x07` (x8 + x2 + x + 1)

```c
uint8_t crc_checksum(uint8_t *data, uint32_t len) {
    uint8_t crc = 0x00; uint8_t MSB;
    uint8_t *buf = (uint8_t*) data; int i, j;

    for (i = 0; i < len; i++) {
        crc ^= buf[i];
        for (j = 0; j < 8; j++) {
            MSB = crc & 0x80;
            crc = crc << 1;
            if (MSB) crc ^= 0x07;
        }
    }

    return (crc);
}
```

## Firmware 3134 Message Formats

Message formats describe the structure of each type of message sent from or to the button.

### Uplink Messages

**Status**

The **Status message** reports the current configuration of the button.

- Message is sent when:

  - the button is powered on for the first time
  - the batteries are replaced after power was depleted
  - pressing and holding the built-in button for 10 seconds
  - the external I/O mode is configured as [Pulse Detection](https://docs.soracom.io/en/devices/soracom-lte-m-button/io-modes/pulse-detection) and the external I/O is triggered for 10 seconds

- Message length: 14 bytes

- Example: `30 00 00 21 01 02 01 01 11 60 00 00 00 66`

| Byte | Bits | Bits | Bits | Bits | Bits | Bits | Bits | Bits |
| - | - | - | - | - | - | - | - | - |
| Byte | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 1 | **prod\_type** Fixed value `001` | **prod\_type** Fixed value `001` | **prod\_type** Fixed value `001` | **f\_ack** Fixed value `1` | **msg\_type** Fixed value `0000` | **msg\_type** Fixed value `0000` | **msg\_type** Fixed value `0000` | **msg\_type** Fixed value `0000` |
| 2 | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) |
| 3 | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) |
| 4 | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) |
| 5 | **fw\_ver** 16-bit hexadecimal (format: `0x0000`) | **fw\_ver** 16-bit hexadecimal (format: `0x0000`) | **fw\_ver** 16-bit hexadecimal (format: `0x0000`) | **fw\_ver** 16-bit hexadecimal (format: `0x0000`) | **fw\_ver** 16-bit hexadecimal (format: `0x0000`) | **fw\_ver** 16-bit hexadecimal (format: `0x0000`) | **fw\_ver** 16-bit hexadecimal (format: `0x0000`) | **fw\_ver** 16-bit hexadecimal (format: `0x0000`) |
| 6 | **fw\_ver** 16-bit hexadecimal (format: `0x0000`) | **fw\_ver** 16-bit hexadecimal (format: `0x0000`) | **fw\_ver** 16-bit hexadecimal (format: `0x0000`) | **fw\_ver** 16-bit hexadecimal (format: `0x0000`) | **fw\_ver** 16-bit hexadecimal (format: `0x0000`) | **fw\_ver** 16-bit hexadecimal (format: `0x0000`) | **fw\_ver** 16-bit hexadecimal (format: `0x0000`) | **fw\_ver** 16-bit hexadecimal (format: `0x0000`) |
| 7 | **hw\_ver** 16-bit hexadecimal (format: `0x0000`) | **hw\_ver** 16-bit hexadecimal (format: `0x0000`) | **hw\_ver** 16-bit hexadecimal (format: `0x0000`) | **hw\_ver** 16-bit hexadecimal (format: `0x0000`) | **hw\_ver** 16-bit hexadecimal (format: `0x0000`) | **hw\_ver** 16-bit hexadecimal (format: `0x0000`) | **hw\_ver** 16-bit hexadecimal (format: `0x0000`) | **hw\_ver** 16-bit hexadecimal (format: `0x0000`) |
| 8 | **hw\_ver** 16-bit hexadecimal (format: `0x0000`) | **hw\_ver** 16-bit hexadecimal (format: `0x0000`) | **hw\_ver** 16-bit hexadecimal (format: `0x0000`) | **hw\_ver** 16-bit hexadecimal (format: `0x0000`) | **hw\_ver** 16-bit hexadecimal (format: `0x0000`) | **hw\_ver** 16-bit hexadecimal (format: `0x0000`) | **hw\_ver** 16-bit hexadecimal (format: `0x0000`) | **hw\_ver** 16-bit hexadecimal (format: `0x0000`) |
| 9 | **curr\_oper** 4-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **curr\_oper** 4-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **curr\_oper** 4-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **curr\_oper** 4-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **curr\_sync** Boolean | **curr\_debounce** Boolean | **curr\_ext\_io** 2-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **curr\_ext\_io** 2-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) |
| 10 | **curr\_ul\_freq** 8-bit unsigned integer (range: 1–144; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **curr\_ul\_freq** 8-bit unsigned integer (range: 1–144; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **curr\_ul\_freq** 8-bit unsigned integer (range: 1–144; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **curr\_ul\_freq** 8-bit unsigned integer (range: 1–144; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **curr\_ul\_freq** 8-bit unsigned integer (range: 1–144; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **curr\_ul\_freq** 8-bit unsigned integer (range: 1–144; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **curr\_ul\_freq** 8-bit unsigned integer (range: 1–144; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **curr\_ul\_freq** 8-bit unsigned integer (range: 1–144; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) |
| 11 | **curr\_nw\_standby** 4-bit unsigned integer (range: 0–15; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **curr\_nw\_standby** 4-bit unsigned integer (range: 0–15; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **curr\_nw\_standby** 4-bit unsigned integer (range: 0–15; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **curr\_nw\_standby** 4-bit unsigned integer (range: 0–15; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | (reserved) | (reserved) | (reserved) | (reserved) |
| 12 | (reserved) | (reserved) | (reserved) | (reserved) | (reserved) | (reserved) | (reserved) | (reserved) |
| 13 | (reserved) | (reserved) | (reserved) | (reserved) | (reserved) | (reserved) | (reserved) | (reserved) |
| 14 | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum |

**Event**

The **Event message** reports a button click or external I/O detection event.

- Message is sent when:

  - the operation mode is configured as [Event](https://docs.soracom.io/en/devices/soracom-lte-m-button/operation-modes/event), [Event + Timer](https://docs.soracom.io/en/devices/soracom-lte-m-button/operation-modes/event-and-timer), or [Event + Heartbeat](https://docs.soracom.io/en/devices/soracom-lte-m-button/operation-modes/event-and-heartbeat); the external I/O mode is configured as [Edge Detection](https://docs.soracom.io/en/devices/soracom-lte-m-button/io-modes/edge-detection), [Pulse Detection](https://docs.soracom.io/en/devices/soracom-lte-m-button/io-modes/pulse-detection), or Disabled; and the built-in button is clicked
  - the operation mode is configured as [Event](https://docs.soracom.io/en/devices/soracom-lte-m-button/operation-modes/event), [Event + Timer](https://docs.soracom.io/en/devices/soracom-lte-m-button/operation-modes/event-and-timer), or [Event + Heartbeat](https://docs.soracom.io/en/devices/soracom-lte-m-button/operation-modes/event-and-heartbeat); the external I/O mode is configured as [Edge Detection](https://docs.soracom.io/en/devices/soracom-lte-m-button/io-modes/edge-detection) or [Pulse Detection](https://docs.soracom.io/en/devices/soracom-lte-m-button/io-modes/pulse-detection); and the external I/O is triggered

- Message length: 6 bytes

- Example: `31 00 0c 1c 02 6b`

| Byte | Bits | Bits | Bits | Bits | Bits | Bits | Bits | Bits |
| - | - | - | - | - | - | - | - | - |
| Byte | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 1 | **prod\_type** Fixed value `001` | **prod\_type** Fixed value `001` | **prod\_type** Fixed value `001` | **f\_ack** Fixed value `1` | **msg\_type** Fixed value `0001` | **msg\_type** Fixed value `0001` | **msg\_type** Fixed value `0001` | **msg\_type** Fixed value `0001` |
| 2 | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) |
| 3 | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) |
| 4 | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) |
| 5 | **detect\_type** 8-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **detect\_type** 8-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **detect\_type** 8-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **detect\_type** 8-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **detect\_type** 8-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **detect\_type** 8-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **detect\_type** 8-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **detect\_type** 8-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) |
| 6 | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum |

**Event with Temperature**

The **Event with Temperature message** reports a button click as well as the current temperature measured from an attached [Temperature Sensor](https://docs.soracom.io/en/devices/soracom-lte-m-button/io-modes/temperature-sensor).

- Message is sent when:
  - the operation mode is configured as [Event](https://docs.soracom.io/en/devices/soracom-lte-m-button/operation-modes/event), [Event + Timer](https://docs.soracom.io/en/devices/soracom-lte-m-button/operation-modes/event-and-timer), or [Event + Heartbeat](https://docs.soracom.io/en/devices/soracom-lte-m-button/operation-modes/event-and-heartbeat); the external I/O mode is configured as [Temperature Sensor](https://docs.soracom.io/en/devices/soracom-lte-m-button/io-modes/temperature-sensor); and the built-in button is clicked
- Message length: 8 bytes
- Example: `36 00 0d 1c 02 0a be a2`

| Byte | Bits | Bits | Bits | Bits | Bits | Bits | Bits | Bits |
| - | - | - | - | - | - | - | - | - |
| Byte | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 1 | **prod\_type** Fixed value `001` | **prod\_type** Fixed value `001` | **prod\_type** Fixed value `001` | **f\_ack** Fixed value `1` | **msg\_type** Fixed value `0110` | **msg\_type** Fixed value `0110` | **msg\_type** Fixed value `0110` | **msg\_type** Fixed value `0110` |
| 2 | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) |
| 3 | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) |
| 4 | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) |
| 5 | **detect\_type** 8-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **detect\_type** 8-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **detect\_type** 8-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **detect\_type** 8-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **detect\_type** 8-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **detect\_type** 8-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **detect\_type** 8-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **detect\_type** 8-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) |
| 6 | **temp\_cur** 16-bit signed integer (range: -32,768–32,767; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **temp\_cur** 16-bit signed integer (range: -32,768–32,767; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **temp\_cur** 16-bit signed integer (range: -32,768–32,767; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **temp\_cur** 16-bit signed integer (range: -32,768–32,767; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **temp\_cur** 16-bit signed integer (range: -32,768–32,767; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **temp\_cur** 16-bit signed integer (range: -32,768–32,767; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **temp\_cur** 16-bit signed integer (range: -32,768–32,767; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **temp\_cur** 16-bit signed integer (range: -32,768–32,767; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) |
| 7 | **temp\_cur** 16-bit signed integer (range: -32,768–32,767; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **temp\_cur** 16-bit signed integer (range: -32,768–32,767; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **temp\_cur** 16-bit signed integer (range: -32,768–32,767; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **temp\_cur** 16-bit signed integer (range: -32,768–32,767; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **temp\_cur** 16-bit signed integer (range: -32,768–32,767; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **temp\_cur** 16-bit signed integer (range: -32,768–32,767; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **temp\_cur** 16-bit signed integer (range: -32,768–32,767; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **temp\_cur** 16-bit signed integer (range: -32,768–32,767; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) |
| 8 | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum |

**Timer**

The **Timer message** reports the number of clicks, the number of edge detections counted (when the external I/O mode is configured as [Edge Detection](https://docs.soracom.io/en/devices/soracom-lte-m-button/io-modes/edge-detection)), and the temperature measured (when the external I/O mode is configured as [Temperature Sensor](https://docs.soracom.io/en/devices/soracom-lte-m-button/io-modes/temperature-sensor)) during a certain interval.

- Message is sent automatically when:
  - the operation mode is configured as [Timer](https://docs.soracom.io/en/devices/soracom-lte-m-button/operation-modes/timer) or [Event + Timer](https://docs.soracom.io/en/devices/soracom-lte-m-button/operation-modes/event-and-timer) at an interval configured by the **Uplink frequency** setting (**conf\_ul\_freq**) in the Set Configuration message

- Message length: 36 bytes

- Example: `32 00 8d 1c 60 00 00 01 00 00 00 01 00 00 00 00 00 01 00 00 00 00 00 00 00 08 f0 08 e9 08 f0 08 e9 08 f6 74`

- Notes:

  - The clicks, edge detections, and temperature measurements are subdivided into 5 summaries, each with a duration equal to 86400 / (5 x **applied\_freq**) seconds.
  - Each of the **short\_summary\__#_**, **long\_summary\__#_**, and **double\_summary\__#_** indicate the number of short, long, and double clicks detected within each summary period, respectively.
  - The **edge\_summary\__#_** values indicate the number of rising and falling edge detection events within each summary period, and are valid only when the external I/O mode is configured as [Edge Detection](https://docs.soracom.io/en/devices/soracom-lte-m-button/io-modes/edge-detection).
  - The **temp\_summary\__#_** values indicate the temperature measured at the end of each summary period, are valid only when the external I/O mode is configured as [Temperature Sensor](https://docs.soracom.io/en/devices/soracom-lte-m-button/io-modes/temperature-sensor).

| Byte | Bits | Bits | Bits | Bits | Bits | Bits | Bits | Bits |
| - | - | - | - | - | - | - | - | - |
| Byte | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 1 | **prod\_type** Fixed value `001` | **prod\_type** Fixed value `001` | **prod\_type** Fixed value `001` | **f\_ack** Fixed value `1` | **msg\_type** Fixed value `0010` | **msg\_type** Fixed value `0010` | **msg\_type** Fixed value `0010` | **msg\_type** Fixed value `0010` |
| 2 | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) |
| 3 | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) |
| 4 | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) |
| 5 | **applied\_freq** 8-bit unsigned integer (range: 1–144; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **applied\_freq** 8-bit unsigned integer (range: 1–144; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **applied\_freq** 8-bit unsigned integer (range: 1–144; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **applied\_freq** 8-bit unsigned integer (range: 1–144; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **applied\_freq** 8-bit unsigned integer (range: 1–144; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **applied\_freq** 8-bit unsigned integer (range: 1–144; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **applied\_freq** 8-bit unsigned integer (range: 1–144; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **applied\_freq** 8-bit unsigned integer (range: 1–144; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) |
| 6 \| 10 | **short\_summary\_1**, **short\_summary\_2**, **short\_summary\_3**, **short\_summary\_4**, **short\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) | **short\_summary\_1**, **short\_summary\_2**, **short\_summary\_3**, **short\_summary\_4**, **short\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) | **short\_summary\_1**, **short\_summary\_2**, **short\_summary\_3**, **short\_summary\_4**, **short\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) | **short\_summary\_1**, **short\_summary\_2**, **short\_summary\_3**, **short\_summary\_4**, **short\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) | **short\_summary\_1**, **short\_summary\_2**, **short\_summary\_3**, **short\_summary\_4**, **short\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) | **short\_summary\_1**, **short\_summary\_2**, **short\_summary\_3**, **short\_summary\_4**, **short\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) | **short\_summary\_1**, **short\_summary\_2**, **short\_summary\_3**, **short\_summary\_4**, **short\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) | **short\_summary\_1**, **short\_summary\_2**, **short\_summary\_3**, **short\_summary\_4**, **short\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) |
| 11 \| 15 | **long\_summary\_1**, **long\_summary\_2**, **long\_summary\_3**, **long\_summary\_4**, **long\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) | **long\_summary\_1**, **long\_summary\_2**, **long\_summary\_3**, **long\_summary\_4**, **long\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) | **long\_summary\_1**, **long\_summary\_2**, **long\_summary\_3**, **long\_summary\_4**, **long\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) | **long\_summary\_1**, **long\_summary\_2**, **long\_summary\_3**, **long\_summary\_4**, **long\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) | **long\_summary\_1**, **long\_summary\_2**, **long\_summary\_3**, **long\_summary\_4**, **long\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) | **long\_summary\_1**, **long\_summary\_2**, **long\_summary\_3**, **long\_summary\_4**, **long\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) | **long\_summary\_1**, **long\_summary\_2**, **long\_summary\_3**, **long\_summary\_4**, **long\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) | **long\_summary\_1**, **long\_summary\_2**, **long\_summary\_3**, **long\_summary\_4**, **long\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) |
| 16 \| 20 | **double\_summary\_1**, **double\_summary\_2**, **double\_summary\_3**, **double\_summary\_4**, **double\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) | **double\_summary\_1**, **double\_summary\_2**, **double\_summary\_3**, **double\_summary\_4**, **double\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) | **double\_summary\_1**, **double\_summary\_2**, **double\_summary\_3**, **double\_summary\_4**, **double\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) | **double\_summary\_1**, **double\_summary\_2**, **double\_summary\_3**, **double\_summary\_4**, **double\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) | **double\_summary\_1**, **double\_summary\_2**, **double\_summary\_3**, **double\_summary\_4**, **double\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) | **double\_summary\_1**, **double\_summary\_2**, **double\_summary\_3**, **double\_summary\_4**, **double\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) | **double\_summary\_1**, **double\_summary\_2**, **double\_summary\_3**, **double\_summary\_4**, **double\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) | **double\_summary\_1**, **double\_summary\_2**, **double\_summary\_3**, **double\_summary\_4**, **double\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) |
| 21 \| 25 | **edge\_summary\_1**, **edge\_summary\_2**, **edge\_summary\_3**, **edge\_summary\_4**, **edge\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) | **edge\_summary\_1**, **edge\_summary\_2**, **edge\_summary\_3**, **edge\_summary\_4**, **edge\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) | **edge\_summary\_1**, **edge\_summary\_2**, **edge\_summary\_3**, **edge\_summary\_4**, **edge\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) | **edge\_summary\_1**, **edge\_summary\_2**, **edge\_summary\_3**, **edge\_summary\_4**, **edge\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) | **edge\_summary\_1**, **edge\_summary\_2**, **edge\_summary\_3**, **edge\_summary\_4**, **edge\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) | **edge\_summary\_1**, **edge\_summary\_2**, **edge\_summary\_3**, **edge\_summary\_4**, **edge\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) | **edge\_summary\_1**, **edge\_summary\_2**, **edge\_summary\_3**, **edge\_summary\_4**, **edge\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) | **edge\_summary\_1**, **edge\_summary\_2**, **edge\_summary\_3**, **edge\_summary\_4**, **edge\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) |
| 26 \| 35 | **temp\_summary\_1**, **temp\_summary\_2**, **temp\_summary\_3**, **temp\_summary\_4**, **temp\_summary\_5** (5x) 16-bit signed integer (range: -32,768–32,767; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **temp\_summary\_1**, **temp\_summary\_2**, **temp\_summary\_3**, **temp\_summary\_4**, **temp\_summary\_5** (5x) 16-bit signed integer (range: -32,768–32,767; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **temp\_summary\_1**, **temp\_summary\_2**, **temp\_summary\_3**, **temp\_summary\_4**, **temp\_summary\_5** (5x) 16-bit signed integer (range: -32,768–32,767; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **temp\_summary\_1**, **temp\_summary\_2**, **temp\_summary\_3**, **temp\_summary\_4**, **temp\_summary\_5** (5x) 16-bit signed integer (range: -32,768–32,767; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **temp\_summary\_1**, **temp\_summary\_2**, **temp\_summary\_3**, **temp\_summary\_4**, **temp\_summary\_5** (5x) 16-bit signed integer (range: -32,768–32,767; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **temp\_summary\_1**, **temp\_summary\_2**, **temp\_summary\_3**, **temp\_summary\_4**, **temp\_summary\_5** (5x) 16-bit signed integer (range: -32,768–32,767; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **temp\_summary\_1**, **temp\_summary\_2**, **temp\_summary\_3**, **temp\_summary\_4**, **temp\_summary\_5** (5x) 16-bit signed integer (range: -32,768–32,767; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **temp\_summary\_1**, **temp\_summary\_2**, **temp\_summary\_3**, **temp\_summary\_4**, **temp\_summary\_5** (5x) 16-bit signed integer (range: -32,768–32,767; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) |
| 36 | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum |

**Alert**

The **Alert message** is sent each time the built-in button is clicked and cannot be canceled.

- Message is sent when:

  - the operation mode is configured as [Alert](https://docs.soracom.io/en/devices/soracom-lte-m-button/operation-modes/alert) or [Alert + Heartbeat](https://docs.soracom.io/en/devices/soracom-lte-m-button/operation-modes/alert-and-heartbeat) and the built-in button is clicked
  - the operation mode is configured as [Alert](https://docs.soracom.io/en/devices/soracom-lte-m-button/operation-modes/alert) or [Alert + Heartbeat](https://docs.soracom.io/en/devices/soracom-lte-m-button/operation-modes/alert-and-heartbeat); the external I/O mode is configured as [Edge Detection](https://docs.soracom.io/en/devices/soracom-lte-m-button/io-modes/edge-detection) or [Pulse Detection](https://docs.soracom.io/en/devices/soracom-lte-m-button/io-modes/pulse-detection); and the external I/O is triggered

- Message length: 6 bytes

- Example: `35 00 0c 1c 01 ed`

| Byte | Bits | Bits | Bits | Bits | Bits | Bits | Bits | Bits |
| - | - | - | - | - | - | - | - | - |
| Byte | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 1 | **prod\_type** Fixed value `001` | **prod\_type** Fixed value `001` | **prod\_type** Fixed value `001` | **f\_ack** Fixed value `1` | **msg\_type** Fixed value `0101` | **msg\_type** Fixed value `0101` | **msg\_type** Fixed value `0101` | **msg\_type** Fixed value `0101` |
| 2 | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) |
| 3 | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) |
| 4 | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) |
| 5 | **detect\_type** 8-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **detect\_type** 8-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **detect\_type** 8-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **detect\_type** 8-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **detect\_type** 8-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **detect\_type** 8-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **detect\_type** 8-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **detect\_type** 8-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) |
| 6 | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum |

**Heartbeat**

The **Heartbeat message** indicates that the button is able to connect to a network and reports the battery status of the button.

- Message is automatically sent when:
  - the operation mode is configured as [Event + Heartbeat](https://docs.soracom.io/en/devices/soracom-lte-m-button/operation-modes/event-and-heartbeat) or [Alert + Heartbeat](https://docs.soracom.io/en/devices/soracom-lte-m-button/operation-modes/alert-and-heartbeat) at an interval configured by the **Uplink frequency** setting (**conf\_ul\_freq**) in the Set Configuration message
- Message length: 5 bytes
- Example: `33 00 55 1c 8a`

| Byte | Bits | Bits | Bits | Bits | Bits | Bits | Bits | Bits |
| - | - | - | - | - | - | - | - | - |
| Byte | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 1 | **prod\_type** Fixed value `001` | **prod\_type** Fixed value `001` | **prod\_type** Fixed value `001` | **f\_ack** Fixed value `1` | **msg\_type** Fixed value `0011` | **msg\_type** Fixed value `0011` | **msg\_type** Fixed value `0011` | **msg\_type** Fixed value `0011` |
| 2 | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) |
| 3 | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) |
| 4 | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) |
| 5 | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum |

**OOB**

The **OOB message** reports that the button successfully received a Set Configuration downlink message.

- Message is automatically sent when:
  - the button receives a Set Configuration downlink message
- Message length: 5 bytes
- Example: `2f 00 01 21 ee`

| Byte | Bits | Bits | Bits | Bits | Bits | Bits | Bits | Bits |
| - | - | - | - | - | - | - | - | - |
| Byte | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 1 | **prod\_type** Fixed value `001` | **prod\_type** Fixed value `001` | **prod\_type** Fixed value `001` | **f\_ack** Fixed value `0` | **msg\_type** Fixed value `1111` | **msg\_type** Fixed value `1111` | **msg\_type** Fixed value `1111` | **msg\_type** Fixed value `1111` |
| 2 | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) |
| 3 | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) |
| 4 | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) |
| 5 | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum |

### Downlink Messages

**Server ACK**

The **Server ACK message** should be sent to the button when the server receives an uplink message from the button where the ACK flag **f\_ack** is `1`. The Server ACK message indicates to the button that the uplink was successfully received. If the button does not receive the Server ACK message, it will attempt to resend the uplink message. **(reserved)** sections should be `0`-filled.

- Message length: 2 bytes
- Example: `a0 69`

| Byte | Bits | Bits | Bits | Bits | Bits | Bits | Bits | Bits |
| - | - | - | - | - | - | - | - | - |
| Byte | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 1 | **res\_type** Fixed value `1010` | **res\_type** Fixed value `1010` | **res\_type** Fixed value `1010` | **res\_type** Fixed value `1010` | (reserved) | (reserved) | (reserved) | (reserved) |
| 2 | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum |

**Set Configuration**

The **Set Configuration message** changes the button's configuration. When the server receives a **Status message** from the button, it can reply with the Set Configuration message to modify the button's configuration. **(reserved)** sections should be `0`-filled.

- Message length: 9 bytes
- Example: `e0 00 11 30 00 00 00 00 fc`

| Byte | Bits | Bits | Bits | Bits | Bits | Bits | Bits | Bits |
| - | - | - | - | - | - | - | - | - |
| Byte | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 1 | **res\_type** Fixed value `1110` | **res\_type** Fixed value `1110` | **res\_type** Fixed value `1110` | **res\_type** Fixed value `1110` | (reserved) | (reserved) | (reserved) | (reserved) |
| 2 | **flow\_ctrl** Fixed value `00000001` | **flow\_ctrl** Fixed value `00000001` | **flow\_ctrl** Fixed value `00000001` | **flow\_ctrl** Fixed value `00000001` | **flow\_ctrl** Fixed value `00000001` | **flow\_ctrl** Fixed value `00000001` | **flow\_ctrl** Fixed value `00000001` | **flow\_ctrl** Fixed value `00000001` |
| 3 | **conf\_oper** 4-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#downlink-symbols)) | **conf\_oper** 4-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#downlink-symbols)) | **conf\_oper** 4-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#downlink-symbols)) | **conf\_oper** 4-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#downlink-symbols)) | **conf\_sync** Boolean | **conf\_debounce** Boolean | **conf\_ext\_io** 2-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#downlink-symbols)) | **conf\_ext\_io** 2-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#downlink-symbols)) |
| 4 | **conf\_ul\_freq** 8-bit unsigned integer (range: 1–144; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#downlink-symbols)) | **conf\_ul\_freq** 8-bit unsigned integer (range: 1–144; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#downlink-symbols)) | **conf\_ul\_freq** 8-bit unsigned integer (range: 1–144; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#downlink-symbols)) | **conf\_ul\_freq** 8-bit unsigned integer (range: 1–144; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#downlink-symbols)) | **conf\_ul\_freq** 8-bit unsigned integer (range: 1–144; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#downlink-symbols)) | **conf\_ul\_freq** 8-bit unsigned integer (range: 1–144; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#downlink-symbols)) | **conf\_ul\_freq** 8-bit unsigned integer (range: 1–144; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#downlink-symbols)) | **conf\_ul\_freq** 8-bit unsigned integer (range: 1–144; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#downlink-symbols)) |
| 5 | **conf\_nw\_standby** 4-bit unsigned integer (range: 0–15; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#downlink-symbols)) | **conf\_nw\_standby** 4-bit unsigned integer (range: 0–15; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#downlink-symbols)) | **conf\_nw\_standby** 4-bit unsigned integer (range: 0–15; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#downlink-symbols)) | **conf\_nw\_standby** 4-bit unsigned integer (range: 0–15; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#downlink-symbols)) | (reserved) | (reserved) | (reserved) | (reserved) |
| 6 \| 8 | (reserved) | (reserved) | (reserved) | (reserved) | (reserved) | (reserved) | (reserved) | (reserved) |
| 9 | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum |

## Firmware 2220 Message Formats

Message formats describe the structure of each type of message sent from or to the button.

### Uplink Messages

**Status**

The **Status message** reports the current configuration of the button.

- Message is sent when:

  - the button is powered on for the first time
  - the batteries are replaced after power was depleted
  - pressing and holding the built-in button for 10 seconds
  - the external I/O mode is configured as [Pulse Detection](https://docs.soracom.io/en/devices/soracom-lte-m-button/io-modes/pulse-detection) and the external I/O is triggered for 10 seconds

- Message length: 14 bytes

- Example: `30 00 00 21 01 02 01 01 11 60 00 00 00 66`

| Byte | Bits | Bits | Bits | Bits | Bits | Bits | Bits | Bits |
| - | - | - | - | - | - | - | - | - |
| Byte | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 1 | **prod\_type** Fixed value `001` | **prod\_type** Fixed value `001` | **prod\_type** Fixed value `001` | **f\_ack** Fixed value `1` | **msg\_type** Fixed value `0000` | **msg\_type** Fixed value `0000` | **msg\_type** Fixed value `0000` | **msg\_type** Fixed value `0000` |
| 2 | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) |
| 3 | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) |
| 4 | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) |
| 5 | **fw\_ver** 16-bit hexadecimal (format: `0x0000`) | **fw\_ver** 16-bit hexadecimal (format: `0x0000`) | **fw\_ver** 16-bit hexadecimal (format: `0x0000`) | **fw\_ver** 16-bit hexadecimal (format: `0x0000`) | **fw\_ver** 16-bit hexadecimal (format: `0x0000`) | **fw\_ver** 16-bit hexadecimal (format: `0x0000`) | **fw\_ver** 16-bit hexadecimal (format: `0x0000`) | **fw\_ver** 16-bit hexadecimal (format: `0x0000`) |
| 6 | **fw\_ver** 16-bit hexadecimal (format: `0x0000`) | **fw\_ver** 16-bit hexadecimal (format: `0x0000`) | **fw\_ver** 16-bit hexadecimal (format: `0x0000`) | **fw\_ver** 16-bit hexadecimal (format: `0x0000`) | **fw\_ver** 16-bit hexadecimal (format: `0x0000`) | **fw\_ver** 16-bit hexadecimal (format: `0x0000`) | **fw\_ver** 16-bit hexadecimal (format: `0x0000`) | **fw\_ver** 16-bit hexadecimal (format: `0x0000`) |
| 7 | **hw\_ver** 16-bit hexadecimal (format: `0x0000`) | **hw\_ver** 16-bit hexadecimal (format: `0x0000`) | **hw\_ver** 16-bit hexadecimal (format: `0x0000`) | **hw\_ver** 16-bit hexadecimal (format: `0x0000`) | **hw\_ver** 16-bit hexadecimal (format: `0x0000`) | **hw\_ver** 16-bit hexadecimal (format: `0x0000`) | **hw\_ver** 16-bit hexadecimal (format: `0x0000`) | **hw\_ver** 16-bit hexadecimal (format: `0x0000`) |
| 8 | **hw\_ver** 16-bit hexadecimal (format: `0x0000`) | **hw\_ver** 16-bit hexadecimal (format: `0x0000`) | **hw\_ver** 16-bit hexadecimal (format: `0x0000`) | **hw\_ver** 16-bit hexadecimal (format: `0x0000`) | **hw\_ver** 16-bit hexadecimal (format: `0x0000`) | **hw\_ver** 16-bit hexadecimal (format: `0x0000`) | **hw\_ver** 16-bit hexadecimal (format: `0x0000`) | **hw\_ver** 16-bit hexadecimal (format: `0x0000`) |
| 9 | **curr\_oper** 4-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **curr\_oper** 4-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **curr\_oper** 4-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **curr\_oper** 4-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | (reserved) | **curr\_debounce** Boolean | **curr\_ext\_io** 2-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **curr\_ext\_io** 2-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) |
| 10 | **curr\_ul\_freq** 8-bit unsigned integer (range: 1–144; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **curr\_ul\_freq** 8-bit unsigned integer (range: 1–144; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **curr\_ul\_freq** 8-bit unsigned integer (range: 1–144; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **curr\_ul\_freq** 8-bit unsigned integer (range: 1–144; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **curr\_ul\_freq** 8-bit unsigned integer (range: 1–144; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **curr\_ul\_freq** 8-bit unsigned integer (range: 1–144; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **curr\_ul\_freq** 8-bit unsigned integer (range: 1–144; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **curr\_ul\_freq** 8-bit unsigned integer (range: 1–144; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) |
| 11 \| 13 | (reserved) | (reserved) | (reserved) | (reserved) | (reserved) | (reserved) | (reserved) | (reserved) |
| 14 | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum |

**Event**

The **Event message** reports a button click or external I/O detection event.

- Message is sent when:

  - the operation mode is configured as [Event](https://docs.soracom.io/en/devices/soracom-lte-m-button/operation-modes/event), [Event + Timer](https://docs.soracom.io/en/devices/soracom-lte-m-button/operation-modes/event-and-timer), or [Event + Heartbeat](https://docs.soracom.io/en/devices/soracom-lte-m-button/operation-modes/event-and-heartbeat); the external I/O mode is configured as [Edge Detection](https://docs.soracom.io/en/devices/soracom-lte-m-button/io-modes/edge-detection), [Pulse Detection](https://docs.soracom.io/en/devices/soracom-lte-m-button/io-modes/pulse-detection), or Disabled; and the built-in button is clicked
  - the operation mode is configured as [Event](https://docs.soracom.io/en/devices/soracom-lte-m-button/operation-modes/event), [Event + Timer](https://docs.soracom.io/en/devices/soracom-lte-m-button/operation-modes/event-and-timer), or [Event + Heartbeat](https://docs.soracom.io/en/devices/soracom-lte-m-button/operation-modes/event-and-heartbeat); the external I/O mode is configured as [Edge Detection](https://docs.soracom.io/en/devices/soracom-lte-m-button/io-modes/edge-detection) or [Pulse Detection](https://docs.soracom.io/en/devices/soracom-lte-m-button/io-modes/pulse-detection); and the external I/O is triggered

- Message length: 5 bytes

- Example: `31 00 0c 02 4d`

| Byte | Bits | Bits | Bits | Bits | Bits | Bits | Bits | Bits |
| - | - | - | - | - | - | - | - | - |
| Byte | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 1 | **prod\_type** Fixed value `001` | **prod\_type** Fixed value `001` | **prod\_type** Fixed value `001` | **f\_ack** Fixed value `1` | **msg\_type** Fixed value `0001` | **msg\_type** Fixed value `0001` | **msg\_type** Fixed value `0001` | **msg\_type** Fixed value `0001` |
| 2 | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) |
| 3 | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) |
| 4 | **detect\_type** 8-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **detect\_type** 8-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **detect\_type** 8-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **detect\_type** 8-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **detect\_type** 8-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **detect\_type** 8-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **detect\_type** 8-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **detect\_type** 8-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) |
| 5 | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum |

**Event with Temperature**

The **Event with Temperature message** reports a button click as well as the current temperature measured from an attached [Temperature Sensor](https://docs.soracom.io/en/devices/soracom-lte-m-button/io-modes/temperature-sensor).

- Message is sent when:
  - the operation mode is configured as [Event](https://docs.soracom.io/en/devices/soracom-lte-m-button/operation-modes/event), [Event + Timer](https://docs.soracom.io/en/devices/soracom-lte-m-button/operation-modes/event-and-timer), or [Event + Heartbeat](https://docs.soracom.io/en/devices/soracom-lte-m-button/operation-modes/event-and-heartbeat); the external I/O mode is configured as [Temperature Sensor](https://docs.soracom.io/en/devices/soracom-lte-m-button/io-modes/temperature-sensor); and the built-in button is clicked
- Message length: 7 bytes
- Example: `36 00 0d 02 0a be ca`

| Byte | Bits | Bits | Bits | Bits | Bits | Bits | Bits | Bits |
| - | - | - | - | - | - | - | - | - |
| Byte | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 1 | **prod\_type** Fixed value `001` | **prod\_type** Fixed value `001` | **prod\_type** Fixed value `001` | **f\_ack** Fixed value `1` | **msg\_type** Fixed value `0110` | **msg\_type** Fixed value `0110` | **msg\_type** Fixed value `0110` | **msg\_type** Fixed value `0110` |
| 2 | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) |
| 3 | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) |
| 4 | **detect\_type** 8-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **detect\_type** 8-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **detect\_type** 8-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **detect\_type** 8-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **detect\_type** 8-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **detect\_type** 8-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **detect\_type** 8-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **detect\_type** 8-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) |
| 5 | **temp\_cur** 16-bit signed integer (range: -32,768–32,767; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **temp\_cur** 16-bit signed integer (range: -32,768–32,767; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **temp\_cur** 16-bit signed integer (range: -32,768–32,767; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **temp\_cur** 16-bit signed integer (range: -32,768–32,767; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **temp\_cur** 16-bit signed integer (range: -32,768–32,767; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **temp\_cur** 16-bit signed integer (range: -32,768–32,767; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **temp\_cur** 16-bit signed integer (range: -32,768–32,767; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **temp\_cur** 16-bit signed integer (range: -32,768–32,767; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) |
| 6 | **temp\_cur** 16-bit signed integer (range: -32,768–32,767; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **temp\_cur** 16-bit signed integer (range: -32,768–32,767; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **temp\_cur** 16-bit signed integer (range: -32,768–32,767; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **temp\_cur** 16-bit signed integer (range: -32,768–32,767; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **temp\_cur** 16-bit signed integer (range: -32,768–32,767; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **temp\_cur** 16-bit signed integer (range: -32,768–32,767; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **temp\_cur** 16-bit signed integer (range: -32,768–32,767; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **temp\_cur** 16-bit signed integer (range: -32,768–32,767; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) |
| 7 | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum |

**Timer**

The **Timer message** reports the number of clicks, the number of edge detections counted (when the external I/O mode is configured as [Edge Detection](https://docs.soracom.io/en/devices/soracom-lte-m-button/io-modes/edge-detection)), and the temperature measured (when the external I/O mode is configured as [Temperature Sensor](https://docs.soracom.io/en/devices/soracom-lte-m-button/io-modes/temperature-sensor)) during a certain interval.

- Message is sent automatically when:
  - the operation mode is configured as [Timer](https://docs.soracom.io/en/devices/soracom-lte-m-button/operation-modes/timer) or [Event + Timer](https://docs.soracom.io/en/devices/soracom-lte-m-button/operation-modes/event-and-timer) at an interval configured by the **Uplink frequency** setting (**conf\_ul\_freq**) in the Set Configuration message

- Message length: 35 bytes

- Example: `32 00 8d 60 00 00 01 00 00 00 01 00 00 00 00 00 01 00 00 00 00 00 00 00 08 f0 08 e9 08 f0 08 e9 08 f6 01`

- Notes:

  - The clicks, edge detections, and temperature measurements are subdivided into 5 summaries, each with a duration equal to 86400 / (5 x **applied\_freq**) seconds.
  - Each of the **short\_summary\__#_**, **long\_summary\__#_**, and **double\_summary\__#_** indicate the number of short, long, and double clicks detected within each summary period, respectively.
  - The **edge\_summary\__#_** values indicate the number of rising and falling edge detection events within each summary period, and are valid only when the external I/O mode is configured as [Edge Detection](https://docs.soracom.io/en/devices/soracom-lte-m-button/io-modes/edge-detection).
  - The **temp\_summary\__#_** values indicate the temperature measured at the end of each summary period, are valid only when the external I/O mode is configured as [Temperature Sensor](https://docs.soracom.io/en/devices/soracom-lte-m-button/io-modes/temperature-sensor).

| Byte | Bits | Bits | Bits | Bits | Bits | Bits | Bits | Bits |
| - | - | - | - | - | - | - | - | - |
| Byte | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 1 | **prod\_type** Fixed value `001` | **prod\_type** Fixed value `001` | **prod\_type** Fixed value `001` | **f\_ack** Fixed value `1` | **msg\_type** Fixed value `0010` | **msg\_type** Fixed value `0010` | **msg\_type** Fixed value `0010` | **msg\_type** Fixed value `0010` |
| 2 | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) |
| 3 | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) |
| 4 | **applied\_freq** 8-bit unsigned integer (range: 1–144; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **applied\_freq** 8-bit unsigned integer (range: 1–144; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **applied\_freq** 8-bit unsigned integer (range: 1–144; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **applied\_freq** 8-bit unsigned integer (range: 1–144; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **applied\_freq** 8-bit unsigned integer (range: 1–144; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **applied\_freq** 8-bit unsigned integer (range: 1–144; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **applied\_freq** 8-bit unsigned integer (range: 1–144; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **applied\_freq** 8-bit unsigned integer (range: 1–144; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) |
| 5 \| 9 | **short\_summary\_1**, **short\_summary\_2**, **short\_summary\_3**, **short\_summary\_4**, **short\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) | **short\_summary\_1**, **short\_summary\_2**, **short\_summary\_3**, **short\_summary\_4**, **short\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) | **short\_summary\_1**, **short\_summary\_2**, **short\_summary\_3**, **short\_summary\_4**, **short\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) | **short\_summary\_1**, **short\_summary\_2**, **short\_summary\_3**, **short\_summary\_4**, **short\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) | **short\_summary\_1**, **short\_summary\_2**, **short\_summary\_3**, **short\_summary\_4**, **short\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) | **short\_summary\_1**, **short\_summary\_2**, **short\_summary\_3**, **short\_summary\_4**, **short\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) | **short\_summary\_1**, **short\_summary\_2**, **short\_summary\_3**, **short\_summary\_4**, **short\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) | **short\_summary\_1**, **short\_summary\_2**, **short\_summary\_3**, **short\_summary\_4**, **short\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) |
| 10 \| 14 | **long\_summary\_1**, **long\_summary\_2**, **long\_summary\_3**, **long\_summary\_4**, **long\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) | **long\_summary\_1**, **long\_summary\_2**, **long\_summary\_3**, **long\_summary\_4**, **long\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) | **long\_summary\_1**, **long\_summary\_2**, **long\_summary\_3**, **long\_summary\_4**, **long\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) | **long\_summary\_1**, **long\_summary\_2**, **long\_summary\_3**, **long\_summary\_4**, **long\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) | **long\_summary\_1**, **long\_summary\_2**, **long\_summary\_3**, **long\_summary\_4**, **long\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) | **long\_summary\_1**, **long\_summary\_2**, **long\_summary\_3**, **long\_summary\_4**, **long\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) | **long\_summary\_1**, **long\_summary\_2**, **long\_summary\_3**, **long\_summary\_4**, **long\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) | **long\_summary\_1**, **long\_summary\_2**, **long\_summary\_3**, **long\_summary\_4**, **long\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) |
| 15 \| 19 | **double\_summary\_1**, **double\_summary\_2**, **double\_summary\_3**, **double\_summary\_4**, **double\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) | **double\_summary\_1**, **double\_summary\_2**, **double\_summary\_3**, **double\_summary\_4**, **double\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) | **double\_summary\_1**, **double\_summary\_2**, **double\_summary\_3**, **double\_summary\_4**, **double\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) | **double\_summary\_1**, **double\_summary\_2**, **double\_summary\_3**, **double\_summary\_4**, **double\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) | **double\_summary\_1**, **double\_summary\_2**, **double\_summary\_3**, **double\_summary\_4**, **double\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) | **double\_summary\_1**, **double\_summary\_2**, **double\_summary\_3**, **double\_summary\_4**, **double\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) | **double\_summary\_1**, **double\_summary\_2**, **double\_summary\_3**, **double\_summary\_4**, **double\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) | **double\_summary\_1**, **double\_summary\_2**, **double\_summary\_3**, **double\_summary\_4**, **double\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) |
| 20 \| 24 | **edge\_summary\_1**, **edge\_summary\_2**, **edge\_summary\_3**, **edge\_summary\_4**, **edge\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) | **edge\_summary\_1**, **edge\_summary\_2**, **edge\_summary\_3**, **edge\_summary\_4**, **edge\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) | **edge\_summary\_1**, **edge\_summary\_2**, **edge\_summary\_3**, **edge\_summary\_4**, **edge\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) | **edge\_summary\_1**, **edge\_summary\_2**, **edge\_summary\_3**, **edge\_summary\_4**, **edge\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) | **edge\_summary\_1**, **edge\_summary\_2**, **edge\_summary\_3**, **edge\_summary\_4**, **edge\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) | **edge\_summary\_1**, **edge\_summary\_2**, **edge\_summary\_3**, **edge\_summary\_4**, **edge\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) | **edge\_summary\_1**, **edge\_summary\_2**, **edge\_summary\_3**, **edge\_summary\_4**, **edge\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) | **edge\_summary\_1**, **edge\_summary\_2**, **edge\_summary\_3**, **edge\_summary\_4**, **edge\_summary\_5** (5x) 8-bit unsigned integer (range: 0–255) |
| 25 \| 34 | **temp\_summary\_1**, **temp\_summary\_2**, **temp\_summary\_3**, **temp\_summary\_4**, **temp\_summary\_5** (5x) 16-bit signed integer (range: -32,768–32,767; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **temp\_summary\_1**, **temp\_summary\_2**, **temp\_summary\_3**, **temp\_summary\_4**, **temp\_summary\_5** (5x) 16-bit signed integer (range: -32,768–32,767; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **temp\_summary\_1**, **temp\_summary\_2**, **temp\_summary\_3**, **temp\_summary\_4**, **temp\_summary\_5** (5x) 16-bit signed integer (range: -32,768–32,767; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **temp\_summary\_1**, **temp\_summary\_2**, **temp\_summary\_3**, **temp\_summary\_4**, **temp\_summary\_5** (5x) 16-bit signed integer (range: -32,768–32,767; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **temp\_summary\_1**, **temp\_summary\_2**, **temp\_summary\_3**, **temp\_summary\_4**, **temp\_summary\_5** (5x) 16-bit signed integer (range: -32,768–32,767; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **temp\_summary\_1**, **temp\_summary\_2**, **temp\_summary\_3**, **temp\_summary\_4**, **temp\_summary\_5** (5x) 16-bit signed integer (range: -32,768–32,767; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **temp\_summary\_1**, **temp\_summary\_2**, **temp\_summary\_3**, **temp\_summary\_4**, **temp\_summary\_5** (5x) 16-bit signed integer (range: -32,768–32,767; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **temp\_summary\_1**, **temp\_summary\_2**, **temp\_summary\_3**, **temp\_summary\_4**, **temp\_summary\_5** (5x) 16-bit signed integer (range: -32,768–32,767; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) |
| 35 | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum |

**Heartbeat**

The **Heartbeat message** indicates that the button is able to connect to a network and reports the battery status of the button.

- Message is automatically sent when:
  - the operation mode is configured as [Event + Heartbeat](https://docs.soracom.io/en/devices/soracom-lte-m-button/operation-modes/event-and-heartbeat) at an interval configured by the **Uplink frequency** setting (**conf\_ul\_freq**) in the Set Configuration message
- Message length: 5 bytes
- Example: `33 00 55 1c 8a`

| Byte | Bits | Bits | Bits | Bits | Bits | Bits | Bits | Bits |
| - | - | - | - | - | - | - | - | - |
| Byte | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 1 | **prod\_type** Fixed value `001` | **prod\_type** Fixed value `001` | **prod\_type** Fixed value `001` | **f\_ack** Fixed value `1` | **msg\_type** Fixed value `0011` | **msg\_type** Fixed value `0011` | **msg\_type** Fixed value `0011` | **msg\_type** Fixed value `0011` |
| 2 | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) |
| 3 | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) |
| 4 | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) |
| 5 | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum |

**OOB**

The **OOB message** reports that the button successfully received a Set Configuration downlink message.

- Message is automatically sent when:
  - the button receives a Set Configuration downlink message
- Message length: 5 bytes
- Example: `2f 00 01 21 ee`

| Byte | Bits | Bits | Bits | Bits | Bits | Bits | Bits | Bits |
| - | - | - | - | - | - | - | - | - |
| Byte | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 1 | **prod\_type** Fixed value `001` | **prod\_type** Fixed value `001` | **prod\_type** Fixed value `001` | **f\_ack** Fixed value `0` | **msg\_type** Fixed value `1111` | **msg\_type** Fixed value `1111` | **msg\_type** Fixed value `1111` | **msg\_type** Fixed value `1111` |
| 2 | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) |
| 3 | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) | **seq\_number** 16-bit unsigned integer (range: 0–4,095) |
| 4 | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) | **batt\_vol** 8-bit unsigned integer (range: 0–255; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#uplink-symbols)) |
| 5 | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum |

### Downlink Messages

**Server ACK**

The **Server ACK message** should be sent to the button when the server receives an uplink message from the button where the ACK flag **f\_ack** is `1`. The Server ACK message indicates to the button that the uplink was successfully received. If the button does not receive the Server ACK message, it will attempt to resend the uplink message. **(reserved)** sections should be `0`-filled.

- Message length: 2 bytes
- Example: `a0 69`

| Byte | Bits | Bits | Bits | Bits | Bits | Bits | Bits | Bits |
| - | - | - | - | - | - | - | - | - |
| Byte | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 1 | **res\_type** Fixed value `1010` | **res\_type** Fixed value `1010` | **res\_type** Fixed value `1010` | **res\_type** Fixed value `1010` | (reserved) | (reserved) | (reserved) | (reserved) |
| 2 | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum |

**Set Configuration**

The **Set Configuration message** changes the button's configuration. When the server receives a **Status message** from the button, it can reply with the Set Configuration message to modify the button's configuration. **(reserved)** sections should be `0`-filled.

- Message length: 9 bytes
- Example: `e0 00 11 30 00 00 00 00 ec`

| Byte | Bits | Bits | Bits | Bits | Bits | Bits | Bits | Bits |
| - | - | - | - | - | - | - | - | - |
| Byte | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 1 | **res\_type** Fixed value `1110` | **res\_type** Fixed value `1110` | **res\_type** Fixed value `1110` | **res\_type** Fixed value `1110` | (reserved) | (reserved) | (reserved) | (reserved) |
| 2 | **flow\_ctrl** Fixed value `00000001` | **flow\_ctrl** Fixed value `00000001` | **flow\_ctrl** Fixed value `00000001` | **flow\_ctrl** Fixed value `00000001` | **flow\_ctrl** Fixed value `00000001` | **flow\_ctrl** Fixed value `00000001` | **flow\_ctrl** Fixed value `00000001` | **flow\_ctrl** Fixed value `00000001` |
| 3 | **conf\_oper** 4-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#downlink-symbols)) | **conf\_oper** 4-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#downlink-symbols)) | **conf\_oper** 4-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#downlink-symbols)) | **conf\_oper** 4-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#downlink-symbols)) | (reserved) | **conf\_debounce** Boolean | **conf\_ext\_io** 2-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#downlink-symbols)) | **conf\_ext\_io** 2-bit binary (see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#downlink-symbols)) |
| 4 | **conf\_ul\_freq** 8-bit unsigned integer (range: 1–144; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#downlink-symbols)) | **conf\_ul\_freq** 8-bit unsigned integer (range: 1–144; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#downlink-symbols)) | **conf\_ul\_freq** 8-bit unsigned integer (range: 1–144; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#downlink-symbols)) | **conf\_ul\_freq** 8-bit unsigned integer (range: 1–144; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#downlink-symbols)) | **conf\_ul\_freq** 8-bit unsigned integer (range: 1–144; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#downlink-symbols)) | **conf\_ul\_freq** 8-bit unsigned integer (range: 1–144; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#downlink-symbols)) | **conf\_ul\_freq** 8-bit unsigned integer (range: 1–144; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#downlink-symbols)) | **conf\_ul\_freq** 8-bit unsigned integer (range: 1–144; see [Symbols](https://docs.soracom.io/en/devices/soracom-lte-m-button/custom-implementation/#downlink-symbols)) |
| 5 \| 8 | (reserved) | (reserved) | (reserved) | (reserved) | (reserved) | (reserved) | (reserved) | (reserved) |
| 9 | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum | **crc** 8-bit CRC-8 checksum |
