diff --git a/lib/extension/availabilityNew.ts b/lib/extension/availabilityNew.ts index f2e9a5a3d4..71e01141b7 100644 --- a/lib/extension/availabilityNew.ts +++ b/lib/extension/availabilityNew.ts @@ -62,10 +62,13 @@ class AvailabilityNew extends ExtensionTS { const re = this.pingQueue[0]; let pingedSuccessfully = false; - const attempts = this.isAvailable(re) ? 3 : 1; + const available = this.availabilityCache[re.device.ieeeAddr] || this.isAvailable(re); + const attempts = available ? 2 : 1; for (let i = 0; i < attempts; i++) { try { - await re.device.ping(); + // Enable recovery if device is marked as available and first ping fails. + const disableRecovery = !(i == 1 && available); + await re.device.ping(disableRecovery); pingedSuccessfully = true; logger.debug(`Succesfully pinged '${re.name}' (attempt ${i + 1}/${attempts})`); break; diff --git a/test/availabilityNew.test.ts b/test/availabilityNew.test.ts index 5eac5e1829..fdb0d4b7b0 100644 --- a/test/availabilityNew.test.ts +++ b/test/availabilityNew.test.ts @@ -79,6 +79,7 @@ describe('Availability', () => { await advancedTime(minutes(7)); expect(devices.bulb_color.ping).toHaveBeenCalledTimes(1); + expect(devices.bulb_color.ping).toHaveBeenNthCalledWith(1, true); expect(MQTT.publish).toHaveBeenCalledWith('zigbee2mqtt/bulb_color/availability', 'offline', {retain: true, qos: 0}, expect.any(Function)); }); @@ -104,6 +105,7 @@ describe('Availability', () => { await advancedTime(minutes(10)); expect(devices.bulb_color.ping).toHaveBeenCalledTimes(1); + expect(devices.bulb_color.ping).toHaveBeenNthCalledWith(1, true); expect(MQTT.publish).toHaveBeenCalledWith('zigbee2mqtt/bulb_color/availability', 'offline', {retain: true, qos: 0}, expect.any(Function)); }); @@ -123,6 +125,8 @@ describe('Availability', () => { devices.bulb_color.lastSeen = Date.now() + minutes(10); await advancedTime(minutes(10)); expect(devices.bulb_color.ping).toHaveBeenCalledTimes(2); + expect(devices.bulb_color.ping).toHaveBeenNthCalledWith(1, true); + expect(devices.bulb_color.ping).toHaveBeenNthCalledWith(2, false); expect(MQTT.publish).toHaveBeenCalledWith('zigbee2mqtt/bulb_color/availability', 'offline', {retain: true, qos: 0}, expect.any(Function)); });