Estimote Telemetry

Estimote Location Beacons and next-generation Proximity Beacons support our brand new packet: Estimote Telemetry. It’s a packet that can be broadcast alongside iBeacon or Eddystone, and which contains real-time sensor readings & beacon health data. Estimote iOS and Android SDKs can discover and parse these packets, allowing you to access all the sensor & health data without having to connect to the beacon.

What’s ahead (aka Table of Contents)


  • Location (hardware revision “F” or “I”) or next-generation Proximity (hardware revision “G”) Beacons.
  • iOS or Android device with Bluetooth 4.0 support.
  • The latest version of Estimote iOS or Android SDK.
  • Estimote Account (sign up here).

Enabling Estimote Telemetry

Both Location and Proximity Beacons ship with Estimote Telemetry enabled by default. That hasn’t always been the case though, so when in doubt, double-check to make sure it’s enabled on your beacons.

The easiest way to enable Estimote Telemetry, and also adjust its transmit power and advertising interval if you want, is with an Estimote iOS or Android app. Simply find your beacon on the radar or list, tap on it, wait for the app to connect to the beacon, then find the Estimote Telemetry packet options.

Detecting Estimote Telemetry packets


Example code snippet showing how to subscribe to Telemetry Notifications for Temperature:

class ViewController: UIViewController {

    let deviceManager = ESTDeviceManager()

    override func viewDidLoad() {

        let tempNotification = ESTTelemetryNotificationTemperature { (tempInfo) in
            print("beacon ID: \(tempInfo.shortIdentifier), "
                + "temperature: \(tempInfo.temperatureInCelsius) °C")

Other telemetry data follows the same pattern: create a TelemetryNotification object with a block where you put code that acts on the telemetry data. The block will be passed a single parameter of an appropriate TelemetryInfo object.

Here’s a list of all the available TelemetryNotification and their corresponding TelemetryInfo objects. We also list the available properties for each TelemetryInfo object.

Telemetry Notification & Info classes Telemetry Info properties
+ ESTTelemetryInfoMotion
+ ESTTelemetryInfoAmbientLight
+ ESTTelemetryInfoSystemStatus
+ ESTTelemetryInfoTemperature
+ ESTTelemetryInfoMagnetometer
+ ESTTelemetryInfoGPIO

Note that each TelemetryInfo objects also contains a shortIdentifier property, which is half of the originating beacon’s identifier.


On Android, you want to use a BeaconManager object, and its Telemetry listener:

public class MyActivity extends Activity {

    private BeaconManager beaconManager;

    @Override protected void onCreate() {
        beaconManager = new BeaconManager(this);
        beaconManager.setTelemetryListener(new BeaconManager.TelemetryListener() {
            public void onTelemetriesFound(List<EstimoteTelemetry> telemetries) {
                for (EstimoteTelemetry tlm : telemetries) {
                    Log.d("TELEMETRY", "beaconID: " + tlm.deviceId +
                          ", temperature: " + tlm.temperature + " °C");

Consult the EstimoteTelemetry API reference for a full list of available properties.

You can start and stop scanning for Telemetry packets like this:

// here, assuming we're still inside the MyActivity class

@Override protected void onStart() {
    beaconManager.connect(new BeaconManager.ServiceReadyCallback() {
        public void onServiceReady() {

@Override protected void onStop() {

Uploading Telemetry data to Estimote Cloud

When your app is scanning for Telemetry packets (i.e., on iOS, your register for any Telemetry Notification, and on Android, you startTelemetryDiscovery), it can automatically upload all the discovered Telemetry data to your Estimote Cloud account. Simply make sure that the app is authenticated to access your Cloud account:

// iOS
ESTConfig.setupAppID("YOUR APP ID", andAppToken: "YOUR APP TOKEN")

// Android
EstimoteSDK.initialize(applicationContext, "YOUR APP ID", "YOUR APP TOKEN");

You can generate the App ID and Token for your app in the Apps section of Estimote Cloud.

Tip: Having Telemetry data in Estimote Cloud enables you to use Beacon Health Check and Sensors API.

Info: If you only want to use Estimote Telemetry for Beacon Health Check or Sensors API, you can skip the setTelemetryListener on Android. On iOS, you can register for any Telemetry Notification (e.g., ESTTelemetryNotificationSystemStatus) and implement an empty completion block.

You still need to setup the App ID and Token, and startTelemetryDiscovery on Android, and registerForTelemetryNotification on iOS!

Sensors API

If your app is uploading Telemetry data to Estimote Cloud, as explained in the paragraph above, you can access that data on your Estimote Cloud dashboard:

Sensors API dashboard

… or programmatically via Estimote Cloud RESTful API:

$ APP_ID=my-sensors-app
$ APP_TOKEN=845b2f14a9fa54321ff8cf9b95a86054
$ BEACON_ID=046618f76a44404af14a546e7a37ac3b
$ curl -u $APP_ID:$APP_TOKEN \$BEACON_ID/telemetry \
| python -m json.tool

    "data": [
            "ambient_light_level": 3,
            "date": "2016-08-11T12:00:00.000Z",
            "temperature": 13.1593427658081
            "ambient_light_level": 2000,
            "date": "2016-08-11T13:00:00.000Z",
            "temperature": 23.6983528137207

You could, e.g., leave an iPhone or Android device in range of a beacon, and access the sensor data remotely!

Estimote Telemetry packet specification

Estimote Telemetry packet contains the following data:

  • short identifier of the beacon (i.e., half of its usual, 32-character long identifier)
  • raw acceleration readings on 3 axis
  • is the beacon currently in motion or not
  • “current” and “previous” motion state duration
    • e.g., if the beacon is currently in motion: for how long (“current”), and how long it’s been motionless before the motion happened (“previous”)
    • e.g., if the beacon is currently still: for how long (“current”), and how long it’s been in motion before it stopped moving (“previous”)
  • temperature sensor reading
  • battery voltage
  • battery level (%)
  • beacon uptime (how long since the beacon’s last restart)
  • error codes if there’s been some problem with the beacon:
    • one error code for firmware problems
    • one error code for internal clock problems (e.g., time desync for beacons with no Real-Time Clock)
  • [Location Beacons “F” only] magnetometer readings on 3 axis
  • [Location Beacons only] ambient light level
  • [Location Beacons only] state of GPIO pins (high or low)
  • [Location Beacons F3.3 and later only] atmospheric pressure

Full specification is available on our GitHub:
Estimote packet specs