matterbridge-irobot 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +3 -3
- package/README.md +10 -8
- package/dist/iRobot.d.ts +89 -0
- package/dist/iRobot.js +256 -0
- package/dist/module.d.ts +9 -0
- package/dist/{platform.js → module.js} +9 -2
- package/npm-shrinkwrap.json +16 -15
- package/package.json +14 -5
- package/dist/index.js +0 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
# <img src="https://
|
|
1
|
+
# <img src="https://matterbridge.io/assets/matterbridge.svg" alt="Matterbridge Logo" width="64px" height="64px"> Matterbridge iRobot plugin changelog
|
|
2
2
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
|
|
5
|
-
If you like this project and find it useful, please consider giving it a star on GitHub at https://github.com/Luligu/matterbridge-
|
|
5
|
+
If you like this project and find it useful, please consider giving it a star on GitHub at https://github.com/Luligu/matterbridge-irobot and sponsoring it.
|
|
6
6
|
|
|
7
7
|
## [0.0.1] - 2025-02-11
|
|
8
8
|
|
|
9
9
|
<a href="https://www.buymeacoffee.com/luligugithub">
|
|
10
|
-
<img src="
|
|
10
|
+
<img src="https://matterbridge.io/assets/bmc-button.svg" alt="Buy me a coffee" width="120">
|
|
11
11
|
</a>
|
|
12
12
|
|
|
13
13
|
<!-- Commented out section
|
package/README.md
CHANGED
|
@@ -1,15 +1,17 @@
|
|
|
1
|
-
# <img src="https://
|
|
1
|
+
# <img src="https://matterbridge.io/assets/matterbridge.svg" alt="Matterbridge Logo" width="64px" height="64px"> Matterbridge iRobot plugin
|
|
2
2
|
|
|
3
3
|
[](https://www.npmjs.com/package/matterbridge-irobot)
|
|
4
4
|
[](https://www.npmjs.com/package/matterbridge-irobot)
|
|
5
|
-
[](https://hub.docker.com/r/luligu/matterbridge)
|
|
6
|
+
[](https://hub.docker.com/r/luligu/matterbridge)
|
|
7
|
+

|
|
8
8
|

|
|
9
9
|
|
|
10
|
-
[](https://www.npmjs.com/package/matterbridge)
|
|
11
|
+
[](https://www.npmjs.com/package/matter-history)
|
|
12
|
+
[](https://www.npmjs.com/package/node-ansi-logger)
|
|
13
|
+
[](https://www.npmjs.com/package/node-persist-manager)
|
|
14
14
|
|
|
15
15
|
---
|
|
16
|
+
|
|
17
|
+
Work in progress!
|
package/dist/iRobot.d.ts
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import dgram from 'node:dgram';
|
|
2
|
+
export interface DiscoveryInfo {
|
|
3
|
+
ip: string;
|
|
4
|
+
ver?: string;
|
|
5
|
+
hostname?: string;
|
|
6
|
+
robotname?: string;
|
|
7
|
+
robotid?: string;
|
|
8
|
+
mac?: string;
|
|
9
|
+
sw?: string;
|
|
10
|
+
sku?: string;
|
|
11
|
+
nc?: number;
|
|
12
|
+
proto?: string;
|
|
13
|
+
cap?: {
|
|
14
|
+
'pose'?: number;
|
|
15
|
+
'rNav'?: number;
|
|
16
|
+
'ns'?: number;
|
|
17
|
+
'maps'?: number;
|
|
18
|
+
'pmaps'?: number;
|
|
19
|
+
'sem2umf'?: number;
|
|
20
|
+
'floorTypeDetect'?: number;
|
|
21
|
+
'keepOutZones'?: number;
|
|
22
|
+
'multiPass'?: number;
|
|
23
|
+
'carpetBoost'?: number;
|
|
24
|
+
'edge'?: number | null;
|
|
25
|
+
'eco'?: number;
|
|
26
|
+
'area'?: number;
|
|
27
|
+
'regions'?: number;
|
|
28
|
+
'cleaningPasses'?: number;
|
|
29
|
+
'alwaysFinish'?: number;
|
|
30
|
+
'binFullDetect'?: number;
|
|
31
|
+
'addOnHw'?: number;
|
|
32
|
+
'dockComm'?: number;
|
|
33
|
+
'tLine'?: number;
|
|
34
|
+
'tank'?: number;
|
|
35
|
+
'evac'?: number;
|
|
36
|
+
'odoa'?: number;
|
|
37
|
+
'obstacleAvoidance'?: number;
|
|
38
|
+
'ota'?: number;
|
|
39
|
+
'langOta'?: number;
|
|
40
|
+
'lang'?: number;
|
|
41
|
+
'5ghz'?: number;
|
|
42
|
+
'ble'?: number;
|
|
43
|
+
'pp'?: number;
|
|
44
|
+
'pw'?: number;
|
|
45
|
+
'oMode'?: number;
|
|
46
|
+
'prov'?: number;
|
|
47
|
+
'sched'?: number;
|
|
48
|
+
'svcConf'?: number;
|
|
49
|
+
'mc'?: number;
|
|
50
|
+
'expectingUserConf'?: number;
|
|
51
|
+
'team'?: number;
|
|
52
|
+
'hm'?: number;
|
|
53
|
+
'idl'?: number;
|
|
54
|
+
'missionStatus'?: number;
|
|
55
|
+
'batteryStatus'?: number;
|
|
56
|
+
'chargingState'?: number;
|
|
57
|
+
'dockingState'?: number;
|
|
58
|
+
'runningState'?: number;
|
|
59
|
+
'pausedState'?: number;
|
|
60
|
+
'log'?: number;
|
|
61
|
+
'bleLog'?: number;
|
|
62
|
+
'filterMaintenance'?: number;
|
|
63
|
+
'errorReporting'?: number;
|
|
64
|
+
'cloud'?: number;
|
|
65
|
+
'remoteControl'?: number;
|
|
66
|
+
'fwUpdateNotify'?: number;
|
|
67
|
+
} & Record<string, number | null>;
|
|
68
|
+
freq?: number;
|
|
69
|
+
cloudConnState?: number;
|
|
70
|
+
rinfo: dgram.RemoteInfo;
|
|
71
|
+
}
|
|
72
|
+
export declare class Discovery {
|
|
73
|
+
private readonly port;
|
|
74
|
+
private readonly message;
|
|
75
|
+
private readonly timeout;
|
|
76
|
+
private readonly devices;
|
|
77
|
+
constructor(timeout?: number);
|
|
78
|
+
discover(): Promise<DiscoveryInfo[]>;
|
|
79
|
+
retrieveLocalCredentials(robotIP: string): Promise<{
|
|
80
|
+
blid: string;
|
|
81
|
+
password: string;
|
|
82
|
+
}>;
|
|
83
|
+
retrieveLocalCredentialsV1(robotIP: string): Promise<{
|
|
84
|
+
blid: string;
|
|
85
|
+
password: string;
|
|
86
|
+
}>;
|
|
87
|
+
private getRobotPublicInfo;
|
|
88
|
+
private getBlidV1;
|
|
89
|
+
}
|
package/dist/iRobot.js
ADDED
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
import dgram from 'node:dgram';
|
|
2
|
+
import { connect as tlsConnect } from 'node:tls';
|
|
3
|
+
import { request as httpsRequest } from 'node:https';
|
|
4
|
+
export class Discovery {
|
|
5
|
+
port = 5678;
|
|
6
|
+
message = Buffer.from('irobotmcs');
|
|
7
|
+
timeout;
|
|
8
|
+
devices = new Map();
|
|
9
|
+
constructor(timeout = 3000) {
|
|
10
|
+
this.timeout = timeout;
|
|
11
|
+
}
|
|
12
|
+
discover() {
|
|
13
|
+
return new Promise((resolve, reject) => {
|
|
14
|
+
const socket = dgram.createSocket('udp4');
|
|
15
|
+
socket.on('error', (err) => {
|
|
16
|
+
socket.close();
|
|
17
|
+
reject(err);
|
|
18
|
+
});
|
|
19
|
+
socket.on('message', (msg, rinfo) => {
|
|
20
|
+
try {
|
|
21
|
+
const parsed = JSON.parse(msg.toString());
|
|
22
|
+
const prefix = parsed.hostname?.split('-')[0];
|
|
23
|
+
if ((prefix === 'Roomba' || prefix === 'iRobot') && parsed.ip) {
|
|
24
|
+
parsed.rinfo = rinfo;
|
|
25
|
+
this.devices.set(parsed.ip, parsed);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
socket.bind(this.port, () => {
|
|
32
|
+
socket.setBroadcast(true);
|
|
33
|
+
socket.send(this.message, 0, this.message.length, this.port, '255.255.255.255');
|
|
34
|
+
});
|
|
35
|
+
setTimeout(() => {
|
|
36
|
+
socket.close();
|
|
37
|
+
resolve(Array.from(this.devices.values()));
|
|
38
|
+
}, this.timeout);
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
async retrieveLocalCredentials(robotIP) {
|
|
42
|
+
return new Promise((resolve, reject) => {
|
|
43
|
+
this.getRobotPublicInfo(robotIP)
|
|
44
|
+
.then((robotData) => {
|
|
45
|
+
const blid = robotData.hostname?.split('-')[1];
|
|
46
|
+
if (!blid) {
|
|
47
|
+
reject(new Error('Could not extract BLID from robot hostname'));
|
|
48
|
+
}
|
|
49
|
+
const packet = Buffer.from('f005efcc3b2900', 'hex');
|
|
50
|
+
const client = tlsConnect(8883, robotIP, {
|
|
51
|
+
timeout: 10000,
|
|
52
|
+
rejectUnauthorized: false,
|
|
53
|
+
ciphers: 'AES128-SHA256',
|
|
54
|
+
});
|
|
55
|
+
let sliceFrom = 13;
|
|
56
|
+
client.on('connect', () => {
|
|
57
|
+
client.write(packet);
|
|
58
|
+
});
|
|
59
|
+
client.on('data', (data) => {
|
|
60
|
+
if (data.length === 2) {
|
|
61
|
+
sliceFrom = 9;
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
if (data.length <= 7) {
|
|
65
|
+
client.end();
|
|
66
|
+
reject(new Error('Error getting password. Follow the instructions and try again.'));
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
const password = data.slice(sliceFrom).toString();
|
|
70
|
+
client.end();
|
|
71
|
+
resolve({
|
|
72
|
+
blid: blid,
|
|
73
|
+
password,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
client.on('error', (error) => {
|
|
78
|
+
client.destroy();
|
|
79
|
+
reject(new Error(`TLS connection failed: ${error.message}. Ensure robot is on home base and HOME button was pressed.`));
|
|
80
|
+
});
|
|
81
|
+
client.on('timeout', () => {
|
|
82
|
+
client.destroy();
|
|
83
|
+
reject(new Error('Timeout - ensure you pressed the HOME button on the robot'));
|
|
84
|
+
});
|
|
85
|
+
})
|
|
86
|
+
.catch(reject);
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
async retrieveLocalCredentialsV1(robotIP) {
|
|
90
|
+
return new Promise((resolve, reject) => {
|
|
91
|
+
let requestId = 1;
|
|
92
|
+
const maxRetries = 120;
|
|
93
|
+
const requestOptions = {
|
|
94
|
+
hostname: robotIP,
|
|
95
|
+
port: 443,
|
|
96
|
+
path: '/umi',
|
|
97
|
+
method: 'POST',
|
|
98
|
+
headers: {
|
|
99
|
+
'Content-Type': 'application/json',
|
|
100
|
+
'Connection': 'close',
|
|
101
|
+
'User-Agent': 'aspen%20production/2618 CFNetwork/758.3.15 Darwin/15.4.0',
|
|
102
|
+
'Content-Encoding': 'identity',
|
|
103
|
+
'Accept': '*/*',
|
|
104
|
+
'Accept-Language': 'en-us',
|
|
105
|
+
'Host': robotIP,
|
|
106
|
+
},
|
|
107
|
+
rejectUnauthorized: false,
|
|
108
|
+
};
|
|
109
|
+
const pollForPassword = () => {
|
|
110
|
+
if (requestId > maxRetries) {
|
|
111
|
+
reject(new Error('Timeout getting password. Are you following the instructions?'));
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
const postData = JSON.stringify({
|
|
115
|
+
do: 'get',
|
|
116
|
+
args: ['passwd'],
|
|
117
|
+
id: requestId,
|
|
118
|
+
});
|
|
119
|
+
const req = httpsRequest(requestOptions, (res) => {
|
|
120
|
+
let body = '';
|
|
121
|
+
res.on('data', (chunk) => {
|
|
122
|
+
body += chunk;
|
|
123
|
+
});
|
|
124
|
+
res.on('end', () => {
|
|
125
|
+
if (res.statusCode === 401) {
|
|
126
|
+
setTimeout(() => {
|
|
127
|
+
requestId++;
|
|
128
|
+
pollForPassword();
|
|
129
|
+
}, 2000);
|
|
130
|
+
}
|
|
131
|
+
else if (res.statusCode === 200) {
|
|
132
|
+
try {
|
|
133
|
+
const response = JSON.parse(body);
|
|
134
|
+
const password = response.ok?.passwd;
|
|
135
|
+
if (password) {
|
|
136
|
+
this.getBlidV1(robotIP, password, requestId + 1)
|
|
137
|
+
.then((blid) => resolve({ blid, password }))
|
|
138
|
+
.catch(reject);
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
reject(new Error('Invalid password response format'));
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
reject(new Error(`Failed to parse password response: ${error}`));
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
setTimeout(() => {
|
|
150
|
+
requestId++;
|
|
151
|
+
pollForPassword();
|
|
152
|
+
}, 2000);
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
req.on('error', (error) => {
|
|
157
|
+
reject(new Error(`HTTPS request failed: ${error.message}`));
|
|
158
|
+
});
|
|
159
|
+
req.write(postData);
|
|
160
|
+
req.end();
|
|
161
|
+
};
|
|
162
|
+
pollForPassword();
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
getRobotPublicInfo(robotIP) {
|
|
166
|
+
return new Promise((resolve, reject) => {
|
|
167
|
+
const socket = dgram.createSocket('udp4');
|
|
168
|
+
const timeout = 5000;
|
|
169
|
+
const timeoutId = setTimeout(() => {
|
|
170
|
+
socket.close();
|
|
171
|
+
reject(new Error(`Timeout getting robot info from ${robotIP}`));
|
|
172
|
+
}, timeout);
|
|
173
|
+
socket.on('error', (err) => {
|
|
174
|
+
clearTimeout(timeoutId);
|
|
175
|
+
socket.close();
|
|
176
|
+
reject(err);
|
|
177
|
+
});
|
|
178
|
+
socket.on('message', (msg) => {
|
|
179
|
+
try {
|
|
180
|
+
const parsedMsg = JSON.parse(msg.toString());
|
|
181
|
+
if (parsedMsg.hostname && parsedMsg.ip && (parsedMsg.hostname.split('-')[0] === 'Roomba' || parsedMsg.hostname.split('-')[0] === 'iRobot')) {
|
|
182
|
+
clearTimeout(timeoutId);
|
|
183
|
+
socket.close();
|
|
184
|
+
const blid = parsedMsg.hostname.split('-')[1];
|
|
185
|
+
resolve({ ...parsedMsg, robotid: blid });
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
catch {
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
socket.bind(5678, () => {
|
|
192
|
+
const message = Buffer.from('irobotmcs');
|
|
193
|
+
socket.send(message, 0, message.length, 5678, robotIP);
|
|
194
|
+
});
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
getBlidV1(robotIP, password, requestId) {
|
|
198
|
+
return new Promise((resolve, reject) => {
|
|
199
|
+
const auth = Buffer.from(`user:${password}`).toString('base64');
|
|
200
|
+
const requestOptions = {
|
|
201
|
+
hostname: robotIP,
|
|
202
|
+
port: 443,
|
|
203
|
+
path: '/umi',
|
|
204
|
+
method: 'POST',
|
|
205
|
+
headers: {
|
|
206
|
+
'Content-Type': 'application/json',
|
|
207
|
+
'Authorization': `Basic ${auth}`,
|
|
208
|
+
'Connection': 'close',
|
|
209
|
+
'User-Agent': 'aspen%20production/2618 CFNetwork/758.3.15 Darwin/15.4.0',
|
|
210
|
+
'Content-Encoding': 'identity',
|
|
211
|
+
'Accept': '*/*',
|
|
212
|
+
'Accept-Language': 'en-us',
|
|
213
|
+
'Host': robotIP,
|
|
214
|
+
},
|
|
215
|
+
rejectUnauthorized: false,
|
|
216
|
+
};
|
|
217
|
+
const postData = JSON.stringify({
|
|
218
|
+
do: 'get',
|
|
219
|
+
args: ['sys'],
|
|
220
|
+
id: requestId,
|
|
221
|
+
});
|
|
222
|
+
const req = httpsRequest(requestOptions, (res) => {
|
|
223
|
+
let body = '';
|
|
224
|
+
res.on('data', (chunk) => {
|
|
225
|
+
body += chunk;
|
|
226
|
+
});
|
|
227
|
+
res.on('end', () => {
|
|
228
|
+
if (res.statusCode === 200) {
|
|
229
|
+
try {
|
|
230
|
+
const response = JSON.parse(body);
|
|
231
|
+
const blidArray = response.ok?.blid;
|
|
232
|
+
if (Array.isArray(blidArray)) {
|
|
233
|
+
const blid = blidArray.map((dec) => (dec + 0x10000).toString(16).substr(-2).toUpperCase()).join('');
|
|
234
|
+
resolve(blid);
|
|
235
|
+
}
|
|
236
|
+
else {
|
|
237
|
+
reject(new Error('Invalid BLID response format'));
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
catch (error) {
|
|
241
|
+
reject(new Error(`Failed to parse BLID response: ${error}`));
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
else {
|
|
245
|
+
reject(new Error(`Unexpected status code getting BLID: ${res.statusCode}`));
|
|
246
|
+
}
|
|
247
|
+
});
|
|
248
|
+
});
|
|
249
|
+
req.on('error', (error) => {
|
|
250
|
+
reject(new Error(`HTTPS request failed: ${error.message}`));
|
|
251
|
+
});
|
|
252
|
+
req.write(postData);
|
|
253
|
+
req.end();
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
}
|
package/dist/module.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { MatterbridgeDynamicPlatform, PlatformConfig, PlatformMatterbridge } from 'matterbridge';
|
|
2
|
+
import { AnsiLogger } from 'matterbridge/logger';
|
|
3
|
+
export default function initializePlugin(matterbridge: PlatformMatterbridge, log: AnsiLogger, config: PlatformConfig): Platform;
|
|
4
|
+
export declare class Platform extends MatterbridgeDynamicPlatform {
|
|
5
|
+
constructor(matterbridge: PlatformMatterbridge, log: AnsiLogger, config: PlatformConfig);
|
|
6
|
+
onStart(reason?: string): Promise<void>;
|
|
7
|
+
onConfigure(): Promise<void>;
|
|
8
|
+
onShutdown(reason?: string): Promise<void>;
|
|
9
|
+
}
|
|
@@ -1,15 +1,22 @@
|
|
|
1
1
|
import { MatterbridgeDynamicPlatform } from 'matterbridge';
|
|
2
|
+
import { Discovery } from './iRobot.js';
|
|
3
|
+
export default function initializePlugin(matterbridge, log, config) {
|
|
4
|
+
return new Platform(matterbridge, log, config);
|
|
5
|
+
}
|
|
2
6
|
export class Platform extends MatterbridgeDynamicPlatform {
|
|
3
7
|
constructor(matterbridge, log, config) {
|
|
4
8
|
super(matterbridge, log, config);
|
|
5
|
-
if (this.verifyMatterbridgeVersion === undefined || typeof this.verifyMatterbridgeVersion !== 'function' || !this.verifyMatterbridgeVersion('
|
|
6
|
-
throw new Error(`
|
|
9
|
+
if (this.verifyMatterbridgeVersion === undefined || typeof this.verifyMatterbridgeVersion !== 'function' || !this.verifyMatterbridgeVersion('3.5.0')) {
|
|
10
|
+
throw new Error(`This plugin requires Matterbridge version >= "3.5.0". Please update Matterbridge to the latest version in the frontend.`);
|
|
7
11
|
}
|
|
8
12
|
this.log.info('Initializing platform:', this.config.name);
|
|
9
13
|
this.log.info('Finished initializing platform:', this.config.name);
|
|
10
14
|
}
|
|
11
15
|
async onStart(reason) {
|
|
12
16
|
this.log.info('onStart called with reason:', reason ?? 'none');
|
|
17
|
+
const iRobot = new Discovery();
|
|
18
|
+
const devices = await iRobot.discover();
|
|
19
|
+
this.log.info('Discovered iRobot devices:', devices);
|
|
13
20
|
}
|
|
14
21
|
async onConfigure() {
|
|
15
22
|
await super.onConfigure();
|
package/npm-shrinkwrap.json
CHANGED
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "matterbridge-irobot",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.2",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "matterbridge-irobot",
|
|
9
|
-
"version": "0.0.
|
|
9
|
+
"version": "0.0.2",
|
|
10
10
|
"license": "Apache-2.0",
|
|
11
11
|
"dependencies": {
|
|
12
|
-
"node-ansi-logger": "
|
|
13
|
-
"node-persist-manager": "
|
|
12
|
+
"node-ansi-logger": "3.1.1",
|
|
13
|
+
"node-persist-manager": "2.0.0"
|
|
14
14
|
},
|
|
15
15
|
"engines": {
|
|
16
|
-
"node": ">=
|
|
16
|
+
"node": ">=20.0.0 <21.0.0 || >=22.0.0 <23.0.0 || >=24.0.0 <25.0.0"
|
|
17
17
|
},
|
|
18
18
|
"funding": {
|
|
19
19
|
"type": "buymeacoffee",
|
|
@@ -21,12 +21,13 @@
|
|
|
21
21
|
}
|
|
22
22
|
},
|
|
23
23
|
"node_modules/node-ansi-logger": {
|
|
24
|
-
"version": "3.
|
|
25
|
-
"resolved": "https://registry.npmjs.org/node-ansi-logger/-/node-ansi-logger-3.
|
|
26
|
-
"integrity": "sha512-
|
|
27
|
-
"
|
|
24
|
+
"version": "3.1.1",
|
|
25
|
+
"resolved": "https://registry.npmjs.org/node-ansi-logger/-/node-ansi-logger-3.1.1.tgz",
|
|
26
|
+
"integrity": "sha512-tFeCSxwiRg5XaNda5nC27alzraZP76nLtUk1JDZqb9byhW4WYaSGL7/lmxFHEI16gypQDMEYljuF+wcG+cPPHw==",
|
|
27
|
+
"hasShrinkwrap": true,
|
|
28
|
+
"license": "Apache-2.0",
|
|
28
29
|
"engines": {
|
|
29
|
-
"node": "18.
|
|
30
|
+
"node": ">=18.0.0 <19.0.0 || >=20.0.0 <21.0.0 || >=22.0.0 <23.0.0 || >=24.0.0 <25.0.0"
|
|
30
31
|
},
|
|
31
32
|
"funding": {
|
|
32
33
|
"type": "buymeacoffee",
|
|
@@ -46,15 +47,15 @@
|
|
|
46
47
|
}
|
|
47
48
|
},
|
|
48
49
|
"node_modules/node-persist-manager": {
|
|
49
|
-
"version": "
|
|
50
|
-
"resolved": "https://registry.npmjs.org/node-persist-manager/-/node-persist-manager-
|
|
51
|
-
"integrity": "sha512-
|
|
50
|
+
"version": "2.0.0",
|
|
51
|
+
"resolved": "https://registry.npmjs.org/node-persist-manager/-/node-persist-manager-2.0.0.tgz",
|
|
52
|
+
"integrity": "sha512-jpgOqCCn4ZEnIr4WcvqkyyGmmLJarV6aUyBlDQdG1G84X9UUmOmI1W2OZtc9K0z375CYWhjtGEXaY7GXNiEOfA==",
|
|
52
53
|
"license": "MIT",
|
|
53
54
|
"dependencies": {
|
|
54
|
-
"node-persist": "
|
|
55
|
+
"node-persist": "4.0.4"
|
|
55
56
|
},
|
|
56
57
|
"engines": {
|
|
57
|
-
"node": ">=18.0.0"
|
|
58
|
+
"node": ">=18.0.0 <19.0.0 || >=20.0.0 <21.0.0 || >=22.0.0 <23.0.0 || >=24.0.0 <25.0.0"
|
|
58
59
|
},
|
|
59
60
|
"funding": {
|
|
60
61
|
"type": "buymeacoffee",
|
package/package.json
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "matterbridge-irobot",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.2",
|
|
4
4
|
"description": "Matterbridge irobot plugin",
|
|
5
5
|
"author": "https://github.com/Luligu",
|
|
6
6
|
"license": "Apache-2.0",
|
|
7
7
|
"type": "module",
|
|
8
|
-
"main": "dist/
|
|
8
|
+
"main": "dist/module.js",
|
|
9
|
+
"types": "dist/module.d.ts",
|
|
9
10
|
"repository": {
|
|
10
11
|
"type": "git",
|
|
11
12
|
"url": "git+https://github.com/Luligu/matterbridge-irobot.git"
|
|
@@ -30,10 +31,18 @@
|
|
|
30
31
|
"shelly"
|
|
31
32
|
],
|
|
32
33
|
"engines": {
|
|
33
|
-
"node": ">=
|
|
34
|
+
"node": ">=20.0.0 <21.0.0 || >=22.0.0 <23.0.0 || >=24.0.0 <25.0.0"
|
|
34
35
|
},
|
|
36
|
+
"files": [
|
|
37
|
+
"bin",
|
|
38
|
+
"dist",
|
|
39
|
+
"npm-shrinkwrap.json",
|
|
40
|
+
"CHANGELOG.md",
|
|
41
|
+
"*.config.json",
|
|
42
|
+
"*.schema.json"
|
|
43
|
+
],
|
|
35
44
|
"dependencies": {
|
|
36
|
-
"node-ansi-logger": "
|
|
37
|
-
"node-persist-manager": "
|
|
45
|
+
"node-ansi-logger": "3.1.1",
|
|
46
|
+
"node-persist-manager": "2.0.0"
|
|
38
47
|
}
|
|
39
48
|
}
|
package/dist/index.js
DELETED