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,169 @@
1
+ import { PowerSource, RvcCleanMode, RvcOperationalState, RvcRunMode, ServiceArea } from 'matterbridge/matter/clusters';
2
+ import { getRunningMode } from '../initialData/getSupportedRunModes.js';
3
+ import { state_to_matter_state } from '../share/function.js';
4
+ import { OperationStatusCode } from '../roborockCommunication/Zenum/operationStatusCode.js';
5
+ import { getRoomMap } from '../helper.js';
6
+ import { debugStringify } from 'matterbridge/logger';
7
+ import { getBatteryState, getBatteryStatus } from '../initialData/index.js';
8
+ import { getCurrentCleanModeFunc } from '../share/runtimeHelper.js';
9
+ import { hasDockingStationError, parseDockingStationStatus } from '../model/DockingStationStatus.js';
10
+ export async function handleLocalMessage(data, platform, duid = '') {
11
+ const robot = platform.robots.get(duid);
12
+ if (!robot) {
13
+ platform.log.error(`Robot with DUID ${duid} not found.`);
14
+ return;
15
+ }
16
+ const currentMappedAreas = platform.roborockService?.getSupportedAreas(duid);
17
+ const roomIndexMap = platform.roborockService?.getSupportedAreasIndexMap(duid);
18
+ const roomMap = await getRoomMap(duid, platform);
19
+ platform.log.debug(`RoomMap: ${roomMap ? debugStringify(roomMap) : 'undefined'}`);
20
+ platform.log.debug(`Current mapped areas: ${currentMappedAreas ? debugStringify(currentMappedAreas) : 'undefined'}`);
21
+ platform.log.debug(`RoomIndexMap:
22
+ `, roomIndexMap);
23
+ const deviceData = robot.device.data;
24
+ const state = state_to_matter_state(data.state);
25
+ if (state) {
26
+ robot.updateAttribute(RvcRunMode.Cluster.id, 'currentMode', getRunningMode(state), platform.log);
27
+ }
28
+ if (data.state === OperationStatusCode.Idle) {
29
+ const selectedAreas = platform.roborockService?.getSelectedAreas(duid) ?? [];
30
+ robot.updateAttribute(ServiceArea.Cluster.id, 'selectedAreas', selectedAreas, platform.log);
31
+ }
32
+ if (state === RvcRunMode.ModeTag.Cleaning && !data.cleaning_info) {
33
+ platform.log.debug('No cleaning_info, setting currentArea to null');
34
+ robot.updateAttribute(ServiceArea.Cluster.id, 'currentArea', null, platform.log);
35
+ robot.updateAttribute(ServiceArea.Cluster.id, 'selectedAreas', [], platform.log);
36
+ }
37
+ else {
38
+ const isMultipleMapEnable = platform.enableExperimentalFeature?.enableExperimentalFeature && platform.enableExperimentalFeature?.advancedFeature?.enableMultipleMap;
39
+ if (isMultipleMapEnable) {
40
+ await mapRoomsToAreasFeatureOn(platform, duid, data);
41
+ }
42
+ else {
43
+ await mapRoomsToAreasFeatureOff(platform, duid, data);
44
+ }
45
+ }
46
+ if (data.battery) {
47
+ const batteryLevel = data.battery;
48
+ robot.updateAttribute(PowerSource.Cluster.id, 'batPercentRemaining', batteryLevel * 2, platform.log);
49
+ robot.updateAttribute(PowerSource.Cluster.id, 'batChargeState', getBatteryState(data.state, data.battery), platform.log);
50
+ robot.updateAttribute(PowerSource.Cluster.id, 'batChargeLevel', getBatteryStatus(batteryLevel), platform.log);
51
+ }
52
+ const currentCleanModeSetting = {
53
+ suctionPower: data.cleaning_info?.fan_power ?? data.fan_power,
54
+ waterFlow: data.cleaning_info?.water_box_status ?? data.water_box_mode,
55
+ distance_off: data.distance_off,
56
+ mopRoute: data.cleaning_info?.mop_mode ?? data.mop_mode,
57
+ segment_id: data.cleaning_info?.segment_id,
58
+ target_segment_id: data.cleaning_info?.target_segment_id,
59
+ };
60
+ platform.log.debug(`data: ${debugStringify(data)}`);
61
+ platform.log.notice(`currentCleanModeSetting: ${debugStringify(currentCleanModeSetting)}`);
62
+ if (currentCleanModeSetting.mopRoute && currentCleanModeSetting.suctionPower && currentCleanModeSetting.waterFlow) {
63
+ const currentCleanMode = getCurrentCleanModeFunc(deviceData.model, platform.enableExperimentalFeature?.advancedFeature?.forceRunAtDefault ?? false)(currentCleanModeSetting);
64
+ platform.log.debug(`Current clean mode: ${currentCleanMode}`);
65
+ if (currentCleanMode) {
66
+ robot.updateAttribute(RvcCleanMode.Cluster.id, 'currentMode', currentCleanMode, platform.log);
67
+ }
68
+ }
69
+ processAdditionalProps(robot, data, duid, platform);
70
+ }
71
+ export function triggerDssError(robot, platform) {
72
+ const currentOperationState = robot.getAttribute(RvcOperationalState.Cluster.id, 'operationalState');
73
+ if (currentOperationState === RvcOperationalState.OperationalState.Error) {
74
+ return true;
75
+ }
76
+ if (currentOperationState === RvcOperationalState.OperationalState.Docked) {
77
+ robot.updateAttribute(RvcOperationalState.Cluster.id, 'operationalState', RvcOperationalState.OperationalState.Error, platform.log);
78
+ return true;
79
+ }
80
+ return false;
81
+ }
82
+ async function processAdditionalProps(robot, message, duid, platform) {
83
+ const dssStatus = getDssStatus(message, duid, platform);
84
+ if (dssStatus) {
85
+ triggerDssError(robot, platform);
86
+ }
87
+ }
88
+ function getDssStatus(message, duid, platform) {
89
+ const robot = platform.robots.get(duid);
90
+ if (robot === undefined) {
91
+ platform.log.error(`Error4: Robot with DUID ${duid} not found`);
92
+ return undefined;
93
+ }
94
+ if (platform.enableExperimentalFeature &&
95
+ platform.enableExperimentalFeature.enableExperimentalFeature &&
96
+ platform.enableExperimentalFeature.advancedFeature.includeDockStationStatus &&
97
+ message.dss !== undefined) {
98
+ const dss = parseDockingStationStatus(message.dss);
99
+ if (dss && robot) {
100
+ robot.dockStationStatus = dss;
101
+ }
102
+ if (dss && hasDockingStationError(dss)) {
103
+ return RvcOperationalState.OperationalState.Error;
104
+ }
105
+ }
106
+ return undefined;
107
+ }
108
+ async function mapRoomsToAreasFeatureOff(platform, duid, data) {
109
+ const currentMappedAreas = platform.roborockService?.getSupportedAreas(duid);
110
+ const robot = platform.robots.get(duid);
111
+ if (!robot) {
112
+ platform.log.error(`Robot with DUID ${duid} not found.`);
113
+ return;
114
+ }
115
+ if (!data.cleaning_info) {
116
+ return;
117
+ }
118
+ const source_segment_id = data.cleaning_info.segment_id ?? -1;
119
+ const source_target_segment_id = data.cleaning_info.target_segment_id ?? -1;
120
+ const segment_id = source_segment_id !== -1 ? source_segment_id : source_target_segment_id;
121
+ const mappedArea = currentMappedAreas?.find((x) => x.areaId == segment_id);
122
+ platform.log.debug(`mappedArea:
123
+ source_segment_id: ${source_segment_id},
124
+ source_target_segment_id: ${source_target_segment_id},
125
+ segment_id: ${segment_id},
126
+ result: ${mappedArea ? debugStringify(mappedArea) : 'undefined'}
127
+ `);
128
+ if (segment_id !== -1 && mappedArea) {
129
+ robot.updateAttribute(ServiceArea.Cluster.id, 'currentArea', segment_id, platform.log);
130
+ }
131
+ if (segment_id == -1) {
132
+ robot.updateAttribute(ServiceArea.Cluster.id, 'currentArea', null, platform.log);
133
+ }
134
+ }
135
+ async function mapRoomsToAreasFeatureOn(platform, duid, data) {
136
+ const robot = platform.robots.get(duid);
137
+ if (!robot) {
138
+ platform.log.error(`Robot with DUID ${duid} not found.`);
139
+ return;
140
+ }
141
+ if (!data.cleaning_info) {
142
+ return;
143
+ }
144
+ const currentMappedAreas = platform.roborockService?.getSupportedAreas(duid);
145
+ const roomIndexMap = platform.roborockService?.getSupportedAreasIndexMap(duid);
146
+ const source_segment_id = data.cleaning_info.segment_id ?? -1;
147
+ const source_target_segment_id = data.cleaning_info.target_segment_id ?? -1;
148
+ const segment_id = source_segment_id !== -1 ? source_segment_id : source_target_segment_id;
149
+ const areaId = roomIndexMap?.getAreaId(segment_id, 0);
150
+ if (!areaId) {
151
+ platform.log.debug(`
152
+ source_segment_id: ${source_segment_id},
153
+ source_target_segment_id: ${source_target_segment_id},
154
+ segment_id: ${segment_id},
155
+ areaId: ${areaId}`);
156
+ return;
157
+ }
158
+ const mappedArea = currentMappedAreas?.find((x) => x.areaId == areaId);
159
+ platform.log.debug(`mappedArea:
160
+ source_segment_id: ${source_segment_id},
161
+ source_target_segment_id: ${source_target_segment_id},
162
+ segment_id: ${segment_id},
163
+ areaId: ${areaId},
164
+ result: ${mappedArea ? debugStringify(mappedArea) : 'undefined'}
165
+ `);
166
+ if (areaId !== -1 && mappedArea) {
167
+ robot.updateAttribute(ServiceArea.Cluster.id, 'currentArea', areaId, platform.log);
168
+ }
169
+ }
package/dist/rvc.js ADDED
@@ -0,0 +1,51 @@
1
+ import { RoboticVacuumCleaner } from 'matterbridge/devices';
2
+ import { getOperationalStates, getSupportedAreas, getSupportedCleanModes, getSupportedRunModes } from './initialData/index.js';
3
+ import { debugStringify } from 'matterbridge/logger';
4
+ import { RvcOperationalState } from 'matterbridge/matter/clusters';
5
+ export class RoborockVacuumCleaner extends RoboticVacuumCleaner {
6
+ username;
7
+ device;
8
+ roomInfo;
9
+ dockStationStatus;
10
+ constructor(username, device, roomMap, routineAsRoom, enableExperimentalFeature, log) {
11
+ const cleanModes = getSupportedCleanModes(device.data.model, enableExperimentalFeature);
12
+ const supportedRunModes = getSupportedRunModes();
13
+ const enableMultipleMap = enableExperimentalFeature?.enableExperimentalFeature && enableExperimentalFeature?.advancedFeature?.enableMultipleMap;
14
+ const { supportedAreas, supportedMaps } = getSupportedAreas(device.rooms, roomMap, enableMultipleMap, log);
15
+ const supportedAreaAndRoutines = [...supportedAreas, ...routineAsRoom];
16
+ const deviceName = `${device.name}-${device.duid}`.replace(/\s+/g, '');
17
+ log.debug(`Creating RoborockVacuumCleaner for device: ${deviceName}, model: ${device.data.model}, forceRunAtDefault: ${enableExperimentalFeature?.advancedFeature?.forceRunAtDefault}`);
18
+ log.debug(`Supported Clean Modes: ${JSON.stringify(cleanModes)}`);
19
+ log.debug(`Supported Run Modes: ${JSON.stringify(supportedRunModes)}`);
20
+ log.debug(`Supported Areas: ${JSON.stringify(supportedAreas)}`);
21
+ log.debug(`Supported Maps: ${JSON.stringify(supportedMaps)}`);
22
+ const bridgeMode = enableExperimentalFeature?.enableExperimentalFeature && enableExperimentalFeature?.advancedFeature?.enableServerMode ? 'server' : undefined;
23
+ super(deviceName, device.duid, bridgeMode, supportedRunModes[0].mode, supportedRunModes, cleanModes[0].mode, cleanModes, undefined, undefined, RvcOperationalState.OperationalState.Docked, getOperationalStates(), supportedAreaAndRoutines, undefined, supportedAreas[0].areaId, supportedMaps);
24
+ this.username = username;
25
+ this.device = device;
26
+ }
27
+ configurateHandler(behaviorHandler) {
28
+ this.addCommandHandler('identify', async ({ request, cluster, attributes, endpoint }) => {
29
+ this.log.info(`Identify command received for endpoint ${endpoint}, cluster ${cluster}, attributes ${debugStringify(attributes)}, request: ${JSON.stringify(request)}`);
30
+ behaviorHandler.executeCommand('playSoundToLocate', request.identifyTime ?? 0);
31
+ });
32
+ this.addCommandHandler('selectAreas', async ({ request }) => {
33
+ const { newAreas } = request;
34
+ this.log.info(`Selecting areas: ${newAreas?.join(', ')}`);
35
+ behaviorHandler.executeCommand('selectAreas', newAreas);
36
+ });
37
+ this.addCommandHandler('changeToMode', async ({ request }) => {
38
+ const { newMode } = request;
39
+ behaviorHandler.executeCommand('changeToMode', newMode);
40
+ });
41
+ this.addCommandHandler('pause', async () => {
42
+ behaviorHandler.executeCommand('pause');
43
+ });
44
+ this.addCommandHandler('resume', async () => {
45
+ behaviorHandler.executeCommand('resume');
46
+ });
47
+ this.addCommandHandler('goHome', async () => {
48
+ behaviorHandler.executeCommand('goHome');
49
+ });
50
+ }
51
+ }
@@ -0,0 +1 @@
1
+ export const PLUGIN_NAME = 'matterbridge-roborock-vacuum-plugin-jb';
@@ -0,0 +1,93 @@
1
+ import { OperationStatusCode } from '../roborockCommunication/Zenum/operationStatusCode.js';
2
+ import { RvcRunMode, RvcOperationalState } from 'matterbridge/matter/clusters';
3
+ export function state_to_matter_state(state) {
4
+ if (state === null) {
5
+ return undefined;
6
+ }
7
+ switch (state) {
8
+ case OperationStatusCode.RemoteControl:
9
+ case OperationStatusCode.Cleaning:
10
+ case OperationStatusCode.ReturningDock:
11
+ case OperationStatusCode.ManualMode:
12
+ case OperationStatusCode.SpotCleaning:
13
+ case OperationStatusCode.ReturnToDock:
14
+ case OperationStatusCode.GoTo:
15
+ case OperationStatusCode.ZoneClean:
16
+ case OperationStatusCode.RoomClean:
17
+ case OperationStatusCode.WashingTheMop:
18
+ case OperationStatusCode.GoingToWashTheMop:
19
+ case OperationStatusCode.EmptyingDustContainer:
20
+ case OperationStatusCode.Initiating:
21
+ case OperationStatusCode.Paused:
22
+ case OperationStatusCode.AirDryingStopping:
23
+ case OperationStatusCode.CleanMopCleaning:
24
+ case OperationStatusCode.CleanMopMopping:
25
+ case OperationStatusCode.RoomMopping:
26
+ case OperationStatusCode.RoomCleanMopCleaning:
27
+ case OperationStatusCode.RoomCleanMopMopping:
28
+ case OperationStatusCode.ZoneMopping:
29
+ case OperationStatusCode.ZoneCleanMopCleaning:
30
+ case OperationStatusCode.ZoneCleanMopMopping:
31
+ case OperationStatusCode.BackToDockWashingDuster:
32
+ return RvcRunMode.ModeTag.Cleaning;
33
+ case OperationStatusCode.Mapping:
34
+ return RvcRunMode.ModeTag.Mapping;
35
+ case OperationStatusCode.Idle:
36
+ case OperationStatusCode.Sleeping:
37
+ case OperationStatusCode.Charging:
38
+ case OperationStatusCode.FullyCharged:
39
+ default:
40
+ return RvcRunMode.ModeTag.Idle;
41
+ }
42
+ }
43
+ export function state_to_matter_operational_status(state) {
44
+ switch (state) {
45
+ case OperationStatusCode.Initiating:
46
+ case OperationStatusCode.RemoteControl:
47
+ case OperationStatusCode.Cleaning:
48
+ case OperationStatusCode.ManualMode:
49
+ case OperationStatusCode.SpotCleaning:
50
+ case OperationStatusCode.GoTo:
51
+ case OperationStatusCode.ZoneClean:
52
+ case OperationStatusCode.RoomClean:
53
+ case OperationStatusCode.InCall:
54
+ case OperationStatusCode.Mapping:
55
+ case OperationStatusCode.Patrol:
56
+ case OperationStatusCode.CleanMopCleaning:
57
+ case OperationStatusCode.CleanMopMopping:
58
+ case OperationStatusCode.RoomMopping:
59
+ case OperationStatusCode.RoomCleanMopCleaning:
60
+ case OperationStatusCode.RoomCleanMopMopping:
61
+ case OperationStatusCode.ZoneMopping:
62
+ case OperationStatusCode.ZoneCleanMopCleaning:
63
+ case OperationStatusCode.ZoneCleanMopMopping:
64
+ case OperationStatusCode.RobotStatusMopping:
65
+ return RvcOperationalState.OperationalState.Running;
66
+ case OperationStatusCode.InError:
67
+ case OperationStatusCode.ChargingError:
68
+ case OperationStatusCode.Unknown:
69
+ case OperationStatusCode.DeviceOffline:
70
+ case OperationStatusCode.Locked:
71
+ case OperationStatusCode.AirDryingStopping:
72
+ return RvcOperationalState.OperationalState.Error;
73
+ case OperationStatusCode.Paused:
74
+ return RvcOperationalState.OperationalState.Paused;
75
+ case OperationStatusCode.ShuttingDown:
76
+ return RvcOperationalState.OperationalState.Stopped;
77
+ case OperationStatusCode.ReturnToDock:
78
+ case OperationStatusCode.ReturningDock:
79
+ case OperationStatusCode.WashingTheMop:
80
+ case OperationStatusCode.WashingTheMop2:
81
+ case OperationStatusCode.GoingToWashTheMop:
82
+ case OperationStatusCode.BackToDockWashingDuster:
83
+ case OperationStatusCode.EmptyingDustContainer:
84
+ return RvcOperationalState.OperationalState.SeekingCharger;
85
+ case OperationStatusCode.Idle:
86
+ case OperationStatusCode.Sleeping:
87
+ case OperationStatusCode.Updating:
88
+ case OperationStatusCode.FullyCharged:
89
+ case OperationStatusCode.Charging:
90
+ default:
91
+ return RvcOperationalState.OperationalState.Docked;
92
+ }
93
+ }
@@ -0,0 +1,17 @@
1
+ import { getCurrentCleanModeDefault } from '../behaviors/roborock.vacuum/default/runtimes.js';
2
+ import { getCurrentCleanModeSmart } from '../behaviors/roborock.vacuum/smart/runtimes.js';
3
+ import { DeviceModel } from '../roborockCommunication/Zmodel/deviceModel.js';
4
+ export function getCurrentCleanModeFunc(model, forceRunAtDefault) {
5
+ if (forceRunAtDefault) {
6
+ return getCurrentCleanModeDefault;
7
+ }
8
+ switch (model) {
9
+ case DeviceModel.QREVO_EDGE_5V1:
10
+ return getCurrentCleanModeSmart;
11
+ case DeviceModel.S7_MAXV:
12
+ case DeviceModel.S8_PRO_ULTRA:
13
+ case DeviceModel.S6_PURE:
14
+ default:
15
+ return getCurrentCleanModeDefault;
16
+ }
17
+ }