Milesight TS101: LoRaWAN Insertion Temperature Sensor
Milesight TS101 LoRaWAN insertion temperature probe: own ChirpStack/ThingsBoard decoder, decoded example, abrupt-change alarms and cold-chain integration.
- LoRaWAN
- Class A, OTAA
- Band / port
- EU868 / port 85
- Probe
- 316 stainless steel, food-grade, 400 mm
- Temperature
- -30 to +70 °C, +/-0.5 °C typ.
- Ingress / impact
- IP67, IK10 transceiver
- Battery
- 4000 mAh ER18505, up to 10 years
- Configuration
- NFC (Milesight ToolBox)
What the TS101 measures
Temperature
Insertion probe, -30 to +70 °C, 0.1 °C resolution, +/-0.5 °C typical accuracy.
Abrupt-change alarm
Mutation alarm on a fast temperature jump, sent immediately outside the interval.
Threshold alarm
Below, above, between or outside a configured band, with the triggering value.
Battery level
Reported periodically as a percentage, with local storage and retransmission.
History buffer
Up to 1200 timestamped entries stored locally and replayed after a network gap.
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 === 0xff) { // device info on join / power-on
i += deviceInfoLen(type);
} else if (channel === 0x01 && type === 0x75) { // battery (%)
data.battery = bytes[i]; i += 1;
} else if (channel === 0x03 && type === 0x67) { // temperature (deg C)
data.temperature = readInt16LE(bytes, i) / 10; i += 2;
} else if (channel === 0x83 && type === 0x67) { // threshold alarm
data.temperature = readInt16LE(bytes, i) / 10;
data.alarm = readAlarm(bytes[i + 2]); i += 3;
} else if (channel === 0x93 && type === 0xd7) { // mutation (abrupt-change) alarm
data.temperature = readInt16LE(bytes, i) / 10;
data.temperature_mutation = readInt16LE(bytes, i + 2) / 100;
data.alarm = readAlarm(bytes[i + 4]); i += 5;
} else if (channel === 0x20 && type === 0xce) { // history: ts + temperature
data.history = data.history || [];
data.history.push({
timestamp: readUInt32LE(bytes, i),
temperature: readInt16LE(bytes, i + 4) / 10
});
i += 6;
} else {
break;
}
}
return { data: data };
}
function readInt16LE(b, i) {
var v = (b[i + 1] << 8) | b[i];
return v > 0x7fff ? v - 0x10000 : v;
}
function readUInt32LE(b, i) {
return ((b[i+3]<<24)|(b[i+2]<<16)|(b[i+1]<<8)|b[i]) >>> 0;
}
function readAlarm(v) {
var map = { 0: "release", 1: "threshold", 2: "mutation" };
return map[v] !== undefined ? map[v] : v;
}
function deviceInfoLen(type) {
// 0xFF info segments (protocol/hw/fw/SN/class); lengths are firmware-specific
if (type === 0x16) return 8; // serial number
if (type === 0x09 || type === 0x0a || type === 0xff) return 2;
return 1;
}
Implemented from the published Milesight byte specification (Communication Protocol / User Guide).
Channel format: 01 75 battery (%), 03 67 temperature (INT16 little-endian, /10). A threshold alarm arrives on 83 67 with an extra alarm byte, an abrupt-change (mutation) alarm on 93 D7 with the mutation delta. History uplinks on 20 CE carry a UINT32 timestamp plus temperature. The 0xFF device-info block appears on join and power-on. Implemented from the published Milesight byte specification; for ThingsBoard the same channel logic goes into an uplink converter.
Uplink (hex)
01755C0367E000Decoded JSON
{ "battery": 92, "temperature": 22.4 }Use cases
Cold-chain monitoring
Insertion probe in product cores or tanks with HACCP-style logging and alarms.
MoreStack & compost heat
Detect self-heating in tobacco stacks, hay or compost with abrupt-change alarms.
Process & pipe temperature
Inline liquid and pipe temperature for utilities and food processing.
MoreConfiguration & pitfalls
NFC setup
Keys, reporting interval and alarm thresholds are set over NFC with the Milesight ToolBox before rollout. The probe needs no wiring.
Abrupt-change alarm
The mutation alarm fires on a fast temperature jump, independent of absolute thresholds. Treat 93 D7 uplinks as priority events in dashboard rules.
Probe placement
The 400 mm 316 stainless probe must sit in the product core or flow it measures. A poorly inserted probe reads ambient air, not the medium.
History replay
Up to 1200 entries are buffered locally and replayed after a network gap, so the ingest path must accept the 20 CE history channel, not only live readings.
How merkaio supports your TS101
From sourcing to day-to-day operation, all from one partner on our own European infrastructure.
Pre-staging & provisioning
We configure the TS101, 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.