From 6855e03e68770ca80b343c954cf6ffc8f66c003e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Victor=20Hagelb=C3=A4ck?= Date: Sat, 27 Feb 2021 13:46:41 +0100 Subject: [PATCH] Invoke power cycling of the BLE adapter every 10th reconnect attempt --- plejd/PlejdBLEHandler.js | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/plejd/PlejdBLEHandler.js b/plejd/PlejdBLEHandler.js index 6f68a76..58ea552 100644 --- a/plejd/PlejdBLEHandler.js +++ b/plejd/PlejdBLEHandler.js @@ -48,6 +48,7 @@ class PlejBLEHandler extends EventEmitter { bus = null; connectedDevice = null; consecutiveWriteFails; + consecutiveReconnectAttempts = 0; discoveryTimeout = null; plejdService = null; pingRef = null; @@ -291,6 +292,7 @@ class PlejBLEHandler extends EventEmitter { // invalidated (third param), ) => this._onLastDataUpdated(iface, properties)); this.characteristics.lastData.StartNotify(); + this.consecutiveReconnectAttempts = 0; this.emit(PlejBLEHandler.EVENTS.connected); clearTimeout(this.emergencyReconnectTimeout); @@ -345,18 +347,21 @@ class PlejBLEHandler extends EventEmitter { } async _powerCycleAdapter() { + logger.verbose('Power cycling BLE adapter'); await this._powerOffAdapter(); await this._powerOnAdapter(); } async _powerOnAdapter() { + logger.verbose('Powering on BLE adapter and waiting 5 seconds'); await this.adapterProperties.Set(BLUEZ_ADAPTER_ID, 'Powered', new dbus.Variant('b', 1)); - await delay(1000); + await delay(5000); } async _powerOffAdapter() { + logger.verbose('Powering off BLE adapter and waiting 5 seconds'); await this.adapterProperties.Set(BLUEZ_ADAPTER_ID, 'Powered', new dbus.Variant('b', 0)); - await delay(1000); + await delay(5000); } async _cleanExistingConnections(managedObjects) { @@ -494,6 +499,19 @@ class PlejBLEHandler extends EventEmitter { try { logger.verbose('Reconnect: Clean up, emit reconnect event, wait 5s and the re-init...'); this.cleanup(); + + this.consecutiveReconnectAttempts++; + if (this.consecutiveReconnectAttempts % 10 === 0) { + logger.warn( + `Tried reconnecting ${this.consecutiveReconnectAttempts} times. Try power cycling the BLE adapter every 10th time...`, + ); + await this._powerCycleAdapter(); + } else { + logger.verbose( + `Reconnect attempt ${this.consecutiveReconnectAttempts} in a row. Will power cycle every 10th time.`, + ); + } + this.emit(PlejBLEHandler.EVENTS.reconnecting); // Emergency 2 minute timer if reconnect silently fails somewhere