Milesight AM107: 7-in-1 LoRaWAN Indoor Air Quality Sensor

Milesight AM107 7-in-1 LoRaWAN IAQ sensor: own ChirpStack/ThingsBoard decoder, decoded example, CO2 and TVOC monitoring for offices and schools.

AM107Sensor
LoRaWAN
Class A, OTAA
Band / port
EU868 / port 85
Sensors
7-in-1: CO2, TVOC, temp, humidity, light, pressure, PIR
CO2 range
0 to 5000 ppm (NDIR)
Display
E-ink screen with live values
Power
2x AA batteries, up to 1 year
Configuration
NFC (Milesight ToolBox)
Measurements

What the AM107 measures

CO2

NDIR sensor, 0 to 5000 ppm, the key indicator for ventilation.

Temperature & humidity

Comfort tracking, temperature in 0.1 C steps, humidity in 0.5 % steps.

TVOC

Total volatile organic compounds as an air-freshness index.

Barometric pressure

Ambient pressure in hPa, reported in 0.1 hPa steps.

Light & PIR

Illumination level plus motion activity for occupancy context.

Data into your dashboard

Integration

Sensor / controller

Measures or controls in the field and sends LoRaWAN uplinks.

LoRaWAN gateway

Receives the radio packets and forwards them to the server.

ChirpStack

Network server: manages sessions and decodes the payload.

ThingsBoard / Grafana

Dashboards, alarms, rules and reports.

ChirpStack v4 · decodeUplink
function decodeUplink(input) {
  var bytes = input.bytes;
  var data = {};

  for (var i = 0; i < bytes.length; ) {
    var channel = bytes[i++];
    var type = bytes[i++];

    if (channel === 0x01 && type === 0x75) {          // battery (%)
      data.battery = bytes[i]; i += 1;
    } else if (channel === 0x03 && type === 0x67) {   // temperature (C)
      data.temperature = readInt16LE(bytes, i) / 10; i += 2;
    } else if (channel === 0x04 && type === 0x68) {   // humidity (%RH)
      data.humidity = bytes[i] / 2; i += 1;
    } else if (channel === 0x05 && type === 0x6a) {   // PIR activity
      data.activity = readUInt16LE(bytes, i); i += 2;
    } else if (channel === 0x06 && type === 0x65) {   // light (lux + IR)
      data.illumination = readUInt16LE(bytes, i);
      data.infrared_and_visible = readUInt16LE(bytes, i + 2);
      data.infrared = readUInt16LE(bytes, i + 4); i += 6;
    } else if (channel === 0x07 && type === 0x7d) {   // CO2 (ppm)
      data.co2 = readUInt16LE(bytes, i); i += 2;
    } else if (channel === 0x08 && type === 0x7d) {   // TVOC
      data.tvoc = readUInt16LE(bytes, i); i += 2;
    } else if (channel === 0x09 && type === 0x73) {   // pressure (hPa)
      data.pressure = readUInt16LE(bytes, i) / 10; i += 2;
    } else {
      break;
    }
  }
  return { data: data };
}

function readInt16LE(b, i) {
  var v = (b[i + 1] << 8) | b[i];
  return v > 0x7fff ? v - 0x10000 : v;
}

function readUInt16LE(b, i) {
  return ((b[i + 1] << 8) | b[i]) & 0xffff;
}

Implemented from the published Milesight byte specification (Communication Protocol / User Guide).

Channel format: 01 75 battery (%), 03 67 temperature (INT16 little-endian, /10), 04 68 humidity (/2), 05 6a PIR activity (UINT16), 06 65 light (6 bytes: illumination, IR+visible, IR), 07 7d CO2 (ppm), 08 7d TVOC, 09 73 pressure (UINT16, /10 hPa). Implemented from the published Milesight byte specification. For ThingsBoard the same channel logic goes into an uplink converter.

Uplink (hex)

0175640367E80004685C077D9001087D320009739427

Decoded JSON

{ "battery": 100, "temperature": 23.2, "humidity": 46, "co2": 400, "tvoc": 50, "pressure": 1013.2 }
From the field

Configuration & pitfalls

CO2 warm-up

The NDIR sensor needs a short warm-up after power-on, so the first readings can be off. Discard the first uplinks before alerting.

ABC calibration

Automatic baseline calibration assumes the room reaches fresh-air CO2 regularly. In rooms occupied around the clock, switch to manual calibration so the baseline does not drift.

NFC setup

Reporting interval, thresholds and which of the seven sensors are enabled are set over NFC with the Milesight ToolBox before rollout.

Battery vs reporting rate

The 1-year life on 2 AA cells assumes a moderate interval. Frequent CO2 reporting and the e-ink refresh shorten it, so balance the interval against runtime.

Your partner

How merkaio supports your AM107

From sourcing to day-to-day operation, all from one partner on our own European infrastructure.

Pre-staging & provisioning

We configure the AM107, set keys, intervals and alarms, and ship it ready to deploy.

Own decoder

Payload codec for ChirpStack v4 and ThingsBoard, implemented from the Milesight specification.

Dashboard integration

Data lands in your ThingsBoard or Grafana, with alarms and reports.

Operations & monitoring

We run the LoRaWAN stack and dashboards on European infrastructure, you just use the data.

Frequently asked questions

Yes. It is a standard LoRaWAN device, no Milesight gateway or cloud required. You add the codec to the device profile and provision it via OTAA.
Yes, for both ChirpStack and ThingsBoard, implemented from the published Milesight byte specification. The same channel logic goes into a ThingsBoard uplink converter.
Seven in one housing: CO2, TVOC, temperature, humidity, light, barometric pressure and a PIR motion sensor, with the live values shown on an e-ink screen.
It is a Class A device on LoRaWAN port 85. Each uplink can carry the enabled measurements; the battery level is reported periodically rather than on every uplink.
It runs on 2 AA batteries for up to one year, depending on the reporting interval, how many sensors are enabled and how often the e-ink screen refreshes.
Yes. Over NFC with the Milesight ToolBox you can enable or disable individual sensors, which keeps payloads small and extends battery life.
From the same series

Related devices

Let's discuss your infrastructure. Digital and on-site.

Whether it's IoT platform development, hardware selection, managed hosting for ChirpStack, ThingsBoard, Grafana or NetBird VPN, or migration from a self-hosted setup - we'll find the right solution for your use case. Book a free 30-minute consultation, no commitment required.

Timo Wevelsiep

Your contact

Timo Wevelsiep

Founder, merkaio

15 minutes, no commitment, directly with Timo.

By submitting, you agree to our Privacy Policy.

Decoder for ChirpStack v4. merkaio is an independent integrator and is not affiliated with Milesight.