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.
- 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)
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.
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.
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)
0175640367E80004685C077D9001087D320009739427Decoded JSON
{ "battery": 100, "temperature": 23.2, "humidity": 46, "co2": 400, "tvoc": 50, "pressure": 1013.2 }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.
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
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.
Your contact
Timo Wevelsiep
Founder, merkaio
15 minutes, no commitment, directly with Timo.
Decoder for ChirpStack v4. merkaio is an independent integrator and is not affiliated with Milesight.