Milesight EM310-TILT: LoRaWAN 3-Axis Tilt Sensor

Milesight EM310-TILT LoRaWAN 3-axis tilt sensor: own ChirpStack/ThingsBoard decoder, decoded example, angle threshold alarms and structural monitoring.

Milesight EM310-TILT
EM310-TILTSensor
LoRaWAN
Class A, OTAA
Band / port
EU868 / port 85
Ingress protection
IP67
Measurement
X / Y / Z tilt angle, 3-axis
Angle range
-90° to +90° per axis, 0.1° resolution, ±1° accuracy
Battery
2 x ER17505 Li-SOCl2, replaceable, multi-year life
Configuration
NFC (Milesight ToolBox)
Measurements

What the EM310-TILT measures

Tilt angle X

Angle on the X axis relative to the configured initial surface, INT16, scaled by /100.

Tilt angle Y

Angle on the Y axis relative to the initial surface, INT16, scaled by /100.

Tilt angle Z

Angle on the Z axis relative to the initial surface, INT16, scaled by /100.

Threshold status

Per-axis flag (X/Y/Z) signalling that the configured angle threshold was crossed.

Battery level

Reported as a percentage, with local storage and retransmission.

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 === 0xcf) {   // 3-axis tilt angle
      data.angle_x = readInt16LE(bytes, i) / 100;
      data.angle_y = readInt16LE(bytes, i + 2) / 100;
      data.angle_z = readInt16LE(bytes, i + 4) / 100;
      var flags = bytes[i + 6];
      data.threshold_x = (flags & 0x01) ? 1 : 0;
      data.threshold_y = (flags >> 1 & 0x01) ? 1 : 0;
      data.threshold_z = (flags >> 2 & 0x01) ? 1 : 0;
      i += 7;
    } else {
      break;
    }
  }
  return { data: data };
}

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

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

Channel format: 01 75 battery (%), 03 cf 3-axis tilt angle. The angle block holds three INT16 little-endian values (X, Y, Z, each /100) followed by one status byte whose low three bits flag whether the X, Y and Z thresholds were crossed. Angles are measured relative to the initial surface you set during commissioning. For ThingsBoard the same channel logic goes into an uplink converter. Implemented from the published Milesight byte specification.

Uplink (hex)

01756403CF14002C01F40100

Decoded JSON

{ "battery": 100, "angle_x": 0.2, "angle_y": 3, "angle_z": 5, "threshold_x": 0, "threshold_y": 0, "threshold_z": 0 }
Where it fits

Use cases

From the field

Configuration & pitfalls

Initial surface

Set the reference surface (horizontal or vertical) over NFC before mounting, so angles are reported against the correct zero point.

Angle thresholds

Define per-axis threshold and condition rules in the ToolBox. Threshold uplinks are sent immediately, so dashboard rules should treat them as priority events.

Trigger rules

Up to 36 trigger rules cover different scenarios; keep the active set lean so the reporting behaviour stays predictable.

Rigid mounting

Mount the sensor firmly to the monitored object. A loose bracket adds vibration noise and produces false tilt readings.

Your partner

How merkaio supports your EM310-TILT

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

Pre-staging & provisioning

We configure the EM310-TILT, 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 reports tilt angle on three axes (X, Y, Z) relative to a configured initial surface, plus a per-axis threshold flag and the battery level. Each angle is an INT16 value scaled by 100.
It is a Class A device on LoRaWAN port 85. Each uplink carries the three tilt angles and the threshold status; the battery percentage is included as a separate channel.
Yes. The enclosure is rated IP67, so it suits outdoor structures, poles and infrastructure as well as indoor equipment monitoring.
Yes. Per-axis angle thresholds are set over NFC with the Milesight ToolBox. When an angle crosses its threshold the device sends an immediate uplink with the matching status bit set, so dashboard rules should treat it as a priority event.
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.