[ST Edge] LinknLink eMotion Air - SmartThings driver for the battery-powered Zigbee mmWave presence sensor

I’ve released a SmartThings Edge driver for the LinknLink eMotion Air, a compact battery-powered mmWave presence sensor with Zigbee 3.0 and Bluetooth.

The eMotion Air first reached most users through Kickstarter, where the campaign by LinknLink Pty Ltd raised AU$171,938 from 1,496 backers against a AU$55,000 goal.

LinknLink is also more than a one-product Kickstarter name. The company already has several generations of eMotion presence sensors and smart-home gateways; its own legal terms identify Hangzhou LinknLink Technology Co., Ltd. as the company behind the LinknLink service, alongside the Australian LinknLink Pty Ltd operation.

The eMotion Air is particularly interesting because it combines several useful sensors in a very small, completely wireless device:

  • 24 GHz mmWave presence detection
  • temperature
  • humidity
  • illuminance
  • programmable physical button
  • Zigbee 3.0
  • Bluetooth configuration
  • 3 × AAA batteries
  • magnetic, adhesive, screw, corner or tabletop mounting

LinknLink claims up to around 1.5 years of battery life. As always with a battery-powered mmWave sensor, the real-world result will depend heavily on radar, sampling and reporting settings.

SmartThings driver features

The driver has now been tested with real eMotion Air hardware. SmartThings automatically selects it during pairing when it is already installed on the hub.

It exposes:

  • Presence sensor as the primary SmartThings capability
  • Motion sensor as a secondary compatibility capability
  • Temperature
  • Relative humidity
  • Illuminance
  • Battery
  • Button
  • Refresh

The same Zigbee Occupancy report drives both Presence and Motion:

Occupied
→ Presence: present
→ Motion: active

Unoccupied
→ Presence: not present
→ Motion: inactive

I use Presence as the primary capability because that is what an mmWave sensor actually provides: it can continue detecting a person who is sitting or lying still. Motion remains useful because many integrations (Alexa, …) still expect a conventional motion sensor.

Button support

The button commands observed from the device are mapped as follows:

Single press → pushed
Double press → double
Triple press → pushed_3x

The driver also handles the standard Zigbee Level Control commands used for held/long-press behavior.

Temperature and humidity calibration

The standard SmartThings Temperature offset and Humidity offset settings are included, so a sensor that consistently reads slightly above or below a trusted reference can be corrected without changing anything on the eMotion Air itself.

Configurable reporting

Temperature, humidity and illuminance reporting can be adjusted from the SmartThings device settings.

The defaults are deliberately conservative:

Measurement Fastest update Maximum wait Change
Temperature 60 s 3600 s 0.5 °C
Humidity 60 s 3600 s 1 %
Illuminance 30 s 3600 s ~10 %

In the app these are presented as normal user settings such as Fastest temperature updates, Temperature update timeout and Temperature change rather than raw Zigbee parameters.

Occupancy reporting is intentionally fixed so presence changes are delivered promptly. Battery reporting is also kept conservative and is not exposed as another set of tuning options.

The driver does not continuously poll the device, of course.

Installation

The driver is available through my SmartThings Edge Driver channel:

Join the SmartThings Edge Driver channel

  1. Open the channel invitation and sign in with your Samsung account.
  2. Select Enroll.
  3. Open Available Drivers and install LinknLink eMotion Air.
  4. Configure the eMotion Air in the LinknLink app first if you want to change its radar or sensor-level settings.
  5. Put the eMotion Air into Zigbee pairing mode by holding the button for about 15 seconds.
  6. In SmartThings, select Add device and start a scan.

With the driver installed beforehand, SmartThings should identify the device and select the driver automatically.

If the eMotion Air is already paired with another Edge driver, open the device in SmartThings and use Driver → Select different driver.

Recommended initial setup

This part is worth doing in the correct order because the eMotion Air uses Bluetooth and Zigbee as separate operating modes.

The LinknLink app provides device-level settings including radar sensitivity, no-motion/vacancy duration, environmental collection intervals, light thresholds, presence monitoring and Environment Learning.

I therefore recommend:

  1. Put the eMotion Air into Bluetooth mode.
  2. Add it to the LinknLink app.
  3. Configure radar sensitivity, vacancy timing and environmental sampling as desired.
  4. Finish the Bluetooth configuration.
  5. Switch the device into Zigbee pairing mode with the approximately 15-second button hold.
  6. Add it to SmartThings.

A useful finding from testing is that switching the device back to Bluetooth later can interrupt its Zigbee operation. After changing settings in the LinknLink app, put it back into Zigbee pairing mode and reconnect it with SmartThings before expecting new Zigbee data.

For that reason, I would set the radar-related options once during initial installation and use the SmartThings settings for normal reporting adjustments afterward.

LinknLink has since published a useful eMotion Air setup and troubleshooting guide covering Bluetooth/Zigbee operation, vacancy timing, Environment Learning and battery considerations.

Sensor sampling vs. Zigbee reporting

There are two different sets of timing controls, and they should not be confused.

The LinknLink app controls how often the eMotion Air itself collects environmental measurements. For example, a tested configuration used:

Light collection:            30 seconds
Temperature/humidity:         1 minute

The SmartThings driver controls when an available measurement is reported over Zigbee.

So, for example:

eMotion Air:
measure temperature every 60 seconds

SmartThings/Zigbee:
report when it changes enough
or when the maximum reporting interval expires

Setting a 10-second Zigbee reporting interval cannot make a sensor that measures temperature once per minute suddenly measure every 10 seconds.

This separation is also useful for battery life: the device-side settings control the actual sensing workload, while the driver lets the user decide how much Zigbee traffic is appropriate.

The same principle applies to presence. The vacancy/no-motion delay belongs to the eMotion Air itself. The driver does not add a second software timer on top of it.

If the LinknLink app is configured for a three-minute no-motion duration, the sensor waits before reporting the Zigbee Occupancy attribute as unoccupied. SmartThings then immediately changes Presence to Not present and Motion to No motion.

Technical details

The eMotion Air is pleasantly conventional from a Zigbee perspective.

Both the public Zigbee2MQTT device interview and an independent SmartThings Zigbee Thing interview showed the same endpoint:

Manufacturer: LinknLink
Model: eMotion Air

Endpoint 0x01

Server clusters:
0000  Basic
0001  Power Configuration
0020  Poll Control
0400  Illuminance Measurement
0402  Temperature Measurement
0405  Relative Humidity Measurement
0406  Occupancy Sensing

Client clusters:
0006  On/Off
0008  Level Control
0019  OTA Upgrade

The upstream zigbee-herdsman-converters definition is correspondingly small: temperature, humidity, illuminance, occupancy, battery and the standard On/Off and Level Control commands.

There is no Tuya 0xEF00, no Aqara-style manufacturer cluster and no proprietary Zigbee datapoint protocol involved.

That allows the SmartThings driver to use the standard Edge Zigbee libraries for most of the device. The device-specific code mainly deals with:

  • mapping Occupancy to both SmartThings Presence and Motion
  • interpreting the button commands
  • configuring conservative environmental reporting
  • applying per-device reporting preferences
  • keeping the sleepy battery device free of unnecessary polling

The radar configuration itself is not exposed through Zigbee. Sensitivity, vacancy timing and environmental collection settings are handled through Bluetooth in the LinknLink app and stored on the device.

Thanks

A big thank-you to @Andrew_Palmer, who tested two actual eMotion Air units, confirmed automatic driver selection, documented the Bluetooth configuration options and uncovered the important Bluetooth-to-Zigbee reconnection behavior.

Thanks also to the other Kickstarter backers and SmartThings Community members who installed the driver, tested it on newly delivered hardware and reported their results. The early feedback has been very positive, and it turned what started as a device-integration exercise into a properly hardware-validated release.

The public Zigbee2MQTT work was also extremely helpful. Having an independent device interview and an upstream converter to compare against made it possible to verify the Zigbee side rather than reverse-engineer it from scratch.

Final thoughts

The eMotion Air fills an interesting gap: a small, inexpensive, battery-powered mmWave presence sensor that can be placed almost anywhere without running power, while also providing temperature, humidity, light and a physical button.

More importantly for SmartThings, its normal operating interface is standard Zigbee.

Bluetooth is used for the settings that belong to the sensor itself; Zigbee handles presence, measurements and button events; SmartThings adds local automation, calibration and configurable reporting on top.

That separation makes the integration relatively clean and should also make it maintainable.

The longer-term question is now the interesting one for any battery-powered mmWave product: how well the claimed battery life holds up in real homes with different radar, sampling and Zigbee reporting configurations.

But as far as SmartThings integration is concerned, the eMotion Air is no longer an experiment. The driver is working on real hardware and is ready to use.

Andreas,

Thank you for doing this. To confirm your suspicions, when pairing with Bluetooth via the LinknLink app, there is the opportunity to set various parameters.

I was successfully able to add to SmartThings - the driver was picked automagically.

And the good news is that everything seems to work well. I did occasionally get a “There was a problem connecting” error with one of the two units but I might just need to re-pair. The other device worked perfectly. Have to go back to work - I’ll report more later on. This is brilliant!

Excellent, ordered a couple to try out :+1:

One thing I’ve discovered after more tinkering overnight is that if you do use the LinknLink app to update settings via Bluetooth, you always appear to have to reconnect the devices again in SmartThings. If you don’t, they seem to sit in this limbo condition where they appear to be alive to SmartThings but never seem to actually transmit any new data.

Thanks. That’s a really useful finding and it explains quite a bit.

It now looks as though Bluetooth and Zigbee should be treated as separate operating modes rather than two interfaces that remain active at the same time. So when you switch to Bluetooth to change settings in the LinknLink app, the device seems to stop communicating properly over Zigbee until it is switched back again.

Could you try one specific thing next time you change a Bluetooth setting?

Please don’t delete the device from SmartThings. After finishing in the LinknLink app, put the device back into Zigbee pairing mode with the ~15-second button hold, then start an Add device / scan in SmartThings. Do not delete the device beforehand.

I’d like to see whether the existing SmartThings device simply reconnects/rejoins and starts reporting again, rather than requiring a complete delete-and-repair. If that works, routines and the existing device entry should remain intact.

This also makes the new SmartThings reporting settings in the latest version of the driver rather useful: temperature, humidity and light reporting can now be adjusted directly in SmartThings without having to switch the sensor back into Bluetooth mode.

And thanks again for testing this so thoroughly - these are exactly the little device-specific behaviors that aren’t obvious from the Zigbee implementation itself.

Will do. I have two of the eMotion Airs, so I can try the two different approaches together.

Good news. It appears that if I don’t delete the device from SmartThings but do go through the pairing process, even though it doesn’t appear to find the device during the scan, it does make the connection again. So if you need to make a change to the config of the eMotion Air, the steps are:

  1. Use LinknLink app to change config via Bluetooth (10s button push until solid)
  2. Close LinknLink app (this seems to help)
  3. Put the eMotion Air back into Zigbee pairing (15s button push until flashing)
  4. Scan nearby in SmartThings but ignore the nil response and let it timeout.
  5. Go back to the device in ST and it should start working again.

Two other points to note
The sensitivity of the motion/presence is interesting - it’s not always what you might think of as “line of sight” - I have to put the unit in a completely unoccupied room to be sure. Placing it face down on the desk next to you isn’t always enough. On the other hand, it doesn’t respond quite as fast as the traditional PIR style ones. If I walk into a room, the OG ST ones will pick me up faster than the Air. It’s tenths of a second but you can see it in the app as the icons respond.

Second, I’ve noticed that in the LinknLink app, it doesn’t differentiate between Presence and Motion - there’s just Motion. I’ll have to do some more experimenting to figure out if it’s possible to be sufficiently still that there’s no motion but you’re still present! Any excuse to do a bit of lying around…

Your heartbeat is enough to be picked up by a radar sensor.

That’s why the Aqara FP2 and the upcoming FP400 can measure the heart rate of the people in the room.

Placing it face down on the desk next to you isn’t always enough.

That’s because the sensor is sending out electromagnetic waves (active), while a passive infrared (PIR) sensor basically measures temperature changes.

Your an absolute star for creating this. All your hard work is much appreciated.

Just got my kickstarter funded air today and loving it already.

@Mikeyf79 @Andrew_Palmer

Can one of you please post a screenshot from the settings? Thanks!

Settings in Smarthings or in the Linknlink app?

Settings in SmartThings.

Here you go.

Hi @Andreas_Roedl ,

Installed a couple of these this morning using your driver but I am not getting any updates :thinking:

One I did a firmware update through bt and the linknlink app first, the other I didn’t. Both installed first time apparently without issue, both picked up your driver and both are showing active, different, connection paths in ST.

Unfortunately I am not seeing any sensor or button press updates just:

I have tried re-pairing and deletion re-add but no luck… Any ideas?

It would definitely seem that there is a connection issue (rather than driver) as I have just moved them to a darker area where I can aee the led properly and on button press the they are flashing rapidly for a period before going off. I would expect a single on/off on a press?

I have moved closer to hub (v2 UK) and (updated &) re-paired both and, after a few minutes both are now working OK… Both have direct connection to hub now (rather than a 1 repeater hop) so will reposition and keep 'em crossed :crossed_fingers:

The devices appear to have joined the Zigbee network successfully, because SmartThings considers them active, has a connection path and has received the battery state. What is missing is the rest of the Zigbee configuration: no initial sensor reads and, importantly, no button commands.

Could you try the following with one of them, without deleting it from SmartThings?

  • Hold the eMotion Air button for about 15 seconds until the LED starts flashing, to put it back into Zigbee pairing mode.

  • Start Add device → Scan nearby in SmartThings.

  • While the scan is running, give the eMotion Air a short button press every few seconds for perhaps 30 - 60 seconds. We want to keep the sleepy device awake long enough for the hub to finish the Zigbee configuration.

  • Let the SmartThings scan finish even if it does not appear to discover a new device.

  • Go back to the existing eMotion Air device and see whether temperature, humidity, illuminance and presence populate, and whether button presses then register.

We already know from earlier testing that an eMotion Air can silently rejoin an existing SmartThings device during a scan even though SmartThings does not show it as newly discovered.

One other question that would help narrow this down: did the second eMotion Air ever enter Bluetooth mode / get added to the LinknLink app at all, or did that one go straight from the box into Zigbee pairing? The first device having had a Bluetooth firmware update could explain its state, but if the second one has never been in Bluetooth mode, then I can rule that out as the common cause.

One reason I like the device so much is that it is so simple, meaning there isn’t much going on in the driver…

Hi @Andreas_Roedl typically since they connected I can not reproduce the issue.

I intend to do a bit more fiddling over the next few days but think you are probably right in that the scanning process was being cut short/timing out on the device side before completing 100%.

The second device was straight from the box with no BT connection at all. It initially eventually paired and has since re-paired after being BT connected, updated and configured by it’s native app (radar sensitivity only, all else defaulted).

Have to say that the jury is out regarding the device so far though. Running a test overnight it would seem that presence and movement reporting go hand in hand and that the device sensitivity is not total.

I had both devices in the open directly monitoring my sleep with one set to high (default) and one to low sensitivity, no other changes. Both pretty much reported in unison.

Only bedding was a duvet cover and at no point did my heart stop beating or I stop breathing (I assume :nerd_face:). Presence/motion triggered consistently and for varying periods during the night. I would have hoped motion would trigger variably, for shorter periods, with presence remaining fairly constantly on?

Maybe I am expecting too much of a budget device though but…

See the original post regarding the connection between motion and presence.

I’ve yet to see any difference reported between presence and motion - I’m pretty sure it’s using the one sensor to report on both. My experience seems to be that it’s very accurate - I think it picks up my cat snoozing on the sofa - but is slightly slower to respond compared with a PIR.

motion is mirrored from presence.

It’s a matter of 5 minutes to take out the motion capability. The last time I did that, people were complaining that they can’t see the device in other integrations like Alexa or Home Assistant, so I had to put it back.