Milesight TS201: LoRaWAN Temperature Probe (DS18B20)
Milesight TS201 LoRaWAN temperature probe (DS18B20): own ChirpStack/ThingsBoard decoder, decoded example, threshold alarms, cold-chain integration.
- LoRaWAN
- v1.0.3 Class A, OTAA / ABP
- Band / port
- EU868 / port 85
- Probe
- Detachable DS18B20, 1.5 m cable, 50 mm tip
- Temperature
- -40 to +125 °C, ±0.5 °C (-10 to +85 °C)
- Resolution
- 0.1 °C
- Local storage
- 4000 records, retransmission
- Battery
- 2700 mAh ER14505 Li-SOCl₂, up to ~9 years
What the TS201 measures
Temperature
Detachable DS18B20 probe, -40 to +125 °C, reported as INT16 little-endian scaled by /10.
Battery level
Percentage value, reported periodically alongside readings.
Threshold alarm
Dedicated alarm channel fires immediately when a configured limit is crossed.
Abrupt change alarm
Mutation channel reports a sudden temperature jump with the change magnitude.
Probe fault status
Channel B3 67 flags a read error or an out-of-range reading when the DS18B20 probe is faulty or disconnected.
History records
Up to 4000 timestamped records stored on device and retransmitted after an outage.
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 === 0x83 && type === 0x67) { // threshold alarm
data.temperature = readInt16LE(bytes, i) / 10;
data.temperature_alarm = readAlarm(bytes[i + 2]); i += 3;
} else if (channel === 0x93 && type === 0x67) { // abrupt change alarm
data.temperature = readInt16LE(bytes, i) / 10;
data.temperature_mutation = readInt16LE(bytes, i + 2) / 10;
data.temperature_alarm = readAlarm(bytes[i + 4]); i += 5;
} else if (channel === 0xb3 && type === 0x67) { // probe sensor status
data.temperature_sensor_status = readSensorStatus(bytes[i]); i += 1;
} else if (channel === 0xff) { // device info (skip)
break;
} else {
break;
}
}
return { data: data };
}
function readInt16LE(b, i) {
var v = (b[i + 1] << 8) | b[i];
return v > 0x7fff ? v - 0x10000 : v;
}
function readAlarm(v) {
var m = { 0: "threshold alarm release", 1: "threshold alarm", 2: "mutation alarm" };
return m[v] !== undefined ? m[v] : v;
}
function readSensorStatus(v) {
var m = { 0: "read error", 1: "out of range" };
return m[v] !== undefined ? m[v] : v;
}
Implemented from the published Milesight byte specification (Communication Protocol / User Guide).
Channel format: 01 75 battery (%), 03 67 temperature (INT16 little-endian, /10). Alarm uplinks use channel 83 67 (threshold, +1-byte alarm flag) and 93 67 (abrupt change, +2-byte mutation value +1-byte alarm flag); the flag maps 0 to threshold release, 1 to threshold alarm, 2 to mutation alarm. Channel B3 67 reports a probe fault (0 read error, 1 out of range). Device-info segments on channel FF (version, serial number) appear in the first uplink after a join; extend the loop if you store them. Built from the published Milesight byte specification. For ThingsBoard the same channel logic goes into an uplink converter.
Uplink (hex)
01756403671C01Decoded JSON
{ "battery": 100, "temperature": 28.4 }Use cases
Cold-chain monitoring
EN12830-certified temperature logging for food and pharma with threshold alarms.
MorePharmacy refrigerators
Probe sits inside the fridge while the transmitter stays outside the cold zone.
MoreServer room & archive
Spot temperature monitoring of critical rooms with instant alerts.
MoreConfiguration & pitfalls
NFC setup
Keys, reporting interval and threshold alarms are set over NFC with the Milesight ToolBox app before rollout.
Detachable probe
The DS18B20 probe unplugs for self-calibration and replacement. Document the probe serial so a swap stays traceable on the dashboard.
Threshold and mutation alarms
Threshold (83 67) and abrupt-change (93 67) alarms are sent immediately, outside the reporting interval. Treat them as priority events in dashboard rules.
Probe placement
Keep the transmitter body outside the cold zone and route only the 1.5 m probe inside, so the battery and radio stay in a stable temperature.
How merkaio supports your TS201
From sourcing to day-to-day operation, all from one partner on our own European infrastructure.
Pre-staging & provisioning
We configure the TS201, 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.