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.
- 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
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.
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 = { 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)
0175630367E80004826205Decoded JSON
{ "battery": 99, "temperature": 23.2, "distance": 1378 }Use cases
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.
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
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.