henry-spanka / nubli

Nubli is a Node.JS library for Nuki Smart Locks
MIT License
15 stars 11 forks source link
bluetooth library node nuki smart-lock smarthome smartlock

Nubli

Nubli is a Node.JS library for Nuki Smart Locks (Nuki Bluetooth Library) Nubli is very energy efficient when used properly and should't drain more power than a Nuki bridge. It uses the same protocol the App and Bridge uses and therefore communicates securely with the Smart Lock.

NPM

Features

Supported devices

Requirements

Note: Do not use the built-in Bluetooth in a Raspberry Pi. Due to bad hardware design it will not reliably connect to your Smart Lock and cause unexpected disconnects. I've been there and invested a whole week into fixing it.

Setup / Installation

  1. npm install nubli --save
  2. See Examples or Usage
  3. Star the repository ;)

Notes

Usage

    const nubli = require('nubli').default;

    nubli.onReadyToScan()
    .then(() => {
        nubli.startScanning();
    })
    .catch((err) => {
        console.log(err);
    });

Actions

Start Scanning for Nuki devices

    nubli.startScanning(): void;

Start Actively Scanning for Nuki devices (Required for pairing)

    nubli.startActiveScanning(): void;

Notes:

Stop Scanning for Nuki devices

    nubli.stopScanning(): void;

Connect to a Smart Lock

    smartlock.connect(): Promise<void>;

Disconnect from a Smart Lock

    smartlock.disconnect(): Promise<void>;

Check if a config for the Smart Lock already exists

    smartlock.configExists(path?: string): boolean;

Read Smart Lock config

    smartlock.readConfig(path?: string): Promise<void>;

Save Smart Lock config

    smartlock.saveConfig(path?: string): Promise<void>;

Pair with a Smart Lock

    smartlock.pair(asBridge = true): Promise<void>;

Note: By default it will pair as bridge. If you do have a bridge, make sure to pass false as a parameter. The reason is, that when no bridge exists, Nuki will not push any state changes automatically via advertisements, so we set ourselves as a bridge instead.

Read lock state from Smart Lock

    smartlock.readLockState(): Promise<SmartLockResponse>;

Unlock door

    smartlock.unlock(updateCallback?: (response: SmartLockResponse) => void): Promise<SmartLockResponse>;

Lock door

    smartlock.lock(updateCallback?: (response: SmartLockResponse) => void): Promise<SmartLockResponse>;

Unlatch Door

    smartlock.unlatch(updateCallback?: (response: SmartLockResponse) => void): Promise<SmartLockResponse>;

Lock N Go Door

    smartlock.lockNGo(updateCallback?: (response: SmartLockResponse) => void): Promise<SmartLockResponse>;

Lock N Go Unlatch Door

    smartlock.lockNGoUnlatch(updateCallback?: (response: SmartLockResponse) => void): Promise<SmartLockResponse>;

Get Config from Smart Lock

    smartlock.requestConfig(): Promise<SmartLockResponse>;

Get Advanced Config from Smart Lock

    smartlock.requestAdvancedConfig(): Promise<SmartLockResponse>;

Properties

Check whether a Smart Lock is already paired

    smartlock.paired: boolean;

Events

Nubli Smart Lock Discovered Event

    nubli.on('smartLockDiscovered', (smartlock: SmartLock) => void);

Nubli started scanning

    nubli.on('startedScanning', () => void);

Nubli stopped scanning

    nubli.on('stoppedScanning', () => void);

Smart Lock Connected Event

    smartlock.on('connected', () => void);

Smart Lock Disconnected Event

    smartlock.on('disconnected', () => void);

Smart Lock Error Event

    smartlock.on('error', (err: string) => void);

Smart Lock Activity Log Changed Event

    smartlock.on('activityLogChanged', () => void);

Note: The activityLogChanged event only works while scanning because the Smart Lock advertises activity log changes via bluetooth. To get notified when the door opens or closes (Door Sensor) make sure to enable 'Log door sensor status' in the Nuki app.

Help

If you have any questions or help please open an issue on the GitHub project page.

Contributing

Pull requests are always welcome. If you have an issue or feature request please open a GitHub issue.

License

The project is subject to the MIT license unless otherwise noted. A copy can be found in the root directory of the project LICENSE.