mirror of
https://github.com/Koenkk/zigbee2mqtt.git
synced 2026-08-23 19:19:52 +00:00
Availability stop pining when device leaves. #6281
This commit is contained in:
@@ -128,6 +128,15 @@ class AvailabilityNew extends ExtensionTS {
|
||||
this.zigbee.on('lastSeenChanged', this.lastSeenChanged);
|
||||
}
|
||||
|
||||
override onZigbeeEvent(type: ZigbeeEventType, data: ZigbeeEventData, resolvedEntity: ResolvedEntity): void {
|
||||
resolvedEntity;
|
||||
|
||||
/* istanbul ignore else */
|
||||
if (type === 'deviceLeave') {
|
||||
clearTimeout(this.timers[data.ieeeAddr]);
|
||||
}
|
||||
}
|
||||
|
||||
private publishAvailability(re: ResolvedEntity, logLastSeen: boolean): void {
|
||||
if (logLastSeen) {
|
||||
const ago = Date.now() - re.device.lastSeen;
|
||||
|
||||
@@ -44,7 +44,7 @@ abstract class ExtensionTS {
|
||||
*/
|
||||
/* istanbul ignore next */
|
||||
/* eslint-disable-next-line @typescript-eslint/no-unused-vars */
|
||||
onZigbeeEvent(type: string, data: unknown, resolvedEntity: ResolvedEntity): void {}
|
||||
onZigbeeEvent(type: ZigbeeEventType, data: ZigbeeEventData, resolvedEntity: ResolvedEntity): void {}
|
||||
|
||||
/**
|
||||
* Is called when a MQTT message is received
|
||||
|
||||
@@ -3,6 +3,12 @@ import type {Device as ZHDevice} from 'zigbee-herdsman/dist/controller/model';
|
||||
declare global {
|
||||
type Device = ZHDevice;
|
||||
|
||||
type ZigbeeEventType = 'deviceLeave';
|
||||
|
||||
interface ZigbeeEventData {
|
||||
ieeeAddr: string;
|
||||
}
|
||||
|
||||
/* eslint-disable */
|
||||
// Controller
|
||||
interface KeyValue {
|
||||
|
||||
@@ -196,4 +196,18 @@ describe('Availability', () => {
|
||||
await advancedTime(minutes(7));
|
||||
expect(devices.bulb_color.ping).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
|
||||
it('Should stop pinging device when it leaves', async () => {
|
||||
await resetExtension();
|
||||
MQTT.publish.mockClear();
|
||||
|
||||
await advancedTime(minutes(9));
|
||||
expect(devices.bulb_color.ping).toHaveBeenCalledTimes(0);
|
||||
|
||||
await zigbeeHerdsman.events.deviceLeave({ieeeAddr: devices.bulb_color.ieeeAddr});
|
||||
await flushPromises();
|
||||
|
||||
await advancedTime(minutes(3));
|
||||
expect(devices.bulb_color.ping).toHaveBeenCalledTimes(0);
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user