Skip to content

Commit

Permalink
fix(bluetooth-classic): align device_tracker discovery (#493)
Browse files Browse the repository at this point in the history
  • Loading branch information
PeteBa committed Feb 5, 2021
1 parent e76a123 commit 9e1be95
Show file tree
Hide file tree
Showing 2 changed files with 49 additions and 13 deletions.
Expand Up @@ -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 });
Expand Down Expand Up @@ -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({
Expand All @@ -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),
Expand Down
40 changes: 30 additions & 10 deletions src/integrations/bluetooth-classic/bluetooth-classic.service.ts
Expand Up @@ -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,
Expand All @@ -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';
Expand Down Expand Up @@ -328,23 +330,26 @@ export class BluetoothClassicService
sensorId: string,
device: Device
): Promise<RoomPresenceDistanceSensor> {
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<EntityCustomization<any>> = [
{
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,
},
},
];
Expand Down Expand Up @@ -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<EntityCustomization<any>> = [
{
for: DeviceTrackerConfig,
overrides: {
sourceType: 'bluetooth',
device: deviceInfo,
},
},
];
return this.entitiesService.add(
new DeviceTracker(id, name, true)
new DeviceTracker(id, name, true),
trackerCustomizations
) as DeviceTracker;
}

Expand Down

0 comments on commit 9e1be95

Please sign in to comment.