Home

Awesome

<bt-device>

A small (900 byte) Custom Element to make Web Bluetooth a little easier to use.

See it in action (with a Bluetooth heart rate monitor): https://output.jsbin.com/mohezur/11

More details here: https://steele.blue/renderless-web-components/

Usage

Import it via your method of choice, but unpkg works great:

<script type="module" src="https://unpkg.com/bt-device?module"></script>

Then add a (render-less) element to your page with the settings you'd like:

<!-- prettier-ignore -->
<bt-device
  service="40fc0000-8a8d-4a32-a455-c1148e24a9f1"
  characteristic="40fc0001-8a8d-4a32-a455-c1148e24a9f1"
  notifications="true"
></bt-device>

Properties

service: string

The GATT service you wish to interact with. Can be a UUID or a standardized service

characteristic: string

The GATT characteristic you wish to interact with. Can be a UUID or a standardized characteristic

notifications: boolean

Whether to receive notifications (event stream) from the characteristic after connecting.

parse: DataView => any

An optional function property you can use to "shape" the raw binary data coming from the Bluetooth device. Set this property to a function and it will be executed each time your characteristic emits data:

btDevice.parse = (input) {
  const percentLeft = input.getUint8(0) / 2;
  return percentLeft;
}

connectOptions: Object

Override the auto-generated connection options object. See https://developer.mozilla.org/en-US/docs/Web/API/Bluetooth/requestDevice for details

Generated Properties

btService: BluetoothRemoteGATTService

Once connected, provides access to the service interface

btChar: BluetoothGATTCharacteristic

Once connected, provides access to the characteristic interface

Methods

connect(): Promise<void>

Attempts to connect to the Bluetooth device

Events

data: CustomEvent<any>

Emitted whenever the characteristicvaluechanged event occurs. Will contain an object that contains the data (passed through parse if it is set).

btDevice.addEventListener('data', (e) => {
  const value = e.detail.value;
  console.log(value);
});