matterbridge-roborock-vacuum-plugin 1.1.0-rc16 → 1.1.0-rc17

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.
@@ -35,55 +35,55 @@ describe('getRoomMapFromDevice', () => {
35
35
  jest.clearAllMocks();
36
36
  });
37
37
 
38
- // it('returns RoomMap from getRoomMappings if available', async () => {
39
- // const device = {
40
- // duid: '123',
41
- // rooms: [
42
- // {
43
- // 'id': 12461114,
44
- // 'name': 'Guest bedroom',
45
- // },
46
- // {
47
- // 'id': 12461111,
48
- // 'name': 'Balcony',
49
- // },
50
- // {
51
- // 'id': 12461109,
52
- // 'name': 'Master bedroom',
53
- // },
54
- // {
55
- // 'id': 11100849,
56
- // 'name': 'Study',
57
- // },
58
- // {
59
- // 'id': 11100847,
60
- // 'name': 'Bedroom',
61
- // },
62
- // {
63
- // 'id': 11100845,
64
- // 'name': 'Kitchen',
65
- // },
66
- // {
67
- // 'id': 11100842,
68
- // 'name': 'Living room',
69
- // },
70
- // ],
71
- // };
72
- // mockRoborockService.getRoomMappings.mockResolvedValue([
73
- // [1, '11100842', 6],
74
- // [2, '12461114', 3],
75
- // [3, '12461109', 2],
76
- // [4, '12461111', 7],
77
- // ]);
78
- // mockRoborockService.getMapInformation.mockResolvedValue(undefined);
38
+ it('returns RoomMap from getRoomMappings if available', async () => {
39
+ const device = {
40
+ duid: '123',
41
+ rooms: [
42
+ {
43
+ 'id': 12461114,
44
+ 'name': 'Guest bedroom',
45
+ },
46
+ {
47
+ 'id': 12461111,
48
+ 'name': 'Balcony',
49
+ },
50
+ {
51
+ 'id': 12461109,
52
+ 'name': 'Master bedroom',
53
+ },
54
+ {
55
+ 'id': 11100849,
56
+ 'name': 'Study',
57
+ },
58
+ {
59
+ 'id': 11100847,
60
+ 'name': 'Bedroom',
61
+ },
62
+ {
63
+ 'id': 11100845,
64
+ 'name': 'Kitchen',
65
+ },
66
+ {
67
+ 'id': 11100842,
68
+ 'name': 'Living room',
69
+ },
70
+ ],
71
+ };
72
+ mockRoborockService.getRoomMappings.mockResolvedValue([
73
+ [1, '11100842', 6],
74
+ [2, '12461114', 3],
75
+ [3, '12461109', 2],
76
+ [4, '12461111', 7],
77
+ ]);
78
+ mockRoborockService.getMapInformation.mockResolvedValue(undefined);
79
79
 
80
- // const result = await getRoomMapFromDevice(device as any, mockPlatform as any);
80
+ const result = await getRoomMapFromDevice(device as any, mockPlatform as any);
81
81
 
82
- // //console.log('Result:', result);
83
- // expect(result).toBeInstanceOf(RoomMap);
84
- // expect(mockRoborockService.getRoomMappings).toHaveBeenCalledWith('123');
85
- // expect(result.rooms.length).toBeGreaterThan(0);
86
- // });
82
+ // console.log('Result:', result);
83
+ expect(result).toBeInstanceOf(RoomMap);
84
+ expect(mockRoborockService.getRoomMappings).toHaveBeenCalledWith('123');
85
+ expect(result.rooms.length).toBeGreaterThan(0);
86
+ });
87
87
 
88
88
  it('returns RoomMap from getRoomMappings if available', async () => {
89
89
  const device = {
@@ -1,9 +1,11 @@
1
1
  import { getSupportedAreas } from '../../initialData/getSupportedAreas';
2
- import RoomMap from '../../model/RoomMap';
2
+ import { RoomMap } from '../../model/RoomMap';
3
+ import { Room } from '../../roborockCommunication/Zmodel/room';
3
4
 
4
5
  const mockLogger = {
5
6
  debug: jest.fn(),
6
7
  error: jest.fn(),
8
+ notice: jest.fn(),
7
9
  };
8
10
 
9
11
  describe('getSupportedAreas', () => {
@@ -12,7 +14,7 @@ describe('getSupportedAreas', () => {
12
14
  });
13
15
 
14
16
  it('returns default area when rooms and roomMap are empty', () => {
15
- const result = getSupportedAreas(
17
+ const { supportedAreas } = getSupportedAreas(
16
18
  [
17
19
  { id: 2775739, name: 'Garage' },
18
20
  { id: 1474466, name: 'Outside' },
@@ -46,14 +48,15 @@ describe('getSupportedAreas', () => {
46
48
  { id: 23, globalId: 1474466, displayName: 'Outside' },
47
49
  ],
48
50
  } as RoomMap,
51
+ false, // enableMultipleMap
49
52
  mockLogger as any,
50
53
  );
51
54
 
52
- expect(result.length).toEqual(8);
55
+ expect(supportedAreas.length).toEqual(8);
53
56
  });
54
57
 
55
58
  it('returns default area when rooms and roomMap are empty', () => {
56
- const result = getSupportedAreas(
59
+ const { supportedAreas } = getSupportedAreas(
57
60
  [
58
61
  { id: 11453731, name: 'Living room' },
59
62
  { id: 11453727, name: 'Kitchen' },
@@ -73,14 +76,15 @@ describe('getSupportedAreas', () => {
73
76
  { id: 20, globalId: 991190, displayName: undefined },
74
77
  ],
75
78
  } as RoomMap,
79
+ false, // enableMultipleMap
76
80
  mockLogger as any,
77
81
  );
78
82
 
79
- expect(result.length).toEqual(5);
83
+ expect(supportedAreas.length).toEqual(5);
80
84
  });
81
85
 
82
86
  it('returns default area when rooms and roomMap are empty', () => {
83
- const result = getSupportedAreas(
87
+ const { supportedAreas } = getSupportedAreas(
84
88
  [
85
89
  { id: 11453731, name: 'Living room' },
86
90
  { id: 11453727, name: 'Kitchen' },
@@ -100,9 +104,78 @@ describe('getSupportedAreas', () => {
100
104
  { id: 20, globalId: 991190, displayName: undefined },
101
105
  ],
102
106
  } as RoomMap,
107
+ false, // enableMultipleMap
103
108
  mockLogger as any,
104
109
  );
105
110
 
106
- expect(result.length).toEqual(5);
111
+ expect(supportedAreas.length).toEqual(5);
112
+ });
113
+
114
+ it('returns default area when rooms and roomMap are empty', () => {
115
+ const vacuumRooms: Room[] = [
116
+ { id: 11100845, name: 'Kitchen' },
117
+ { id: 11100849, name: 'Study' },
118
+ { id: 11100842, name: 'Living room' },
119
+ { id: 11100847, name: 'Bedroom' },
120
+ { id: 12461114, name: 'Guest bedroom' },
121
+ { id: 12461109, name: 'Master bedroom' },
122
+ { id: 12461111, name: 'Balcony' },
123
+ ];
124
+ const roomMap: RoomMap = {
125
+ rooms: [
126
+ { id: 16, globalId: 2775739, displayName: undefined, alternativeId: '161' },
127
+ { id: 17, globalId: 991195, displayName: undefined, alternativeId: '171' },
128
+ { id: 18, globalId: 991187, displayName: undefined, alternativeId: '181' },
129
+ { id: 19, globalId: 991185, displayName: undefined, alternativeId: '191' },
130
+ { id: 20, globalId: 991190, displayName: undefined, alternativeId: '201' },
131
+ ],
132
+ };
133
+ const { supportedAreas } = getSupportedAreas(vacuumRooms, roomMap, false, mockLogger as any);
134
+
135
+ expect(supportedAreas.length).toEqual(5);
136
+ });
137
+
138
+ it('returns default area when rooms and roomMap are empty', () => {
139
+ const vacuumRooms: Room[] = [
140
+ { id: 11100845, name: 'Kitchen' },
141
+ { id: 11100849, name: 'Study' },
142
+ { id: 11100842, name: 'Living room' },
143
+ { id: 11100847, name: 'Bedroom' },
144
+ { id: 11100842, name: 'Living room' },
145
+ { id: 12461114, name: 'Guest bedroom' },
146
+ { id: 12461109, name: 'Master bedroom' },
147
+ { id: 12461111, name: 'Balcony' },
148
+ ];
149
+ const roomMap: RoomMap = {
150
+ rooms: [
151
+ { id: 1, globalId: 11100845, displayName: 'Kitchen', alternativeId: '114', mapId: 0 },
152
+ { id: 2, globalId: 11100849, displayName: 'Study', alternativeId: '29', mapId: 0 },
153
+ { id: 3, globalId: 11100842, displayName: 'Living room', alternativeId: '36', mapId: 0 },
154
+ { id: 4, globalId: 11100847, displayName: 'Bedroom', alternativeId: '41', mapId: 0 },
155
+ { id: 1, globalId: 11100842, displayName: 'Living room', alternativeId: '16', mapId: 1 },
156
+ { id: 2, globalId: 12461114, displayName: 'Guest bedroom', alternativeId: '23', mapId: 1 },
157
+ { id: 3, globalId: 12461109, displayName: 'Master bedroom', alternativeId: '32', mapId: 1 },
158
+ { id: 4, globalId: 12461111, displayName: 'Balcony', alternativeId: '47', mapId: 1 },
159
+ ],
160
+ mapInfo: [
161
+ {
162
+ id: 0,
163
+ name: 'First Map',
164
+ },
165
+ {
166
+ id: 1,
167
+ name: 'Second Map',
168
+ },
169
+ ],
170
+ };
171
+
172
+ const mockLogger1 = {
173
+ debug: jest.fn(),
174
+ notice: jest.fn(),
175
+ error: jest.fn(),
176
+ };
177
+ const { supportedAreas, supportedMaps } = getSupportedAreas(vacuumRooms, roomMap, true, mockLogger1 as any);
178
+ expect(supportedAreas.length).toEqual(8);
179
+ expect(supportedMaps.length).toEqual(2);
107
180
  });
108
181
  });
@@ -114,8 +114,115 @@ describe('PlatformRunner.getRoomMapFromDevice', () => {
114
114
  platform.roborockService.getMapInformation.mockResolvedValue(mapInfo);
115
115
 
116
116
  const result = await getRoomMapFromDevice(device as any, platform);
117
+ expect(result).toBeInstanceOf(RoomMap);
118
+ expect(result.rooms.length).toEqual(4);
119
+
120
+ platform.enableExperimentalFeature = {
121
+ enableExperimentalFeature: true,
122
+ advancedFeature: {
123
+ enableMultipleMap: true,
124
+ },
125
+ };
117
126
 
127
+ const result1 = await getRoomMapFromDevice(device as any, platform);
128
+ expect(result1).toBeInstanceOf(RoomMap);
129
+ expect(result1.rooms.length).toEqual(8);
130
+ });
131
+
132
+ it('returns RoomMap with empty roomData from getMapInformation if available', async () => {
133
+ const device = {
134
+ duid: 'duid1',
135
+ rooms: [
136
+ { id: 1, name: 'Kitchen' },
137
+ { id: 2, name: 'Study' },
138
+ { id: 3, name: 'Living room' },
139
+ { id: 4, name: 'Bedroom' },
140
+ ],
141
+ };
142
+
143
+ const mapInfo = new MapInfo({
144
+ max_multi_map: 4,
145
+ max_bak_map: 0,
146
+ multi_map_count: 1,
147
+ map_info: [
148
+ {
149
+ mapFlag: 0,
150
+ add_time: 1753731408,
151
+ length: 0,
152
+ name: '',
153
+ bak_maps: [],
154
+ },
155
+ ],
156
+ });
157
+
158
+ platform.roborockService.getRoomMappings.mockResolvedValue(undefined);
159
+ platform.roborockService.getMapInformation.mockResolvedValue(mapInfo);
160
+
161
+ const result = await getRoomMapFromDevice(device as any, platform);
118
162
  expect(result).toBeInstanceOf(RoomMap);
119
- expect(result.rooms.length).toEqual(7);
163
+ expect(result.rooms.length).toEqual(0);
164
+
165
+ platform.enableExperimentalFeature = {
166
+ enableExperimentalFeature: true,
167
+ advancedFeature: {
168
+ enableMultipleMap: true,
169
+ },
170
+ };
171
+
172
+ const result1 = await getRoomMapFromDevice(device as any, platform);
173
+ expect(result1).toBeInstanceOf(RoomMap);
174
+ expect(result1.rooms.length).toEqual(0);
175
+ });
176
+
177
+ it('returns RoomMap with roomData from getMapInformation if available', async () => {
178
+ const device = {
179
+ duid: 'duid1',
180
+ rooms: [
181
+ { id: 1, name: 'Kitchen' },
182
+ { id: 2, name: 'Study' },
183
+ { id: 3, name: 'Living room' },
184
+ { id: 4, name: 'Bedroom' },
185
+ ],
186
+ };
187
+
188
+ const mapInfo = new MapInfo({
189
+ max_multi_map: 4,
190
+ max_bak_map: 0,
191
+ multi_map_count: 1,
192
+ map_info: [
193
+ {
194
+ mapFlag: 0,
195
+ add_time: 1753731408,
196
+ length: 0,
197
+ name: '',
198
+ bak_maps: [],
199
+ },
200
+ ],
201
+ });
202
+
203
+ const roomData = [
204
+ [1, '11100845', 14],
205
+ [2, '11100849', 9],
206
+ [3, '11100842', 6],
207
+ [4, '11100847', 1],
208
+ ];
209
+
210
+ platform.roborockService.getRoomMappings.mockResolvedValue(roomData);
211
+ platform.roborockService.getMapInformation.mockResolvedValue(mapInfo);
212
+
213
+ const result = await getRoomMapFromDevice(device as any, platform);
214
+ expect(result).toBeInstanceOf(RoomMap);
215
+ expect(result.rooms.length).toEqual(4);
216
+
217
+ platform.enableExperimentalFeature = {
218
+ enableExperimentalFeature: true,
219
+ advancedFeature: {
220
+ enableMultipleMap: true,
221
+ },
222
+ };
223
+
224
+ const result1 = await getRoomMapFromDevice(device as any, platform);
225
+ expect(result1).toBeInstanceOf(RoomMap);
226
+ expect(result1.rooms.length).toEqual(4);
120
227
  });
121
228
  });
@@ -3,6 +3,7 @@ import { ServiceArea } from 'matterbridge/matter/clusters';
3
3
  import RoborockService from '../roborockService';
4
4
  import { MessageProcessor } from '../roborockCommunication/broadcast/messageProcessor';
5
5
  import { Device, MultipleMap, RequestMessage } from '../roborockCommunication';
6
+ import { RoomIndexMap } from '../model/roomIndexMap';
6
7
 
7
8
  describe('RoborockService - startClean', () => {
8
9
  let roborockService: RoborockService;
@@ -282,7 +283,17 @@ describe('RoborockService - basic setters/getters', () => {
282
283
  });
283
284
 
284
285
  it('setSelectedAreas should set selected areas', () => {
286
+ roborockService.setSupportedAreaIndexMap(
287
+ 'duid',
288
+ new RoomIndexMap(
289
+ new Map([
290
+ [1, { roomId: 1, mapId: 0 }],
291
+ [2, { roomId: 2, mapId: 1 }],
292
+ ]),
293
+ ),
294
+ );
285
295
  roborockService.setSelectedAreas('duid', [1, 2]);
296
+
286
297
  expect(roborockService['selectedAreas'].get('duid')).toEqual([1, 2]);
287
298
  expect(mockLogger.debug).toHaveBeenCalledWith('RoborockService - setSelectedAreas', [1, 2]);
288
299
  });
@@ -12,7 +12,7 @@
12
12
  "binary-parser": "^2.2.1",
13
13
  "ejs": "^3.1.10",
14
14
  "express": "^5.1.0",
15
- "matterbridge": "^3.1.4",
15
+ "matterbridge": "^3.1.8",
16
16
  "node-ansi-logger": "^3.0.1"
17
17
  },
18
18
  "devDependencies": {
@@ -2351,9 +2351,9 @@
2351
2351
  "license": "MIT"
2352
2352
  },
2353
2353
  "node_modules/matterbridge": {
2354
- "version": "3.1.4",
2355
- "resolved": "https://registry.npmjs.org/matterbridge/-/matterbridge-3.1.4.tgz",
2356
- "integrity": "sha512-r9Bhy+YMzeneR0hihEeKn4BpFSVJ7oXuKDVLpWPz4fN/51ziBkKIGRARJLPY5HEwHlvUbf9oU3Z4fkQhq70O7w==",
2354
+ "version": "3.1.8",
2355
+ "resolved": "https://registry.npmjs.org/matterbridge/-/matterbridge-3.1.8.tgz",
2356
+ "integrity": "sha512-KYGSw088++v8UBr2+iCewrfuNGbZpr9AzhbNbVpaXGzGkxaonUQ7397ZQ4MRMTmdpsEteOJb4Hcx4IJtXUuZdA==",
2357
2357
  "hasShrinkwrap": true,
2358
2358
  "license": "Apache-2.0",
2359
2359
  "dependencies": {
@@ -2361,13 +2361,15 @@
2361
2361
  "archiver": "7.0.1",
2362
2362
  "express": "5.1.0",
2363
2363
  "glob": "11.0.3",
2364
- "multer": "2.0.1",
2364
+ "multer": "2.0.2",
2365
2365
  "node-ansi-logger": "3.1.1",
2366
2366
  "node-persist-manager": "2.0.0",
2367
2367
  "ws": "8.18.3"
2368
2368
  },
2369
2369
  "bin": {
2370
- "matterbridge": "bin/matterbridge.js"
2370
+ "matterbridge": "bin/matterbridge.js",
2371
+ "mb_coap": "bin/mb_coap.js",
2372
+ "mb_mdns": "bin/mb_mdns.js"
2371
2373
  },
2372
2374
  "engines": {
2373
2375
  "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"
@@ -2499,9 +2501,9 @@
2499
2501
  }
2500
2502
  },
2501
2503
  "node_modules/matterbridge/node_modules/@noble/curves": {
2502
- "version": "1.9.2",
2503
- "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.2.tgz",
2504
- "integrity": "sha512-HxngEd2XUcg9xi20JkwlLCtYwfoFw4JGkuZpT+WlsPD4gB/cxkvTD8fSsoAnphGZhFdZYKeQIPCuFlWPm1uE0g==",
2504
+ "version": "1.9.4",
2505
+ "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.9.4.tgz",
2506
+ "integrity": "sha512-2bKONnuM53lINoDrSmK8qP8W271ms7pygDhZt4SiLOoLwBtoHqeCFi6RG42V8zd3mLHuJFhU/Bmaqo4nX0/kBw==",
2505
2507
  "license": "MIT",
2506
2508
  "dependencies": {
2507
2509
  "@noble/hashes": "1.8.0"
@@ -3627,9 +3629,9 @@
3627
3629
  "license": "MIT"
3628
3630
  },
3629
3631
  "node_modules/matterbridge/node_modules/multer": {
3630
- "version": "2.0.1",
3631
- "resolved": "https://registry.npmjs.org/multer/-/multer-2.0.1.tgz",
3632
- "integrity": "sha512-Ug8bXeTIUlxurg8xLTEskKShvcKDZALo1THEX5E41pYCD2sCVub5/kIRIGqWNoqV6szyLyQKV6mD4QUrWE5GCQ==",
3632
+ "version": "2.0.2",
3633
+ "resolved": "https://registry.npmjs.org/multer/-/multer-2.0.2.tgz",
3634
+ "integrity": "sha512-u7f2xaZ/UG8oLXHvtF/oWTRvT44p9ecwBBqTwgJVq0+4BW1g8OW01TyMEGWBHbyMOYVHXslaut7qEQ1meATXgw==",
3633
3635
  "license": "MIT",
3634
3636
  "dependencies": {
3635
3637
  "append-field": "^1.0.0",
@@ -21,7 +21,7 @@
21
21
  "binary-parser": "^2.2.1",
22
22
  "ejs": "^3.1.10",
23
23
  "express": "^5.1.0",
24
- "matterbridge": "^3.1.4",
24
+ "matterbridge": "^3.1.8",
25
25
  "node-ansi-logger": "^3.0.1"
26
26
  },
27
27
  "devDependencies": {
@@ -1,10 +0,0 @@
1
- import { UserData } from './ext/roborockCommunication/index.js';
2
-
3
- export function getAccountStore(): Map<string, UserData> {
4
- const accountStore = new Map<string, UserData>();
5
-
6
- // Initialize with a default user data if needed
7
- // accountStore.set('defaultUser', new UserData());
8
-
9
- return accountStore;
10
- }