Skip to content

Commit

Permalink
Added -mdnsinterface command line parameter to limit the MdnsBroadcaster
Browse files Browse the repository at this point in the history
  • Loading branch information
Luligu committed Jun 29, 2024
1 parent 638f52d commit 73f710f
Show file tree
Hide file tree
Showing 7 changed files with 540 additions and 14 deletions.
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ If you like this project and find it useful, please consider giving it a star on

## [1.3.7] - 2024-06-30

### Added
- [matter.js]: Added -mdnsinterface command line parameter to limit the MdnsBroadcaster to a single interface (e.g. matterbridge -bridge -mdnsinterface eth0). Matterbridge will validate the given interface and log a message if the interface is not available and will use all available interfaces.

### Changed

- [dependencies]: Update dependencies.
Expand Down
1 change: 1 addition & 0 deletions jest.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,4 +26,5 @@ export default {
],
},
transformIgnorePatterns: ['/node_modules/'],
testPathIgnorePatterns: ['/node_modules/', '/dist/', '/frontend/'],
};
6 changes: 3 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -76,9 +76,9 @@
"start:childbridge": "node ./dist/cli.js -childbridge",
"start:controller": "node ./dist/cli.js -controller",
"start:help": "node ./dist/cli.js -help",
"test": "jest",
"test:verbose": "jest --verbose",
"test:watch": "jest --watch",
"test": "node --experimental-vm-modules node_modules/jest/bin/jest.js",
"test:verbose": "node --experimental-vm-modules node_modules/jest/bin/jest.js --verbose",
"test:watch": "node --experimental-vm-modules node_modules/jest/bin/jest.js --watch",
"lint": "eslint --max-warnings=0 .",
"lint:fix": "eslint --fix --max-warnings=0 .",
"format": "prettier --write \"**/*.{js,jsx,ts,tsx,json,css,md}\"",
Expand Down
36 changes: 28 additions & 8 deletions src/matterbridge.ts
Original file line number Diff line number Diff line change
Expand Up @@ -190,11 +190,12 @@ export class Matterbridge extends EventEmitter {
public restartMode: 'service' | 'docker' | '' = '';
public debugEnabled = false;

private port = 5540;
private mdnsInterface: string | undefined; // matter server mdnsInterface: 'eth0' or 'wlan0' or 'WiFi'
private port = 5540; // first commissioning server port
private log!: AnsiLogger;
private hasCleanupStarted = false;
private plugins = new Map<string, RegisteredPlugin>();
private devices = new Map<string, RegisteredDevice>();
// private plugins = new Map<string, RegisteredPlugin>();
// private devices = new Map<string, RegisteredDevice>();
private registeredPlugins: RegisteredPlugin[] = [];
private registeredDevices: RegisteredDevice[] = [];
private nodeStorage: NodeStorageManager | undefined;
Expand Down Expand Up @@ -365,6 +366,8 @@ export class Matterbridge extends EventEmitter {
- help: show the help
- bridge: start Matterbridge in bridge mode
- childbridge: start Matterbridge in childbridge mode
- port [port]: start the commissioning server on the given port (default 5540)
- mdnsinterface [name]: set the interface to use for the matter server mdnsInterface (default all interfaces)
- frontend [port]: start the frontend on the given port (default 8283)
- debug: enable the Matterbridge debug mode (default false)
- matterlogger: set the matter.js logger level: debug | info | notice | warn | error | fatal (default info)
Expand All @@ -387,7 +390,10 @@ export class Matterbridge extends EventEmitter {
process.exit(0);
}

// Set the first port to use
// Set the interface to use for the matter server mdnsInterface
this.mdnsInterface = getParameter('mdnsinterface');

// Set the first port to use for the commissioning server
this.port = getIntParameter('port') ?? 5540;

// Set the restart mode
Expand Down Expand Up @@ -450,10 +456,10 @@ export class Matterbridge extends EventEmitter {
Logger.defaultLogLevel = Level.FATAL;
} else {
this.log.warn(`Invalid matterlogger level: ${level}. Using default level ${this.debugEnabled ? 'debug' : 'info'}.`);
Logger.defaultLogLevel = this.debugEnabled ? Level.DEBUG : Level.INFO;
Logger.defaultLogLevel = Level.INFO;
}
} else {
Logger.defaultLogLevel = this.debugEnabled ? Level.DEBUG : Level.INFO;
Logger.defaultLogLevel = Level.INFO;
}
Logger.format = Format.ANSI;

Expand Down Expand Up @@ -2233,6 +2239,8 @@ export class Matterbridge extends EventEmitter {
this.log.debug(`Creating matter commissioning server for plugin ${plg}${pluginName}${db} with hardwareVersion ${hardwareVersion} hardwareVersionString ${hardwareVersionString}`);
const commissioningServer = new CommissioningServer({
port: this.port++,
// listeningAddressIpv4
// listeningAddressIpv6
passcode: undefined,
discriminator: undefined,
deviceName,
Expand Down Expand Up @@ -2344,7 +2352,19 @@ export class Matterbridge extends EventEmitter {
*/
private createMatterServer(storageManager: StorageManager): MatterServer {
this.log.debug('Creating matter server');
const matterServer = new MatterServer(storageManager, { mdnsAnnounceInterface: undefined });

// Validate mdnsInterface
if (this.mdnsInterface) {
const networkInterfaces = os.networkInterfaces();
const availableInterfaces = Object.keys(networkInterfaces);
if (!availableInterfaces.includes(this.mdnsInterface)) {
this.log.error(`Invalid mdnsInterface: ${this.mdnsInterface}. Available interfaces are: ${availableInterfaces.join(', ')}. Using all available interfaces.`);
this.mdnsInterface = undefined;
} else {
this.log.info(`***Using mdnsInterface: ${this.mdnsInterface}`);
}
}
const matterServer = new MatterServer(storageManager, { mdnsInterface: this.mdnsInterface });
this.log.debug('Created matter server');
return matterServer;
}
Expand Down Expand Up @@ -2915,7 +2935,7 @@ export class Matterbridge extends EventEmitter {
this.log.info(`WebSocketServer client ${clientIp} connected`);
this.log.setGlobalCallback(this.wssSendMessage.bind(this));
this.log.debug('WebSocketServer logger callback added');
this.wssSendMessage('Matterbridge', 'info', 'WebSocketServer client connected to Matterbridge');
this.wssSendMessage('Matterbridge', 'info', `WebSocketServer client ${clientIp} connected to Matterbridge`);

ws.on('message', (message) => {
this.log.debug(`WebSocket client message: ${message}`);
Expand Down
236 changes: 236 additions & 0 deletions src/mock/shellyplus2pm-5443b23d81f8.roller.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,236 @@
{
"shelly": {
"name": "My shelly plus 2PM",
"id": "shellyplus2pm-5443b23d81f8",
"mac": "5443B23D81F8",
"slot": 0,
"model": "SNSW-102P16EU",
"gen": 2,
"fw_id": "20240430-105737/1.3.1-gd8534ee",
"ver": "1.3.1",
"app": "Plus2PM",
"auth_en": false,
"auth_domain": null,
"profile": "cover"
},
"settings": {
"ble": {
"enable": true,
"rpc": {
"enable": true
},
"observer": {
"enable": false
}
},
"cloud": {
"enable": true,
"server": "shelly-103-eu.shelly.cloud:6022/jrpc"
},
"cover:0": {
"id": 0,
"name": null,
"motor": {
"idle_power_thr": 2,
"idle_confirm_period": 0.25
},
"maxtime_open": 10,
"maxtime_close": 10,
"initial_state": "stopped",
"invert_directions": false,
"in_mode": "dual",
"swap_inputs": false,
"safety_switch": {
"enable": false,
"direction": "both",
"action": "stop",
"allowed_move": null
},
"power_limit": 2800,
"voltage_limit": 280,
"undervoltage_limit": 0,
"current_limit": 10,
"obstruction_detection": {
"enable": false,
"direction": "both",
"action": "stop",
"power_thr": 1000,
"holdoff": 1
}
},
"input:0": {
"id": 0,
"name": null,
"type": "switch",
"enable": true,
"invert": false,
"factory_reset": true
},
"input:1": {
"id": 1,
"name": null,
"type": "switch",
"enable": true,
"invert": false,
"factory_reset": true
},
"mqtt": {
"enable": false,
"server": null,
"client_id": "shellyplus2pm-5443b23d81f8",
"user": null,
"ssl_ca": null,
"topic_prefix": "shellyplus2pm-5443b23d81f8",
"rpc_ntf": true,
"status_ntf": false,
"use_client_cert": false,
"enable_rpc": true,
"enable_control": true
},
"sys": {
"device": {
"name": "My Shelly 2PM plus",
"mac": "5443B23D81F8",
"fw_id": "20240430-105737/1.3.1-gd8534ee",
"discoverable": true,
"eco_mode": false,
"profile": "cover",
"addon_type": null
},
"location": {
"tz": null,
"lat": null,
"lon": null
},
"debug": {
"level": 2,
"file_level": null,
"mqtt": {
"enable": false
},
"websocket": {
"enable": false
},
"udp": {
"addr": null
}
},
"ui_data": {},
"rpc_udp": {
"dst_addr": null,
"listen_port": null
},
"sntp": {
"server": "time.google.com"
},
"cfg_rev": 26
},
"wifi": {
"ap": {
"ssid": "ShellyPlus2PM-5443B23D81F8",
"is_open": true,
"enable": false,
"range_extender": {
"enable": false
}
},
"sta": {
"ssid": "FibreBox_X6-12A4C7",
"is_open": false,
"enable": true,
"ipv4mode": "dhcp",
"ip": null,
"netmask": null,
"gw": null,
"nameserver": null
},
"sta1": {
"ssid": null,
"is_open": true,
"enable": false,
"ipv4mode": "dhcp",
"ip": null,
"netmask": null,
"gw": null,
"nameserver": null
},
"roam": {
"rssi_thr": -80,
"interval": 60
}
},
"ws": {
"enable": false,
"server": null,
"ssl_ca": "ca.pem"
}
},
"status": {
"ble": {},
"cloud": {
"connected": true
},
"cover:0": {
"id": 0,
"source": "timeout",
"state": "open",
"apower": 0,
"voltage": 232.8,
"current": 0,
"pf": 0,
"freq": 50,
"aenergy": {
"total": 0,
"by_minute": [0, 0, 0],
"minute_ts": 1718609280
},
"temperature": {
"tC": 53.6,
"tF": 128.5
},
"pos_control": false,
"last_direction": "open"
},
"input:0": {
"id": 0,
"state": false
},
"input:1": {
"id": 1,
"state": false
},
"mqtt": {
"connected": false
},
"sys": {
"mac": "5443B23D81F8",
"restart_required": false,
"time": "09:28",
"unixtime": 1718609333,
"uptime": 122263,
"ram_size": 260044,
"ram_free": 117332,
"fs_size": 458752,
"fs_free": 131072,
"cfg_rev": 26,
"kvs_rev": 0,
"schedule_rev": 1,
"webhook_rev": 1,
"available_updates": {
"stable": {
"version": "1.3.2"
}
},
"reset_reason": 1
},
"wifi": {
"sta_ip": "192.168.1.218",
"status": "got ip",
"ssid": "FibreBox_X6-12A4C7",
"rssi": -56
},
"ws": {
"connected": false
}
}
}
Loading

0 comments on commit 73f710f

Please sign in to comment.