Milesight EM500-UDL: Outdoor LoRaWAN Ultrasonic Level Sensor

Milesight EM500-UDL outdoor LoRaWAN ultrasonic distance and level sensor: own ChirpStack/ThingsBoard decoder, decoded example, tank and flood monitoring.

Milesight EM500-UDL
EM500-UDLSensor
LoRaWAN
1.0.3 Class A, OTAA
Band / port
EU868 / port 85
Sensing
Ultrasonic, non-contact distance/level
Range
0.25 to 10 m (variant dependent)
Accuracy
±1 % FS, 1 mm resolution
Ingress protection
IP67
Battery
19000 mAh, up to ~10 years
Measurements

What the EM500-UDL measures

Distance

Non-contact ultrasonic distance to the surface in mm, the basis for fill level.

Fill level

Tank or basin level derived from distance against a known empty/full reference.

Battery level

Reported as a percentage, with local storage and retransmission.

Distance alarm

Optional threshold and mutation alarm for sudden level changes.

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 === 0x01 && type === 0x75) {          // battery (%)
      data.battery = bytes[i]; i += 1;
    } else if (channel === 0x03 && type === 0x82) {   // distance (mm)
      data.distance = readUInt16LE(bytes, i); i += 2;
    } else if (channel === 0x83 && type === 0xe9) {   // distance + mutation alarm
      data.distance = readUInt16LE(bytes, i) / 10;
      data.distance_mutation = readUInt16LE(bytes, i + 2) / 10;
      data.distance_alarm = bytes[i + 4];
      i += 5;
    } else if (channel === 0xff) {                    // device info (version, SN, status)
      break;
    } else {
      break;
    }
  }
  return { data: data };
}

function readUInt16LE(b, i) {
  return (b[i + 1] << 8) | b[i];
}

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

Channel format: 01 75 battery (%), 03 82 distance (UINT16 little-endian, mm). The 83 E9 channel carries a combined distance plus mutation alarm frame (each value /10) when threshold or mutation alarms are enabled. The 0xFF channels hold device info (protocol/firmware version, serial number, status) on join or power-on. Implemented from the published Milesight byte specification. For ThingsBoard the same channel logic goes into an uplink converter.

Uplink (hex)

0175630382E803

Decoded JSON

{ "battery": 99, "distance": 1000 }
From the field

Configuration & pitfalls

Mount above the blind zone

Keep the surface beyond the ~0.25 m minimum range. Anything inside the blind zone reads as invalid, so plan the sensor height accordingly.

Pick the right variant

EM500-UDL ships in range variants (for example C050, C100). Match the variant to the tank depth so the full level stays inside the rated range.

Foam, vapour and turbulence

Ultrasonic echoes can scatter on foam, heavy vapour or a turbulent surface. Position the probe over a calm spot or use a stilling well.

Convert distance to level

The device reports distance to the surface, not fill. Store the empty and full reference distances in your dashboard to compute level and volume.

NFC setup

Keys, reporting interval and threshold/mutation alarms are configured over NFC with the Milesight ToolBox before rollout.

Your partner

How merkaio supports your EM500-UDL

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

Pre-staging & provisioning

We configure the EM500-UDL, 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, 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.
It measures non-contact ultrasonic distance to a surface in millimetres. That distance becomes a fill level once you store the empty and full reference distances in your dashboard.
It is a LoRaWAN 1.0.3 Class A device on port 85. Each uplink carries the distance reading; the battery level is reported as a percentage.
Roughly 0.25 to 10 m depending on the variant, with about ±1 % FS accuracy and 1 mm resolution. Keep the surface outside the blind zone for valid readings.
It carries a 19000 mAh battery rated for up to around ten years, depending on the reporting interval you configure.
Yes. The enclosure is rated IP67, so it suits outdoor flood, drainage, tank and silo monitoring as well as indoor basins.
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.