Skip to content

Scans for Bluetooth low energy adverts (e.g. beacons) and publishes them on MQTT

License

Notifications You must be signed in to change notification settings

crees/bluetooth_le_scanner

Repository files navigation

bluetooth-le-scanner

Very simple passive detection of Bluetooth Low Energy beacons using MQTT

This is currently for GNU/Linux using Bluez, and requires a Mosquitto server as well. It is very easy to adapt for other OSes- pull requests are always welcome as portability is good. Please stick to POSIX sh.

I'm really grateful to @andrewjfreyer for his Monitor project, which is far too sophisticated for my needs, but it gave me several clues.

Installation and setup (on a Raspberry Pi)

git clone https://github.com/crees/bluetooth_le_scanner/
cd bluetooth_le_scanner
install -o root -g 0 -m 755 bluetooth_le_scanner.sh /usr/sbin/
install -o root -g 0 -m 600 bluetooth_le_scanner.conf.sample /etc/bluetooth_le_scanner.conf
# edit /etc/bluetooth_le_scanner.conf
install -o root -g 0 -m 644 systemd/bluetooth_le_scanner.service /etc/systemd/system/
systemctl enable bluetooth_le_scanner
service bluetooth_le_scanner start

Adding to Home Asssistant

Once you have MQTT configured, it's very straightforward to subscribe to presence detection. Add to your configuration.yaml:

mqtt:
  sensor:
    - name: 'Airtag 1'
      unique_id: mqtt_myraspberry_sensor_airtag_one
      state_topic: 'btlescan/myraspberry/airtag_one'
      value_template: '{{ value_json.present }}'
    - name: 'Airtag 2'
      unique_id: mqtt_myraspberry_sensor_airtag_two
      state_topic: 'btlescan/myraspberry/airtag_two'
      value_template: '{{ value_json.present }}'

Using DNS for parameters

When you have a few beacon sensors around, having a consistent configuration is helpful. If you control the DNS server for your domain, then you can add a record in this form:

_btle_scanner           TXT     "bluetooth_scan_duration=15 bluetooth_expiry_time=60 mqtt_host=my_mqtt_host.example.com nickname=AA:AA:AA:AA:AA:AA=airtag_one nickname=BB:BB:BB:BB:BB:BB=airtag_two"

Run bluetooth_le_scanner with the -n option (and the -d debug option might be helpful when setting up) and put the MQTT password into /etc/bluetooth_le_scanner.mqttpasswd.

It will rescan the DNS just before each beacon scan. Obviously the TTL will affect how quickly it updates!

About

Scans for Bluetooth low energy adverts (e.g. beacons) and publishes them on MQTT

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages