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,34 @@
1
+ ### ⚙️ Matterbridge Setup
2
+
3
+ <div align="center">
4
+ <img src="./screenshot/IMG_6.PNG" alt="Matterbridge Configuration Screenshot" style="border-radius: 8px; max-width: 100%; box-shadow: 0 4px 12px rgba(0,0,0,0.1);" />
5
+ </div>
6
+
7
+ > 🛠️ Follow the configuration shown above to set up Matterbridge correctly for your Roborock vacuum.
8
+
9
+ ---
10
+
11
+ ### 🔄 Steps to Reproduce
12
+
13
+ 1. Apply the configuration shown above.
14
+ 2. Restart **Matterbridge**.
15
+ 3. Reproduce the issue you're encountering.
16
+
17
+ ---
18
+
19
+ ### 🪵 Collect Logs
20
+
21
+ After reproducing the issue, download the **MATTERBRIDGE LOG** file:
22
+
23
+ <div align="center">
24
+ <img src="./screenshot/IMG_7.PNG" alt="Download Matterbridge Log Screenshot" style="border-radius: 8px; max-width: 100%; box-shadow: 0 4px 12px rgba(0,0,0,0.1);" />
25
+ </div>
26
+
27
+ ---
28
+
29
+ ### 📬 Submit an Issue
30
+
31
+ Please upload the log file and describe the problem at:
32
+ [https://github.com/RinDevJunior/matterbridge-roborock-vacuum-plugin/issues](https://github.com/RinDevJunior/matterbridge-roborock-vacuum-plugin/issues)
33
+
34
+ Your logs help me troubleshoot and improve compatibility. Thank you! 🙏
@@ -0,0 +1,67 @@
1
+ # Supported & Tested Roborock Device Models
2
+
3
+ ## ✅ Tested Devices
4
+
5
+ | Device Name | Model Enum Key | Model String | Thank |
6
+ |----------------------------|------------------------|-------------------------------|------------------|
7
+ | Roborock Qrevo Edge 5V1 | `QREVO_EDGE_5V1` | `roborock.vacuum.a187` | |
8
+ | Roborock S8 Pro Ultra | `S8_PRO_ULTRA` | `roborock.vacuum.a70` | |
9
+ | Roborock S7 MaxV | `S7_MAXV` | `roborock.vacuum.a27` | |
10
+
11
+ These devices have been fully tested and are confirmed to work as expected.
12
+
13
+ ---
14
+
15
+ ## ⚠️ Not Supported Devices
16
+
17
+ This plugin does NOT support these models:
18
+
19
+ | Device Name | Model String |
20
+ |----------------------------|-------------------------------|
21
+ | Roborock Q10 Series | `roborock.vacuum.ss07` |
22
+
23
+ **Reason:**
24
+ Roborock recently released a new series of models, Q10. Roborock has changed the protocol for how these devices interact.
25
+
26
+ ---
27
+
28
+ ## ⚠️ Other Supported Devices
29
+
30
+ All other models listed in the code are supported, but **may have some limitations**.
31
+
32
+ **Reason:**
33
+ I do not own these devices for direct testing.
34
+
35
+ If you have one of these models, please try it out and let me know your results!
36
+
37
+ ---
38
+
39
+ ### List of Other Models that I know the mode string
40
+
41
+ - Q5 (`roborock.vacuum.a34`)
42
+ - Q5_PRO (`roborock.vacuum.a72`)
43
+ - S5 (`roborock.vacuum.s5`)
44
+ - S5_MAX (`roborock.vacuum.s5e`)
45
+ - S6 (`roborock.vacuum.s6`)
46
+ - S6_MAXV (`roborock.vacuum.a10`)
47
+ - S6_PURE (`roborock.vacuum.a08`)
48
+ - Q7 (`roborock.vacuum.a40`)
49
+ - Q7_MAX (`roborock.vacuum.a38`)
50
+ - Q7_PLUS (`roborock.vacuum.a40`)
51
+ - S7 (`roborock.vacuum.a15`)
52
+ - S7_MAXV_ULTRA (`roborock.vacuum.a65`)
53
+ - S7_PRO_ULTRA (`roborock.vacuum.a62`)
54
+ - Q8_MAX (`roborock.vacuum.a73`)
55
+ - S8 (`roborock.vacuum.a51`)
56
+ - S8_MAXV_ULTRA (`roborock.vacuum.a97`)
57
+ - QREVO_MASTER (`roborock.vacuum.a117`)
58
+ - QREVO_CURV (`roborock.vacuum.a135`)
59
+ - QREVO_S (`roborock.vacuum.a104`)
60
+ - QREVO_PRO (`roborock.vacuum.a101`)
61
+ - QREVO_MAXV (`roborock.vacuum.a87`)
62
+ - QREVO_EDGE_5AE (`roborock.vacuum.xxxx`)
63
+
64
+ ---
65
+
66
+ > **Note:**
67
+ > If you have a device not listed above, feel free to try it and report your experience!
@@ -0,0 +1,26 @@
1
+ import { BehaviorDeviceGeneric } from './behaviors/BehaviorDeviceGeneric.js';
2
+ import { setDefaultCommandHandler } from './behaviors/roborock.vacuum/default/default.js';
3
+ import { DeviceModel } from './roborockCommunication/Zmodel/deviceModel.js';
4
+ import { setCommandHandlerSmart } from './behaviors/roborock.vacuum/smart/smart.js';
5
+ export function configurateBehavior(model, duid, roborockService, cleanModeSettings, forceRunAtDefault, logger) {
6
+ if (forceRunAtDefault) {
7
+ const deviceHandler = new BehaviorDeviceGeneric(logger);
8
+ setDefaultCommandHandler(duid, deviceHandler, logger, roborockService, cleanModeSettings);
9
+ return deviceHandler;
10
+ }
11
+ switch (model) {
12
+ case DeviceModel.QREVO_EDGE_5V1: {
13
+ const deviceHandler = new BehaviorDeviceGeneric(logger);
14
+ setCommandHandlerSmart(duid, deviceHandler, logger, roborockService, cleanModeSettings);
15
+ return deviceHandler;
16
+ }
17
+ case DeviceModel.S7_MAXV:
18
+ case DeviceModel.S8_PRO_ULTRA:
19
+ case DeviceModel.S6_PURE:
20
+ default: {
21
+ const deviceHandler = new BehaviorDeviceGeneric(logger);
22
+ setDefaultCommandHandler(duid, deviceHandler, logger, roborockService, cleanModeSettings);
23
+ return deviceHandler;
24
+ }
25
+ }
26
+ }
@@ -0,0 +1,22 @@
1
+ import { Behavior } from 'matterbridge/matter';
2
+ export class BehaviorDeviceGeneric {
3
+ log;
4
+ commands = {};
5
+ constructor(log) {
6
+ this.log = log;
7
+ }
8
+ setCommandHandler(command, handler) {
9
+ if (this.commands[command])
10
+ throw new Error(`Handler already registered for command ${String(command)}`);
11
+ this.commands[command] = handler;
12
+ }
13
+ async executeCommand(command, ...args) {
14
+ const handler = this.commands[command];
15
+ if (!handler)
16
+ throw new Error(`${String(command)} not implemented`);
17
+ await handler(...args);
18
+ }
19
+ }
20
+ export class BehaviorRoborock extends Behavior {
21
+ static id = 'roborock.vacuum.axx';
22
+ }
@@ -0,0 +1,183 @@
1
+ import { debugStringify } from 'matterbridge/logger';
2
+ import { BehaviorRoborock } from '../../BehaviorDeviceGeneric.js';
3
+ export class DefaultBehavior extends BehaviorRoborock {
4
+ }
5
+ export var VacuumSuctionPower;
6
+ (function (VacuumSuctionPower) {
7
+ VacuumSuctionPower[VacuumSuctionPower["Quiet"] = 101] = "Quiet";
8
+ VacuumSuctionPower[VacuumSuctionPower["Balanced"] = 102] = "Balanced";
9
+ VacuumSuctionPower[VacuumSuctionPower["Turbo"] = 103] = "Turbo";
10
+ VacuumSuctionPower[VacuumSuctionPower["Max"] = 104] = "Max";
11
+ VacuumSuctionPower[VacuumSuctionPower["Off"] = 105] = "Off";
12
+ VacuumSuctionPower[VacuumSuctionPower["Custom"] = 106] = "Custom";
13
+ VacuumSuctionPower[VacuumSuctionPower["MaxPlus"] = 108] = "MaxPlus";
14
+ })(VacuumSuctionPower || (VacuumSuctionPower = {}));
15
+ export var MopWaterFlow;
16
+ (function (MopWaterFlow) {
17
+ MopWaterFlow[MopWaterFlow["Off"] = 200] = "Off";
18
+ MopWaterFlow[MopWaterFlow["Low"] = 201] = "Low";
19
+ MopWaterFlow[MopWaterFlow["Medium"] = 202] = "Medium";
20
+ MopWaterFlow[MopWaterFlow["High"] = 203] = "High";
21
+ MopWaterFlow[MopWaterFlow["Custom"] = 204] = "Custom";
22
+ MopWaterFlow[MopWaterFlow["CustomizeWithDistanceOff"] = 207] = "CustomizeWithDistanceOff";
23
+ })(MopWaterFlow || (MopWaterFlow = {}));
24
+ export var MopRoute;
25
+ (function (MopRoute) {
26
+ MopRoute[MopRoute["Standard"] = 300] = "Standard";
27
+ MopRoute[MopRoute["Deep"] = 301] = "Deep";
28
+ MopRoute[MopRoute["Custom"] = 302] = "Custom";
29
+ MopRoute[MopRoute["DeepPlus"] = 303] = "DeepPlus";
30
+ MopRoute[MopRoute["Fast"] = 304] = "Fast";
31
+ })(MopRoute || (MopRoute = {}));
32
+ export const RvcRunMode = {
33
+ [1]: 'Idle',
34
+ [2]: 'Cleaning',
35
+ [3]: 'Mapping',
36
+ };
37
+ export const RvcCleanMode = {
38
+ [5]: 'Mop & Vacuum: Default',
39
+ [6]: 'Mop & Vacuum: Quick',
40
+ [7]: 'Mop & Vacuum: Max',
41
+ [8]: 'Mop & Vacuum: Min',
42
+ [9]: 'Mop & Vacuum: Quiet',
43
+ [10]: 'Mop & Vacuum: Custom',
44
+ [31]: 'Mop: Default',
45
+ [32]: 'Mop: Max',
46
+ [33]: 'Mop: Min',
47
+ [34]: 'Mop: Quick',
48
+ [35]: 'Mop: DeepClean',
49
+ [66]: 'Vacuum: Default',
50
+ [67]: 'Vacuum: Max',
51
+ [68]: 'Vacuum: Quiet',
52
+ [69]: 'Vacuum: Quick',
53
+ [99]: 'Go Vacation',
54
+ };
55
+ export const CleanSetting = {
56
+ [5]: { suctionPower: VacuumSuctionPower.Balanced, waterFlow: MopWaterFlow.Medium, distance_off: 0, mopRoute: MopRoute.Standard },
57
+ [6]: { suctionPower: VacuumSuctionPower.Balanced, waterFlow: MopWaterFlow.Medium, distance_off: 0, mopRoute: MopRoute.Fast },
58
+ [7]: { suctionPower: VacuumSuctionPower.Max, waterFlow: MopWaterFlow.Medium, distance_off: 0, mopRoute: MopRoute.Standard },
59
+ [8]: { suctionPower: VacuumSuctionPower.Balanced, waterFlow: MopWaterFlow.Low, distance_off: 0, mopRoute: MopRoute.Standard },
60
+ [9]: { suctionPower: VacuumSuctionPower.Quiet, waterFlow: MopWaterFlow.Medium, distance_off: 0, mopRoute: MopRoute.Standard },
61
+ [10]: { suctionPower: VacuumSuctionPower.Custom, waterFlow: MopWaterFlow.Custom, distance_off: 0, mopRoute: MopRoute.Custom },
62
+ [31]: { suctionPower: VacuumSuctionPower.Off, waterFlow: MopWaterFlow.Medium, distance_off: 0, mopRoute: MopRoute.Standard },
63
+ [32]: { suctionPower: VacuumSuctionPower.Off, waterFlow: MopWaterFlow.High, distance_off: 0, mopRoute: MopRoute.Standard },
64
+ [33]: { suctionPower: VacuumSuctionPower.Off, waterFlow: MopWaterFlow.Low, distance_off: 0, mopRoute: MopRoute.Standard },
65
+ [34]: { suctionPower: VacuumSuctionPower.Off, waterFlow: MopWaterFlow.Medium, distance_off: 0, mopRoute: MopRoute.Fast },
66
+ [35]: { suctionPower: VacuumSuctionPower.Off, waterFlow: MopWaterFlow.Medium, distance_off: 0, mopRoute: MopRoute.Deep },
67
+ [66]: { suctionPower: VacuumSuctionPower.Balanced, waterFlow: MopWaterFlow.Off, distance_off: 0, mopRoute: MopRoute.Standard },
68
+ [67]: { suctionPower: VacuumSuctionPower.Max, waterFlow: MopWaterFlow.Off, distance_off: 0, mopRoute: MopRoute.Standard },
69
+ [68]: { suctionPower: VacuumSuctionPower.Quiet, waterFlow: MopWaterFlow.Off, distance_off: 0, mopRoute: MopRoute.Standard },
70
+ [69]: { suctionPower: VacuumSuctionPower.Balanced, waterFlow: MopWaterFlow.Off, distance_off: 0, mopRoute: MopRoute.Fast },
71
+ };
72
+ export function setDefaultCommandHandler(duid, handler, logger, roborockService, cleanModeSettings) {
73
+ handler.setCommandHandler('changeToMode', async (newMode) => {
74
+ const activity = RvcRunMode[newMode] || RvcCleanMode[newMode];
75
+ switch (activity) {
76
+ case 'Cleaning': {
77
+ logger.notice('DefaultBehavior-ChangeRunMode to: ', activity);
78
+ await roborockService.startClean(duid);
79
+ break;
80
+ }
81
+ case 'Go Vacation': {
82
+ logger.notice('DefaultBehavior-GoHome');
83
+ await roborockService.stopAndGoHome(duid);
84
+ break;
85
+ }
86
+ case 'Mop & Vacuum: Custom': {
87
+ const setting = CleanSetting[newMode];
88
+ logger.notice(`DefaultBehavior-ChangeCleanMode to: ${activity}, setting: ${debugStringify(setting)}`);
89
+ await roborockService.changeCleanMode(duid, setting);
90
+ break;
91
+ }
92
+ case 'Mop & Vacuum: Default':
93
+ case 'Mop: Default':
94
+ case 'Vacuum: Default': {
95
+ const setting = cleanModeSettings ? (getSettingFromCleanMode(activity, cleanModeSettings) ?? CleanSetting[newMode]) : CleanSetting[newMode];
96
+ logger.notice(`DefaultBehavior-ChangeCleanMode to: ${activity}, setting: ${debugStringify(setting ?? {})}`);
97
+ if (setting) {
98
+ await roborockService.changeCleanMode(duid, setting);
99
+ }
100
+ break;
101
+ }
102
+ case 'Mop & Vacuum: Quick':
103
+ case 'Mop & Vacuum: Max':
104
+ case 'Mop & Vacuum: Min':
105
+ case 'Mop & Vacuum: Quiet':
106
+ case 'Mop: Max':
107
+ case 'Mop: Min':
108
+ case 'Mop: Quick':
109
+ case 'Mop: DeepClean':
110
+ case 'Vacuum: Max':
111
+ case 'Vacuum: Min':
112
+ case 'Vacuum: Quiet':
113
+ case 'Vacuum: Quick': {
114
+ const setting = CleanSetting[newMode];
115
+ logger.notice(`DefaultBehavior-ChangeCleanMode to: ${activity}, setting: ${debugStringify(setting ?? {})}`);
116
+ if (setting) {
117
+ await roborockService.changeCleanMode(duid, setting);
118
+ }
119
+ break;
120
+ }
121
+ default:
122
+ logger.notice('DefaultBehavior-changeToMode-Unknown: ', newMode);
123
+ break;
124
+ }
125
+ });
126
+ handler.setCommandHandler('selectAreas', async (newAreas) => {
127
+ logger.notice(`DefaultBehavior-selectAreas: ${newAreas}`);
128
+ roborockService.setSelectedAreas(duid, newAreas ?? []);
129
+ });
130
+ handler.setCommandHandler('pause', async () => {
131
+ logger.notice('DefaultBehavior-Pause');
132
+ await roborockService.pauseClean(duid);
133
+ });
134
+ handler.setCommandHandler('resume', async () => {
135
+ logger.notice('DefaultBehavior-Resume');
136
+ await roborockService.resumeClean(duid);
137
+ });
138
+ handler.setCommandHandler('goHome', async () => {
139
+ logger.notice('DefaultBehavior-GoHome');
140
+ await roborockService.stopAndGoHome(duid);
141
+ });
142
+ handler.setCommandHandler('playSoundToLocate', async () => {
143
+ logger.notice('DefaultBehavior-playSoundToLocate');
144
+ await roborockService.playSoundToLocate(duid);
145
+ });
146
+ }
147
+ export const getSettingFromCleanMode = (activity, cleanModeSettings) => {
148
+ switch (activity) {
149
+ case 'Mop: Default': {
150
+ const mopSetting = cleanModeSettings?.mopping;
151
+ const waterFlow = MopWaterFlow[mopSetting?.waterFlowMode] ?? MopWaterFlow.Medium;
152
+ const distance_off = waterFlow == MopWaterFlow.CustomizeWithDistanceOff ? 210 - 5 * (mopSetting?.distanceOff ?? 25) : 0;
153
+ return {
154
+ suctionPower: VacuumSuctionPower.Off,
155
+ waterFlow,
156
+ distance_off,
157
+ mopRoute: MopRoute[mopSetting?.mopRouteMode] ?? MopRoute.Standard,
158
+ };
159
+ }
160
+ case 'Vacuum: Default': {
161
+ const vacuumSetting = cleanModeSettings?.vacuuming;
162
+ return {
163
+ suctionPower: VacuumSuctionPower[vacuumSetting?.fanMode] ?? VacuumSuctionPower.Balanced,
164
+ waterFlow: MopWaterFlow.Off,
165
+ distance_off: 0,
166
+ mopRoute: MopRoute[vacuumSetting?.mopRouteMode] ?? MopRoute.Standard,
167
+ };
168
+ }
169
+ case 'Mop & Vacuum: Default': {
170
+ const vacmopSetting = cleanModeSettings?.vacmop;
171
+ const waterFlow = MopWaterFlow[vacmopSetting?.waterFlowMode] ?? MopWaterFlow.Medium;
172
+ const distance_off = waterFlow == MopWaterFlow.CustomizeWithDistanceOff ? 210 - 5 * (vacmopSetting?.distanceOff ?? 25) : 0;
173
+ return {
174
+ suctionPower: VacuumSuctionPower[vacmopSetting?.fanMode] ?? VacuumSuctionPower.Balanced,
175
+ waterFlow,
176
+ distance_off,
177
+ mopRoute: MopRoute[vacmopSetting?.mopRouteMode] ?? MopRoute.Standard,
178
+ };
179
+ }
180
+ default:
181
+ return undefined;
182
+ }
183
+ };
@@ -0,0 +1,143 @@
1
+ import { RvcCleanMode, RvcOperationalState, RvcRunMode } from 'matterbridge/matter/clusters';
2
+ import { RvcCleanMode as RvcCleanModeDisplayMap } from './default.js';
3
+ export function getDefaultSupportedRunModes() {
4
+ return [
5
+ {
6
+ label: 'Idle',
7
+ mode: 1,
8
+ modeTags: [{ value: RvcRunMode.ModeTag.Idle }],
9
+ },
10
+ {
11
+ label: 'Cleaning',
12
+ mode: 2,
13
+ modeTags: [{ value: RvcRunMode.ModeTag.Cleaning }],
14
+ },
15
+ {
16
+ label: 'Mapping',
17
+ mode: 3,
18
+ modeTags: [{ value: RvcRunMode.ModeTag.Mapping }],
19
+ },
20
+ ];
21
+ }
22
+ export function getDefaultSupportedCleanModes(enableExperimentalFeature) {
23
+ const result = [
24
+ {
25
+ label: RvcCleanModeDisplayMap[5],
26
+ mode: 5,
27
+ modeTags: [{ value: RvcCleanMode.ModeTag.Mop }, { value: RvcCleanMode.ModeTag.Vacuum }, { value: RvcCleanMode.ModeTag.Auto }],
28
+ },
29
+ {
30
+ label: RvcCleanModeDisplayMap[6],
31
+ mode: 6,
32
+ modeTags: [{ value: RvcCleanMode.ModeTag.Mop }, { value: RvcCleanMode.ModeTag.Vacuum }, { value: RvcCleanMode.ModeTag.Quick }],
33
+ },
34
+ {
35
+ label: RvcCleanModeDisplayMap[7],
36
+ mode: 7,
37
+ modeTags: [{ value: RvcCleanMode.ModeTag.Mop }, { value: RvcCleanMode.ModeTag.Vacuum }, { value: RvcCleanMode.ModeTag.Max }],
38
+ },
39
+ {
40
+ label: RvcCleanModeDisplayMap[8],
41
+ mode: 8,
42
+ modeTags: [{ value: RvcCleanMode.ModeTag.Mop }, { value: RvcCleanMode.ModeTag.Vacuum }, { value: RvcCleanMode.ModeTag.Min }],
43
+ },
44
+ {
45
+ label: RvcCleanModeDisplayMap[9],
46
+ mode: 9,
47
+ modeTags: [{ value: RvcCleanMode.ModeTag.Mop }, { value: RvcCleanMode.ModeTag.Vacuum }, { value: RvcCleanMode.ModeTag.Quiet }],
48
+ },
49
+ {
50
+ label: RvcCleanModeDisplayMap[10],
51
+ mode: 10,
52
+ modeTags: [{ value: RvcCleanMode.ModeTag.Mop }, { value: RvcCleanMode.ModeTag.Vacuum }, { value: RvcCleanMode.ModeTag.LowEnergy }],
53
+ },
54
+ {
55
+ label: RvcCleanModeDisplayMap[31],
56
+ mode: 31,
57
+ modeTags: [{ value: RvcCleanMode.ModeTag.Mop }, { value: RvcCleanMode.ModeTag.Auto }],
58
+ },
59
+ {
60
+ label: RvcCleanModeDisplayMap[32],
61
+ mode: 32,
62
+ modeTags: [{ value: RvcCleanMode.ModeTag.Mop }, { value: RvcCleanMode.ModeTag.Max }],
63
+ },
64
+ {
65
+ label: RvcCleanModeDisplayMap[33],
66
+ mode: 33,
67
+ modeTags: [{ value: RvcCleanMode.ModeTag.Mop }, { value: RvcCleanMode.ModeTag.Min }],
68
+ },
69
+ {
70
+ label: RvcCleanModeDisplayMap[34],
71
+ mode: 34,
72
+ modeTags: [{ value: RvcCleanMode.ModeTag.Mop }, { value: RvcCleanMode.ModeTag.Quick }],
73
+ },
74
+ {
75
+ label: RvcCleanModeDisplayMap[35],
76
+ mode: 35,
77
+ modeTags: [{ value: RvcCleanMode.ModeTag.Mop }, { value: RvcCleanMode.ModeTag.DeepClean }],
78
+ },
79
+ {
80
+ label: RvcCleanModeDisplayMap[66],
81
+ mode: 66,
82
+ modeTags: [{ value: RvcCleanMode.ModeTag.Vacuum }, { value: RvcCleanMode.ModeTag.Auto }],
83
+ },
84
+ {
85
+ label: RvcCleanModeDisplayMap[67],
86
+ mode: 67,
87
+ modeTags: [{ value: RvcCleanMode.ModeTag.Vacuum }, { value: RvcCleanMode.ModeTag.Max }],
88
+ },
89
+ {
90
+ label: RvcCleanModeDisplayMap[68],
91
+ mode: 68,
92
+ modeTags: [{ value: RvcCleanMode.ModeTag.Vacuum }, { value: RvcCleanMode.ModeTag.Quiet }],
93
+ },
94
+ {
95
+ label: RvcCleanModeDisplayMap[69],
96
+ mode: 69,
97
+ modeTags: [{ value: RvcCleanMode.ModeTag.Vacuum }, { value: RvcCleanMode.ModeTag.Quick }],
98
+ },
99
+ ];
100
+ if (enableExperimentalFeature?.advancedFeature?.useVacationModeToSendVacuumToDock ?? false) {
101
+ return [
102
+ ...result,
103
+ {
104
+ label: RvcCleanModeDisplayMap[99],
105
+ mode: 99,
106
+ modeTags: [{ value: RvcCleanMode.ModeTag.Mop }, { value: RvcCleanMode.ModeTag.Vacuum }, { value: RvcCleanMode.ModeTag.Vacation }],
107
+ },
108
+ ];
109
+ }
110
+ return result;
111
+ }
112
+ export function getDefaultOperationalStates() {
113
+ return [
114
+ {
115
+ operationalStateId: RvcOperationalState.OperationalState.Stopped,
116
+ operationalStateLabel: 'Stopped',
117
+ },
118
+ {
119
+ operationalStateId: RvcOperationalState.OperationalState.Running,
120
+ operationalStateLabel: 'Running',
121
+ },
122
+ {
123
+ operationalStateId: RvcOperationalState.OperationalState.Paused,
124
+ operationalStateLabel: 'Paused',
125
+ },
126
+ {
127
+ operationalStateId: RvcOperationalState.OperationalState.Error,
128
+ operationalStateLabel: 'Error',
129
+ },
130
+ {
131
+ operationalStateId: RvcOperationalState.OperationalState.SeekingCharger,
132
+ operationalStateLabel: 'SeekingCharger',
133
+ },
134
+ {
135
+ operationalStateId: RvcOperationalState.OperationalState.Charging,
136
+ operationalStateLabel: 'Charging',
137
+ },
138
+ {
139
+ operationalStateId: RvcOperationalState.OperationalState.Docked,
140
+ operationalStateLabel: 'Docked',
141
+ },
142
+ ];
143
+ }
@@ -0,0 +1,21 @@
1
+ import { CleanSetting, MopRoute, MopWaterFlow, VacuumSuctionPower } from './default.js';
2
+ export function getCurrentCleanModeDefault(setting) {
3
+ if (!setting || typeof setting !== 'object') {
4
+ return undefined;
5
+ }
6
+ if (setting.suctionPower === VacuumSuctionPower.Custom || setting.waterFlow === MopWaterFlow.Custom || setting.mopRoute === MopRoute.Custom) {
7
+ return 10;
8
+ }
9
+ for (const [key, value] of Object.entries(CleanSetting)) {
10
+ if (value.suctionPower === setting.suctionPower && value.waterFlow === setting.waterFlow && value.mopRoute === setting.mopRoute) {
11
+ return Number(key);
12
+ }
13
+ }
14
+ if (setting.suctionPower == VacuumSuctionPower.Off)
15
+ return 31;
16
+ if (setting.waterFlow == MopWaterFlow.Off)
17
+ return 66;
18
+ if ((setting.suctionPower !== VacuumSuctionPower.Off && setting.waterFlow) !== MopWaterFlow.Off)
19
+ return 5;
20
+ return undefined;
21
+ }
@@ -0,0 +1,18 @@
1
+ import { RvcCleanMode } from 'matterbridge/matter/clusters';
2
+ import { RvcCleanMode as RvcCleanModeDisplayMap } from './smart.js';
3
+ import { getDefaultSupportedCleanModes } from '../default/initalData.js';
4
+ export function getSupportedCleanModesSmart(enableExperimentalFeature) {
5
+ return [
6
+ {
7
+ label: RvcCleanModeDisplayMap[4],
8
+ mode: 4,
9
+ modeTags: [{ value: RvcCleanMode.ModeTag.Mop }, { value: RvcCleanMode.ModeTag.Vacuum }, { value: RvcCleanMode.ModeTag.Auto }],
10
+ },
11
+ {
12
+ label: RvcCleanModeDisplayMap[5],
13
+ mode: 5,
14
+ modeTags: [{ value: RvcCleanMode.ModeTag.Mop }, { value: RvcCleanMode.ModeTag.Vacuum }, { value: RvcCleanMode.ModeTag.Day }],
15
+ },
16
+ ...getDefaultSupportedCleanModes(enableExperimentalFeature).filter((x) => x.mode !== 4 && x.mode !== 5),
17
+ ];
18
+ }
@@ -0,0 +1,11 @@
1
+ import { getCurrentCleanModeDefault } from '../default/runtimes.js';
2
+ import { MopRouteSmart, MopWaterFlowSmart, VacuumSuctionPowerSmart } from './smart.js';
3
+ export function getCurrentCleanModeSmart(setting) {
4
+ if (!setting || typeof setting !== 'object') {
5
+ return undefined;
6
+ }
7
+ if (setting.suctionPower === VacuumSuctionPowerSmart.Smart || setting.waterFlow === MopWaterFlowSmart.Smart || setting.mopRoute === MopRouteSmart.Smart) {
8
+ return 4;
9
+ }
10
+ return getCurrentCleanModeDefault(setting);
11
+ }
@@ -0,0 +1,119 @@
1
+ import { debugStringify } from 'matterbridge/logger';
2
+ import { BehaviorRoborock } from '../../BehaviorDeviceGeneric.js';
3
+ import { RvcCleanMode as DefaultRvcCleanMode, CleanSetting as DefaultCleanSetting, getSettingFromCleanMode, RvcRunMode } from '../default/default.js';
4
+ export class BehaviorSmart extends BehaviorRoborock {
5
+ }
6
+ export var VacuumSuctionPowerSmart;
7
+ (function (VacuumSuctionPowerSmart) {
8
+ VacuumSuctionPowerSmart[VacuumSuctionPowerSmart["Quiet"] = 101] = "Quiet";
9
+ VacuumSuctionPowerSmart[VacuumSuctionPowerSmart["Balanced"] = 102] = "Balanced";
10
+ VacuumSuctionPowerSmart[VacuumSuctionPowerSmart["Turbo"] = 103] = "Turbo";
11
+ VacuumSuctionPowerSmart[VacuumSuctionPowerSmart["Max"] = 104] = "Max";
12
+ VacuumSuctionPowerSmart[VacuumSuctionPowerSmart["Off"] = 105] = "Off";
13
+ VacuumSuctionPowerSmart[VacuumSuctionPowerSmart["Custom"] = 106] = "Custom";
14
+ VacuumSuctionPowerSmart[VacuumSuctionPowerSmart["MaxPlus"] = 108] = "MaxPlus";
15
+ VacuumSuctionPowerSmart[VacuumSuctionPowerSmart["Smart"] = 110] = "Smart";
16
+ })(VacuumSuctionPowerSmart || (VacuumSuctionPowerSmart = {}));
17
+ export var MopWaterFlowSmart;
18
+ (function (MopWaterFlowSmart) {
19
+ MopWaterFlowSmart[MopWaterFlowSmart["Off"] = 200] = "Off";
20
+ MopWaterFlowSmart[MopWaterFlowSmart["Low"] = 201] = "Low";
21
+ MopWaterFlowSmart[MopWaterFlowSmart["Medium"] = 202] = "Medium";
22
+ MopWaterFlowSmart[MopWaterFlowSmart["High"] = 203] = "High";
23
+ MopWaterFlowSmart[MopWaterFlowSmart["Custom"] = 204] = "Custom";
24
+ MopWaterFlowSmart[MopWaterFlowSmart["CustomizeWithDistanceOff"] = 207] = "CustomizeWithDistanceOff";
25
+ MopWaterFlowSmart[MopWaterFlowSmart["Smart"] = 209] = "Smart";
26
+ })(MopWaterFlowSmart || (MopWaterFlowSmart = {}));
27
+ export var MopRouteSmart;
28
+ (function (MopRouteSmart) {
29
+ MopRouteSmart[MopRouteSmart["Standard"] = 300] = "Standard";
30
+ MopRouteSmart[MopRouteSmart["Deep"] = 301] = "Deep";
31
+ MopRouteSmart[MopRouteSmart["Custom"] = 302] = "Custom";
32
+ MopRouteSmart[MopRouteSmart["DeepPlus"] = 303] = "DeepPlus";
33
+ MopRouteSmart[MopRouteSmart["Fast"] = 304] = "Fast";
34
+ MopRouteSmart[MopRouteSmart["Smart"] = 306] = "Smart";
35
+ })(MopRouteSmart || (MopRouteSmart = {}));
36
+ export const RvcCleanMode = {
37
+ [4]: 'Smart Plan',
38
+ ...DefaultRvcCleanMode,
39
+ };
40
+ export const CleanSetting = {
41
+ [4]: { suctionPower: 0, waterFlow: 0, distance_off: 0, mopRoute: MopRouteSmart.Smart },
42
+ ...DefaultCleanSetting,
43
+ };
44
+ export function setCommandHandlerSmart(duid, handler, logger, roborockService, cleanModeSettings) {
45
+ handler.setCommandHandler('changeToMode', async (newMode) => {
46
+ const activity = RvcRunMode[newMode] || RvcCleanMode[newMode];
47
+ switch (activity) {
48
+ case 'Cleaning': {
49
+ logger.notice('BehaviorSmart-ChangeRunMode to: ', activity);
50
+ await roborockService.startClean(duid);
51
+ break;
52
+ }
53
+ case 'Go Vacation': {
54
+ logger.notice('BehaviorSmart-GoHome');
55
+ await roborockService.stopAndGoHome(duid);
56
+ break;
57
+ }
58
+ case 'Smart Plan':
59
+ case 'Mop & Vacuum: Custom': {
60
+ const setting = CleanSetting[newMode];
61
+ logger.notice(`BehaviorSmart-ChangeCleanMode to: ${activity}, setting: ${debugStringify(setting)}`);
62
+ await roborockService.changeCleanMode(duid, setting);
63
+ break;
64
+ }
65
+ case 'Mop & Vacuum: Default':
66
+ case 'Mop: Default':
67
+ case 'Vacuum: Default': {
68
+ const setting = cleanModeSettings ? (getSettingFromCleanMode(activity, cleanModeSettings) ?? CleanSetting[newMode]) : CleanSetting[newMode];
69
+ logger.notice(`BehaviorSmart-ChangeCleanMode to: ${activity}, setting: ${debugStringify(setting ?? {})}`);
70
+ if (setting) {
71
+ await roborockService.changeCleanMode(duid, setting);
72
+ }
73
+ break;
74
+ }
75
+ case 'Mop & Vacuum: Quick':
76
+ case 'Mop & Vacuum: Max':
77
+ case 'Mop & Vacuum: Min':
78
+ case 'Mop & Vacuum: Quiet':
79
+ case 'Mop: Max':
80
+ case 'Mop: Min':
81
+ case 'Mop: Quick':
82
+ case 'Mop: DeepClean':
83
+ case 'Vacuum: Max':
84
+ case 'Vacuum: Min':
85
+ case 'Vacuum: Quiet':
86
+ case 'Vacuum: Quick': {
87
+ const setting = CleanSetting[newMode];
88
+ logger.notice(`BehaviorSmart-ChangeCleanMode to: ${activity}, setting: ${debugStringify(setting ?? {})}`);
89
+ if (setting) {
90
+ await roborockService.changeCleanMode(duid, setting);
91
+ }
92
+ break;
93
+ }
94
+ default:
95
+ logger.notice('BehaviorSmart-changeToMode-Unknown: ', newMode);
96
+ break;
97
+ }
98
+ });
99
+ handler.setCommandHandler('selectAreas', async (newAreas) => {
100
+ logger.notice(`BehaviorSmart-selectAreas: ${newAreas}`);
101
+ roborockService.setSelectedAreas(duid, newAreas ?? []);
102
+ });
103
+ handler.setCommandHandler('pause', async () => {
104
+ logger.notice('BehaviorSmart-Pause');
105
+ await roborockService.pauseClean(duid);
106
+ });
107
+ handler.setCommandHandler('resume', async () => {
108
+ logger.notice('BehaviorSmart-Resume');
109
+ await roborockService.resumeClean(duid);
110
+ });
111
+ handler.setCommandHandler('goHome', async () => {
112
+ logger.notice('BehaviorSmart-GoHome');
113
+ await roborockService.stopAndGoHome(duid);
114
+ });
115
+ handler.setCommandHandler('playSoundToLocate', async () => {
116
+ logger.notice('BehaviorSmart-playSoundToLocate');
117
+ await roborockService.playSoundToLocate(duid);
118
+ });
119
+ }
@@ -0,0 +1,17 @@
1
+ import { ClientRouter } from './roborockCommunication/broadcast/clientRouter.js';
2
+ export default class ClientManager {
3
+ clients = new Map();
4
+ logger;
5
+ constructor(logger) {
6
+ this.logger = logger;
7
+ }
8
+ get(username, userdata) {
9
+ if (!this.clients.has(username)) {
10
+ this.clients.set(username, new ClientRouter(this.logger, userdata));
11
+ }
12
+ return this.clients.get(username);
13
+ }
14
+ destroy(username) {
15
+ this.clients.delete(username);
16
+ }
17
+ }