Skip to content

Commit

Permalink
fix!: Improve permit join (#24257)
Browse files Browse the repository at this point in the history
* fix: Improve permit join

* Update Home Assistant permit join switch

* Remove `permit_join` from `settings.schema.json`

* Update zigbee-herdsman version to pre-release.

* Fix pnpm overrides

* Update test/homeassistant.test.js

---------

Co-authored-by: Koen Kanters <[email protected]>
  • Loading branch information
Nerivec and Koenkk authored Oct 15, 2024
1 parent 1092563 commit 1b9e444
Show file tree
Hide file tree
Showing 15 changed files with 78 additions and 186 deletions.
13 changes: 0 additions & 13 deletions lib/controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -167,19 +167,6 @@ export class Controller {

logger.info(`Currently ${deviceCount} devices are joined.`);

// Enable zigbee join
try {
if (settings.get().permit_join) {
logger.warning('`permit_join` set to `true` in configuration.yaml.');
logger.warning('Allowing new devices to join.');
logger.warning('Set `permit_join` to `false` once you joined all devices.');
}

await this.zigbee.permitJoin(settings.get().permit_join);
} catch (error) {
logger.error(`Failed to set permit join to ${settings.get().permit_join} (${(error as Error).message})`);
}

// MQTT
try {
await this.mqtt.connect();
Expand Down
37 changes: 10 additions & 27 deletions lib/extension/bridge.ts
Original file line number Diff line number Diff line change
Expand Up @@ -225,10 +225,6 @@ export default class Bridge extends Extension {
if (restartRequired) this.restartRequired = true;

// Apply some settings on-the-fly.
if (newSettings.permit_join != undefined) {
await this.zigbee.permitJoin(settings.get().permit_join);
}

if (newSettings.homeassistant != undefined) {
await this.enableDisableExtension(!!settings.get().homeassistant, 'HomeAssistant');
}
Expand Down Expand Up @@ -323,17 +319,15 @@ export default class Bridge extends Extension {
}

@bind async permitJoin(message: KeyValue | string): Promise<MQTTResponse> {
if (typeof message === 'object' && message.value === undefined) {
throw new Error('Invalid payload');
}

let value: boolean | string;
let time: number | undefined;
let device: Device | undefined;

if (typeof message === 'object') {
value = message.value;
time = message.time;
if (message.time === undefined) {
throw new Error('Invalid payload');
}

time = Number.parseInt(message.time, 10);

if (message.device) {
const resolved = this.zigbee.resolveEntity(message.device);
Expand All @@ -345,25 +339,15 @@ export default class Bridge extends Extension {
}
}
} else {
value = message;
}

if (typeof value === 'string') {
value = value.toLowerCase() === 'true';
time = Number.parseInt(message, 10);
}

await this.zigbee.permitJoin(value, device, time);
await this.zigbee.permitJoin(time, device);

const response: {value: boolean; device?: string; time?: number} = {value};
const response: {time: number; device?: string} = {time};

if (typeof message === 'object') {
if (device) {
response.device = message.device;
}

if (time != undefined) {
response.time = message.time;
}
if (device) {
response.device = device.name;
}

return utils.getResponse(message, response);
Expand Down Expand Up @@ -679,7 +663,6 @@ export default class Bridge extends Extension {
},
network: utils.toSnakeCaseObject(await this.zigbee.getNetworkParameters()),
log_level: logger.getLevel(),
permit_join: this.zigbee.getPermitJoin(),
permit_join_timeout: this.zigbee.getPermitJoinTimeout(),
restart_required: this.restartRequired,
config,
Expand Down
5 changes: 3 additions & 2 deletions lib/extension/homeassistant.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2151,8 +2151,9 @@ export default class HomeAssistant extends Extension {
value_template: '{{ value_json.permit_join | lower }}',
command_topic: `${baseTopic}/request/permit_join`,
state_on: 'true',
payload_on: '{"value": true, "time": 254}',
payload_off: 'false',
state_off: 'false',
payload_on: '{"time": 254}',
payload_off: '{"time": 0}',
},
},
);
Expand Down
1 change: 0 additions & 1 deletion lib/types/types.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,6 @@ declare global {
legacy_entity_attributes: boolean;
legacy_triggers: boolean;
};
permit_join: boolean;
availability?: {
active: {timeout: number};
passive: {timeout: number};
Expand Down
6 changes: 0 additions & 6 deletions lib/util/settings.schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -45,12 +45,6 @@
}
]
},
"permit_join": {
"type": "boolean",
"default": false,
"title": "Permit join",
"description": "Allow new devices to join (re-applied at restart)"
},
"availability": {
"oneOf": [
{
Expand Down
1 change: 0 additions & 1 deletion lib/util/settings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,6 @@ const ajvRestartRequiredGroupOptions = new Ajv({allErrors: true})
.addKeyword({keyword: 'requiresRestart', validate: (s: unknown) => !s})
.compile(schemaJson.definitions.group);
const defaults: RecursivePartial<Settings> = {
permit_join: false,
external_converters: [],
mqtt: {
base_topic: 'zigbee2mqtt',
Expand Down
16 changes: 4 additions & 12 deletions lib/zigbee.ts
Original file line number Diff line number Diff line change
Expand Up @@ -225,26 +225,18 @@ export default class Zigbee {
logger.info('Stopped zigbee-herdsman');
}

getPermitJoin(): boolean {
return this.herdsman.getPermitJoin();
}

getPermitJoinTimeout(): number | undefined {
getPermitJoinTimeout(): number {
return this.herdsman.getPermitJoinTimeout();
}

async permitJoin(permit: boolean, device?: Device, time?: number): Promise<void> {
if (permit) {
async permitJoin(time: number, device?: Device): Promise<void> {
if (time > 0) {
logger.info(`Zigbee: allowing new devices to join${device ? ` via ${device.name}` : ''}.`);
} else {
logger.info('Zigbee: disabling joining new devices.');
}

if (device && permit) {
await this.herdsman.permitJoin(permit, device.zh, time);
} else {
await this.herdsman.permitJoin(permit, undefined, time);
}
await this.herdsman.permitJoin(time, device?.zh);
}

@bind private resolveDevice(ieeeAddr: string): Device | undefined {
Expand Down
6 changes: 3 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@
"winston-syslog": "^2.7.1",
"winston-transport": "^4.8.0",
"ws": "^8.18.0",
"zigbee-herdsman": "2.1.3",
"zigbee-herdsman": "3.0.0-pre.0",
"zigbee-herdsman-converters": "20.28.0",
"zigbee2mqtt-frontend": "0.7.4"
},
Expand Down Expand Up @@ -92,8 +92,8 @@
"typescript": "^5.6.3",
"typescript-eslint": "^8.8.1"
},
"overrides": {
"zigbee-herdsman-converters": {
"pnpm": {
"overrides": {
"zigbee-herdsman": "$zigbee-herdsman"
}
},
Expand Down
36 changes: 20 additions & 16 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit 1b9e444

Please sign in to comment.