From 10b0e21eabcd3864fcd3ebed0f73427bef4b3876 Mon Sep 17 00:00:00 2001 From: Heiko Rothe Date: Sun, 16 Aug 2020 19:49:14 +0200 Subject: [PATCH] fix(bluetooth-classic): exclude old measurements from preservation --- .../bluetooth-classic.service.spec.ts | 20 +++++++++++++++++++ .../bluetooth-classic.service.ts | 7 ++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/integrations/bluetooth-classic/bluetooth-classic.service.spec.ts b/src/integrations/bluetooth-classic/bluetooth-classic.service.spec.ts index 49eafb1..dd070d3 100644 --- a/src/integrations/bluetooth-classic/bluetooth-classic.service.spec.ts +++ b/src/integrations/bluetooth-classic/bluetooth-classic.service.spec.ts @@ -546,6 +546,26 @@ Requesting information ... expect(clusterService.publish).not.toHaveBeenCalled(); }); + it('should send no pseudo state update if the last recorded distance is too old', () => { + const updateSpy = jest.spyOn(service, 'handleNewRssi').mockResolvedValue(); + jest.spyOn(service, 'shouldInquire').mockReturnValue(false); + config.preserveState = true; + + const sensor = new RoomPresenceDistanceSensor('bt-test', 'Test', 5); + sensor.distances = {}; + sensor.distances['test-instance'] = { + distance: 10, + outOfRange: false, + lastUpdatedAt: new Date(Date.now() - 25 * 1000), + }; + const device = { address: 'test', name: 'Test' }; + + service.updateSensorState(sensor, device); + + expect(updateSpy).not.toHaveBeenCalled(); + expect(clusterService.publish).not.toHaveBeenCalled(); + }); + it('should not distribute inquiries if not the leader', () => { clusterService.isMajorityLeader.mockReturnValue(false); const inquireSpy = jest.spyOn(service, 'inquireRssi'); diff --git a/src/integrations/bluetooth-classic/bluetooth-classic.service.ts b/src/integrations/bluetooth-classic/bluetooth-classic.service.ts index 85572bc..a624fc8 100644 --- a/src/integrations/bluetooth-classic/bluetooth-classic.service.ts +++ b/src/integrations/bluetooth-classic/bluetooth-classic.service.ts @@ -296,7 +296,12 @@ export class BluetoothClassicService extends KalmanFilterable(Object, 1.4, 1) const instanceName = this.configService.get('global').instanceName; const previousReading = sensor.distances[instanceName]; - if (previousReading) { + if ( + previousReading && + Date.now() < + previousReading.lastUpdatedAt.getTime() + + this.calculateCurrentTimeout() * 1000 + ) { // emit pseudo update to keep local state alive const event = new NewRssiEvent( instanceName,