Question: I'd like to start my music player (Clementine) when my bluetooth headset connects to my computer. How do I detect the bluetooth device connecting so I can run a script to start the player?

Answer: 
I didn't like the polling approach, so I did some digging on bluez and DBus. I ended up writing the following script:

```
#!/usr/bin/python

import dbus
from dbus.mainloop.glib import DBusGMainLoop
import gobject

import subprocess

# ID of the device we care about
DEV_ID = '00_1D_54_AB_DC_72'

dbus_loop = DBusGMainLoop()
bus = dbus.SystemBus(mainloop=dbus_loop)

# Figure out the path to the headset
man = bus.get_object('org.bluez', '/')
iface = dbus.Interface(man, 'org.bluez.Manager')
adapterPath = iface.DefaultAdapter()

headset = bus.get_object('org.bluez', adapterPath + '/dev_' + DEV_ID)
    # ^^^ I'm not sure if that's kosher. But it works.

def cb(iface=None, mbr=None, path=None):

    if ("org.bluez.Headset" == iface and path.find(DEV_ID) > -1):
        print 'iface: %s' % iface
        print 'mbr: %s' % mbr
        print 'path: %s' % path
        print "\n"
        print "matched"

        if mbr == "Connected":
            subprocess.call(["clementine", "--play"])
            print 'conn'

        elif mbr == "Disconnected":
            subprocess.call(["clementine", "--stop"])
            print 'dconn'

headset.connect_to_signal("Connected", cb, interface_keyword='iface', member_keyword='mbr', path_keyword='path')
headset.connect_to_signal("Disconnected", cb, interface_keyword='iface', member_keyword='mbr', path_keyword='path')

loop = gobject.MainLoop()
loop.run()

```
Here is another example for monitoring all Bluetooth devices. It does not need to specify a specific MAC address. This approach makes the xinput setting persistent even when login/out, suspend/wake and connect/dis-connect your bluetooth device.

I have a Thinkpad compact Bluetooth Keyboard, and I wish to run an xinput command whenever the keyboard is connected to adjust the speed of trackpoint. Here are the steps.

1. Download code from Github [bluetooth-ruunner](https://github.com/linuxthink/bluetooth-runner). Credits given to [here](https://www.raspberrypi.org/forums/viewtopic.php?f=91&t=85101) who first wrote this for Raspberry Pi. **Modify** the following section of the code to run your custom comamnds.

```
subprocess.call(['xinput', 'set-prop',
                 'ThinkPad Compact Bluetooth Keyboard with TrackPoint',
                 'Device Accel Constant Deceleration', '0.6'])

```

In my case, this is equivalent to calling from the terminal.

```
$ xinput set-prop 'ThinkPad Compact Bluetooth Keyboard with TrackPoint' 'Device Accel Constant Deceleration' 0.6

```
2. Save the modification. Try running your scripts by

```
$ python bluetooth-runner.py

```

Connect and disconnect your Bluethooth device. You should see the corresponding message printed on screen.
3. Now, make your file executable and copy it in one of the directory in your `$PATH`, say `~/bin/`.

```
$ chmod +x bluetooth-runner.py
$ mkdir ~/bin # if you dont have it yet
$ cp bluetooth-runner.py ~/bin

```
4. Now, make sure you can run the script from anywhere in the terminal (make sure it is in your search path).
5. Fire up the `Startup Applications` from the ubuntu menu. Add your scripts to the startup.

![Add startup applications](https://i.stack.imgur.com/yheK7.png)
6. Now, there is only one problem left, at the time when you login, the scripts might not catch the **very first** bluetooth event. This is because your bluetooth device might be connected before your script is initialized in the background. 

To solve this, add your custom command directly in `Startup Applications`. In my case, it is the follow command:

```
 xinput set-prop 'ThinkPad Compact Bluetooth Keyboard with TrackPoint' 'Device Accel Constant Deceleration' 0.6

```

And now you shall be able to enjoy your Bluetooth device with Ubuntu.