From 655e35bf65e9cfa183d072e9931fd79221797379 Mon Sep 17 00:00:00 2001 From: sko Date: Thu, 9 Jan 2025 15:05:07 +0100 Subject: [PATCH] Revert "fix!: Remove `permit_join_timeout` (#25082)" This reverts commit 7d63a87aad954225c77156d22576939b1ffe7d6c. --- lib/extension/bridge.ts | 3 +-- lib/extension/homeassistant.ts | 14 ++++++++++ lib/types/api.ts | 3 +-- lib/zigbee.ts | 8 ++---- test/extensions/bridge.test.ts | 5 ++-- test/extensions/homeassistant.test.ts | 20 +++++++++++++++ test/mocks/zigbeeHerdsman.ts | 37 ++++++++++++--------------- 7 files changed, 56 insertions(+), 34 deletions(-) diff --git a/lib/extension/bridge.ts b/lib/extension/bridge.ts index 071b566c3b..662ea53f63 100644 --- a/lib/extension/bridge.ts +++ b/lib/extension/bridge.ts @@ -698,8 +698,7 @@ export default class Bridge extends Extension { channel: networkParams.channel, }, log_level: logger.getLevel(), - permit_join: this.zigbee.getPermitJoin(), - permit_join_end: this.zigbee.getPermitJoinEnd(), + permit_join_timeout: this.zigbee.getPermitJoinTimeout(), restart_required: this.restartRequired, config, config_schema: settings.schemaJson, diff --git a/lib/extension/homeassistant.ts b/lib/extension/homeassistant.ts index 19befccbf0..6c08e6c221 100644 --- a/lib/extension/homeassistant.ts +++ b/lib/extension/homeassistant.ts @@ -2028,6 +2028,20 @@ export default class HomeAssistant extends Extension { json_attributes_template: '{{ value_json.data.value | tojson }}', }, }, + { + type: 'sensor', + object_id: 'permit_join_timeout', + mockProperties: [], + discovery_payload: { + name: 'Permit join timeout', + device_class: 'duration', + unit_of_measurement: 's', + entity_category: 'diagnostic', + state_topic: true, + state_topic_postfix: 'info', + value_template: '{{ iif(value_json.permit_join_timeout is defined, value_json.permit_join_timeout, None) }}', + }, + }, // Switches. { diff --git a/lib/types/api.ts b/lib/types/api.ts index 2eaad7a007..7c17b9a2ab 100644 --- a/lib/types/api.ts +++ b/lib/types/api.ts @@ -170,8 +170,7 @@ export interface Zigbee2MQTTAPI { channel: number; }; log_level: 'debug' | 'info' | 'warning' | 'error'; - permit_join: boolean; - permit_join_end: number | undefined; + permit_join_timeout: number; restart_required: boolean; config: Settings; config_schema: typeof schemaJson; diff --git a/lib/zigbee.ts b/lib/zigbee.ts index 8d326350e8..b9cc44ce53 100644 --- a/lib/zigbee.ts +++ b/lib/zigbee.ts @@ -223,12 +223,8 @@ export default class Zigbee { logger.info('Stopped zigbee-herdsman'); } - getPermitJoin(): boolean { - return this.herdsman.getPermitJoin(); - } - - getPermitJoinEnd(): number | undefined { - return this.herdsman.getPermitJoinEnd(); + getPermitJoinTimeout(): number { + return this.herdsman.getPermitJoinTimeout(); } async permitJoin(time: number, device?: Device): Promise { diff --git a/test/extensions/bridge.test.ts b/test/extensions/bridge.test.ts index d345481c85..06b51037d4 100644 --- a/test/extensions/bridge.test.ts +++ b/test/extensions/bridge.test.ts @@ -300,9 +300,8 @@ describe('Extension: Bridge', () => { config_schema: settings.schemaJson, coordinator: {ieee_address: '0x00124b00120144ae', meta: {revision: 20190425, version: 1}, type: 'z-Stack'}, log_level: 'info', - network: {channel: 15, extended_pan_id: '0x64c5fd698daf0c00', pan_id: 5674}, - permit_join: false, - permit_join_end: undefined, + network: {channel: 15, extended_pan_id: 0x001122, pan_id: 5674}, + permit_join_timeout: 0, restart_required: false, version: version.version, zigbee_herdsman: zhVersion, diff --git a/test/extensions/homeassistant.test.ts b/test/extensions/homeassistant.test.ts index a3b597f996..17a2239dcd 100644 --- a/test/extensions/homeassistant.test.ts +++ b/test/extensions/homeassistant.test.ts @@ -2505,6 +2505,26 @@ describe('Extension: HomeAssistant', () => { {retain: true, qos: 1}, ); + payload = { + name: 'Permit join timeout', + object_id: 'zigbee2mqtt_bridge_permit_join_timeout', + entity_category: 'diagnostic', + device_class: 'duration', + unit_of_measurement: 's', + unique_id: 'bridge_0x00124b00120144ae_permit_join_timeout_zigbee2mqtt', + state_topic: 'zigbee2mqtt/bridge/info', + value_template: '{{ iif(value_json.permit_join_timeout is defined, value_json.permit_join_timeout, None) }}', + origin: origin, + device: devicePayload, + availability: [{topic: 'zigbee2mqtt/bridge/state', value_template: '{{ value_json.state }}'}], + availability_mode: 'all', + }; + expect(mockMQTT.publishAsync).toHaveBeenCalledWith( + 'homeassistant/sensor/1221051039810110150109113116116_0x00124b00120144ae/permit_join_timeout/config', + stringify(payload), + {retain: true, qos: 1}, + ); + // Switches. payload = { name: 'Permit join', diff --git a/test/mocks/zigbeeHerdsman.ts b/test/mocks/zigbeeHerdsman.ts index f5fd767703..03eeb01161 100644 --- a/test/mocks/zigbeeHerdsman.ts +++ b/test/mocks/zigbeeHerdsman.ts @@ -1123,27 +1123,22 @@ export const mockController = { on: (type: string, handler: EventHandler): void => { events[type] = handler; }, - start: vi.fn((): Promise => Promise.resolve('reset')), - stop: vi.fn(), - touchlinkIdentify: vi.fn(), - touchlinkScan: vi.fn(), - touchlinkFactoryReset: vi.fn(), - touchlinkFactoryResetFirst: vi.fn(), - addInstallCode: vi.fn(), - permitJoin: vi.fn(), - getPermitJoin: vi.fn((): boolean => false), - getPermitJoinEnd: vi.fn((): number | undefined => undefined), - isStopping: vi.fn((): boolean => false), - backup: vi.fn(), - coordinatorCheck: vi.fn(), - getCoordinatorVersion: vi.fn( - (): Promise => Promise.resolve({type: 'z-Stack', meta: {version: 1, revision: 20190425}}), - ), - getNetworkParameters: vi.fn( - (): Promise => Promise.resolve({panID: 0x162a, extendedPanID: '0x64c5fd698daf0c00', channel: 15}), - ), - getDevices: vi.fn((): Device[] => []), - getDevicesIterator: vi.fn(function* (predicate?: (value: Device) => boolean): Generator { + start: jest.fn((): Promise => Promise.resolve('reset')), + stop: jest.fn(), + touchlinkIdentify: jest.fn(), + touchlinkScan: jest.fn(), + touchlinkFactoryReset: jest.fn(), + touchlinkFactoryResetFirst: jest.fn(), + addInstallCode: jest.fn(), + permitJoin: jest.fn(), + getPermitJoinTimeout: jest.fn((): number => 0), + isStopping: jest.fn((): boolean => false), + backup: jest.fn(), + coordinatorCheck: jest.fn(), + getCoordinatorVersion: jest.fn((): Promise => Promise.resolve({type: 'z-Stack', meta: {version: 1, revision: 20190425}})), + getNetworkParameters: jest.fn((): Promise => Promise.resolve({panID: 0x162a, extendedPanID: 0x001122, channel: 15})), + getDevices: jest.fn((): Device[] => []), + getDevicesIterator: jest.fn(function* (predicate?: (value: Device) => boolean): Generator { for (const key in devices) { const device = devices[key as keyof typeof devices];