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.

Milesight TS101
TS101Sensor
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)
Measurements

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.

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 === 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)

01755C0367E000

Decoded JSON

{ "battery": 92, "temperature": 22.4 }
From the field

Configuration & 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.

Your partner

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

Yes. It is a standard LoRaWAN Class A 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.
The insertion probe measures -30 to +70 °C with 0.1 °C resolution and a typical accuracy of +/-0.5 °C, suitable for cold-chain, stack-heat and process monitoring.
Beside the normal below/above/between/outside threshold alarm, the TS101 sends a mutation alarm when the temperature jumps quickly, which is useful for detecting self-heating in stacks or compost before a fixed threshold is crossed.
It ships with a replaceable 4000 mAh ER18505 Li-SOCl2 battery rated up to ten years, depending on the reporting interval and spreading factor you configure.
Yes. It stores up to 1200 timestamped entries locally and retransmits them once the link returns, so make sure your ingest path accepts the history channel as well as live uplinks.
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.