matterbridge-roborock-vacuum-plugin-regions 1.1.1-jb.1

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.
Files changed (261) hide show
  1. package/.github/workflows/build.yml +56 -0
  2. package/.github/workflows/coverage.yml +59 -0
  3. package/.github/workflows/publish.yml +37 -0
  4. package/.tarignore +5 -0
  5. package/CHANGELOG.md +62 -0
  6. package/LICENSE +202 -0
  7. package/README.md +135 -0
  8. package/README_CLEANMODE.md +29 -0
  9. package/README_DEV.md +75 -0
  10. package/README_REPORT_ISSUE.md +34 -0
  11. package/README_SUPPORTED.md +67 -0
  12. package/dist/behaviorFactory.js +26 -0
  13. package/dist/behaviors/BehaviorDeviceGeneric.js +22 -0
  14. package/dist/behaviors/roborock.vacuum/default/default.js +183 -0
  15. package/dist/behaviors/roborock.vacuum/default/initalData.js +143 -0
  16. package/dist/behaviors/roborock.vacuum/default/runtimes.js +21 -0
  17. package/dist/behaviors/roborock.vacuum/smart/initalData.js +18 -0
  18. package/dist/behaviors/roborock.vacuum/smart/runtimes.js +11 -0
  19. package/dist/behaviors/roborock.vacuum/smart/smart.js +119 -0
  20. package/dist/clientManager.js +17 -0
  21. package/dist/helper.js +76 -0
  22. package/dist/index.js +4 -0
  23. package/dist/initialData/getBatteryStatus.js +24 -0
  24. package/dist/initialData/getOperationalStates.js +82 -0
  25. package/dist/initialData/getSupportedAreas.js +120 -0
  26. package/dist/initialData/getSupportedCleanModes.js +17 -0
  27. package/dist/initialData/getSupportedRunModes.js +11 -0
  28. package/dist/initialData/getSupportedScenes.js +26 -0
  29. package/dist/initialData/index.js +6 -0
  30. package/dist/model/CloudMessageModel.js +1 -0
  31. package/dist/model/DockingStationStatus.js +26 -0
  32. package/dist/model/ExperimentalFeatureSetting.js +30 -0
  33. package/dist/model/RoomMap.js +19 -0
  34. package/dist/model/roomIndexMap.js +21 -0
  35. package/dist/notifyMessageTypes.js +9 -0
  36. package/dist/platform.js +312 -0
  37. package/dist/platformRunner.js +90 -0
  38. package/dist/roborockCommunication/RESTAPI/roborockAuthenticateApi.js +213 -0
  39. package/dist/roborockCommunication/RESTAPI/roborockIoTApi.js +95 -0
  40. package/dist/roborockCommunication/Zenum/additionalPropCode.js +4 -0
  41. package/dist/roborockCommunication/Zenum/authenticateResponseCode.js +7 -0
  42. package/dist/roborockCommunication/Zenum/dockType.js +4 -0
  43. package/dist/roborockCommunication/Zenum/operationStatusCode.js +44 -0
  44. package/dist/roborockCommunication/Zenum/vacuumAndDockErrorCode.js +68 -0
  45. package/dist/roborockCommunication/Zmodel/apiResponse.js +1 -0
  46. package/dist/roborockCommunication/Zmodel/authenticateFlowState.js +1 -0
  47. package/dist/roborockCommunication/Zmodel/authenticateResponse.js +1 -0
  48. package/dist/roborockCommunication/Zmodel/baseURL.js +1 -0
  49. package/dist/roborockCommunication/Zmodel/batteryMessage.js +1 -0
  50. package/dist/roborockCommunication/Zmodel/device.js +1 -0
  51. package/dist/roborockCommunication/Zmodel/deviceModel.js +28 -0
  52. package/dist/roborockCommunication/Zmodel/deviceSchema.js +1 -0
  53. package/dist/roborockCommunication/Zmodel/deviceStatus.js +22 -0
  54. package/dist/roborockCommunication/Zmodel/dockInfo.js +6 -0
  55. package/dist/roborockCommunication/Zmodel/home.js +1 -0
  56. package/dist/roborockCommunication/Zmodel/homeInfo.js +1 -0
  57. package/dist/roborockCommunication/Zmodel/map.js +1 -0
  58. package/dist/roborockCommunication/Zmodel/mapInfo.js +29 -0
  59. package/dist/roborockCommunication/Zmodel/messageResult.js +7 -0
  60. package/dist/roborockCommunication/Zmodel/multipleMap.js +1 -0
  61. package/dist/roborockCommunication/Zmodel/networkInfo.js +1 -0
  62. package/dist/roborockCommunication/Zmodel/product.js +1 -0
  63. package/dist/roborockCommunication/Zmodel/room.js +1 -0
  64. package/dist/roborockCommunication/Zmodel/roomInfo.js +22 -0
  65. package/dist/roborockCommunication/Zmodel/scene.js +16 -0
  66. package/dist/roborockCommunication/Zmodel/userData.js +1 -0
  67. package/dist/roborockCommunication/Zmodel/vacuumError.js +27 -0
  68. package/dist/roborockCommunication/broadcast/abstractClient.js +55 -0
  69. package/dist/roborockCommunication/broadcast/client/LocalNetworkClient.js +174 -0
  70. package/dist/roborockCommunication/broadcast/client/LocalNetworkUDPClient.js +129 -0
  71. package/dist/roborockCommunication/broadcast/client/MQTTClient.js +139 -0
  72. package/dist/roborockCommunication/broadcast/client.js +1 -0
  73. package/dist/roborockCommunication/broadcast/clientRouter.js +82 -0
  74. package/dist/roborockCommunication/broadcast/listener/abstractConnectionListener.js +1 -0
  75. package/dist/roborockCommunication/broadcast/listener/abstractMessageHandler.js +1 -0
  76. package/dist/roborockCommunication/broadcast/listener/abstractMessageListener.js +1 -0
  77. package/dist/roborockCommunication/broadcast/listener/implementation/chainedConnectionListener.js +26 -0
  78. package/dist/roborockCommunication/broadcast/listener/implementation/chainedMessageListener.js +11 -0
  79. package/dist/roborockCommunication/broadcast/listener/implementation/connectionStateListener.js +43 -0
  80. package/dist/roborockCommunication/broadcast/listener/implementation/generalSyncMessageListener.js +28 -0
  81. package/dist/roborockCommunication/broadcast/listener/implementation/simpleMessageListener.js +27 -0
  82. package/dist/roborockCommunication/broadcast/listener/implementation/syncMessageListener.js +33 -0
  83. package/dist/roborockCommunication/broadcast/listener/index.js +1 -0
  84. package/dist/roborockCommunication/broadcast/messageProcessor.js +148 -0
  85. package/dist/roborockCommunication/broadcast/model/contentMessage.js +1 -0
  86. package/dist/roborockCommunication/broadcast/model/dps.js +1 -0
  87. package/dist/roborockCommunication/broadcast/model/headerMessage.js +1 -0
  88. package/dist/roborockCommunication/broadcast/model/messageContext.js +37 -0
  89. package/dist/roborockCommunication/broadcast/model/protocol.js +28 -0
  90. package/dist/roborockCommunication/broadcast/model/requestMessage.js +38 -0
  91. package/dist/roborockCommunication/broadcast/model/responseMessage.js +14 -0
  92. package/dist/roborockCommunication/helper/chunkBuffer.js +17 -0
  93. package/dist/roborockCommunication/helper/cryptoHelper.js +23 -0
  94. package/dist/roborockCommunication/helper/messageDeserializer.js +98 -0
  95. package/dist/roborockCommunication/helper/messageSerializer.js +84 -0
  96. package/dist/roborockCommunication/helper/nameDecoder.js +66 -0
  97. package/dist/roborockCommunication/helper/sequence.js +16 -0
  98. package/dist/roborockCommunication/index.js +13 -0
  99. package/dist/roborockService.js +494 -0
  100. package/dist/runtimes/handleCloudMessage.js +110 -0
  101. package/dist/runtimes/handleHomeDataMessage.js +57 -0
  102. package/dist/runtimes/handleLocalMessage.js +169 -0
  103. package/dist/rvc.js +51 -0
  104. package/dist/settings.js +1 -0
  105. package/dist/share/function.js +93 -0
  106. package/dist/share/runtimeHelper.js +17 -0
  107. package/dist/tests/testData/mockData.js +359 -0
  108. package/eslint.config.js +80 -0
  109. package/jest.config.js +22 -0
  110. package/jest.setup.js +2 -0
  111. package/logo.png +0 -0
  112. package/matterbridge-roborock-vacuum-plugin.config.json +46 -0
  113. package/matterbridge-roborock-vacuum-plugin.schema.json +293 -0
  114. package/misc/status.md +119 -0
  115. package/package.json +111 -0
  116. package/prettier.config.js +49 -0
  117. package/screenshot/IMG_1.PNG +0 -0
  118. package/screenshot/IMG_2.PNG +0 -0
  119. package/screenshot/IMG_3.PNG +0 -0
  120. package/screenshot/IMG_4.PNG +0 -0
  121. package/screenshot/IMG_5.PNG +0 -0
  122. package/screenshot/IMG_6.PNG +0 -0
  123. package/screenshot/IMG_7.PNG +0 -0
  124. package/src/behaviorFactory.ts +41 -0
  125. package/src/behaviors/BehaviorDeviceGeneric.ts +31 -0
  126. package/src/behaviors/roborock.vacuum/default/default.ts +238 -0
  127. package/src/behaviors/roborock.vacuum/default/initalData.ts +152 -0
  128. package/src/behaviors/roborock.vacuum/default/runtimes.ts +23 -0
  129. package/src/behaviors/roborock.vacuum/smart/initalData.ts +20 -0
  130. package/src/behaviors/roborock.vacuum/smart/runtimes.ts +15 -0
  131. package/src/behaviors/roborock.vacuum/smart/smart.ts +159 -0
  132. package/src/clientManager.ts +23 -0
  133. package/src/helper.ts +97 -0
  134. package/src/index.ts +16 -0
  135. package/src/initialData/getBatteryStatus.ts +26 -0
  136. package/src/initialData/getOperationalStates.ts +94 -0
  137. package/src/initialData/getSupportedAreas.ts +162 -0
  138. package/src/initialData/getSupportedCleanModes.ts +22 -0
  139. package/src/initialData/getSupportedRunModes.ts +14 -0
  140. package/src/initialData/getSupportedScenes.ts +32 -0
  141. package/src/initialData/index.ts +6 -0
  142. package/src/model/CloudMessageModel.ts +11 -0
  143. package/src/model/DockingStationStatus.ts +41 -0
  144. package/src/model/ExperimentalFeatureSetting.ts +77 -0
  145. package/src/model/RoomMap.ts +38 -0
  146. package/src/model/roomIndexMap.ts +26 -0
  147. package/src/notifyMessageTypes.ts +8 -0
  148. package/src/platform.ts +424 -0
  149. package/src/platformRunner.ts +103 -0
  150. package/src/roborockCommunication/RESTAPI/roborockAuthenticateApi.ts +302 -0
  151. package/src/roborockCommunication/RESTAPI/roborockIoTApi.ts +107 -0
  152. package/src/roborockCommunication/Zenum/additionalPropCode.ts +3 -0
  153. package/src/roborockCommunication/Zenum/authenticateResponseCode.ts +6 -0
  154. package/src/roborockCommunication/Zenum/dockType.ts +3 -0
  155. package/src/roborockCommunication/Zenum/operationStatusCode.ts +43 -0
  156. package/src/roborockCommunication/Zenum/vacuumAndDockErrorCode.ts +68 -0
  157. package/src/roborockCommunication/Zmodel/apiResponse.ts +3 -0
  158. package/src/roborockCommunication/Zmodel/authenticateFlowState.ts +6 -0
  159. package/src/roborockCommunication/Zmodel/authenticateResponse.ts +5 -0
  160. package/src/roborockCommunication/Zmodel/baseURL.ts +5 -0
  161. package/src/roborockCommunication/Zmodel/batteryMessage.ts +16 -0
  162. package/src/roborockCommunication/Zmodel/device.ts +50 -0
  163. package/src/roborockCommunication/Zmodel/deviceModel.ts +27 -0
  164. package/src/roborockCommunication/Zmodel/deviceSchema.ts +8 -0
  165. package/src/roborockCommunication/Zmodel/deviceStatus.ts +30 -0
  166. package/src/roborockCommunication/Zmodel/dockInfo.ts +9 -0
  167. package/src/roborockCommunication/Zmodel/home.ts +13 -0
  168. package/src/roborockCommunication/Zmodel/homeInfo.ts +5 -0
  169. package/src/roborockCommunication/Zmodel/map.ts +20 -0
  170. package/src/roborockCommunication/Zmodel/mapInfo.ts +54 -0
  171. package/src/roborockCommunication/Zmodel/messageResult.ts +75 -0
  172. package/src/roborockCommunication/Zmodel/multipleMap.ts +8 -0
  173. package/src/roborockCommunication/Zmodel/networkInfo.ts +7 -0
  174. package/src/roborockCommunication/Zmodel/product.ts +9 -0
  175. package/src/roborockCommunication/Zmodel/room.ts +4 -0
  176. package/src/roborockCommunication/Zmodel/roomInfo.ts +30 -0
  177. package/src/roborockCommunication/Zmodel/scene.ts +44 -0
  178. package/src/roborockCommunication/Zmodel/userData.ts +26 -0
  179. package/src/roborockCommunication/Zmodel/vacuumError.ts +35 -0
  180. package/src/roborockCommunication/broadcast/abstractClient.ts +80 -0
  181. package/src/roborockCommunication/broadcast/client/LocalNetworkClient.ts +218 -0
  182. package/src/roborockCommunication/broadcast/client/LocalNetworkUDPClient.ts +157 -0
  183. package/src/roborockCommunication/broadcast/client/MQTTClient.ts +174 -0
  184. package/src/roborockCommunication/broadcast/client.ts +19 -0
  185. package/src/roborockCommunication/broadcast/clientRouter.ts +104 -0
  186. package/src/roborockCommunication/broadcast/listener/abstractConnectionListener.ts +6 -0
  187. package/src/roborockCommunication/broadcast/listener/abstractMessageHandler.ts +11 -0
  188. package/src/roborockCommunication/broadcast/listener/abstractMessageListener.ts +5 -0
  189. package/src/roborockCommunication/broadcast/listener/implementation/chainedConnectionListener.ts +33 -0
  190. package/src/roborockCommunication/broadcast/listener/implementation/chainedMessageListener.ts +16 -0
  191. package/src/roborockCommunication/broadcast/listener/implementation/connectionStateListener.ts +57 -0
  192. package/src/roborockCommunication/broadcast/listener/implementation/generalSyncMessageListener.ts +38 -0
  193. package/src/roborockCommunication/broadcast/listener/implementation/simpleMessageListener.ts +37 -0
  194. package/src/roborockCommunication/broadcast/listener/implementation/syncMessageListener.ts +50 -0
  195. package/src/roborockCommunication/broadcast/listener/index.ts +3 -0
  196. package/src/roborockCommunication/broadcast/messageProcessor.ts +184 -0
  197. package/src/roborockCommunication/broadcast/model/contentMessage.ts +5 -0
  198. package/src/roborockCommunication/broadcast/model/dps.ts +19 -0
  199. package/src/roborockCommunication/broadcast/model/headerMessage.ts +7 -0
  200. package/src/roborockCommunication/broadcast/model/messageContext.ts +53 -0
  201. package/src/roborockCommunication/broadcast/model/protocol.ts +28 -0
  202. package/src/roborockCommunication/broadcast/model/requestMessage.ts +51 -0
  203. package/src/roborockCommunication/broadcast/model/responseMessage.ts +19 -0
  204. package/src/roborockCommunication/helper/chunkBuffer.ts +18 -0
  205. package/src/roborockCommunication/helper/cryptoHelper.ts +30 -0
  206. package/src/roborockCommunication/helper/messageDeserializer.ts +119 -0
  207. package/src/roborockCommunication/helper/messageSerializer.ts +101 -0
  208. package/src/roborockCommunication/helper/nameDecoder.ts +78 -0
  209. package/src/roborockCommunication/helper/sequence.ts +18 -0
  210. package/src/roborockCommunication/index.ts +25 -0
  211. package/src/roborockService.ts +657 -0
  212. package/src/runtimes/handleCloudMessage.ts +134 -0
  213. package/src/runtimes/handleHomeDataMessage.ts +67 -0
  214. package/src/runtimes/handleLocalMessage.ts +209 -0
  215. package/src/rvc.ts +97 -0
  216. package/src/settings.ts +1 -0
  217. package/src/share/function.ts +103 -0
  218. package/src/share/runtimeHelper.ts +23 -0
  219. package/src/tests/behaviors/roborock.vacuum/default/default.test.ts +134 -0
  220. package/src/tests/behaviors/roborock.vacuum/smart/runtimes.test.ts +64 -0
  221. package/src/tests/behaviors/roborock.vacuum/smart/smart.test.ts +215 -0
  222. package/src/tests/helper.test.ts +162 -0
  223. package/src/tests/initialData/getSupportedAreas.test.ts +181 -0
  224. package/src/tests/model/DockingStationStatus.test.ts +39 -0
  225. package/src/tests/platformRunner.test.ts +188 -0
  226. package/src/tests/platformRunner2.test.ts +228 -0
  227. package/src/tests/platformRunner3.test.ts +46 -0
  228. package/src/tests/roborockCommunication/RESTAPI/roborockAuthenticateApi.test.ts +144 -0
  229. package/src/tests/roborockCommunication/RESTAPI/roborockIoTApi.test.ts +106 -0
  230. package/src/tests/roborockCommunication/broadcast/client/LocalNetworkClient.test.ts +189 -0
  231. package/src/tests/roborockCommunication/broadcast/client/MQTTClient.test.ts +208 -0
  232. package/src/tests/roborockCommunication/broadcast/clientRouter.test.ts +168 -0
  233. package/src/tests/roborockCommunication/broadcast/listener/implementation/chainedConnectionListener.test.ts +59 -0
  234. package/src/tests/roborockCommunication/broadcast/listener/implementation/chainedMessageListener.test.ts +46 -0
  235. package/src/tests/roborockCommunication/broadcast/listener/implementation/simpleMessageListener.test.ts +71 -0
  236. package/src/tests/roborockCommunication/broadcast/listener/implementation/syncMessageListener.test.ts +86 -0
  237. package/src/tests/roborockCommunication/broadcast/messageProcessor.test.ts +126 -0
  238. package/src/tests/roborockService.setSelectedAreas.test.ts +61 -0
  239. package/src/tests/roborockService.test.ts +517 -0
  240. package/src/tests/roborockService2.test.ts +69 -0
  241. package/src/tests/roborockService3.test.ts +133 -0
  242. package/src/tests/roborockService4.test.ts +76 -0
  243. package/src/tests/roborockService5.test.ts +79 -0
  244. package/src/tests/runtimes/handleCloudMessage.test.ts +200 -0
  245. package/src/tests/runtimes/handleHomeDataMessage.test.ts +54 -0
  246. package/src/tests/runtimes/handleLocalMessage.test.ts +227 -0
  247. package/src/tests/testData/mockData.ts +370 -0
  248. package/src/tests/testData/mockHomeData-a187.json +286 -0
  249. package/tsconfig.jest.json +21 -0
  250. package/tsconfig.json +37 -0
  251. package/tsconfig.production.json +19 -0
  252. package/tslint.json +9 -0
  253. package/web-for-testing/README.md +47 -0
  254. package/web-for-testing/nodemon.json +7 -0
  255. package/web-for-testing/package-lock.json +6600 -0
  256. package/web-for-testing/package.json +36 -0
  257. package/web-for-testing/src/app.ts +194 -0
  258. package/web-for-testing/tsconfig-ext.json +19 -0
  259. package/web-for-testing/tsconfig.json +23 -0
  260. package/web-for-testing/views/index.ejs +172 -0
  261. package/web-for-testing/watch.mjs +93 -0
@@ -0,0 +1,238 @@
1
+ import { MaybePromise } from 'matterbridge/matter';
2
+ import { AnsiLogger, debugStringify } from 'matterbridge/logger';
3
+ import { BehaviorDeviceGeneric, BehaviorRoborock, DeviceCommands } from '../../BehaviorDeviceGeneric.js';
4
+ import RoborockService from '../../../roborockService.js';
5
+ import { CleanModeSettings } from '../../../model/ExperimentalFeatureSetting.js';
6
+
7
+ export interface DefaultEndpointCommands extends DeviceCommands {
8
+ selectAreas: (newAreas: number[]) => MaybePromise;
9
+ changeToMode: (newMode: number) => MaybePromise;
10
+ pause: () => MaybePromise;
11
+ resume: () => MaybePromise;
12
+ goHome: () => MaybePromise;
13
+ playSoundToLocate: (identifyTime: number) => MaybePromise;
14
+ }
15
+
16
+ export class DefaultBehavior extends BehaviorRoborock {
17
+ declare state: DefaultBehaviorRoborockState;
18
+ }
19
+
20
+ export interface DefaultBehaviorRoborockState {
21
+ device: BehaviorDeviceGeneric<DefaultEndpointCommands>;
22
+ }
23
+
24
+ // suction_power
25
+ export enum VacuumSuctionPower {
26
+ Quiet = 101,
27
+ Balanced = 102,
28
+ Turbo = 103,
29
+ Max = 104,
30
+ Off = 105,
31
+ Custom = 106,
32
+ MaxPlus = 108,
33
+ }
34
+
35
+ // water_box_mode
36
+ export enum MopWaterFlow {
37
+ Off = 200,
38
+ Low = 201,
39
+ Medium = 202,
40
+ High = 203,
41
+ Custom = 204,
42
+ CustomizeWithDistanceOff = 207,
43
+ }
44
+
45
+ // set_mop_mode
46
+ export enum MopRoute {
47
+ Standard = 300,
48
+ Deep = 301,
49
+ Custom = 302,
50
+ DeepPlus = 303,
51
+ Fast = 304,
52
+ }
53
+
54
+ export const RvcRunMode: Record<number, string> = {
55
+ [1]: 'Idle', // DO NOT HANDLE HERE,
56
+ [2]: 'Cleaning',
57
+ [3]: 'Mapping',
58
+ };
59
+
60
+ export const RvcCleanMode: Record<number, string> = {
61
+ [5]: 'Mop & Vacuum: Default',
62
+ [6]: 'Mop & Vacuum: Quick',
63
+ [7]: 'Mop & Vacuum: Max',
64
+ [8]: 'Mop & Vacuum: Min',
65
+ [9]: 'Mop & Vacuum: Quiet',
66
+ [10]: 'Mop & Vacuum: Custom',
67
+
68
+ [31]: 'Mop: Default',
69
+ [32]: 'Mop: Max',
70
+ [33]: 'Mop: Min',
71
+ [34]: 'Mop: Quick',
72
+ [35]: 'Mop: DeepClean',
73
+
74
+ [66]: 'Vacuum: Default',
75
+ [67]: 'Vacuum: Max',
76
+ [68]: 'Vacuum: Quiet',
77
+ [69]: 'Vacuum: Quick',
78
+
79
+ [99]: 'Go Vacation',
80
+ };
81
+
82
+ export interface CleanModeSetting {
83
+ suctionPower: number;
84
+ waterFlow: number;
85
+ distance_off: number;
86
+ mopRoute: number | undefined;
87
+ }
88
+
89
+ export const CleanSetting: Record<number, CleanModeSetting> = {
90
+ [5]: { suctionPower: VacuumSuctionPower.Balanced, waterFlow: MopWaterFlow.Medium, distance_off: 0, mopRoute: MopRoute.Standard }, // 'Vac & Mop Default'
91
+ [6]: { suctionPower: VacuumSuctionPower.Balanced, waterFlow: MopWaterFlow.Medium, distance_off: 0, mopRoute: MopRoute.Fast }, // 'Vac & Mop Quick'
92
+
93
+ [7]: { suctionPower: VacuumSuctionPower.Max, waterFlow: MopWaterFlow.Medium, distance_off: 0, mopRoute: MopRoute.Standard }, // 'Vac & Mop Max'
94
+ [8]: { suctionPower: VacuumSuctionPower.Balanced, waterFlow: MopWaterFlow.Low, distance_off: 0, mopRoute: MopRoute.Standard }, // 'Vac & Mop Min'
95
+ [9]: { suctionPower: VacuumSuctionPower.Quiet, waterFlow: MopWaterFlow.Medium, distance_off: 0, mopRoute: MopRoute.Standard }, // 'Vac & Mop Quiet'
96
+
97
+ [10]: { suctionPower: VacuumSuctionPower.Custom, waterFlow: MopWaterFlow.Custom, distance_off: 0, mopRoute: MopRoute.Custom }, // 'Vac & Mop Custom -> LowEnergy'
98
+
99
+ [31]: { suctionPower: VacuumSuctionPower.Off, waterFlow: MopWaterFlow.Medium, distance_off: 0, mopRoute: MopRoute.Standard }, // 'Mop Default'
100
+ [32]: { suctionPower: VacuumSuctionPower.Off, waterFlow: MopWaterFlow.High, distance_off: 0, mopRoute: MopRoute.Standard }, // 'MopMax'
101
+ [33]: { suctionPower: VacuumSuctionPower.Off, waterFlow: MopWaterFlow.Low, distance_off: 0, mopRoute: MopRoute.Standard }, // 'MopMin'
102
+ [34]: { suctionPower: VacuumSuctionPower.Off, waterFlow: MopWaterFlow.Medium, distance_off: 0, mopRoute: MopRoute.Fast }, // 'MopQuick'
103
+ [35]: { suctionPower: VacuumSuctionPower.Off, waterFlow: MopWaterFlow.Medium, distance_off: 0, mopRoute: MopRoute.Deep }, // 'MopDeepClean'
104
+
105
+ [66]: { suctionPower: VacuumSuctionPower.Balanced, waterFlow: MopWaterFlow.Off, distance_off: 0, mopRoute: MopRoute.Standard }, // 'Vacuum Default'
106
+ [67]: { suctionPower: VacuumSuctionPower.Max, waterFlow: MopWaterFlow.Off, distance_off: 0, mopRoute: MopRoute.Standard }, // 'VacuumMax'
107
+ [68]: { suctionPower: VacuumSuctionPower.Quiet, waterFlow: MopWaterFlow.Off, distance_off: 0, mopRoute: MopRoute.Standard }, // 'VacuumQuiet'
108
+ [69]: { suctionPower: VacuumSuctionPower.Balanced, waterFlow: MopWaterFlow.Off, distance_off: 0, mopRoute: MopRoute.Fast }, // 'VacuumQuick'
109
+ };
110
+
111
+ export function setDefaultCommandHandler(
112
+ duid: string,
113
+ handler: BehaviorDeviceGeneric<DefaultEndpointCommands>,
114
+ logger: AnsiLogger,
115
+ roborockService: RoborockService,
116
+ cleanModeSettings: CleanModeSettings | undefined,
117
+ ): void {
118
+ handler.setCommandHandler('changeToMode', async (newMode: number) => {
119
+ const activity = RvcRunMode[newMode] || RvcCleanMode[newMode];
120
+ switch (activity) {
121
+ case 'Cleaning': {
122
+ logger.notice('DefaultBehavior-ChangeRunMode to: ', activity);
123
+ await roborockService.startClean(duid);
124
+ break;
125
+ }
126
+
127
+ case 'Go Vacation': {
128
+ logger.notice('DefaultBehavior-GoHome');
129
+ await roborockService.stopAndGoHome(duid);
130
+ break;
131
+ }
132
+
133
+ case 'Mop & Vacuum: Custom': {
134
+ const setting = CleanSetting[newMode];
135
+ logger.notice(`DefaultBehavior-ChangeCleanMode to: ${activity}, setting: ${debugStringify(setting)}`);
136
+ await roborockService.changeCleanMode(duid, setting);
137
+ break;
138
+ }
139
+
140
+ case 'Mop & Vacuum: Default':
141
+ case 'Mop: Default':
142
+ case 'Vacuum: Default': {
143
+ const setting = cleanModeSettings ? (getSettingFromCleanMode(activity, cleanModeSettings) ?? CleanSetting[newMode]) : CleanSetting[newMode];
144
+ logger.notice(`DefaultBehavior-ChangeCleanMode to: ${activity}, setting: ${debugStringify(setting ?? {})}`);
145
+ if (setting) {
146
+ await roborockService.changeCleanMode(duid, setting);
147
+ }
148
+ break;
149
+ }
150
+
151
+ case 'Mop & Vacuum: Quick':
152
+ case 'Mop & Vacuum: Max':
153
+ case 'Mop & Vacuum: Min':
154
+ case 'Mop & Vacuum: Quiet':
155
+ case 'Mop: Max':
156
+ case 'Mop: Min':
157
+ case 'Mop: Quick':
158
+ case 'Mop: DeepClean':
159
+ case 'Vacuum: Max':
160
+ case 'Vacuum: Min':
161
+ case 'Vacuum: Quiet':
162
+ case 'Vacuum: Quick': {
163
+ const setting = CleanSetting[newMode];
164
+ logger.notice(`DefaultBehavior-ChangeCleanMode to: ${activity}, setting: ${debugStringify(setting ?? {})}`);
165
+ if (setting) {
166
+ await roborockService.changeCleanMode(duid, setting);
167
+ }
168
+ break;
169
+ }
170
+ default:
171
+ logger.notice('DefaultBehavior-changeToMode-Unknown: ', newMode);
172
+ break;
173
+ }
174
+ });
175
+
176
+ handler.setCommandHandler('selectAreas', async (newAreas: number[]) => {
177
+ logger.notice(`DefaultBehavior-selectAreas: ${newAreas}`);
178
+ roborockService.setSelectedAreas(duid, newAreas ?? []);
179
+ });
180
+
181
+ handler.setCommandHandler('pause', async () => {
182
+ logger.notice('DefaultBehavior-Pause');
183
+ await roborockService.pauseClean(duid);
184
+ });
185
+
186
+ handler.setCommandHandler('resume', async () => {
187
+ logger.notice('DefaultBehavior-Resume');
188
+ await roborockService.resumeClean(duid);
189
+ });
190
+
191
+ handler.setCommandHandler('goHome', async () => {
192
+ logger.notice('DefaultBehavior-GoHome');
193
+ await roborockService.stopAndGoHome(duid);
194
+ });
195
+
196
+ handler.setCommandHandler('playSoundToLocate', async () => {
197
+ logger.notice('DefaultBehavior-playSoundToLocate');
198
+ await roborockService.playSoundToLocate(duid);
199
+ });
200
+ }
201
+
202
+ export const getSettingFromCleanMode = (activity: string, cleanModeSettings?: CleanModeSettings): CleanModeSetting | undefined => {
203
+ switch (activity) {
204
+ case 'Mop: Default': {
205
+ const mopSetting = cleanModeSettings?.mopping;
206
+ const waterFlow = MopWaterFlow[mopSetting?.waterFlowMode as keyof typeof MopWaterFlow] ?? MopWaterFlow.Medium;
207
+ const distance_off = waterFlow == MopWaterFlow.CustomizeWithDistanceOff ? 210 - 5 * (mopSetting?.distanceOff ?? 25) : 0;
208
+ return {
209
+ suctionPower: VacuumSuctionPower.Off,
210
+ waterFlow,
211
+ distance_off,
212
+ mopRoute: MopRoute[mopSetting?.mopRouteMode as keyof typeof MopRoute] ?? MopRoute.Standard,
213
+ };
214
+ }
215
+ case 'Vacuum: Default': {
216
+ const vacuumSetting = cleanModeSettings?.vacuuming;
217
+ return {
218
+ suctionPower: VacuumSuctionPower[vacuumSetting?.fanMode as keyof typeof VacuumSuctionPower] ?? VacuumSuctionPower.Balanced,
219
+ waterFlow: MopWaterFlow.Off,
220
+ distance_off: 0,
221
+ mopRoute: MopRoute[vacuumSetting?.mopRouteMode as keyof typeof MopRoute] ?? MopRoute.Standard,
222
+ };
223
+ }
224
+ case 'Mop & Vacuum: Default': {
225
+ const vacmopSetting = cleanModeSettings?.vacmop;
226
+ const waterFlow = MopWaterFlow[vacmopSetting?.waterFlowMode as keyof typeof MopWaterFlow] ?? MopWaterFlow.Medium;
227
+ const distance_off = waterFlow == MopWaterFlow.CustomizeWithDistanceOff ? 210 - 5 * (vacmopSetting?.distanceOff ?? 25) : 0;
228
+ return {
229
+ suctionPower: VacuumSuctionPower[vacmopSetting?.fanMode as keyof typeof VacuumSuctionPower] ?? VacuumSuctionPower.Balanced,
230
+ waterFlow,
231
+ distance_off,
232
+ mopRoute: MopRoute[vacmopSetting?.mopRouteMode as keyof typeof MopRoute] ?? MopRoute.Standard,
233
+ };
234
+ }
235
+ default:
236
+ return undefined;
237
+ }
238
+ };
@@ -0,0 +1,152 @@
1
+ import { RvcCleanMode, RvcOperationalState, RvcRunMode } from 'matterbridge/matter/clusters';
2
+ import { RvcCleanMode as RvcCleanModeDisplayMap } from './default.js';
3
+ import { ExperimentalFeatureSetting } from '../../../model/ExperimentalFeatureSetting.js';
4
+
5
+ export function getDefaultSupportedRunModes(): RvcRunMode.ModeOption[] {
6
+ return [
7
+ {
8
+ label: 'Idle',
9
+ mode: 1,
10
+ modeTags: [{ value: RvcRunMode.ModeTag.Idle }],
11
+ },
12
+ {
13
+ label: 'Cleaning',
14
+ mode: 2,
15
+ modeTags: [{ value: RvcRunMode.ModeTag.Cleaning }],
16
+ },
17
+ {
18
+ label: 'Mapping',
19
+ mode: 3,
20
+ modeTags: [{ value: RvcRunMode.ModeTag.Mapping }],
21
+ },
22
+ ];
23
+ }
24
+
25
+ export function getDefaultSupportedCleanModes(enableExperimentalFeature: ExperimentalFeatureSetting | undefined): RvcCleanMode.ModeOption[] {
26
+ const result = [
27
+ {
28
+ label: RvcCleanModeDisplayMap[5],
29
+ mode: 5,
30
+ modeTags: [{ value: RvcCleanMode.ModeTag.Mop }, { value: RvcCleanMode.ModeTag.Vacuum }, { value: RvcCleanMode.ModeTag.Auto }],
31
+ },
32
+ {
33
+ label: RvcCleanModeDisplayMap[6],
34
+ mode: 6,
35
+ modeTags: [{ value: RvcCleanMode.ModeTag.Mop }, { value: RvcCleanMode.ModeTag.Vacuum }, { value: RvcCleanMode.ModeTag.Quick }],
36
+ },
37
+ {
38
+ label: RvcCleanModeDisplayMap[7],
39
+ mode: 7,
40
+ modeTags: [{ value: RvcCleanMode.ModeTag.Mop }, { value: RvcCleanMode.ModeTag.Vacuum }, { value: RvcCleanMode.ModeTag.Max }],
41
+ },
42
+ {
43
+ label: RvcCleanModeDisplayMap[8],
44
+ mode: 8,
45
+ modeTags: [{ value: RvcCleanMode.ModeTag.Mop }, { value: RvcCleanMode.ModeTag.Vacuum }, { value: RvcCleanMode.ModeTag.Min }],
46
+ },
47
+ {
48
+ label: RvcCleanModeDisplayMap[9],
49
+ mode: 9,
50
+ modeTags: [{ value: RvcCleanMode.ModeTag.Mop }, { value: RvcCleanMode.ModeTag.Vacuum }, { value: RvcCleanMode.ModeTag.Quiet }],
51
+ },
52
+ {
53
+ label: RvcCleanModeDisplayMap[10],
54
+ mode: 10,
55
+ modeTags: [{ value: RvcCleanMode.ModeTag.Mop }, { value: RvcCleanMode.ModeTag.Vacuum }, { value: RvcCleanMode.ModeTag.LowEnergy }],
56
+ },
57
+
58
+ {
59
+ label: RvcCleanModeDisplayMap[31],
60
+ mode: 31,
61
+ modeTags: [{ value: RvcCleanMode.ModeTag.Mop }, { value: RvcCleanMode.ModeTag.Auto }],
62
+ },
63
+
64
+ {
65
+ label: RvcCleanModeDisplayMap[32],
66
+ mode: 32,
67
+ modeTags: [{ value: RvcCleanMode.ModeTag.Mop }, { value: RvcCleanMode.ModeTag.Max }],
68
+ },
69
+ {
70
+ label: RvcCleanModeDisplayMap[33],
71
+ mode: 33,
72
+ modeTags: [{ value: RvcCleanMode.ModeTag.Mop }, { value: RvcCleanMode.ModeTag.Min }],
73
+ },
74
+ {
75
+ label: RvcCleanModeDisplayMap[34],
76
+ mode: 34,
77
+ modeTags: [{ value: RvcCleanMode.ModeTag.Mop }, { value: RvcCleanMode.ModeTag.Quick }],
78
+ },
79
+ {
80
+ label: RvcCleanModeDisplayMap[35],
81
+ mode: 35,
82
+ modeTags: [{ value: RvcCleanMode.ModeTag.Mop }, { value: RvcCleanMode.ModeTag.DeepClean }],
83
+ },
84
+
85
+ {
86
+ label: RvcCleanModeDisplayMap[66],
87
+ mode: 66,
88
+ modeTags: [{ value: RvcCleanMode.ModeTag.Vacuum }, { value: RvcCleanMode.ModeTag.Auto }],
89
+ },
90
+ {
91
+ label: RvcCleanModeDisplayMap[67],
92
+ mode: 67,
93
+ modeTags: [{ value: RvcCleanMode.ModeTag.Vacuum }, { value: RvcCleanMode.ModeTag.Max }],
94
+ },
95
+ {
96
+ label: RvcCleanModeDisplayMap[68],
97
+ mode: 68,
98
+ modeTags: [{ value: RvcCleanMode.ModeTag.Vacuum }, { value: RvcCleanMode.ModeTag.Quiet }],
99
+ },
100
+ {
101
+ label: RvcCleanModeDisplayMap[69],
102
+ mode: 69,
103
+ modeTags: [{ value: RvcCleanMode.ModeTag.Vacuum }, { value: RvcCleanMode.ModeTag.Quick }],
104
+ },
105
+ ];
106
+
107
+ if (enableExperimentalFeature?.advancedFeature?.useVacationModeToSendVacuumToDock ?? false) {
108
+ return [
109
+ ...result,
110
+ {
111
+ label: RvcCleanModeDisplayMap[99],
112
+ mode: 99,
113
+ modeTags: [{ value: RvcCleanMode.ModeTag.Mop }, { value: RvcCleanMode.ModeTag.Vacuum }, { value: RvcCleanMode.ModeTag.Vacation }],
114
+ },
115
+ ];
116
+ }
117
+
118
+ return result;
119
+ }
120
+
121
+ export function getDefaultOperationalStates(): RvcOperationalState.OperationalStateStruct[] {
122
+ return [
123
+ {
124
+ operationalStateId: RvcOperationalState.OperationalState.Stopped,
125
+ operationalStateLabel: 'Stopped',
126
+ },
127
+ {
128
+ operationalStateId: RvcOperationalState.OperationalState.Running,
129
+ operationalStateLabel: 'Running',
130
+ },
131
+ {
132
+ operationalStateId: RvcOperationalState.OperationalState.Paused,
133
+ operationalStateLabel: 'Paused',
134
+ },
135
+ {
136
+ operationalStateId: RvcOperationalState.OperationalState.Error,
137
+ operationalStateLabel: 'Error',
138
+ },
139
+ {
140
+ operationalStateId: RvcOperationalState.OperationalState.SeekingCharger,
141
+ operationalStateLabel: 'SeekingCharger',
142
+ },
143
+ {
144
+ operationalStateId: RvcOperationalState.OperationalState.Charging,
145
+ operationalStateLabel: 'Charging',
146
+ },
147
+ {
148
+ operationalStateId: RvcOperationalState.OperationalState.Docked,
149
+ operationalStateLabel: 'Docked',
150
+ },
151
+ ];
152
+ }
@@ -0,0 +1,23 @@
1
+ import { CleanModeSetting, CleanSetting, MopRoute, MopWaterFlow, VacuumSuctionPower } from './default.js';
2
+
3
+ export function getCurrentCleanModeDefault(setting: CleanModeSetting): number | undefined {
4
+ if (!setting || typeof setting !== 'object') {
5
+ return undefined;
6
+ }
7
+
8
+ if (setting.suctionPower === VacuumSuctionPower.Custom || setting.waterFlow === MopWaterFlow.Custom || setting.mopRoute === MopRoute.Custom) {
9
+ return 10; // 'Vac & Mop Custom'
10
+ }
11
+
12
+ for (const [key, value] of Object.entries(CleanSetting)) {
13
+ if (value.suctionPower === setting.suctionPower && value.waterFlow === setting.waterFlow && value.mopRoute === setting.mopRoute) {
14
+ return Number(key);
15
+ }
16
+ }
17
+
18
+ if (setting.suctionPower == VacuumSuctionPower.Off) return 31; // 'Mop Default'
19
+ if (setting.waterFlow == MopWaterFlow.Off) return 66; // 'Vacuum Default'
20
+ if ((setting.suctionPower !== VacuumSuctionPower.Off && setting.waterFlow) !== MopWaterFlow.Off) return 5; // 'Vac & Mop Default'
21
+
22
+ return undefined;
23
+ }
@@ -0,0 +1,20 @@
1
+ import { RvcCleanMode } from 'matterbridge/matter/clusters';
2
+ import { RvcCleanMode as RvcCleanModeDisplayMap } from './smart.js';
3
+ import { getDefaultSupportedCleanModes } from '../default/initalData.js';
4
+ import { ExperimentalFeatureSetting } from '../../../model/ExperimentalFeatureSetting.js';
5
+
6
+ export function getSupportedCleanModesSmart(enableExperimentalFeature: ExperimentalFeatureSetting | undefined): RvcCleanMode.ModeOption[] {
7
+ return [
8
+ {
9
+ label: RvcCleanModeDisplayMap[4],
10
+ mode: 4,
11
+ modeTags: [{ value: RvcCleanMode.ModeTag.Mop }, { value: RvcCleanMode.ModeTag.Vacuum }, { value: RvcCleanMode.ModeTag.Auto }],
12
+ },
13
+ {
14
+ label: RvcCleanModeDisplayMap[5],
15
+ mode: 5,
16
+ modeTags: [{ value: RvcCleanMode.ModeTag.Mop }, { value: RvcCleanMode.ModeTag.Vacuum }, { value: RvcCleanMode.ModeTag.Day }],
17
+ },
18
+ ...getDefaultSupportedCleanModes(enableExperimentalFeature).filter((x) => x.mode !== 4 && x.mode !== 5), // Exclude modes 4 and 5 which are already defined
19
+ ];
20
+ }
@@ -0,0 +1,15 @@
1
+ import { CleanModeSetting } from '../default/default.js';
2
+ import { getCurrentCleanModeDefault } from '../default/runtimes.js';
3
+ import { MopRouteSmart, MopWaterFlowSmart, VacuumSuctionPowerSmart } from './smart.js';
4
+
5
+ export function getCurrentCleanModeSmart(setting: CleanModeSetting): number | undefined {
6
+ if (!setting || typeof setting !== 'object') {
7
+ return undefined;
8
+ }
9
+
10
+ if (setting.suctionPower === VacuumSuctionPowerSmart.Smart || setting.waterFlow === MopWaterFlowSmart.Smart || setting.mopRoute === MopRouteSmart.Smart) {
11
+ return 4; // 'Smart Plan'
12
+ }
13
+
14
+ return getCurrentCleanModeDefault(setting);
15
+ }
@@ -0,0 +1,159 @@
1
+ import { MaybePromise } from 'matterbridge/matter';
2
+ import { AnsiLogger, debugStringify } from 'matterbridge/logger';
3
+ import { BehaviorDeviceGeneric, BehaviorRoborock, DeviceCommands } from '../../BehaviorDeviceGeneric.js';
4
+ import RoborockService from '../../../roborockService.js';
5
+ import { CleanModeSettings } from '../../../model/ExperimentalFeatureSetting.js';
6
+ import { RvcCleanMode as DefaultRvcCleanMode, CleanSetting as DefaultCleanSetting, getSettingFromCleanMode, RvcRunMode, CleanModeSetting } from '../default/default.js';
7
+
8
+ export interface EndpointCommandsSmart extends DeviceCommands {
9
+ selectAreas: (newAreas: number[] | undefined) => MaybePromise;
10
+ changeToMode: (newMode: number) => MaybePromise;
11
+ pause: () => MaybePromise;
12
+ resume: () => MaybePromise;
13
+ goHome: () => MaybePromise;
14
+ playSoundToLocate: (identifyTime: number) => MaybePromise;
15
+ }
16
+
17
+ export class BehaviorSmart extends BehaviorRoborock {
18
+ declare state: BehaviorRoborockSmartState;
19
+ }
20
+
21
+ export interface BehaviorRoborockSmartState {
22
+ device: BehaviorDeviceGeneric<EndpointCommandsSmart>;
23
+ }
24
+
25
+ // get_custom_mode
26
+ export enum VacuumSuctionPowerSmart {
27
+ Quiet = 101,
28
+ Balanced = 102,
29
+ Turbo = 103,
30
+ Max = 104,
31
+ Off = 105,
32
+ Custom = 106,
33
+ MaxPlus = 108,
34
+ Smart = 110,
35
+ }
36
+
37
+ // get_water_box_custom_mode
38
+ export enum MopWaterFlowSmart {
39
+ Off = 200,
40
+ Low = 201,
41
+ Medium = 202,
42
+ High = 203,
43
+ Custom = 204,
44
+ CustomizeWithDistanceOff = 207,
45
+ Smart = 209,
46
+ }
47
+
48
+ // get_mop_mode
49
+ export enum MopRouteSmart {
50
+ Standard = 300,
51
+ Deep = 301,
52
+ Custom = 302,
53
+ DeepPlus = 303,
54
+ Fast = 304,
55
+ Smart = 306,
56
+ }
57
+
58
+ export const RvcCleanMode: Record<number, string> = {
59
+ [4]: 'Smart Plan',
60
+ ...DefaultRvcCleanMode,
61
+ };
62
+
63
+ // { suctionPower: [ 102 ], waterFlow: 200, distance_off: 0, mopRoute: [ 102 ] }
64
+ export const CleanSetting: Record<number, CleanModeSetting> = {
65
+ [4]: { suctionPower: 0, waterFlow: 0, distance_off: 0, mopRoute: MopRouteSmart.Smart }, // 'Smart Plan'
66
+ ...DefaultCleanSetting,
67
+ };
68
+
69
+ export function setCommandHandlerSmart(
70
+ duid: string,
71
+ handler: BehaviorDeviceGeneric<EndpointCommandsSmart>,
72
+ logger: AnsiLogger,
73
+ roborockService: RoborockService,
74
+ cleanModeSettings: CleanModeSettings | undefined,
75
+ ): void {
76
+ handler.setCommandHandler('changeToMode', async (newMode: number) => {
77
+ const activity = RvcRunMode[newMode] || RvcCleanMode[newMode];
78
+ switch (activity) {
79
+ case 'Cleaning': {
80
+ logger.notice('BehaviorSmart-ChangeRunMode to: ', activity);
81
+ await roborockService.startClean(duid);
82
+ break;
83
+ }
84
+
85
+ case 'Go Vacation': {
86
+ logger.notice('BehaviorSmart-GoHome');
87
+ await roborockService.stopAndGoHome(duid);
88
+ break;
89
+ }
90
+
91
+ case 'Smart Plan':
92
+ case 'Mop & Vacuum: Custom': {
93
+ const setting = CleanSetting[newMode];
94
+ logger.notice(`BehaviorSmart-ChangeCleanMode to: ${activity}, setting: ${debugStringify(setting)}`);
95
+ await roborockService.changeCleanMode(duid, setting);
96
+ break;
97
+ }
98
+
99
+ case 'Mop & Vacuum: Default':
100
+ case 'Mop: Default':
101
+ case 'Vacuum: Default': {
102
+ const setting = cleanModeSettings ? (getSettingFromCleanMode(activity, cleanModeSettings) ?? CleanSetting[newMode]) : CleanSetting[newMode];
103
+ logger.notice(`BehaviorSmart-ChangeCleanMode to: ${activity}, setting: ${debugStringify(setting ?? {})}`);
104
+ if (setting) {
105
+ await roborockService.changeCleanMode(duid, setting);
106
+ }
107
+ break;
108
+ }
109
+
110
+ case 'Mop & Vacuum: Quick':
111
+ case 'Mop & Vacuum: Max':
112
+ case 'Mop & Vacuum: Min':
113
+ case 'Mop & Vacuum: Quiet':
114
+ case 'Mop: Max':
115
+ case 'Mop: Min':
116
+ case 'Mop: Quick':
117
+ case 'Mop: DeepClean':
118
+ case 'Vacuum: Max':
119
+ case 'Vacuum: Min':
120
+ case 'Vacuum: Quiet':
121
+ case 'Vacuum: Quick': {
122
+ const setting = CleanSetting[newMode];
123
+ logger.notice(`BehaviorSmart-ChangeCleanMode to: ${activity}, setting: ${debugStringify(setting ?? {})}`);
124
+ if (setting) {
125
+ await roborockService.changeCleanMode(duid, setting);
126
+ }
127
+ break;
128
+ }
129
+ default:
130
+ logger.notice('BehaviorSmart-changeToMode-Unknown: ', newMode);
131
+ break;
132
+ }
133
+ });
134
+
135
+ handler.setCommandHandler('selectAreas', async (newAreas: number[] | undefined) => {
136
+ logger.notice(`BehaviorSmart-selectAreas: ${newAreas}`);
137
+ roborockService.setSelectedAreas(duid, newAreas ?? []);
138
+ });
139
+
140
+ handler.setCommandHandler('pause', async () => {
141
+ logger.notice('BehaviorSmart-Pause');
142
+ await roborockService.pauseClean(duid);
143
+ });
144
+
145
+ handler.setCommandHandler('resume', async () => {
146
+ logger.notice('BehaviorSmart-Resume');
147
+ await roborockService.resumeClean(duid);
148
+ });
149
+
150
+ handler.setCommandHandler('goHome', async () => {
151
+ logger.notice('BehaviorSmart-GoHome');
152
+ await roborockService.stopAndGoHome(duid);
153
+ });
154
+
155
+ handler.setCommandHandler('playSoundToLocate', async () => {
156
+ logger.notice('BehaviorSmart-playSoundToLocate');
157
+ await roborockService.playSoundToLocate(duid);
158
+ });
159
+ }
@@ -0,0 +1,23 @@
1
+ import { ClientRouter } from './roborockCommunication/broadcast/clientRouter.js';
2
+ import { UserData } from './roborockCommunication/index.js';
3
+ import { AnsiLogger } from 'matterbridge/logger';
4
+
5
+ export default class ClientManager {
6
+ private readonly clients = new Map<string, ClientRouter>();
7
+ private logger: AnsiLogger;
8
+
9
+ public constructor(logger: AnsiLogger) {
10
+ this.logger = logger;
11
+ }
12
+
13
+ public get(username: string, userdata: UserData): ClientRouter {
14
+ if (!this.clients.has(username)) {
15
+ this.clients.set(username, new ClientRouter(this.logger, userdata));
16
+ }
17
+ return this.clients.get(username) as ClientRouter;
18
+ }
19
+
20
+ public destroy(username: string): void {
21
+ this.clients.delete(username);
22
+ }
23
+ }