From 40596bab6ad960cf9efde4e8a097c9ca02c527c3 Mon Sep 17 00:00:00 2001 From: Koen Kanters Date: Sun, 24 Mar 2019 14:38:08 +0100 Subject: [PATCH] =?UTF-8?q?Always=20ping=20xiaomi=20devices=20through=20?= =?UTF-8?q?=E2=80=98basic=E2=80=99=20mechanism.=20#1248?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/extension/deviceAvailability.js | 14 ++++++++------ lib/extension/xiaomi.js | 6 ++---- lib/util/utils.js | 1 + 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/lib/extension/deviceAvailability.js b/lib/extension/deviceAvailability.js index d40c4fa8..34d9e43d 100644 --- a/lib/extension/deviceAvailability.js +++ b/lib/extension/deviceAvailability.js @@ -38,7 +38,7 @@ class DeviceAvailability { return true; } - return device.type === 'Router' && (device.powerSource && device.powerSource !== 'Battery'); + return utils.isRouter(device) && !utils.isBatteryPowered(device); } getAllPingableDevices() { @@ -53,12 +53,13 @@ class DeviceAvailability { .forEach((device) => this.publishAvailability(device.ieeeAddr, true)); // Start timers for all devices - this.getAllPingableDevices().forEach((device) => this.setTimer(device.ieeeAddr)); + this.getAllPingableDevices().forEach((device) => this.setTimer(device)); } - handleInterval(ieeeAddr) { + handleInterval(device) { // Check if a job is already pending. // This avoids overflowing of the queue in case the queue is not able to catch-up with the jobs being added. + const ieeeAddr = device.ieeeAddr; if (this.pending.includes(ieeeAddr)) { logger.debug(`Skipping ping for ${ieeeAddr} becuase job is already in queue`); return; @@ -68,6 +69,7 @@ class DeviceAvailability { // When a device is already unavailable, log the ping failed on 'debug' instead of 'error'. const errorLogLevel = this.state.hasOwnProperty(ieeeAddr) && !this.state[ieeeAddr] ? 'debug' : 'error'; + const mechanism = utils.isXiaomiDevice(device) ? 'basic' : 'default'; this.zigbee.ping(ieeeAddr, errorLogLevel, (error) => { this.publishAvailability(ieeeAddr, !error); @@ -78,8 +80,8 @@ class DeviceAvailability { this.pending.splice(index, 1); } - this.setTimer(ieeeAddr); - }); + this.setTimer(device); + }, mechanism); } setTimer(ieeeAddr) { @@ -148,7 +150,7 @@ class DeviceAvailability { this.publishAvailability(device.ieeeAddr, true); } - this.setTimer(device.ieeeAddr); + this.setTimer(device); } } } diff --git a/lib/extension/xiaomi.js b/lib/extension/xiaomi.js index 8aa9fa04..17a14b4a 100644 --- a/lib/extension/xiaomi.js +++ b/lib/extension/xiaomi.js @@ -53,10 +53,8 @@ class Xiaomi { handleInterval() { this.zigbee.getAllClients() - .filter((d) => utils.isXiaomiDevice(d)) // Filter Xiaomi devices - .filter((d) => d.type === 'Router') // Filter routers - .filter((d) => d.powerSource && d.powerSource !== 'Battery') // Remove battery powered devices - .forEach((d) => this.ping(d.ieeeAddr)); // Ping devices. + .filter((d) => utils.isXiaomiDevice(d) && utils.isRouter(d) && !utils.isBatteryPowered(d)) + .forEach((d) => this.ping(d.ieeeAddr)); } } diff --git a/lib/util/utils.js b/lib/util/utils.js index 340d676e..022eafab 100644 --- a/lib/util/utils.js +++ b/lib/util/utils.js @@ -95,6 +95,7 @@ module.exports = { isXiaomiDevice: (device) => device.modelId !== 'lumi.router' && xiaomiManufacturerID.includes(device.manufId), isIkeaTradfriDevice: (device) => ikeaTradfriManufacturerID.includes(device.manufId), isRouter: (device) => device.type === 'Router', + isBatteryPowered: (device) => device.powerSource && device.powerSource === 'Battery', isNumeric: (string) => /^\d+$/.test(string), toLocalISOString: (dDate) => toLocalISOString(dDate), getPostfixes: () => postfixes,