Milesight EM410-RDL: LoRaWAN Radar Distance & Level Sensor

Milesight EM410-RDL 60GHz radar level sensor: own ChirpStack/ThingsBoard decoder, decoded example, distance and blind-zone alarms, tank-level integration.

Milesight EM410-RDL
EM410-RDLSensor
LoRaWAN
Class A, OTAA/ABP
Band / port
EU868 / port 85
Radar
60 GHz mmWave, 8° beam angle
Measuring range
0.3 to 12 m, blind zone alarm
Accuracy / resolution
up to ±2 mm / 1 mm
Ingress protection
IP68 (1 m underwater, 48 h)
Battery
19000 mAh ER34615 Li-SOCl2, up to 7 years
Measurements

What the EM410-RDL measures

Distance

Non-contact radar distance to the surface, 0.3 to 12 m, reported in millimetres.

Temperature

On-board temperature in °C, useful for compensating and for cold environments.

Distance alarms

Threshold, change (mutation) and blind-zone alarms sent immediately as event uplinks.

Radar signal strength

Reflected signal RSSI to judge target quality and mounting.

Battery level

Reported periodically so you can plan replacements ahead of time.

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 = { events: [] };

  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 === 0x82) {   // distance (mm)
      data.distance = readInt16LE(bytes, i); i += 2;
    } else if (channel === 0x05 && type === 0x00) {   // position (0 normal / 1 tilt)
      data.position = bytes[i] === 0 ? "normal" : "tilt"; i += 1;
    } else if (channel === 0x06 && type === 0xc7) {   // radar signal RSSI
      data.radar_signal_rssi = readInt16LE(bytes, i) / 100; i += 2;
    } else if (channel === 0x84 && type === 0x82) {   // distance threshold alarm (2B distance + 1B status)
      var d = readInt16LE(bytes, i);
      data.distance = d;
      data.events.push({ distance: d, distance_alarm: readDistanceAlarm(bytes[i + 2]) });
      i += 3;
    } else if (channel === 0x94 && type === 0x82) {   // distance mutation alarm (2B distance + 2B mutation + 1B status)
      var dm = readInt16LE(bytes, i);
      data.distance = dm;
      data.events.push({
        distance: dm,
        distance_mutation: readInt16LE(bytes, i + 2),
        distance_alarm: readDistanceAlarm(bytes[i + 4])
      });
      i += 5;
    } else if (channel === 0xb4 && type === 0x82) {   // distance exception / blind-spot alarm (2B distance + 1B status)
      var raw = (bytes[i + 1] << 8) | bytes[i];
      var ev = { distance_exception: readDistanceException(bytes[i + 2]) };
      if (raw !== 0xfffd && raw !== 0xffff) { ev.distance = readInt16LE(bytes, i); }
      data.events.push(ev);
      i += 3;
    } else {
      break;
    }
  }
  if (data.events.length === 0) { delete data.events; }
  return { data: data };
}

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

function readDistanceAlarm(v) {
  if (v === 0) return "threshold alarm release";
  if (v === 1) return "threshold alarm";
  if (v === 2) return "mutation alarm";
  return "alarm " + v;
}

function readDistanceException(v) {
  if (v === 0) return "blind spot alarm release";
  if (v === 1) return "blind spot alarm";
  if (v === 2) return "no target";
  if (v === 3) return "sensor exception";
  return "exception " + v;
}

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

Channel format: 01 75 battery (%), 03 67 temperature (INT16 little-endian, /10), 04 82 distance (INT16, mm), 05 00 position (0 normal / 1 tilt), 06 C7 radar signal RSSI (INT16, /100). Event uplinks use 84 82 (distance threshold alarm, 2-byte distance plus a status byte where 0 is threshold release, 1 is threshold alarm, 2 is mutation), 94 82 (distance mutation alarm, distance plus a 2-byte mutation value plus the same status byte) and B4 82 (distance exception / blind-spot alarm, where the status byte is 0 release, 1 blind spot, 2 no target, 3 sensor exception). The device also sends history (channel 20 CE) and downlink-response frames (FF/FE/F8/F9) that this base decoder skips. Channel ids, types and scaling follow the published Milesight byte specification. For ThingsBoard the same channel logic goes into an uplink converter.

Uplink (hex)

0175630367E80004826205

Decoded JSON

{ "battery": 99, "temperature": 23.2, "distance": 1378 }
From the field

Configuration & pitfalls

Mounting & blind zone

Mount the radar perpendicular above the surface and keep at least the 0.3 m blind zone clear. Readings inside the blind zone fire the blind-zone alarm and are not valid distances.

Beam path

The 8° beam must reach the surface without hitting ladders, pipes or tank walls. Strong reflections from obstacles can be reported instead of the true level, so check the radar signal RSSI after install.

Distance vs. level

The device reports distance from sensor to surface, not fill level. Compute level as tank-height minus distance in your dashboard, and store the empty/full reference distances.

NFC setup

Keys, reporting interval and the threshold/change/blind-zone alarms are set over NFC with the Milesight ToolBox app before rollout.

Your partner

How merkaio supports your EM410-RDL

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

Pre-staging & provisioning

We configure the EM410-RDL, 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 and needs no Milesight gateway or cloud. You add the codec to the device profile and provision it via OTAA or ABP.
Yes, for both ChirpStack and ThingsBoard, implemented from the published Milesight byte specification. The same channel logic goes into a ThingsBoard uplink converter.
Non-contact distance to a surface from 0.3 to 12 m using a 60 GHz radar, plus on-board temperature, radar signal strength and a tilt/position flag. It is typically used for tank and silo level.
The sensor reports the distance from the sensor to the surface. Level equals tank height minus the measured distance, so store the empty and full reference distances and compute the level in your dashboard.
Distance threshold, distance change (mutation) and blind-zone alarms. They are configured over NFC and sent immediately as event uplinks, so dashboard rules should treat them as priority events.
It uses a 19000 mAh ER34615 Li-SOCl2 battery rated for up to seven years, depending on the reporting interval and how often alarms fire.
Yes. The enclosure is rated IP68 and survives 1 m underwater for up to 48 hours, and it is unaffected by dust, condensate, temperature changes or acoustic noise.
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.