Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/feat/2.0.0' into fix/groups-conf…
Browse files Browse the repository at this point in the history
…iguration
  • Loading branch information
Koenkk committed Oct 20, 2024
2 parents ee66c06 + 9ea11fa commit 7734539
Show file tree
Hide file tree
Showing 50 changed files with 5,063 additions and 4,769 deletions.
1 change: 1 addition & 0 deletions .prettierrc
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
"endOfLine": "lf",
"tabWidth": 4,
"importOrder": [
"^[./]*/mocks",
"",
"<TYPES>^(node:)",
"",
Expand Down
2 changes: 1 addition & 1 deletion index.js
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,7 @@ async function start() {
return exit(1);
}

const Controller = require('./dist/controller');
const {Controller} = require('./dist/controller');
controller = new Controller(restart, exit);

await controller.start();
Expand Down
15 changes: 0 additions & 15 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 Expand Up @@ -379,5 +366,3 @@ export class Controller {
}
}
}

module.exports = Controller;
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
9 changes: 5 additions & 4 deletions lib/util/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,17 +10,18 @@ import humanizeDuration from 'humanize-duration';

import data from './data';

function pad(num: number): string {
const norm = Math.floor(Math.abs(num));
return (norm < 10 ? '0' : '') + norm;
}

// construct a local ISO8601 string (instead of UTC-based)
// Example:
// - ISO8601 (UTC) = 2019-03-01T15:32:45.941+0000
// - ISO8601 (local) = 2019-03-01T16:32:45.941+0100 (for timezone GMT+1)
function toLocalISOString(date: Date): string {
const tzOffset = -date.getTimezoneOffset();
const plusOrMinus = tzOffset >= 0 ? '+' : '-';
const pad = (num: number): string => {
const norm = Math.floor(Math.abs(num));
return (norm < 10 ? '0' : '') + norm;
};

return (
date.getFullYear() +
Expand Down
4 changes: 3 additions & 1 deletion lib/util/yaml.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import assert from 'assert';
import fs from 'fs';

import equals from 'fast-deep-equal/es6';
Expand All @@ -20,7 +21,8 @@ export class YAMLFileException extends YAMLException {
function read(file: string): KeyValue {
try {
const result = yaml.load(fs.readFileSync(file, 'utf8'));
return (result as KeyValue) ?? {};
assert(result instanceof Object);
return result as KeyValue;
} catch (error) {
if (error instanceof YAMLException) {
throw new YAMLFileException(error, file);
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 7734539

Please sign in to comment.