Online decoder can be found here: LoRaWAN Tools with downlink decoder
Latest firmware release is v7.23
- Preamble
- Payload Contents of each enLink Product
- Uplink Payload
- Downlink Payload
- Downlink Payload Structure
- Downlink Receive Port
- General Settings Details
- Downlink Message Examples
- Example Uplink Replies to Downlink Messages
- Downlink Message Index Tables
- Product and Sensor Specific Downlinks
- Fan Run-Time (Air/Air-X) Downlinks
- Temperature/Humidity Downlinks
- Light Sensor Downlinks
- VOC Sensor Downlinks
- TVOC Sensor Downlinks
- EPA Sensor Downlinks
- CO2 Sensor Downlinks
- Occupancy Sensor Downlinks
- Particulate Sensor Downlinks
- Gas Sensor Downlinks
- Leak Sensor Downlinks
- Differential Pressure / Air Flow Downlinks
- Zone View e-paper Display Downlinks
- Flammable Gas Sensor Downlink
- Radon Sensor Downlinks
- Sample CODECs for Decoding Messages
Synetica is a UK based company that designs and develops energy and environmental sensors. We specialise in highly accurate and reliable air quality monitoring using LoRaWAN long range wireless.
The enLink range of LoRaWAN devices are categorised into the following:
- Air Quality Monitors (Indoor and Outdoor, mains and battery powered)
- Indoor Environmental Sensors
- Modbus Reader - Serial RS485 RTU
- Pulse Counter
- Leak Sensor
- Differential Pressure / Air Flow
- Gauge Pressure
- Liquid Level
- Temperature Probes
- Voltage/Current Sensor
This repository contains various decoders for the LoRaWAN data packets. The uplink data is telemetry data containing values like temperature, particulates and gas concentrations.
This enLink firmware implements LoRa Mac 4.4.0 release from Semtech/StackForce LoRaMac-Node.
We implement EU868, US915 and AU915 as defined in LoRaWAN Regional Parameters v1.0.2rB document. Class A endpoint implementation is fully compatible with "LoRaWAN specification 1.0.2".
Each enLink device has specific sensors. Each sensor exposes one or more data values. The firmware code is used to determine the sensors in the device. Note: the product code is similar to, but not the same as the firmware code. The following table can be used to determine the expected values in a uplink message. The KPI values are optional.
The firmware code is a concatenation of the base model plus the options.
For example:
FW-ZN-LVCMis the firmware code for an enLink Zone(ZN) with Light, VOCs, CO2 and Motion.
| Firmware Code | Options | Data Type(s) | Description |
|---|---|---|---|
| FW-AQM | (default) | 0x01, 0x02 |
Temperature, Humidity |
| L | 0x03 |
Light Level (Indoor Air only) - Light Sensor Downlinks | |
| V | 0x04, 0x05, 0x12, 0x3F |
Pressure, VOC IAQ, bVOC, CO2e - VOC Sensor Downlinks | |
| C | 0x08 |
NDIR CO2 ppm - CO2 Sensor Downlinks | |
| X | 0x06 |
Oxygen | |
| S | 0x50, 0x51, 0x52 |
Sound | |
| P+ | 0x57, 0x58, 0x59, 0x5A,0x5B, 0x5C, 0x5D, 0x5E,0x5F, 0x60 |
Particles - Particulate Sensor Downlinks | |
| O | 0x61 |
Ozone (Discontinued after v7.10) | |
| O3 | 0x61 |
Ozone (From v7.11) | |
| G+ | 0x61, 0x66 |
Up to 4 x Gas Sensors |
Link to: Air / Air-X Downlinks
enLink IAQ Web Page
enLink IAQ Plus Web Page
enLink IAQ Vape Web Page
enLink IAQ Duct Web Page
enLink OAQ Web Page
| Firmware Code | Options | Data Type(s) | Description |
|---|---|---|---|
| FW-AQ | (default) | 0x01, 0x02, 0x3B |
Temperature, Humidity/Hi-Res Humidity (Selectable from v7.05) Temperature/Humidity Downlinks |
| V | 0x04, 0x05, 0x12, 0x3F |
Pressure, VOC IAQ, bVOC, CO2e - VOC Sensor Downlinks | |
| R | 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C |
Radon Gas Uptime and concentrations - Radon Sensor Downlinks | |
| C | 0x08 |
NDIR CO2 ppm - CO2 Sensor Downlinks | |
| F | 0x73, 0x74 |
Flammable Gas Sensor | |
| I | 0x36, 0x37, 0x38, 0x39, 0x3A |
Indoor TVOC Sensor (enLink IAQ) - TVOC Sensor Downlinks | |
| D | 0x67, 0x68 |
Outdoor EPA Sensor (enLink OAQ) EPA Sensor Downlink | |
| O | 0x61 |
Ozone (Discontinued after v7.10) | |
| O3 | 0x61 |
Ozone (From v7.11) | |
| G | 0x61, 0x66 |
Single Gas Sensor - Gas Sensor Downlinks | |
| S | 0x50, 0x51, 0x52 |
Sound | |
| P+ | 0x57, 0x58, 0x59, 0x5A,0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x60 |
Particles (IAQ/OAQ) Particulate Sensor Downlinks |
|
| PP | 0x69, 0x6A, 0x6B, 0x57, 0x58, 0x6C, 0x5A, 0x6D, 0x6E, 0x5B, 0x5C, 0x5D, 0x6F, 0x5F, 0x3C, 0x3D |
Particles (IAQ Plus) Particulate Sensor Downlinks Unit must be externally powered Compensated Temp/Humidity |
|
| PV | 0x69, 0x6A, 0x6B, 0x57, 0x58, 0x6C, 0x5A, 0x6D, 0x6E, 0x5B, 0x5C, 0x5D, 0x6F, 0x5F, 0x70, 0x71, 0x72, 0x3C, 0x3D |
Particles, Smoke/Vape (IAQ Vape) - Includes ATI feature Particulate Sensor Downlinks Unit must be externally powered Compensated Temp/Humidity |
| Firmware Code | Options | Data Type(s) | Description |
|---|---|---|---|
| FW-ZNP | (default) | 0x01, 0x02, 0x3B |
Temperature, Humidity/Hi-Res Humidity (Selectable from v7.05) Temperature/Humidity Downlinks |
| L | 0x03 |
Light Level - Light Sensor Downlinks | |
| V | 0x04, 0x05, 0x12, 0x3F |
Pressure, VOC IAQ, bVOC, CO2e - VOC Sensor Downlinks | |
| C | 0x08 |
NDIR CO2 ppm - CO2 Sensor Downlinks | |
| M | 0x13, 0x14 |
Motion (PIR). Includes ATI feature | |
| G | 0x61, 0x66 |
Single Gas Sensor - Gas Sensor Downlinks | |
| S | 0x50, 0x51, 0x52 |
Sound |
| Firmware Code | Options | Data Type(s) | Description |
|---|---|---|---|
| FW-ZN | (default) | 0x01, 0x02 |
Temperature, Humidity |
| L | 0x03 |
Light Level - Light Sensor Downlinks | |
| V | 0x04, 0x05, 0x12, 0x3F |
Pressure, VOC IAQ, bVOC, CO2e - VOC Sensor Downlinks | |
| C | 0x08 |
NDIR CO2 ppm - CO2 Sensor Downlinks | |
| M | 0x13, 0x14 |
Motion (PIR). Includes ATI feature |
Available from 2025
| Firmware Code | Options | Data Type(s) | Description |
|---|---|---|---|
| FW-ZN2 | (default) | 0x01, 0x3B |
Temperature, High resolution humidity |
| V | 0x04, 0x05, 0x12, 0x3F |
Pressure, VOC IAQ, bVOC, CO2e - VOC Sensor Downlinks |
| Firmware Code | Options | Data Type(s) | Description |
|---|---|---|---|
| FW-ZV | (default) | 0x01, 0x3B |
Temperature, Hi-Res Humidity |
| L | 0x03 |
Light Level - Light Sensor Downlinks | |
| C | 0x08 |
NDIR CO2 ppm - CO2 Sensor Downlinks | |
| H | 0x13, 0x14, 0x16 |
Human Presence. Includes ATI feature - Occupancy Sensor Downlinks | |
| I | 0x36, 0x37, 0x38, 0x39, 0x3A |
Indoor TVOC Sensor (enLink IAQ) - TVOC Sensor Downlinks |
Zone View e-paper Display Downlinks
| Firmware Code | Options | Data Type(s) | Description |
|---|---|---|---|
| FW-MB-32 | (None) | 0x0F, 0x10, 0x11 |
Exception, Interval, Cumulative readings |
| Firmware Code | Options | Data Type(s) | Description |
|---|---|---|---|
| FW-STS-P/PX | (None) | 0x0E, 0x15 |
Count (0 to 2^32), Change of State - Includes ATI feature |
| Firmware Code | Options | Data Type(s) | Description |
|---|---|---|---|
| FW-STS-L | (None) | 0x30, 0x31 |
Resistance, Leak Event. Includes ATI feature on the leak event |
| Firmware Code | Options | Data Type(s) | Description |
|---|---|---|---|
| FW-STS-DP/AF | (None) | 0x2C, 0x2D |
Pressure, Air flow. Either one or both can be selected DP/AF Downlinks |
| Firmware Code | Options | Data Type(s) | Description |
|---|---|---|---|
| FW-STS-GP | (None) | 0x32, 0x33 |
Pressure Pa, Temperature (of the sensor) |
| Firmware Code | Options | Data Type(s) | Description |
|---|---|---|---|
| FW-STS | 1T | 0x17, 0x1A, 0x1D, 0x20,0x23, 0x26, 0x29 |
Temperature, alarm status (if set) Includes ATI feature |
| 2T | As above, plus0x18, 0x1B, 0x1E, 0x21,0x24, 0x27, 0x2A |
Temperature, alarm status (if set) Includes ATI feature |
| Firmware Code | Options | Data Type(s) | Description |
|---|---|---|---|
| FW-STS-VC | (None) | 0x2E |
Mode: Voltage |
0x2F |
Mode: Current | ||
0x30 |
Mode: Resistance |
This is included on enLink devices where an alarm or status feature requires immediate transfer of a radio message. When a change of alarm state occurs a wireless message is sent immediately, however messages will not be sent more frequently than the Adaptive Min interval. The Adaptive Max interval acts like a heartbeat, so if no change of alarm state occurs then a message is sent at the Adaptive Max interval.
The enLink payload structure is designed to be as efficient as possible. Data for multiple sensor values can be concatenated into a single payload which can be easily decoded. If the payload length is restricted due to channel time limits, the whole message will be split into multiple payloads. Each payload will always be split on a Sensor Data boundary. This is done so each payload can be easily decoded. A payload will always have the first byte as a Data Type Identifier.
The enLink device design uses a single port byte value to transmit uplink messages. This is by default set to 1. This can be changed to allow the user to easily decode packets from different manufacturers, if needed. This can be changed either via the serial port menu, accessed by a USB cable or with a downlink message.
The payload is an array of Sensor Data messages, each one is 2 or more bytes in length.
[Sensor-1 Data] [Sensor-2 Data] ... [Sensor-n Data]
Sensor data consists of a Data Type Identifier byte followed by the Data Value as one or more bytes. The number of bytes in the data value is determined by the Data Type Identifier and is fixed. Details are here: Sensor Details.
Example Payload (hexadecimal):
01 01 23 02 56 03 01 A4
These bytes can be split up as follows:
Example Payload:
[01 01 23] [02 56] [03 01 A4]
Finally, decoding the data:
| Data Type Identifier | Data Value Calculation | Result |
|---|---|---|
01 - Temperature |
((0x01 * 256) + 0x23) / 10 = (256 + 35) / 10 |
29.1 °C |
02 - Humidity |
0x56 |
86 %rH |
03 - Ambient Light |
(0x01 * 256) + 0xA4 = 256 + 164 |
420 Lux |
Each Data Type can use 1 or more bytes to send the value according to the following table:
| Type Hex Dec | System Message | Num Bytes |
|---|---|---|
0xA5 165 |
ACK/NACK reply from a downlink. See examples | 3 or 5 |
0x00 000 |
System Information The next byte value after Type byte indicates the ID of the System Information. See table below: |
| Sys ID Hex Dec | Name | System Info Message | Example | Num Bytes |
|---|---|---|---|---|
0x00 000 |
Firmware Version | MAJOR MINOR Sent in first payload after power up, or by downlink request |
00 00 07 16Version 7.22 |
2 + 2 |
0x1E 030 |
Plug-In Gas Version | This is available to devices (ZNP/IAQ/OAQ) with the G option of a single plug-in gas sensor. Sent in first payload after sensor is initialised, or by downlink request |
00 1E 01 02 03 04 05Serial 0102030405 |
2 + 5 |
| Type Hex Dec | Sensor | Sensor Range | Units | Num Bytes | Format | Scaling |
|---|---|---|---|---|---|---|
0x01 001 |
Temperature | -40 to 85 | °C | 2 | S16 | / 10 |
0x02 002 |
Humidity | 0 to 100 | %rH | 1 | U8 | |
0x03 003 |
Ambient Light | 0.01 to 83k | lux | 2 | U16 | |
0x04 004 |
Pressure | 300 to 1100 | mbar | 2 | U16 | |
0x05 005 |
Volatile Organic Compounds (VOC) | Static IAQ | 2 | U16 | ||
0x06 006 |
Oxygen | 0 to 25 | % | 1 | U8 | / 10 |
0x07 007 |
Carbon Monoxide | 0 to 100 | ppm | 2 | U16 | / 100 |
0x08 008 |
Carbon Dioxide (2 sensor ranges) | 0 to 5000 or 0 to 50,000 | ppm | 2 | U16 | |
0x09 009 |
Ozone (O3) | 0 to 1 0 to 1000 |
ppm ppb |
2 | U16 | / 10000 / 10 |
0x0A 010 |
Air Pollutants: CO, Ammonia, Ethanol, H2, Methane / Propane / Iso-Butane. | 100 to 1500 (Typ) | kΩ | 2 | U16 | / 10 |
0x0D 013 |
Hydrogen Sulphide (H2S) | 0 to 100 | ppm | 2 | U16 | / 100 |
0x0E 014 |
Pulse ID + Pulse Counter | ID: 0 to 2 Value: 0 to 2^32 |
count | 1 + 4 | U32 | |
0x0F 015 |
MB ID + Modbus Exception | ID: 0 to 31 Error Num |
1 + 1 | U8 | ||
0x10 016 |
MB ID + Modbus Interval value | ID: 0 to 31 Interval Value |
1 + 4 | F32 | ||
0x11 017 |
MB ID + Modbus Cumulative value | ID: 0 to 31 Cumulative Value |
1 + 4 | F32 | ||
0x12 018 |
bVOC – VOC concentration | ppm | 4 | F32 | ||
0x13 019 |
Detection count (PIR etc.) | count | 4 | U32 | ||
0x14 020 |
Total occupied duration | seconds | 4 | U32 | ||
0x15 021 |
Change of State information | Change of State | 3 | U16 | ||
0x16 022 |
Detection Status (Occupancy, Liquid Level) | 0 = Inactive 1 = Detected |
status | 1 | U8 | |
0x17 023 |
Probe 1 Temperature | -55 to 125 | °C | 2 | S16 | / 10 |
0x18 024 |
Probe 2 Temperature | -55 to 125 | °C | 2 | S16 | / 10 |
0x19 025 |
Probe 3 Temperature | -55 to 125 | °C | 2 | S16 | / 10 |
0x1A 026 |
Time temperature probe 1 has spent in 'in band' zone | seconds | 4 | U32 | ||
0x1B 027 |
Time temperature probe 2 has spent in 'in band' zone | seconds | 4 | U32 | ||
0x1C 028 |
Time temperature probe 3 has spent in 'in band' zone | seconds | 4 | U32 | ||
0x1D 029 |
Number of times in band alarm has been activated for temperature probe 1 | count | 2 | U16 | ||
0x1E 030 |
Number of times in band alarm has been activated for temperature probe 2 | count | 2 | U16 | ||
0x1F 031 |
Number of times in band alarm has been activated for temperature probe 3 | count | 2 | U16 | ||
0x20 032 |
Time temperature probe 1 has spent below low threshold | seconds | 4 | U32 | ||
0x21 033 |
Time temperature probe 2 has spent below low threshold | seconds | 4 | U32 | ||
0x22 034 |
Time temperature probe 3 has spent below low threshold | seconds | 4 | U32 | ||
0x23 035 |
Number of times low threshold alarm has been activated for temperature probe 1 | count | 2 | U16 | ||
0x24 036 |
Number of times low threshold alarm has been activated for temperature probe 2 | count | 2 | U16 | ||
0x25 037 |
Number of times low threshold alarm has been activated for temperature probe 3 | count | 2 | U16 | ||
0x26 038 |
Time temperature probe 1 has spent above high threshold | seconds | 4 | U32 | ||
0x27 039 |
Time temperature probe 2 has spent above high threshold | seconds | 4 | U32 | ||
0x28 040 |
Time temperature probe 3 has spent above high threshold | seconds | 4 | U32 | ||
0x29 041 |
Number of times high threshold alarm has been activated for temperature probe 1 | count | 2 | U16 | ||
0x2A 042 |
Number of times high threshold alarm has been activated for temperature probe 2 | count | 2 | U16 | ||
0x2B 043 |
Number of times high threshold alarm has been activated for temperature probe 3 | count | 2 | U16 | ||
0x2C 044 |
Differential Pressure | +/- 5000 | Pa | 4 | F32 | |
0x2D 045 |
Airflow | 0 to 100 | m/s | 4 | F32 | |
0x2E 046 |
Voltage | 0 to 10 | Volts | 2 | U16 | / 1000 |
0x2F 047 |
Current | 0 to 20 | mA | 2 | U16 | / 1000 |
0x30 048 |
Resistance | 0 to 6553.5 kΩ (6.5MΩ) | kΩ | 2 | U16 | / 10 |
0x31 049 |
Leak Detection (resistance rope) | 0 = No Leak 1 = Leak Detected |
status | 1 | U8 | |
0x32 050 |
Gauge Pressure | 0 to 1000 kPa typ. | Pa | 4 | F32 | |
0x33 051 |
Gauge Pressure Sensor Temperature | -40 to 85 | °C | 2 | S16 | /100 |
0x34 052 |
Liquid Level (Depth) | 0 to 5000 mm typ. | mm | 4 | F32 | |
0x35 053 |
LL Sensor Temperature | -40 to 85 | °C | 2 | S16 | /100 |
0x36 054 |
TVOC Minimum | mg/m³ | 2 | F32 | ||
0x37 055 |
TVOC Average | mg/m³ | 2 | F32 | ||
0x38 056 |
TVOC Maximum | mg/m³ | 2 | F32 | ||
0x39 057 |
EtOH (Ethanol equivalent) | ppm | 4 | F32 | ||
0x3A 058 |
IAQ (1.0 to 5.0) Included on PBAQ version from v7.11 |
IAQ | 4 | F32 | ||
0x3B 059 |
High resolution Relative Humidity | 0 to 100.00% | %rH | 2 | U16 | / 100 |
0x3C 060 |
Compensated Temperature | -40 to 85 | °C | 2 | S16 | / 10 |
0x3D 061 |
Compensated Relative Humidity | 0 to 100.00% | %rH | 2 | U16 | / 100 |
0x3F 063 |
CO2e estimate equivalent (BME680) | ppm | 4 | F32 | ||
0x50 080 |
Sound Level Minimum | dB(A) | 4 | F32 | ||
0x51 081 |
Sound Level Average | dB(A) | 4 | F32 | ||
0x52 082 |
Sound Level Maximum | dB(A) | 4 | F32 | ||
0x53 083 |
Nitric Oxide | 0 - 100 | ppm | 2 | U16 | / 100 |
0x54 084 |
Nitrogen Dioxide | 0 – 5 | ppm | 2 | U16 | / 10000 |
0x55 085 |
Nitrogen Dioxide | 0 – 20 | ppm | 2 | U16 | / 1000 |
0x56 086 |
Sulphur Dioxide | 0 – 20 | ppm | 2 | U16 | / 1000 |
0x57 087 |
Particulate matter mass concentration at PM1.0 | µg/m³ | 4 | F32 | ||
0x58 088 |
As above, PM2.5 | µg/m³ | 4 | F32 | ||
0x59 089 |
As above, PM4.0 | µg/m³ | 4 | F32 | ||
0x5A 090 |
As above, PM10.0 | µg/m³ | 4 | F32 | ||
0x5B 091 |
Particulate matter number concentration at PM0.5 | #/cm³ | 4 | F32 | ||
0x5C 092 |
As above, PM1.0 | #/cm³ | 4 | F32 | ||
0x5D 093 |
As above, PM2.5 | #/cm³ | 4 | F32 | ||
0x5E 094 |
As above, PM4.0 | #/cm³ | 4 | F32 | ||
0x5F 095 |
As above, PM10.0 | #/cm³ | 4 | F32 | ||
0x60 096 |
Particulate matter typical particle size | µm | 4 | F32 | ||
0x61 097 |
Gas ID + Gas Concentration | ppb | 1 + 4 | F32 | ||
0x62 098 |
Corrosion: Metal ID + Metal Thickness | ~ 1000nm | nm | 1 + 4 | F32 | |
0x63 099 |
Corrosion: Metal ID + Minimum thickness | nm | 1 + 2 | U16 | ||
0x64 100 |
Corrosion: Metal ID + Original thickness | nm | 1 + 2 | U16 | ||
0x65 101 |
Corrosion: percentage of thickness between original thickness (100%) and minimum (0%) | % | 1 + 4 | F32 | ||
0x66 102 |
Gas ID + Gas Concentration | µg/m³ | 1 + 4 | F32 | ||
0x67 103 |
Outdoor EPA Index Sensor Fast AQI (reading taken over 1 minute) | 0 to 500 | AQI | 2 | U16 | |
0x68 104 |
Outdoor EPA Index Sensor EPA AQI | 0 to 500 | AQI | 2 | U16 | |
0x69 105 |
Particulate matter mass concentration at PM0.1 | µg/m³ | 4 | F32 | ||
0x6A 106 |
As above, PM0.3 | µg/m³ | 4 | F32 | ||
0x6B 107 |
As above, PM0.5 | µg/m³ | 4 | F32 | ||
0x6C 108 |
As above, PM5.0 | µg/m³ | 4 | F32 | ||
0x6D 109 |
Particulate matter number concentration at PM0.1 | #/cm³ | 4 | F32 | ||
0x6E 110 |
As above, PM0.3 | #/cm³ | 4 | F32 | ||
0x6F 111 |
As above, PM5.0 | #/cm³ | 4 | F32 | ||
0x70 112 |
Detection: Event Count | 0 to 65535 | count | 2 | U16 | |
0x71 113 |
Detection: Smoke Count | 0 to 65535 | count | 2 | U16 | |
0x72 114 |
Detection: Vape Count | 0 to 65535 | count | 2 | U16 | |
0x73 115 |
Flammable Gas Sensor Cycle Count (internal counter increments every 4 seconds) | count | 4 | I32 | ||
0x74 116 |
Flammable Gas ID + %LEL(Lower Explosive Level) concentration | < -15% to > +110% | %LEL(ISO) | 1 + 4 | F32 | |
0x75 117 |
Radon Sensor Uptime | 0 to 2^32 | seconds | 4 | U32 | |
0x76 118 |
Radon Gas average over uptime | 0 to 2^16 | Bq/m³ | 4 | U16 | |
0x77 119 |
Radon Gas average over 6 hours | 0 to 2^16 | Bq/m³ | 4 | U16 | |
0x78 120 |
Radon Gas average over 12 hours | 0 to 2^16 | Bq/m³ | 4 | U16 | |
0x79 121 |
Radon Gas average over 24 hours | 0 to 2^16 | Bq/m³ | 4 | U16 | |
0x7A 122 |
Radon Gas average over 48 hours | 0 to 2^16 | Bq/m³ | 4 | U16 | |
0x7B 123 |
Radon Gas average over 72 hours | 0 to 2^16 | Bq/m³ | 4 | U16 | |
0x7C 124 |
Radon Gas average over 96 hours | 0 to 2^16 | Bq/m³ | 4 | U16 | |
0xFE 254 |
Fault: [Sensor ID] + [Fault ID] + [Fault Value] | 1 + 1 + 2 | U16 |
Most sensor data values are self-explanatory, additional information for decoding more complex sensor data is given in the sections below.
Types: 0x0F, 0x10, 0x11
The enLink Modbus data types for Interval and Cumulative values use 5 bytes to encode the item index and value.
- Modbus Exception – standard Modbus exception codes, e.g. Code
02– Illegal Data Address. - Modbus Interval Value – for Modbus data types which do not accumulate, e.g. Voltage, Current, Temperature etc.
- Modbus Cumulative Value – for Modbus data types which are linked to a value which accumulates, e.g. kWh, Volume etc.
The first byte indicates which of the 32 available Modbus items is being accessed (0 to 31), followed by the Modbus Value represented as a 32 bit floating point value (IEEE 754 format). Interval Value types are used for instantaneous values, such as Voltage, Current, Temperature, Pressure etc. Cumulative Values are used for items such as energy consumption and total volume.
Example Payload Data:
10 04 41 BC 7A E1
This is an interval data value, from configured item number 5. The value is 23.56.
For an online converter, see Hex to Float Converter
Type: 0x15
The full message is sent as 3 bytes. The second byte indicates the reason for the radio transmission (Trigger Status), the third byte gives the open/close state of the inputs (Input State).
Note: To enable the Change-of-State feature to transmit when a change is detected, the device configuration requires that ATI is enabled, and the Transmit on Change of State option is enabled.
The two data value bytes are bit-encoded as follows:
- Bit 0 - Set to 1 when Input 1 Changed from Closed to Open
- Bit 1 - Set to 1 when Input 2 Changed from Closed to Open
- Bit 2 - Set to 1 when Input 3 Changed from Closed to Open
- Bit 3 - Not used
- Bit 4 - Set to 1 when Input 1 Changed from Open to Closed
- Bit 5 - Set to 1 when Input 2 Changed from Open to Closed
- Bit 6 - Set to 1 when Input 3 Changed from Open to Closed
- Bit 7 - Not used
If a message is received and the trigger status byte value is zero, then the message was either sent after a config button press, or because a regular transmission was scheduled. I.e. the ATI maximum interval has expired. In the NodeRed example decoder, this event is marked as a heartbeat.
You may receive a trigger status byte value where multiple bits are set. This could be that these events occurred before the radio packet could be sent. For example, a fast transition from open -> closed -> open. This may also be caused by a duty cycle restriction delaying the transmission, or the message sending was paused because a previous message was sent within the minimum ATI interval.
- Bit 0 - Input 1 state. Set to 1 when Closed
- Bit 1 - Input 2 state. Set to 1 when Closed
- Bit 2 - Input 3 state. Set to 1 when Closed
- Bit 3 - Not used
- Bit 4 - Not used
- Bit 5 - Not used
- Bit 6 - Not used
- Bit 7 - Not used
Example Payload Data:
15 01 05
The example shows the transmission was triggered when Input #1 changed from Closed to Open, and the state of the inputs are:
- Input 1: Closed
- Input 2: Open
- Input 3: Closed
Types: 0x61, 0x66
The full message is sent as 6 bytes. For example:
Example Payload Data:
61 19 41 BC 7A E1
Ths translates to Gas Type 0x19 or 25 which is Carbon Monoxide. The value is 23.56 ppb.
The Gas types are listed here:
0x17 - Formaldehyde - HCHO / CH2O |
0x18 - Volatile Organic Compounds |
|
0x19 - Carbon Monoxide - CO |
0x1A - Chlorine - Cl2 |
|
0x1B - Hydrogen - H2 |
0x1C - Hydrogen Sulphide - H2S |
|
0x1D - Hydrogen Chloride – HCl |
0x1E - Hydrogen Cyanide - HCN |
|
0x1F - Hydrogen Fluoride - HF |
0x20 - Ammonia - NH3 |
|
0x21 - Nitrogen Dioxide - NO2 |
0x22 - Oxygen - O2 |
|
0x23 - Ozone - O3 |
0x24 - Sulphur Dioxide - SO2 |
|
0x25 - Hydrogen Bromide – HBr |
0x26 - Bromine – Br2 |
|
0x27 - Fluorine – F2 |
0x28 - Phosphine – PH3 |
|
0x29 - Arsine – AsH3 |
0x2A - Silane – SiH4 |
|
0x2B - Germanium Alkane – GeH4 |
0x2C - Diborane – B2H6 |
|
0x2D - Boron Trifluoride – BF3 |
0x2E - Tungsten Hexafluoride – WF6 |
|
0x2F - Silicon Tetrafluoride – SiF4 |
0x30 - Xenon Difluoride - XeF2 |
|
0x31 - Titanium(IV) Fluoride – TiF4 |
0x32 - Odour/Smell |
|
0x33 - IAQ - Indoor Air Quality (TVOCs) |
0x34 - AQI - Outdoor Air Quality (TVOCs) |
|
0x35 - Nonmethane Hydrocarbons - NMHC |
0x36 - Sulphur Oxides – SOx |
|
0x37 - Nitrogen Oxides – NOx |
0x38 - Nitric Oxide – NO |
|
0x39 - Isobutylene – C4H8 |
0x3A - Propylene Glycol – C3H8O2 |
|
0x3B - Methanethiol – CH4S |
0x3C - Styrene – C8H8 |
|
0x3D - Butane – C4H10 |
0x3E - Butadiene – C4H6 |
|
0x3F - Hexane – C6H14 |
0x40 - Ethylene Oxide – C2H4O |
|
0x41 - Trimethylamine – C3H9N |
0x42 - Dimethylamine – C2H7N |
|
0x43 - Ethyl Alcohol (Ethanol) – C2H6O |
0x44 - Carbon Disulphide – CS2 |
|
0x45 - Ethanethiol – C2H6S |
0x46 - Dimethyl Disulphide – C2H6S2 |
|
0x47 - Ethylene – C2H4 |
0x48 - Methanol – CH3OH |
|
0x49 - Benzene – C6H6 |
0x4A - Paraxylene – C8H10 |
|
0x4B - Toluene – C7H8 |
0x4C - Acetic Acid – CH3COOH |
|
0x4D - Chlorine Dioxide – ClO2 |
0x4E - Hydrogen Peroxide – H2O2 |
|
0x4F - Nitrogen Hydride (Hydrazine) – N2H4 |
0x50 - Ethylenediamine – C2H8N2 |
|
0x51 - Trichloroethylene – C2HCl3 |
0x52 - Trichloromethane (Chloroform) – CHCl3 |
|
0x53 - 1,1,1-Trichloroethane – C2H3Cl3 |
0x54 - Hydrogen Selenide – H2Se |
Types: 0x62, 0x63, 0x64, 0x65
The full message is sent as 6 bytes. The second byte indicates the coupon and sacrificial metal of the sensor.
Example Payload Data:
62 01 44 58 D0 27
The example shows Coupon #1 is Copper and the thickness is 867.252 nanometres (equivalent to 8672.52 Ångströms).
Other Coupon/Metal types are:
| Coupon #1 | Coupon #2 | |
|---|---|---|
0x00 - Unknown Metal / Error |
0x80 - Unknown Metal / Error |
|
0x01 - Copper |
0x81 - Copper |
|
0x02 - Silver |
0x82 - Silver |
|
0x03 - Chromium |
0x83 - Chromium |
Available from v7.16 onwards.
Type: 0x74
The full message is sent as 6 bytes. For example:
Example Payload Data:
74 03 41 BC 7A E1
This translates to Gas Type 0x03 which is Methane. The next four bytes are a floating point (F32) number. In this example the value is 23.56 %LEL(ISO).
The Gas classes are listed here:
0 - 0x00 |
No Gas | 1 - 0x01 |
Hydrogen | |
2 - 0x02 |
Hydrogen Mixture | 3 - 0x03 |
Methane | |
4 - 0x04 |
Light Gas | 5 - 0x05 |
Medium Gas | |
6 - 0x06 |
Heavy Gas | |||
253 - 0xFD |
Unknown Gas | 254 - 0xFE |
Under Range: < -5%LEL | |
255 - 0xFF |
Over Range: >= 110%LEL |
Available from v7.14 onwards.
Type: 0xFE
The fault code messages are used to report a sensor state. Communication or transducer faults may be reported by the sensor. The full message is sent as 5 bytes. The second byte indicates the Sensor-ID, third byte the Fault-Code and the next two are the unsigned 16 bit value.
Available from v7.14 onwards.
Example Payload Data:
FE 1C 01 02 27
The example shows Sensor-ID 0x1C (28 decimal). This is the SPS30 particulate sensor. Fault-Code is 0x01 (1 decimal). This is 'Fan-Speed-Error'. The value is 0x0227 (551 decimal) - this is the number of errors occured since last power-up.
| Fault Code | Name | Value Description |
|---|---|---|
0x01 |
Fan Speed Error | Count. Can occur once per sample |
0x02 |
Laser Fail | Count. Can occur once per sample |
0x03 |
Fan Failure | Count. Can occur once per sample |
Note: These packets are only sent if the count is greater than zero.
Available from v7.16 onwards.
Example Payload Data:
FE 24 35 00 27
The example shows Sensor-ID 0x24 (36 decimal). Fault-Code is 0x35 (53 decimal). This is 'Breath/Humidity Surge'. The value is 0x0027 (39 decimal) - this is the number of errors occured since last powered up.
All the values are a count of the occurence of each condition.
| Fault Code | Name | Value Description |
|---|---|---|
0x01 |
CRC Failed | Transmitted data failed checksum. The message will be retried up to 20 times before the sensor is restarted. |
0x02 |
Bad Parameter | Transmitted parameter failed to be understood. The message will be retried up to 20 times before the sensor is restarted. |
0x05 |
Unknown Cmd | Transmitted command failed to be understood. The message will be retried up to 20 times before the sensor is restarted. |
0x07 |
Incomplete Cmd | Transmitted command failed to be understood. The message will be retried up to 20 times before the sensor is restarted. |
0x21 |
VDD Out of Range | -100%LEL - Power cycle the device. If this error persists, contact support. |
0x22 |
VREF Out of Range | -100%LEL - Contact support. |
0x23 |
Env. Sensor Out of Range | Environment sensor (temp, humidity, pressure) out of range. Return the device to specified operating conditions. |
0x24 |
Env. Sensor Failed | -100%LEL - The sensor was exposed to an extreme environmental condition that can permanently damage it, rendering it unsuitable for accurate readings. As a fail-safe, this error permanently latches the sensor and disables further operation. |
0x25 |
Microcontroller Error | -100%LEL - Contact support. |
0x30 |
Sensor read Negative | -15%LEL - Wait for sensor to return to zero. If message persists >10 minutes, contact support. |
0x31 |
Condensation | Condensation condition exists at sensor (out of specification). Raise temperature and/or lower humidity. |
0x32 |
Sensor Error | -100%LEL - Transducer malfunction. Contact support. |
0x33 |
Gas detected during startup | Sensor has detected flammable gas during start-up period. Re-start sensor in clean air. |
0x34 |
Slow Gas accumulation detected | Sensor has detected a slow accumulation of gas. Re-start sensor in clean air. |
0x35 |
Breath/Humidity Surge | Sensor has detected condition indicative of human breath or humidity surge. Exposure to breath or humidity surges may result in false positive readings. |
0xF9 |
Reply Timeout | Received data time out. The message will be retried up to 20 times before the sensor is restarted. |
0xFA |
Incomplete reply | Received data failed to be understood. The message will be retried up to 20 times before the sensor is restarted. |
0xFB |
CRC error on reply | Received data failed checksum. The message will be retried up to 20 times before the sensor is restarted. |
0xFC |
Sensor restart | Transmit/Receive failed too many times and the sensor was restarted. |
0xFF |
Unknown Status | Unknown status ID received from sensor. |
Note: These packets are only sent if the count is greater than zero.
You can reset these counters with a downlink.
Available from v7.20 onwards.
Example Payload Data:
FE 2D 01 02 27
The example shows Sensor-ID 0x2D (45 decimal). This is the Radon gas sensor. The Fault-Code is 0x01. This is 'Restarts'. The value is 0x0227 (551 decimal) - this is the number of times errors have forced the sensor to restart (power cycle) since last power-up of the device.
| Fault Code | Name | Value Description |
|---|---|---|
0x01 |
Restart | Count. After 7 comms failures the sensor will be power cycled. |
Note: These packets are only sent if the count is greater than zero.
Each enLink end-node device can have optional Key Performance Indicators (KPI) added to the payload message. Each KPI can use 1 or more bytes to send the value according to the following table.
| Type Hex Dec | KPI | Comments | Units | Num Bytes | Format |
|---|---|---|---|---|---|
0x40 064 |
CPU Temperature | Packed Byte. See JS Code | °C | 2 | S16 |
0x41 065 |
Battery Status | 0=Ext Power; 1 - 254 (1.8 - 3.3V); 255=Error | status | 1 | U8 |
0x42 066 |
Battery Voltage | 0 -> 3600 mV (3600=Ext Power) | mV | 2 | U16 |
0x43 067 |
RX RSSI | Received Signal Strength | dBm | 2 | S16 |
0x44 068 |
RX SNR | Received Signal-Noise Ratio | dB | 1 | S8 |
0x45 069 |
RX Count | Downlink message count | count | 2 | U16 |
0x46 070 |
TX Time | Time to send message | ms | 2 | U16 |
0x47 071 |
TX Power | Transmit power | dBm | 1 | S8 |
0x48 072 |
TX Count | Uplink message count | count | 2 | U16 |
0x49 073 |
Power up count | Number of times unit powered up | count | 2 | U16 |
0x4A 074 |
USB insertions count | Number of times USB activated | count | 2 | U16 |
0x4B 075 |
Login OK count | Successful logon count | count | 2 | U16 |
0x4C 076 |
Login fail count | Failed logon count | count | 2 | U16 |
0x4D 077 |
Fan runtime | Total time the air intake fan has run (AIR models only) | seconds | 4 | U32 |
0x4E 078 |
CPU Temperature | New from Ver: 4.9 | °C | 2 | S16 /10 |
Example code for different LoRaWAN Network Servers (LNS) is included in the folders on this site.
Screenshot of example using NodeRED
Downlink payloads are sent to re-configure the device. When the device processes the payload, it acknowledges the message by transmitting an ACK/NACK and the identifier code. This is to notify the user that the message has been received. An example to decode the ACK/NACK messages that are sent from the end-node to the LNS is included in the example decoder source files.
| Header | Msg Len | Command | Value |
|---|---|---|---|
| 1 byte | 1 byte | 1 byte | n bytes |
The header byte is is always 0xA5.
Msg Len is the number of bytes in the settings data. The settings data starts with a Command byte and then the command Value. The Value can be empty.
When the enLink device receives a downlink message, it first checks the port byte value. If this value matches the expected value, it then attempts to decode the message and process the result. By default the expected value is set to All, so it will, in effect, ignore the port value and simple decode and process the message. Only valid port values are allowed, as per the LoRaWAN Specification. These values are 1 to 223.
| Name | Msg Len | Command | Value | Reboot Required? |
|---|---|---|---|---|
| Reboot | 1 | 0xFF |
||
| Send System Information | 1 | 0x00 |
See reply in ACK here | |
| Antenna Gain (v5.12) | 2 | 0x01 |
0 to 25.5 dBi (single byte 0 to 255) Default is 2.0 dBi |
Yes |
| Public Network | 2 | 0x02 |
0/1 (Disable/Enable) |
Yes |
| AppEUI | 9 | 0x05 |
8 Bytes for the EUI | Yes |
| AppKey | 17 | 0x06 |
16 bytes for the Key | Yes |
| Auto Data Rate (ADR) | 2 | 0x07 |
0/1 (Disable/Enable) |
|
| Duty Cycle | 2 | 0x08 |
0/1 (Disable/Enable) |
|
| Message Confirmation | 2 | 0x09 |
0/1 (Disable/Enable) |
|
| Transmit Port | 2 | 0x0A |
1 to 223 (Default is 1) |
|
| Default Data Rate Index | 2 | 0x0B |
1 to 6 (Requires ADR disabled) |
|
| Transmit Interval Index | 2 | 0x0C |
1 to 11 when ATI is available, use 255 (0xFF) to activate it |
|
| Transmit Power Index | 2 | 0x0D |
1 to 6 |
|
| Receive Port | 2 | 0x0E |
0 to 223 (0 indicates All Ports. Default is All) |
|
| Set Join Check Interval (v5.07) | 2 | 0x0F |
1 to 255 hours |
|
| Set Join Check Packet Type (v5.07) | 2 | 0x10 |
0 = 'Standard' or 1 = 'Single Byte' of value 0x00 |
|
| ATI Min TX Interval Index (v5.08) | 2 | 0x11 |
1 to 11 |
|
| ATI Max TX Interval Index (v5.08) | 2 | 0x12 |
1 to 11 |
|
| Disable/Enable KPI values in radio packet | 5 | 0x15 |
0x0000 to 0x3FFF Each bit corresponds to the 14 KPI messages 0x41 to 0x4E |
|
| Disable/Enable KPI values in radio packet: Alternative method | 5 | 0x16 |
First byte is the index: 0 to 14. 0x00 to 0x0E. Index corresponds to the 15 KPI messages 0x40 to 0x4E. Second byte is either off or on, 0x00, 0x01 |
| Name | Msg Len | Command | Value |
|---|---|---|---|
| * Set Full Packet Multiplier (v5.12) | 2 | 0x13 |
1 to 200 |
| ** Set WELL defaults (v5.12) | 2 | 0x14 |
1 |
* Set Full Packet Multiplier is a feature that enables only the CO2 value to be sent every TX interval. Then, every (n x TX Interval), send all the data.
As an example; If the transmit interval is set to 10 minutes, a multiplier value of 6 will transmit a full packet every hour, and only the CO2 value the other 10 minute intervals.
This feature is enabled in firmware forENL-IAQ-Cfor WELL standard, on request.
** This will change the options to:
Transmit Interval: 10 mins
Full Packet Multiplier: 6
Join Check Packet: Single Zero Byte
VOC included data packets: bVOC and IAQ only
Particulates included data packets: PM 2.5 and PM 10.0 onlyThis feature is enabled in firmware for
ENL-IAQ-Cfor WELL standard, on request.
Payload Data:
A5 01 FF
Available from v7.20 onwards.
Payload Data:
A5 01 00
The firmware version is sent in the ACK message and is included in the next payload. If the device includes a plug-in gas sensor, it's serial number is also included in the next uplink.
Payload Data:
A5 02 01 14
Payload Data:
A5 02 09 01
Available from v7.02 onwards.
This uses a bit-map to enable/disable all KPI options in one message.
| Byte 1 - KPI Name (Uplink Type byte) | Byte 2 - KPI Name (Uplink Type byte) | |
|---|---|---|
| Bit 0 - Transmit power (0x47) | Bit 0 - n/a | |
| Bit 1 - Transmit Time (0x46) | Bit 1 - CPU Temperature (0x4E) | |
| Bit 2 - Downlink message count (0x45) | Bit 2 - Air Fan Run Time (0x4D) | |
| Bit 3 - Received SNR (0x44) | Bit 3 - Login Fail Count (0x4C) | |
| Bit 4 - Received RSSI (0x43) | Bit 4 - Login OK Count (0x4B) | |
| Bit 5 - Battery Voltage (0x42) | Bit 5 - USB Insert Count (0x4A) | |
| Bit 6 - Battery Status (0x41) | Bit 6 - Power up count (0x49) | |
| Bit 7 - CPU Temperature (0x40) | Bit 7 - Transmit message count (0x48) |
| Example Setting | Message |
|---|---|
| Include Battery Status and Battery Voltage | A5 03 15 60 00 |
| Include RX RSSI, RX SNR and CPU Temperature (0x4E) | A5 03 15 18 02 |
Available from v7.02 onwards.
This uses a message to enable/disable a single KPI at a time. The message is a simple index byte followed by the disable/enable byte 0x00/0x01.
| Index - KPI Name (Uplink Type Byte) | Index - KPI Name (Uplink Type Byte) | |
|---|---|---|
0x00 - CPU Temperature (0x40) |
0x08 - Transmit message count (0x48) |
|
0x01 - Battery Status (0x41) |
0x09 - Power up count (0x49) |
|
0x02 - Battery Voltage (0x42) |
0x0A - USB Insert Count (0x4A) |
|
0x03 - Received RSSI (0x43) |
0x0B - Login OK Count (0x4B) |
|
0x04 - Received SNR (0x44) |
0x0C - Login Fail Count (0x4C) |
|
0x05 - Downlink message count (0x45) |
0x0D - Air Fan Run Time (0x4D) |
|
0x06 - Transmit Time (0x46) |
0x0E - CPU Temperature (0x4E) |
|
0x07 - Transmit power (0x47) |
| Example Setting | Message |
|---|---|
| Include Battery Status | A5 03 16 01 01 |
| Include Battery Voltage | A5 03 16 02 01 |
| Disable Battery Voltage | A5 03 16 02 00 |
ACK 0x06 - Successfully changed the Message Confirmation Option (0x09)
Return Data:
A5 06 09
ACK 0x06 - Request for System Information - Firmware Version (0x00)
Return Data:
A5 06 00 07 16Shows the firmware is v7.22
NACK 0x15 - failed to change the Transmit Port (0x0A)
Return Data:
A5 15 0A
The Indexes for some settings depend on the region the unit is programmed for.
0x0B - Data Rate Index
| Index | EU868 | Index | US915 Hybrid | Index | AU915 | ||
|---|---|---|---|---|---|---|---|
| 0 | DR0 SF12 BW125 | 0 | DR0 SF10 BW125 | 0 | DR0 SF12 BW125 | ||
| 1 | DR1 SF11 BW125 | 1 | DR1 SF9 BW125 | 1 | DR1 SF11 BW125 | ||
| 2 | DR2 SF10 BW125 | 2 | DR2 SF8 BW125 | 2 | DR2 SF10 BW125 | ||
| 3 | DR3 SF9 BW125 | 3 | DR3 SF7 BW125 | 3 | DR3 SF9 BW125 | ||
| 4 | DR4 SF8 BW125 | 4 | DR4 SF8 BW500 | 4 | DR4 SF8 BW125 | ||
| 5 | DR5 SF7 BW125 | 5 | DR5 SF7 BW125 | ||||
| 6 | DR6 SF8 BW500 |
0x0C - Transmit Interval Index
| Index | Transmit Interval | Message |
|---|---|---|
| 1 | 30 s | A5 02 0C 01 |
| 2 | 1 min | A5 02 0C 02 |
| 3 | 2 min | A5 02 0C 03 |
| 4 | 5 min | A5 02 0C 04 |
| 5 | 10 min | A5 02 0C 05 |
| 6 | 15 min | A5 02 0C 06 |
| 7 | 20 min | A5 02 0C 07 |
| 8 | 30 min | A5 02 0C 08 |
| 9 | 1 hour | A5 02 0C 09 |
| 10 | 2 hours | A5 02 0C 0A |
| 11 | 3 hours | A5 02 0C 0B |
0x0D - Transmit Power Index
| Index | EU868 | Index | US195 Hybrid | Index | AU195 | ||
|---|---|---|---|---|---|---|---|
| 1 | 16 dBm | 6 | 20 dBm | 6 | 20 dBm | ||
| 2 | 14 dBm | 7 | 18 dBm | 7 | 18 dBm | ||
| 3 | 11 dBm | 8 | 16 dBm | 8 | 16 dBm | ||
| 4 | 9 dBm | 9 | 14 dBm | 9 | 14 dBm | ||
| 5 | 8 dBm | 10 | 12 dBm | 10 | 12 dBm | ||
| 6 | 6 dBm | 11 | 10 dBm | 11 | 10 dBm | ||
| 7 | 4 dBm | ||||||
| 8 | 2 dBm |
The following are used in the enLink Air/Air-X
| Name | Msg Len | Command | Value |
|---|---|---|---|
| Case Fan Run Time | 3 | 0x22 |
10 to 600 Seconds (0x000A to 0x0258) |
For example, to set the fan run-time to 30 seconds:
-- Payload Data:A5 03 22 00 1E
Available from v7.06 onwards.
The following is used in the Zone Plus, IAQ and OAQ
| Name | Msg Len | Command | Value | Description |
|---|---|---|---|---|
| Transmit Humidity Data | 2 | 0x51 |
0/1 |
Low/High resolution data |
The humidity data is, by default, transmitted as a single byte. Type is 0x02. From v7.06 you can choose to send the data using the type 0x3B as two bytes. Divide the unsigned 16bit result by 100 to see the humidity value.
For example, set the radio transmission to use high-resolution data:
-- Payload Data:A5 02 51 01
The following are used in the Air, Zone and Zone Plus (with Light Sensor)
| Name | Msg Len | Command | Value | Scaling |
|---|---|---|---|---|
| Lux Scale Parameter | 3 | 0x20 |
0 to 65535 |
/1000 (0xFFFF represents 65.535) |
| Lux Offset Parameter | 3 | 0x21 |
0 to 65535 |
None (0xFFFF represents 65535) |
To scale the lux reading to compensate for the enclosure light pipe, a scaling factor is applied to the sensor value:
Adjusted_Reading = (Sensor_Value x Scale) + Offset
Defaults are:
- Scale = 2.0 (Air), 1.678 (Zone and Zone Plus)
- Offset = 0 (All devices)
For example, set Scale to 12.345 (12345 in hexadecimal is
0x3039):
-- Payload Data:A5 03 20 30 39
Available from v5.12 onwards.
The following are used in devices with the BME680 VOC sensor (Firmware option code V). These options are for setting which data values are included in the transmitted radio packets. Sending smaller radio packets size will reduce battery consumption.
| Name | Msg Len | Command | Value |
|---|---|---|---|
| Include Parameter | 2 | 0x3C |
0x00 to 0x0F as a bit pattern (see below) |
Set the bit value to 1 to include the data value; 0 to exclude it.
- Bit 0 -
Pressure - Bit 1 -
CO2e Estimate - Bit 2 -
bVOC - Bit 3 -
IAQ - Bit 4 - Not used
- Bit 5 - Not used
- Bit 6 - Not used
- Bit 7 - Not used
For example, to include the
bVOCandIAQdata values:
-- Payload Data:A5 02 3C 0C
Include Parameter available from v6.02 onwards.
Cleaning trigger available from v7.11 onwards.
The following are used in devices with the ZMOD4410 indoor TVOC sensor (Firmware option code I). These options are for setting which data values are included in the transmitted radio packets. Sending smaller radio packets size will reduce battery consumption. There is a standard and a PBAQ option with this sensor.
| Name | Msg Len | Command | Value |
|---|---|---|---|
| Include Parameter | 2 | 0x42 |
0x00 to 0x1F as a bit pattern (see below) |
| Trigger Cleaning Cycle | 2 | 0x53 |
0x01 |
Set the bit value to 1 to include the data value; 0 to exclude it.
- Bit 0 -
Minimum TVOC - Bit 1 -
Average TVOC - Bit 2 -
Maximum TVOC - Bit 3 -
Latest EtOH reading(Ethanol equivalent) - Bit 4 -
Latest IAQ reading(Included onPBAQversion from v7.11) - Bit 5 - Not used
- Bit 6 - Not used
- Bit 7 - Not used
Note: The Minimum, Average and Maximum are calculated between radio transmissions. The
PBAQversion samples every 5 seconds.
Examples:
To include the
Maximum TVOCand theLatest EtOH readingdata values:
-- Payload Data:A5 02 42 0C
To trigger a 'one-time-only' cleaning cycle of the sensor:
-- Payload Data:A5 02 53 01
Enable/Disable available from v7.04 onwards.
Cleaning trigger available from v7.11 onwards.
This sensor is used in IAQ/OAQ and with Air/Air-X units.
This single sensor can be used as an outdoor EPA sensor (Firmware option code D) and/or Ozone sensor (Firmware code O3)
| Name | Msg Len | Command | Value |
|---|---|---|---|
| Disable/Enable Sensor | 2 | 0x50 |
0x00/0x01 |
| Trigger Cleaning Cycle | 2 | 0x52 |
0x01 |
Example:
To enable the sensor:
-- Payload Data:A5 02 50 01
To trigger a 'one-time-only' cleaning cycle of the sensor (Only works when sensor is enabled):
-- Payload Data:A5 02 52 01
The following are used in devices with CO2 sensor
| Name | Msg Len | Command | Value |
|---|---|---|---|
| Enable/Disable Auto-Calibration | 2 | 0x24 |
0/1 (Disable/Enable) |
| Set Target CO2 Level | 3 | 0x25 |
100 to 1000 ppm (0x0064 to 0x03E8) |
| Set to Known CO2 Level | 3 | 0x26 |
10 to 2000 ppm (0x000A to 0x07D0) |
| Reset to factory Calibration Only Sunrise model |
1 | 0x27 |
|
| Set Regular Auto-Cal Interval | 3 | 0x28 |
24 to 8760 hours (0x0018 to 0x2238) |
| Set the Out-of-Bounds limits Only GSS model |
3 | 0x29 |
10 to 5000 ppm (0x000A to 0x1388) |
| Set initial auto-cal interval Only GSS model |
3 | 0x2A |
1 to 8760 hours (0x0001 to 0x2238) |
| Example Setting | Message |
|---|---|
| Enable Auto-Calibration | A5 02 24 01 |
| Set the auto-calibration target to 450ppm | A5 03 25 01 C2 |
Set the sensor to known CO2 concentration of 780ppm (0x030C) |
A5 03 26 03 0C |
| To reset the sensor back to factory calibration (Sunrise Only) | A5 01 27 |
Set the auto-calibration interval to 10 days (240 hours, 0x00F0) |
A5 03 28 00 F0 |
Available from v7.15 onwards. The following are used in devices with the STHS34PF80 sensor. Firmware code 'H'.
| Name | Msg Len | Command | Value |
|---|---|---|---|
| Set presence threshold | 3 | 0x54 |
0 to 32767 (0x0000 to 0x7FFF) |
| Set presence hysteresis | 2 | 0x55 |
0 to 255 (0x00 to 0xFF) |
| Set the inactivity timeout | 3 | 0x56 |
0 to 21600 (0x0000 to 0x5460) |
| Set the detection count and duration time to zero | 1 | 0x57 |
|
| Reboot/Reset the sensor | 1 | 0x58 |
| Example Setting | Message |
|---|---|
| Set the presence threshold to 200 | A5 03 54 00 C8 |
| Set the presence hysteresis to 50 | A5 02 55 32 |
| Set the inactivity timeout to 25 minutes (1500 seconds) | A5 03 56 05 DC |
| Zero the count and duration variables | A5 01 57 |
| Reset the sensor | A5 01 58 |
Available from v5.03 onwards.
The following are used in devices with SPS30 particulate sensors.
| Name | Msg Len | Command | Value |
|---|---|---|---|
| Enable and set fan run period (Sample time) | 2 | 0x2B |
3 to 180 Seconds (0x03 to 0xB4) 0 disables the sensor. (from v7.16) |
| Set cleaning interval | 3 | 0x2C |
6 to 1440 hours (0x0006 to 0x05A0) |
| Message Include Parameter (from v5.12) | 3 | 0x3D |
0x0000 to 0xFFFF as a bit pattern (see below) |
'Message Include' is for setting which data values are included in the transmitted radio packets. Sending smaller radio packets size will reduce battery consumption.
| Example Setting | Message |
|---|---|
| Set the fan run period to 35 seconds | A5 02 2B 23 |
| Disable the SPS30 sensor (save power) | A5 02 2B 00 |
Set the cleaning interval to 8 days (192 hours, 0x00C0) |
A5 03 2C 00 C0 |
For the 'Message Include' settings, you should set the bit value to 1 to include the data value; 0 to exclude it.
PM = Particle Mass
PC = Particle Count
| Byte 1 | Byte 2 | |
|---|---|---|
Bit 0 - PM 1.0 |
Bit 0 - PC 10.0 |
|
Bit 1 - PM 2.5 |
Bit 1 - Typical Particle Size |
|
Bit 2 - PM 4.0 |
Bit 2 - Not used | |
Bit 3 - PM 10.0 |
Bit 3 - Not used | |
Bit 4 - PC 0.5 |
Bit 4 - Not used | |
Bit 5 - PC 1.0 |
Bit 5 - Not used | |
Bit 6 - PC 2.5 |
Bit 6 - Not used | |
Bit 7 - PC 4.0 |
Bit 7 - Not used |
Example:
To include
PM 10.0,PM 2.5andTypical Particle Sizedata values:
-- Payload Data:A5 03 3D 0A 02
| Name | Msg Len | Command | Value |
|---|---|---|---|
| Set fan run period (Sample time) | 2 | 0x2B |
3 to 180 Seconds (0x03 to 0xB4) |
| Set cleaning interval | 3 | 0x2C |
6 to 1440 hours (0x0006 to 0x05A0) |
| Message Include Parameter (from v5.12) | 3 | 0x3E |
0x0000 to 0xFFFF as a bit pattern (see below) |
'Message Include' is for setting which data values are included in the transmitted radio packets. Sending smaller radio packets size will reduce battery consumption.
| Example Setting | Message |
|---|---|
| Set the fan run period to 35 seconds | A5 02 2B 23 |
Set the cleaning interval to 8 days (192 hours, 0x00C0) |
A5 03 2C 00 C0 |
For the 'Message Include' settings, you should set the bit value to 1 to include the data value; 0 to exclude it.
PM = Particle Mass
PC = Particle Count
| Byte 1 | Byte 2 | |
|---|---|---|
Bit 0 - PM 0.1 |
Bit 0 - PC 0.1 |
|
Bit 1 - PM 0.3 |
Bit 1 - PC 0.3 |
|
Bit 2 - PM 0.5 |
Bit 2 - PC 0.5 |
|
Bit 3 - PM 1.0 |
Bit 3 - PC 1.0 |
|
Bit 4 - PM 2.5 |
Bit 4 - PC 2.5 |
|
Bit 5 - PM 5.0 |
Bit 5 - PC 5.0 |
|
Bit 6 - PM 10.0 |
Bit 6 - PC 10.0 |
|
| Bit 7 - Not used | Bit 7 - Not used |
To include
PM 10.0,PM 2.5,PM 1.0,PM 0.5andPC 1.0data values:
-- Payload Data:A5 03 3E 59 08
Available from v5.07 onwards.
The following are used in devices with a Gas sensor (Option Code 'G')
| Name | Msg Len | Command | Value |
|---|---|---|---|
| Set Idle State | 2 | 0x2D |
0/1/2 Powered Off/Sleep/Powered On |
| Set Preamble Delay | 2 | 0x2E |
2 to 240 seconds (0x02 to 0xF0) |
| Set Number of Reads per Sample | 2 | 0x2F |
1 to 60 (0x01 to 0x3C) |
| Set Read Interval | 2 | 0x30 |
1 to 60 seconds (0x01 to 0x3C) |
| Set Aggregation Method | 2 | 0x31 |
0 to 3 None/Min/Avg/Max |
| Set the EMA (smoothing) Factor | 2 | 0x32 |
1 to 100 (0x01 to 0x64) |
| Set trim value for ppb reading | 2 | 0x33 |
-100 to 100 (0x9C to 0x64) |
| Set trim value for µg/m³ reading | 2 | 0x34 |
-100 to 100 (0x9C to 0x64) |
Available from v5.08 onwards.
The following are used in the enLink Status Leak Sensor.
| Name | Msg Len | Command | Value |
|---|---|---|---|
| Alarm Mode | 2 | 0x35 |
0/1/2 Off/High Threshold/Low Threshold |
| High Alarm Level | 3 | 0x36 |
0 to 5000 kOhms (0x0000 to 0x1388) |
| High Alarm Hysteresis | 3 | 0x37 |
0 to 300 kOhms (0x0000 to 0x012C) |
| Low Alarm Level | 3 | 0x38 |
0 to 5000 kOhms (0x0000 to 0x1388) |
| Low Alarm Hysteresis | 3 | 0x39 |
0 to 300 kOhms (0x0000 to 0x012C) |
| Sample Interval | 3 | 0x3A |
10 to 7200 seconds (0x000A to 0x1C20) |
| Test Duration (v5.12) | 2 | 0x3B |
1 to 20 minutes (0x01 to 0x14) |
Note: All options are shown. However, for the supplied leak cable, the Alarm Mode should be set to Low Threshold (2). Low alarm level to 1000 kOhms with a Low hysteresis of 100 kOhms.
| Example Setting | Message |
|---|---|
| Mode = Low Threshold | A5 02 35 02 |
| Low Alarm Level = 1000 kOhm | A5 03 38 03 E8 |
| Low Hysteresis = 100 kOhm | A5 03 39 01 2C |
| Sample Interval = 3 minutes | A5 03 3A 00 B4 |
Available from v5.14 onwards.
The following over-the-air settings are used for the enLink Status Differential Pressure / Airflow device.
| Name | Msg Len | Command | Value |
|---|---|---|---|
| Values to include in Radio Packets | 2 | 0x3F |
0/1/2 Pressure Only/Air flow Only/Both |
| Zero reading (auto delta) | 1 | 0x40 |
|
| Set Delta Offset | 5 | 0x41 |
Floating point value |
Note: When the device receives a
Zero readingdownlink message it performs a measurement and uses the result as a delta offset value, effectively causing the reading to be zero.
| Example Setting | Message |
|---|---|
| Only transmit pressure value | A5 02 3F 00 |
| Zero the reading | A5 01 40 |
Set delta offset to -1.234 |
A5 05 41 BF 9D F3 B6 |
For an online value converter, see Hex to Float Converter
Available from v7.01 onwards.
The following are used in the Zone View product that includes an e-paper display.
| Name | Msg Len | Command | Value |
|---|---|---|---|
| Screen Refresh Interval | 2 | 0x43 |
5 to 30 minutes |
| Top line of display | 2 | 0x44 |
0/1 Temperature or Humidity |
| Temperature Units | 2 | 0x45 |
0/1 Celsius or Fahrenheit |
| Comfort Indicator | 2 | 0x46 |
0/1/2 None/Face/House |
| Comfort Indicator Location | 2 | 0x47 |
0/1 Left or Right |
| Comfort Indicator Status logic based on | 2 | 0x48 |
0/1 Internal rH Sensor/Downlink Message |
| Comfort Indicator Status | 2 | 0x49 |
0/1/2/3 None/Dry/Humid/Damp |
| Internal Sensor Logic - Low Threshold | 2 | 0x4A |
10 to 70 %rH - Below this is Dry |
| Internal Sensor Logic - High Threshold | 2 | 0x4B |
30 to 90 %rH - Above this is Damp |
| Help Screen | 2 | 0x4C |
0/1 Disable/Enable |
| Set text for information screens (* use this field for the text index. 0x00 to 0x03 for the 4 information screens. 0x04 for Help text.) |
* | 0xD0 |
Hexadecimal values for ASCII Text. See example, below. |
| Set text to default | 2 | 0xD1 |
Use this field for the text index. 0x00 to 0x03 for the 4 information screens. 0x04 for Help text. |
| Example Setting | Message |
|---|---|
| To set the display refresh interval to 10 minutes | A5 02 43 0A |
To set the comfort icon logic to use a downlink message (0x49) |
A5 02 48 01 |
Show the comfort icon as Humid |
A5 02 49 02 |
| Enable the Help Screen (Disabled by default) | A5 02 4C 01 |
Set the text for the Damp (index 0x03) comfort icon as Hello World |
A5 03 D0 48 65 6C 6C 6F 20 57 6F 72 6C 64 |
Set the text for the Damp (index 0x03) to default |
A5 04 D1 03 |
Set the text for the Dry (index 0x01) to default |
A5 04 D1 01 |
Be aware of the maximum message size for the 'Set Text' feature. You can send a downlink up to 242 bytes at SF7 for EU868. Look out for downlink failures for your Region and Data Rates.
See the device configuration screens via the USB connection for more information on formatting screen messages.
Available from v7.16 onwards.
The following is used in products that include a flammable gas sensor.
| Name | Msg Len | Command | Value |
|---|---|---|---|
| Set condition counters to zero | 1 | 0x59 |
| Example Setting | Message |
|---|---|
| To set all the counters to zero | A5 01 59 |
Available from v7.20 onwards.
The following is used in products that include a radon gas sensor.
| Name | Msg Len | Command | Value |
|---|---|---|---|
| Reset sensor options | 2 | 0x5A |
1 - Reset Sensor, 2 - Reset fault code counter only |
| Set read interval | 2 | 0x5B |
1 to 240 minutes |
| Example Setting | Message |
|---|---|
| To reset the radon sensor (power cycle) | A5 02 5A 01 |
| To reset the fault code count | A5 02 5A 02 |
| Set read interval to 10 minutes (default) | A5 02 5B 0A |
| Set read interval to 60 minutes | A5 02 5B 3C |
Examples for decoding these messages are included in the folders on this site. These include all the sensor options to give basic decoding to enable feedback during evaluation and commissioning. If you require these messages in your system, please modify the code to suit your platform.