From 649d2071b021272b102d88ce903d5bb4db86b295 Mon Sep 17 00:00:00 2001 From: Heiko Rothe Date: Mon, 27 Jan 2020 14:13:43 +0100 Subject: [PATCH] feat(bluetooth-low-energy): allow tag names to be overriden As mentioned in #102, the default sensor names are unweildy. This allows users to give tags customized names via their id. --- .../bluetooth-low-energy.config.ts | 3 +- .../bluetooth-low-energy.service.spec.ts | 31 ++++++++++++++++++- .../bluetooth-low-energy.service.ts | 3 ++ src/integrations/bluetooth-low-energy/tag.ts | 8 ++++- 4 files changed, 42 insertions(+), 3 deletions(-) diff --git a/src/integrations/bluetooth-low-energy/bluetooth-low-energy.config.ts b/src/integrations/bluetooth-low-energy/bluetooth-low-energy.config.ts index cba6fb1..e7044cd 100644 --- a/src/integrations/bluetooth-low-energy/bluetooth-low-energy.config.ts +++ b/src/integrations/bluetooth-low-energy/bluetooth-low-energy.config.ts @@ -11,5 +11,6 @@ export class BluetoothLowEnergyConfig { } class TagOverride { - measuredPower: number; + name?: string; + measuredPower?: number; } diff --git a/src/integrations/bluetooth-low-energy/bluetooth-low-energy.service.spec.ts b/src/integrations/bluetooth-low-energy/bluetooth-low-energy.service.spec.ts index e64fced..75a3e36 100644 --- a/src/integrations/bluetooth-low-energy/bluetooth-low-energy.service.spec.ts +++ b/src/integrations/bluetooth-low-energy/bluetooth-low-energy.service.spec.ts @@ -243,7 +243,7 @@ describe('BluetoothLowEnergyService', () => { ); }); - it('should apply tag overrides if they exist', () => { + it('should apply tag distance override if it exists', () => { const sensor = new Sensor('testid', 'Test'); entitiesService.has.mockReturnValue(true); entitiesService.get.mockReturnValue(sensor); @@ -295,6 +295,35 @@ describe('BluetoothLowEnergyService', () => { ); }); + it('should apply a tag name override if it exists', () => { + const sensor = new Sensor('testid', 'Test'); + entitiesService.has.mockReturnValue(false); + entitiesService.add.mockReturnValue(sensor); + jest + .spyOn(service, 'handleNewDistance') + .mockImplementation(() => undefined); + mockConfig.tagOverrides = { + abcd: { + name: 'better name' + } + }; + + service.handleDiscovery({ + id: 'abcd', + rssi: -12, + advertisement: { + localName: 'Test BLE Device' + } + } as Peripheral); + + expect(entitiesService.add).toHaveBeenCalledWith( + expect.objectContaining({ + name: expect.stringContaining('better name') + }), + expect.any(Array) + ); + }); + it('should create a new distance sensor if there is not a matching one yet', () => { const sensor = new Sensor('new', 'New'); entitiesService.has.mockReturnValue(false); diff --git a/src/integrations/bluetooth-low-energy/bluetooth-low-energy.service.ts b/src/integrations/bluetooth-low-energy/bluetooth-low-energy.service.ts index 8a1ea2b..9c8e89a 100644 --- a/src/integrations/bluetooth-low-energy/bluetooth-low-energy.service.ts +++ b/src/integrations/bluetooth-low-energy/bluetooth-low-energy.service.ts @@ -248,6 +248,9 @@ export class BluetoothLowEnergyService protected applyOverrides(tag: Tag): Tag { if (this.config.tagOverrides.hasOwnProperty(tag.id)) { const overrides = this.config.tagOverrides[tag.id]; + if (overrides.name !== undefined) { + tag.name = overrides.name; + } if (overrides.measuredPower !== undefined) { tag.measuredPower = overrides.measuredPower; } diff --git a/src/integrations/bluetooth-low-energy/tag.ts b/src/integrations/bluetooth-low-energy/tag.ts index 2665b10..2e4991b 100644 --- a/src/integrations/bluetooth-low-energy/tag.ts +++ b/src/integrations/bluetooth-low-energy/tag.ts @@ -2,6 +2,8 @@ import { Peripheral } from '@abandonware/noble'; import _ from 'lodash'; export class Tag { + private _name; + constructor(peripheral: Peripheral) { this.peripheral = peripheral; this.rssi = peripheral.rssi; @@ -18,7 +20,11 @@ export class Tag { } get name(): string { - return this.peripheral.advertisement.localName || this.id; + return this._name || this.peripheral.advertisement.localName || this.id; + } + + set name(name: string) { + this._name = name; } get distance(): number {