Skip to content

Commit

Permalink
feat(home-assistant): refresh states after broker re-connect
Browse files Browse the repository at this point in the history
Closes #218
  • Loading branch information
mKeRix committed Aug 16, 2020
1 parent ae40009 commit 85064e6
Show file tree
Hide file tree
Showing 3 changed files with 43 additions and 3 deletions.
3 changes: 2 additions & 1 deletion src/integrations/home-assistant/home-assistant.module.ts
@@ -1,13 +1,14 @@
import { DynamicModule, Module } from '@nestjs/common';
import { HomeAssistantService } from './home-assistant.service';
import { ConfigModule } from '../../config/config.module';
import { EntitiesModule } from '../../entities/entities.module';

@Module({})
export default class HomeAssistantModule {
static forRoot(): DynamicModule {
return {
module: HomeAssistantModule,
imports: [ConfigModule],
imports: [ConfigModule, EntitiesModule],
providers: [HomeAssistantService],
};
}
Expand Down
32 changes: 30 additions & 2 deletions src/integrations/home-assistant/home-assistant.service.spec.ts
Expand Up @@ -22,6 +22,9 @@ import { Switch } from '../../entities/switch';
import { DeviceTracker } from '../../entities/device-tracker';
import { Camera } from '../../entities/camera';
import { DISTRIBUTED_DEVICE_ID } from './home-assistant.const';
import { EntitiesModule } from '../../entities/entities.module';
import { EntitiesService } from '../../entities/entities.service';
import { ClusterService } from '../../cluster/cluster.service';

jest.mock('async-mqtt', () => {
return {
Expand All @@ -44,13 +47,26 @@ describe('HomeAssistantService', () => {
error: jest.fn(),
warn: jest.fn(),
};
const entitiesService = {
refreshStates: jest.fn(),
};
const clusterService = {};

beforeEach(async () => {
emitter = new EventEmitter();
const module: TestingModule = await Test.createTestingModule({
imports: [NestEmitterModule.forRoot(emitter), ConfigModule],
imports: [
NestEmitterModule.forRoot(emitter),
ConfigModule,
EntitiesModule,
],
providers: [HomeAssistantService],
}).compile();
})
.overrideProvider(EntitiesService)
.useValue(entitiesService)
.overrideProvider(ClusterService)
.useValue(clusterService)
.compile();
module.useLogger(loggerService);

jest.clearAllMocks();
Expand Down Expand Up @@ -94,6 +110,18 @@ describe('HomeAssistantService', () => {
expect(mockSystem).toHaveBeenCalled();
});

it('should request an entity state refresh on broker reconnect', async () => {
const mqttEmitter = new EventEmitter();
mockMqttClient.on.mockImplementation((event, callback) => {
mqttEmitter.on(event, callback);
});
await service.onModuleInit();

mqttEmitter.emit('connect');

expect(entitiesService.refreshStates).toHaveBeenCalledTimes(1);
});

it('should send offline messages for local entities on shutdown', async () => {
await service.onModuleInit();
service.handleNewEntity(new Sensor('test', 'Test'));
Expand Down
11 changes: 11 additions & 0 deletions src/integrations/home-assistant/home-assistant.service.ts
Expand Up @@ -28,6 +28,7 @@ import { DeviceTracker } from '../../entities/device-tracker';
import { DeviceTrackerConfig } from './device-tracker-config';
import { Camera } from '../../entities/camera';
import { CameraConfig } from './camera-config';
import { EntitiesService } from '../../entities/entities.service';

const PROPERTY_BLACKLIST = ['component', 'configTopic', 'commandStore'];

Expand All @@ -49,6 +50,7 @@ export class HomeAssistantService

constructor(
private readonly configService: ConfigService,
private readonly entitiesService: EntitiesService,
@InjectEventEmitter() private readonly emitter: EntitiesEventEmitter
) {
this.config = this.configService.get('homeAssistant');
Expand All @@ -67,6 +69,7 @@ export class HomeAssistantService
false
);
this.mqttClient.on('message', this.handleIncomingMessage.bind(this));
this.mqttClient.on('connect', this.handleReconnect.bind(this));
this.logger.log(
`Successfully connected to MQTT broker at ${this.config.mqttUrl}`
);
Expand Down Expand Up @@ -250,6 +253,14 @@ export class HomeAssistantService
}
}

/**
* Handles broker re-connection events.
*/
protected handleReconnect(): void {
this.logger.log('Re-connected to broker');
this.entitiesService.refreshStates();
}

/**
* Retrieves information about the local device.
*
Expand Down

0 comments on commit 85064e6

Please sign in to comment.