From 9e1be95008f30294536f0bbb60dd984dd1f1c083 Mon Sep 17 00:00:00 2001 From: PeteBa Date: Fri, 5 Feb 2021 17:39:32 +0000 Subject: [PATCH] fix(bluetooth-classic): align device_tracker discovery (#493) --- .../bluetooth-classic.service.spec.ts | 22 ++++++++-- .../bluetooth-classic.service.ts | 40 ++++++++++++++----- 2 files changed, 49 insertions(+), 13 deletions(-) diff --git a/src/integrations/bluetooth-classic/bluetooth-classic.service.spec.ts b/src/integrations/bluetooth-classic/bluetooth-classic.service.spec.ts index c31a17b..ac8a02f 100644 --- a/src/integrations/bluetooth-classic/bluetooth-classic.service.spec.ts +++ b/src/integrations/bluetooth-classic/bluetooth-classic.service.spec.ts @@ -30,6 +30,7 @@ import c from 'config'; import { ConfigService } from '../../config/config.service'; import { Device } from './device'; import { DeviceTracker } from '../../entities/device-tracker'; +import { DeviceTrackerConfig } from '../home-assistant/device-tracker-config'; import * as util from 'util'; jest.mock('mdns', () => ({}), { virtual: true }); @@ -407,7 +408,7 @@ describe('BluetoothClassicService', () => { expect(handleRssiMock).not.toHaveBeenCalled(); }); - it('should register a new sensor for a previously unknown device', async () => { + it('should register a new sensor and device tracker for a previously unknown device', async () => { entitiesService.has.mockReturnValue(false); entitiesService.add.mockImplementation((entity) => entity); clusterService.nodes.mockReturnValue({ @@ -429,9 +430,24 @@ describe('BluetoothClassicService', () => { expect(entitiesService.add).toHaveBeenCalledWith( new DeviceTracker( 'bluetooth-classic-10-36-cf-ca-9a-18-tracker', - 'Test Device', + 'Test Device Tracker', true - ) + ), + [ + { + for: DeviceTrackerConfig, + overrides: { + sourceType: 'bluetooth', + device: { + identifiers: '10:36:cf:ca:9a:18', + name: 'Test Device', + connections: [['mac', '10:36:cf:ca:9a:18']], + manufacturer: undefined, + viaDevice: 'room-assistant-distributed', + }, + }, + }, + ] ); expect(entitiesService.add).toHaveBeenCalledWith( expect.any(RoomPresenceDistanceSensor), diff --git a/src/integrations/bluetooth-classic/bluetooth-classic.service.ts b/src/integrations/bluetooth-classic/bluetooth-classic.service.ts index 7e69d5e..8c0e10e 100644 --- a/src/integrations/bluetooth-classic/bluetooth-classic.service.ts +++ b/src/integrations/bluetooth-classic/bluetooth-classic.service.ts @@ -16,6 +16,7 @@ import _ from 'lodash'; import { SchedulerRegistry } from '@nestjs/schedule'; import { EntityCustomization } from '../../entities/entity-customization.interface'; import { SensorConfig } from '../home-assistant/sensor-config'; +import { DeviceTrackerConfig } from '../home-assistant/device-tracker-config'; import { NEW_RSSI_CHANNEL, REQUEST_RSSI_CHANNEL, @@ -25,6 +26,7 @@ import { KalmanFilterable } from '../../util/filters'; import { makeId } from '../../util/id'; import { Device } from './device'; import { DISTRIBUTED_DEVICE_ID } from '../home-assistant/home-assistant.const'; +import { Device as DeviceInfo } from '../home-assistant/device'; import { Switch } from '../../entities/switch'; import { SwitchConfig } from '../home-assistant/switch-config'; import { DeviceTracker } from '../../entities/device-tracker'; @@ -328,9 +330,18 @@ export class BluetoothClassicService sensorId: string, device: Device ): Promise { + const deviceInfo: DeviceInfo = { + identifiers: device.address, + name: device.name, + manufacturer: device.manufacturer, + connections: [['mac', device.address]], + viaDevice: DISTRIBUTED_DEVICE_ID, + }; + const deviceTracker = this.createDeviceTracker( makeId(`${sensorId}-tracker`), - device.name + `${device.name} Tracker`, + deviceInfo ); const customizations: Array> = [ @@ -338,13 +349,7 @@ export class BluetoothClassicService for: SensorConfig, overrides: { icon: 'mdi:bluetooth', - device: { - identifiers: device.address, - name: device.name, - manufacturer: device.manufacturer, - connections: [['mac', device.address]], - viaDevice: DISTRIBUTED_DEVICE_ID, - }, + device: deviceInfo, }, }, ]; @@ -377,11 +382,26 @@ export class BluetoothClassicService * * @param id - Entity ID for the new device tracker * @param name - Name for the new device tracker + * @param deviceInfo - Reference information about the BT Classic device * @returns Registered device tracker */ - protected createDeviceTracker(id: string, name: string): DeviceTracker { + protected createDeviceTracker( + id: string, + name: string, + deviceInfo: DeviceInfo + ): DeviceTracker { + const trackerCustomizations: Array> = [ + { + for: DeviceTrackerConfig, + overrides: { + sourceType: 'bluetooth', + device: deviceInfo, + }, + }, + ]; return this.entitiesService.add( - new DeviceTracker(id, name, true) + new DeviceTracker(id, name, true), + trackerCustomizations ) as DeviceTracker; }