matterbridge-dyson-robot 0.1.0

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/CHANGELOG.md +15 -0
  2. package/LICENSE +14 -0
  3. package/README.md +365 -0
  4. package/dist/async-eventemitter.d.ts +9 -0
  5. package/dist/async-eventemitter.d.ts.map +1 -0
  6. package/dist/async-eventemitter.js +35 -0
  7. package/dist/async-eventemitter.js.map +1 -0
  8. package/dist/check-configuration.d.ts +5 -0
  9. package/dist/check-configuration.d.ts.map +1 -0
  10. package/dist/check-configuration.js +35 -0
  11. package/dist/check-configuration.js.map +1 -0
  12. package/dist/check-versions.d.ts +3 -0
  13. package/dist/check-versions.d.ts.map +1 -0
  14. package/dist/check-versions.js +31 -0
  15. package/dist/check-versions.js.map +1 -0
  16. package/dist/config-types.d.ts +48 -0
  17. package/dist/config-types.d.ts.map +1 -0
  18. package/dist/config-types.js +4 -0
  19. package/dist/config-types.js.map +1 -0
  20. package/dist/decorator-changed.d.ts +16 -0
  21. package/dist/decorator-changed.d.ts.map +1 -0
  22. package/dist/decorator-changed.js +62 -0
  23. package/dist/decorator-changed.js.map +1 -0
  24. package/dist/dyson-360-msg-types.d.ts +113 -0
  25. package/dist/dyson-360-msg-types.d.ts.map +1 -0
  26. package/dist/dyson-360-msg-types.js +4 -0
  27. package/dist/dyson-360-msg-types.js.map +1 -0
  28. package/dist/dyson-360-types.d.ts +76 -0
  29. package/dist/dyson-360-types.d.ts.map +1 -0
  30. package/dist/dyson-360-types.js +72 -0
  31. package/dist/dyson-360-types.js.map +1 -0
  32. package/dist/dyson-air-msg-types.d.ts +99 -0
  33. package/dist/dyson-air-msg-types.d.ts.map +1 -0
  34. package/dist/dyson-air-msg-types.js +4 -0
  35. package/dist/dyson-air-msg-types.js.map +1 -0
  36. package/dist/dyson-air-sensor-types.d.ts +59 -0
  37. package/dist/dyson-air-sensor-types.d.ts.map +1 -0
  38. package/dist/dyson-air-sensor-types.js +4 -0
  39. package/dist/dyson-air-sensor-types.js.map +1 -0
  40. package/dist/dyson-air-state-types.d.ts +96 -0
  41. package/dist/dyson-air-state-types.d.ts.map +1 -0
  42. package/dist/dyson-air-state-types.js +4 -0
  43. package/dist/dyson-air-state-types.js.map +1 -0
  44. package/dist/dyson-air-types.d.ts +325 -0
  45. package/dist/dyson-air-types.d.ts.map +1 -0
  46. package/dist/dyson-air-types.js +382 -0
  47. package/dist/dyson-air-types.js.map +1 -0
  48. package/dist/dyson-device-360-base.d.ts +35 -0
  49. package/dist/dyson-device-360-base.d.ts.map +1 -0
  50. package/dist/dyson-device-360-base.js +233 -0
  51. package/dist/dyson-device-360-base.js.map +1 -0
  52. package/dist/dyson-device-360-commands.d.ts +7 -0
  53. package/dist/dyson-device-360-commands.d.ts.map +1 -0
  54. package/dist/dyson-device-360-commands.js +129 -0
  55. package/dist/dyson-device-360-commands.js.map +1 -0
  56. package/dist/dyson-device-360-faults-table.d.ts +20 -0
  57. package/dist/dyson-device-360-faults-table.d.ts.map +1 -0
  58. package/dist/dyson-device-360-faults-table.js +161 -0
  59. package/dist/dyson-device-360-faults-table.js.map +1 -0
  60. package/dist/dyson-device-360-faults.d.ts +10 -0
  61. package/dist/dyson-device-360-faults.d.ts.map +1 -0
  62. package/dist/dyson-device-360-faults.js +123 -0
  63. package/dist/dyson-device-360-faults.js.map +1 -0
  64. package/dist/dyson-device-360.d.ts +38 -0
  65. package/dist/dyson-device-360.d.ts.map +1 -0
  66. package/dist/dyson-device-360.js +45 -0
  67. package/dist/dyson-device-360.js.map +1 -0
  68. package/dist/dyson-device-air-base.d.ts +41 -0
  69. package/dist/dyson-device-air-base.d.ts.map +1 -0
  70. package/dist/dyson-device-air-base.js +446 -0
  71. package/dist/dyson-device-air-base.js.map +1 -0
  72. package/dist/dyson-device-air-heat.d.ts +52 -0
  73. package/dist/dyson-device-air-heat.d.ts.map +1 -0
  74. package/dist/dyson-device-air-heat.js +71 -0
  75. package/dist/dyson-device-air-heat.js.map +1 -0
  76. package/dist/dyson-device-air-quality.d.ts +7 -0
  77. package/dist/dyson-device-air-quality.d.ts.map +1 -0
  78. package/dist/dyson-device-air-quality.js +101 -0
  79. package/dist/dyson-device-air-quality.js.map +1 -0
  80. package/dist/dyson-device-air.d.ts +216 -0
  81. package/dist/dyson-device-air.d.ts.map +1 -0
  82. package/dist/dyson-device-air.js +80 -0
  83. package/dist/dyson-device-air.js.map +1 -0
  84. package/dist/dyson-device-base.d.ts +49 -0
  85. package/dist/dyson-device-base.d.ts.map +1 -0
  86. package/dist/dyson-device-base.js +46 -0
  87. package/dist/dyson-device-base.js.map +1 -0
  88. package/dist/dyson-device.d.ts +5 -0
  89. package/dist/dyson-device.d.ts.map +1 -0
  90. package/dist/dyson-device.js +43 -0
  91. package/dist/dyson-device.js.map +1 -0
  92. package/dist/dyson-mqtt-360.d.ts +16 -0
  93. package/dist/dyson-mqtt-360.d.ts.map +1 -0
  94. package/dist/dyson-mqtt-360.js +83 -0
  95. package/dist/dyson-mqtt-360.js.map +1 -0
  96. package/dist/dyson-mqtt-air.d.ts +48 -0
  97. package/dist/dyson-mqtt-air.d.ts.map +1 -0
  98. package/dist/dyson-mqtt-air.js +216 -0
  99. package/dist/dyson-mqtt-air.js.map +1 -0
  100. package/dist/dyson-mqtt-config.d.ts +6 -0
  101. package/dist/dyson-mqtt-config.d.ts.map +1 -0
  102. package/dist/dyson-mqtt-config.js +47 -0
  103. package/dist/dyson-mqtt-config.js.map +1 -0
  104. package/dist/dyson-mqtt-connect.d.ts +22 -0
  105. package/dist/dyson-mqtt-connect.d.ts.map +1 -0
  106. package/dist/dyson-mqtt-connect.js +145 -0
  107. package/dist/dyson-mqtt-connect.js.map +1 -0
  108. package/dist/dyson-mqtt-filter.d.ts +10 -0
  109. package/dist/dyson-mqtt-filter.d.ts.map +1 -0
  110. package/dist/dyson-mqtt-filter.js +25 -0
  111. package/dist/dyson-mqtt-filter.js.map +1 -0
  112. package/dist/dyson-mqtt-parse.d.ts +16 -0
  113. package/dist/dyson-mqtt-parse.d.ts.map +1 -0
  114. package/dist/dyson-mqtt-parse.js +100 -0
  115. package/dist/dyson-mqtt-parse.js.map +1 -0
  116. package/dist/dyson-mqtt-subscribe.d.ts +28 -0
  117. package/dist/dyson-mqtt-subscribe.d.ts.map +1 -0
  118. package/dist/dyson-mqtt-subscribe.js +85 -0
  119. package/dist/dyson-mqtt-subscribe.js.map +1 -0
  120. package/dist/dyson-mqtt.d.ts +51 -0
  121. package/dist/dyson-mqtt.d.ts.map +1 -0
  122. package/dist/dyson-mqtt.js +138 -0
  123. package/dist/dyson-mqtt.js.map +1 -0
  124. package/dist/dyson-types.d.ts +18 -0
  125. package/dist/dyson-types.d.ts.map +1 -0
  126. package/dist/dyson-types.js +20 -0
  127. package/dist/dyson-types.js.map +1 -0
  128. package/dist/endpoint-360-behavior.d.ts +55 -0
  129. package/dist/endpoint-360-behavior.d.ts.map +1 -0
  130. package/dist/endpoint-360-behavior.js +156 -0
  131. package/dist/endpoint-360-behavior.js.map +1 -0
  132. package/dist/endpoint-360-rvc.d.ts +14 -0
  133. package/dist/endpoint-360-rvc.d.ts.map +1 -0
  134. package/dist/endpoint-360-rvc.js +149 -0
  135. package/dist/endpoint-360-rvc.js.map +1 -0
  136. package/dist/endpoint-360.d.ts +35 -0
  137. package/dist/endpoint-360.d.ts.map +1 -0
  138. package/dist/endpoint-360.js +197 -0
  139. package/dist/endpoint-360.js.map +1 -0
  140. package/dist/endpoint-air-purifier.d.ts +24 -0
  141. package/dist/endpoint-air-purifier.d.ts.map +1 -0
  142. package/dist/endpoint-air-purifier.js +97 -0
  143. package/dist/endpoint-air-purifier.js.map +1 -0
  144. package/dist/endpoint-air-quality.d.ts +11 -0
  145. package/dist/endpoint-air-quality.d.ts.map +1 -0
  146. package/dist/endpoint-air-quality.js +104 -0
  147. package/dist/endpoint-air-quality.js.map +1 -0
  148. package/dist/endpoint-air-thermostat.d.ts +358 -0
  149. package/dist/endpoint-air-thermostat.d.ts.map +1 -0
  150. package/dist/endpoint-air-thermostat.js +67 -0
  151. package/dist/endpoint-air-thermostat.js.map +1 -0
  152. package/dist/endpoint-air.d.ts +125 -0
  153. package/dist/endpoint-air.d.ts.map +1 -0
  154. package/dist/endpoint-air.js +459 -0
  155. package/dist/endpoint-air.js.map +1 -0
  156. package/dist/endpoint-base.d.ts +36 -0
  157. package/dist/endpoint-base.d.ts.map +1 -0
  158. package/dist/endpoint-base.js +137 -0
  159. package/dist/endpoint-base.js.map +1 -0
  160. package/dist/error-360.d.ts +35 -0
  161. package/dist/error-360.d.ts.map +1 -0
  162. package/dist/error-360.js +105 -0
  163. package/dist/error-360.js.map +1 -0
  164. package/dist/index.d.ts +5 -0
  165. package/dist/index.d.ts.map +1 -0
  166. package/dist/index.js +8 -0
  167. package/dist/index.js.map +1 -0
  168. package/dist/logger-filter.d.ts +23 -0
  169. package/dist/logger-filter.d.ts.map +1 -0
  170. package/dist/logger-filter.js +104 -0
  171. package/dist/logger-filter.js.map +1 -0
  172. package/dist/logger-options.d.ts +18 -0
  173. package/dist/logger-options.d.ts.map +1 -0
  174. package/dist/logger-options.js +41 -0
  175. package/dist/logger-options.js.map +1 -0
  176. package/dist/logger-prefix.d.ts +12 -0
  177. package/dist/logger-prefix.d.ts.map +1 -0
  178. package/dist/logger-prefix.js +37 -0
  179. package/dist/logger-prefix.js.map +1 -0
  180. package/dist/periodic.d.ts +31 -0
  181. package/dist/periodic.d.ts.map +1 -0
  182. package/dist/periodic.js +102 -0
  183. package/dist/periodic.js.map +1 -0
  184. package/dist/platform.d.ts +18 -0
  185. package/dist/platform.d.ts.map +1 -0
  186. package/dist/platform.js +138 -0
  187. package/dist/platform.js.map +1 -0
  188. package/dist/settings.d.ts +9 -0
  189. package/dist/settings.d.ts.map +1 -0
  190. package/dist/settings.js +28 -0
  191. package/dist/settings.js.map +1 -0
  192. package/dist/ti/config-types-ti.d.ts +16 -0
  193. package/dist/ti/config-types-ti.d.ts.map +1 -0
  194. package/dist/ti/config-types-ti.js +65 -0
  195. package/dist/ti/config-types-ti.js.map +1 -0
  196. package/dist/ti/config-types.d.ts +37 -0
  197. package/dist/ti/config-types.d.ts.map +1 -0
  198. package/dist/ti/config-types.js +11 -0
  199. package/dist/ti/config-types.js.map +1 -0
  200. package/dist/ti/dyson-360-msg-types-ti.d.ts +22 -0
  201. package/dist/ti/dyson-360-msg-types-ti.d.ts.map +1 -0
  202. package/dist/ti/dyson-360-msg-types-ti.js +134 -0
  203. package/dist/ti/dyson-360-msg-types-ti.js.map +1 -0
  204. package/dist/ti/dyson-360-msg-types.d.ts +55 -0
  205. package/dist/ti/dyson-360-msg-types.d.ts.map +1 -0
  206. package/dist/ti/dyson-360-msg-types.js +13 -0
  207. package/dist/ti/dyson-360-msg-types.js.map +1 -0
  208. package/dist/ti/dyson-360-types-ti.d.ts +17 -0
  209. package/dist/ti/dyson-360-types-ti.d.ts.map +1 -0
  210. package/dist/ti/dyson-360-types-ti.js +94 -0
  211. package/dist/ti/dyson-360-types-ti.js.map +1 -0
  212. package/dist/ti/dyson-360-types.d.ts +40 -0
  213. package/dist/ti/dyson-360-types.d.ts.map +1 -0
  214. package/dist/ti/dyson-360-types.js +11 -0
  215. package/dist/ti/dyson-360-types.js.map +1 -0
  216. package/dist/ti/dyson-air-msg-types-ti.d.ts +19 -0
  217. package/dist/ti/dyson-air-msg-types-ti.d.ts.map +1 -0
  218. package/dist/ti/dyson-air-msg-types-ti.js +115 -0
  219. package/dist/ti/dyson-air-msg-types-ti.js.map +1 -0
  220. package/dist/ti/dyson-air-msg-types.d.ts +46 -0
  221. package/dist/ti/dyson-air-msg-types.d.ts.map +1 -0
  222. package/dist/ti/dyson-air-msg-types.js +15 -0
  223. package/dist/ti/dyson-air-msg-types.js.map +1 -0
  224. package/dist/ti/dyson-air-sensor-types-ti.d.ts +9 -0
  225. package/dist/ti/dyson-air-sensor-types-ti.d.ts.map +1 -0
  226. package/dist/ti/dyson-air-sensor-types-ti.js +68 -0
  227. package/dist/ti/dyson-air-sensor-types-ti.js.map +1 -0
  228. package/dist/ti/dyson-air-sensor-types.d.ts +16 -0
  229. package/dist/ti/dyson-air-sensor-types.d.ts.map +1 -0
  230. package/dist/ti/dyson-air-sensor-types.js +12 -0
  231. package/dist/ti/dyson-air-sensor-types.js.map +1 -0
  232. package/dist/ti/dyson-air-state-types-ti.d.ts +9 -0
  233. package/dist/ti/dyson-air-state-types-ti.d.ts.map +1 -0
  234. package/dist/ti/dyson-air-state-types-ti.js +105 -0
  235. package/dist/ti/dyson-air-state-types-ti.js.map +1 -0
  236. package/dist/ti/dyson-air-state-types.d.ts +16 -0
  237. package/dist/ti/dyson-air-state-types.d.ts.map +1 -0
  238. package/dist/ti/dyson-air-state-types.js +12 -0
  239. package/dist/ti/dyson-air-state-types.js.map +1 -0
  240. package/dist/ti/dyson-air-types-ti.d.ts +59 -0
  241. package/dist/ti/dyson-air-types-ti.d.ts.map +1 -0
  242. package/dist/ti/dyson-air-types-ti.js +385 -0
  243. package/dist/ti/dyson-air-types-ti.js.map +1 -0
  244. package/dist/ti/dyson-air-types.d.ts +166 -0
  245. package/dist/ti/dyson-air-types.d.ts.map +1 -0
  246. package/dist/ti/dyson-air-types.js +11 -0
  247. package/dist/ti/dyson-air-types.js.map +1 -0
  248. package/dist/ti/dyson-types-ti.d.ts +10 -0
  249. package/dist/ti/dyson-types-ti.d.ts.map +1 -0
  250. package/dist/ti/dyson-types-ti.js +29 -0
  251. package/dist/ti/dyson-types-ti.js.map +1 -0
  252. package/dist/ti/dyson-types.d.ts +19 -0
  253. package/dist/ti/dyson-types.d.ts.map +1 -0
  254. package/dist/ti/dyson-types.js +11 -0
  255. package/dist/ti/dyson-types.js.map +1 -0
  256. package/dist/utils.d.ts +24 -0
  257. package/dist/utils.d.ts.map +1 -0
  258. package/dist/utils.js +150 -0
  259. package/dist/utils.js.map +1 -0
  260. package/matterbridge-dyson-robot.schema.json +359 -0
  261. package/package.json +93 -0
@@ -0,0 +1,156 @@
1
+ // Matterbridge plugin for Dyson robot vacuum and air treatment devices
2
+ // Copyright © 2025 Alexander Thoukydides
3
+ import { Behavior } from 'matterbridge/matter';
4
+ import { ClusterModel, FieldElement } from 'matterbridge/matter';
5
+ import { RvcOperationalState } from 'matterbridge/matter/clusters';
6
+ import { RvcCleanModeBehavior, RvcOperationalStateBehavior, RvcRunModeBehavior } from 'matterbridge/matter/behaviors';
7
+ import { ChangeToModeError, RvcOperationalStateError } from './error-360.js';
8
+ import { assertIsDefined, assertIsInstanceOf, logError } from './utils.js';
9
+ // Robot Vacuum Cleaner Run Mode cluster modes
10
+ export var RvcRunMode360;
11
+ (function (RvcRunMode360) {
12
+ RvcRunMode360[RvcRunMode360["Idle"] = 0] = "Idle";
13
+ RvcRunMode360[RvcRunMode360["Cleaning"] = 1] = "Cleaning";
14
+ RvcRunMode360[RvcRunMode360["Mapping"] = 2] = "Mapping";
15
+ })(RvcRunMode360 || (RvcRunMode360 = {}));
16
+ // Robot Vacuum Cleaner Clean Mode cluster modes
17
+ export var RvcCleanMode360;
18
+ (function (RvcCleanMode360) {
19
+ RvcCleanMode360[RvcCleanMode360["Quiet"] = 0] = "Quiet";
20
+ RvcCleanMode360[RvcCleanMode360["Quick"] = 1] = "Quick";
21
+ RvcCleanMode360[RvcCleanMode360["High"] = 2] = "High";
22
+ RvcCleanMode360[RvcCleanMode360["MaxBoost"] = 3] = "MaxBoost";
23
+ RvcCleanMode360[RvcCleanMode360["Auto"] = 4] = "Auto"; // Vis Nav: Auto
24
+ })(RvcCleanMode360 || (RvcCleanMode360 = {}));
25
+ // OperationalStatus manufacturer error
26
+ export const VENDOR_ERROR_360 = 0x80;
27
+ // Command handling behaviour for the endpoint
28
+ export class BehaviorDevice360 {
29
+ log;
30
+ // Registered command handlers
31
+ commands = {};
32
+ // Construct new command handling behaviour
33
+ constructor(log) {
34
+ this.log = log;
35
+ }
36
+ // Set a command handler
37
+ setCommandHandler(command, handler) {
38
+ if (this.commands[command])
39
+ throw new Error(`Handler already registered for command ${command}`);
40
+ this.commands[command] = handler;
41
+ }
42
+ // Execute a command handler
43
+ async executeCommand(command, ...args) {
44
+ const handler = this.commands[command];
45
+ if (!handler)
46
+ throw new Error(`${command} not implemented`);
47
+ await handler(...args);
48
+ }
49
+ }
50
+ export class Behavior360 extends Behavior {
51
+ static id = 'dyson-rvc';
52
+ }
53
+ // eslint-disable-next-line @typescript-eslint/no-namespace
54
+ (function (Behavior360) {
55
+ class State {
56
+ device;
57
+ }
58
+ Behavior360.State = State;
59
+ })(Behavior360 || (Behavior360 = {}));
60
+ // Implement command handlers for the RVC Run Mode cluster
61
+ export class RvcRunModeServer360 extends RvcRunModeBehavior {
62
+ // ChangeToMode command handler
63
+ async changeToMode({ newMode }) {
64
+ const { device } = this.agent.get(Behavior360).state;
65
+ const { log } = device;
66
+ try {
67
+ // Check whether it is a valid request
68
+ log.debug(`RVC Run Mode command: ChangeToMode ${newMode}...`);
69
+ const supported = this.state.supportedModes.some(({ mode }) => mode === newMode);
70
+ if (!supported)
71
+ throw new ChangeToModeError.UnsupportedMode;
72
+ // Attempt to change the mode
73
+ await device.executeCommand('ChangeRunMode', newMode);
74
+ // Success
75
+ log.debug(`RVC Run Mode command: ChangeToMode ${newMode} - OK`);
76
+ return ChangeToModeError.toResponse();
77
+ }
78
+ catch (err) {
79
+ logError(log, 'RVC Run Mode ChangeToMode', err);
80
+ return ChangeToModeError.toResponse(err);
81
+ }
82
+ }
83
+ }
84
+ // Implement command handlers for the RVC Clean Mode cluster
85
+ export class RvcCleanModeServer360 extends RvcCleanModeBehavior {
86
+ // ChangeToMode command handler
87
+ async changeToMode({ newMode }) {
88
+ const { device } = this.agent.get(Behavior360).state;
89
+ const { log } = device;
90
+ try {
91
+ // Check whether it is a valid request
92
+ log.debug(`RVC Clean Mode command: ChangeToMode ${newMode}...`);
93
+ const supported = this.state.supportedModes.some(({ mode }) => mode === newMode);
94
+ if (!supported)
95
+ throw new ChangeToModeError.UnsupportedMode;
96
+ // Attempt to change the mode
97
+ await device.executeCommand('ChangeCleanMode', newMode);
98
+ // Success
99
+ log.debug(`RVC Clean Mode command: ChangeToMode ${newMode} - OK`);
100
+ return ChangeToModeError.toResponse();
101
+ }
102
+ catch (err) {
103
+ logError(log, 'RVC Clean Mode ChangeToMode', err);
104
+ return ChangeToModeError.toResponse(err);
105
+ }
106
+ }
107
+ }
108
+ // Implement command handlers for the RVC Operational State cluster
109
+ export class RvcOperationalStateServer360 extends RvcOperationalStateBehavior {
110
+ static {
111
+ const schema = RvcOperationalStateServer360.schema;
112
+ assertIsInstanceOf(schema, ClusterModel);
113
+ const extendEnum = (name, values) => {
114
+ const element = schema.datatypes.find(e => e.name === name);
115
+ assertIsDefined(element);
116
+ element.children = [...element.children, ...values];
117
+ };
118
+ // Add a manufacturer-specific ErrorState value
119
+ extendEnum('ErrorStateEnum', [
120
+ FieldElement({
121
+ name: 'OtherError',
122
+ id: VENDOR_ERROR_360,
123
+ conformance: 'O',
124
+ description: 'The device has an error that is not covered by the Matter-defined error states'
125
+ })
126
+ ]);
127
+ }
128
+ // Common command handler
129
+ async command(command, defaultErrorId) {
130
+ const { device } = this.agent.get(Behavior360).state;
131
+ const { log } = device;
132
+ try {
133
+ log.debug(`RVC Operational State command: ${command}...`);
134
+ await device.executeCommand(command);
135
+ log.debug(`RVC Operational State command: ${command} - OK`);
136
+ return RvcOperationalStateError.toResponse();
137
+ }
138
+ catch (err) {
139
+ logError(log, `RVC Operational State ${command}`, err);
140
+ return RvcOperationalStateError.toResponse(err, defaultErrorId);
141
+ }
142
+ }
143
+ // Pause command handler
144
+ pause() {
145
+ return this.command('Pause', RvcOperationalState.ErrorState.CommandInvalidInState);
146
+ }
147
+ // Resume command handler
148
+ resume() {
149
+ return this.command('Resume', RvcOperationalState.ErrorState.UnableToStartOrResume);
150
+ }
151
+ // GoHome command handler
152
+ goHome() {
153
+ return this.command('GoHome', RvcOperationalState.ErrorState.CommandInvalidInState);
154
+ }
155
+ }
156
+ //# sourceMappingURL=endpoint-360-behavior.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"endpoint-360-behavior.js","sourceRoot":"","sources":["../src/endpoint-360-behavior.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { RvcCleanMode360 } from './endpoint-360-behavior.js';
2
+ import { Endpoint } from 'matterbridge/matter';
3
+ export interface BatteryPowerSourceOptions {
4
+ batteryPartNumber: string;
5
+ }
6
+ export type RvcCleanModeLabels = [RvcCleanMode360, string][];
7
+ export interface RvcCleanModeOptions {
8
+ labels: RvcCleanModeLabels;
9
+ }
10
+ export declare function createBatteryPowerSourceClusterServer({ behaviors }: Endpoint, { batteryPartNumber }: BatteryPowerSourceOptions): void;
11
+ export declare function createRvcRunModeClusterServer({ behaviors }: Endpoint): void;
12
+ export declare function createRvcCleanModeClusterServer({ behaviors }: Endpoint, { labels }: RvcCleanModeOptions): void;
13
+ export declare function createRvcOperationalStateClusterServer({ behaviors }: Endpoint): void;
14
+ //# sourceMappingURL=endpoint-360-rvc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"endpoint-360-rvc.d.ts","sourceRoot":"","sources":["../src/endpoint-360-rvc.ts"],"names":[],"mappings":"AAUA,OAAO,EACH,eAAe,EAKlB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAG/C,MAAM,WAAW,yBAAyB;IACtC,iBAAiB,EAAO,MAAM,CAAC;CAClC;AACD,MAAM,MAAM,kBAAkB,GAAG,CAAC,eAAe,EAAE,MAAM,CAAC,EAAE,CAAC;AAC7D,MAAM,WAAW,mBAAmB;IAChC,MAAM,EAAkB,kBAAkB,CAAC;CAC9C;AAGD,wBAAgB,qCAAqC,CACjD,EAAE,SAAS,EAAE,EAAW,QAAQ,EAChC,EAAE,iBAAiB,EAAE,EAAG,yBAAyB,GAClD,IAAI,CAuCN;AAGD,wBAAgB,6BAA6B,CAAC,EAAE,SAAS,EAAE,EAAE,QAAQ,GAAG,IAAI,CAuB3E;AAGD,wBAAgB,+BAA+B,CAC3C,EAAE,SAAS,EAAE,EAAG,QAAQ,EACxB,EAAE,MAAM,EAAE,EAAM,mBAAmB,GACpC,IAAI,CAgDN;AAGD,wBAAgB,sCAAsC,CAClD,EAAE,SAAS,EAAE,EAAE,QAAQ,GACxB,IAAI,CA6BN"}
@@ -0,0 +1,149 @@
1
+ // Matterbridge plugin for Dyson robot vacuum and air treatment devices
2
+ // Copyright © 2025 Alexander Thoukydides
3
+ import { PowerSource, RvcCleanMode, RvcRunMode, RvcOperationalState } from 'matterbridge/matter/clusters';
4
+ import { PowerSourceServer } from 'matterbridge/matter/behaviors';
5
+ import { RvcCleanMode360, RvcCleanModeServer360, RvcOperationalStateServer360, RvcRunMode360, RvcRunModeServer360 } from './endpoint-360-behavior.js';
6
+ import { RvcOperationalStateError } from './error-360.js';
7
+ // Create the Power Source cluster for the rechargeable battery
8
+ export function createBatteryPowerSourceClusterServer({ behaviors }, { batteryPartNumber }) {
9
+ behaviors.require(PowerSourceServer.withFeatures(PowerSource.Feature.Battery, PowerSource.Feature.Rechargeable, PowerSource.Feature.Replaceable).enable({
10
+ events: {
11
+ batFaultChange: true,
12
+ batChargeFaultChange: true
13
+ }
14
+ }), {
15
+ // Constant attributes
16
+ batApprovedChemistry: PowerSource.BatApprovedChemistry.LithiumIon,
17
+ batCapacity: 6600, // mAh
18
+ batFunctionalWhileCharging: false,
19
+ batPresent: true,
20
+ batQuantity: 1,
21
+ batReplaceability: PowerSource.BatReplaceability.UserReplaceable,
22
+ batReplacementDescription: `Dyson ${batteryPartNumber} (14.8V Li-ion)`,
23
+ description: 'Primary Battery',
24
+ endpointList: [],
25
+ order: 0,
26
+ // Variable attributes (with dummy defaults)
27
+ activeBatChargeFaults: [],
28
+ activeBatFaults: [],
29
+ batChargeLevel: PowerSource.BatChargeLevel.Ok,
30
+ batChargeState: PowerSource.BatChargeState.Unknown,
31
+ batPercentRemaining: null,
32
+ batReplacementNeeded: true,
33
+ status: PowerSource.PowerSourceStatus.Unspecified,
34
+ // Unsupported attributes
35
+ batAnsiDesignation: undefined,
36
+ batChargingCurrent: undefined,
37
+ batCommonDesignation: undefined,
38
+ batIecDesignation: undefined,
39
+ batTimeRemaining: undefined,
40
+ batTimeToFullCharge: undefined,
41
+ batVoltage: null
42
+ });
43
+ }
44
+ // Create the RVC Run Mode cluster
45
+ export function createRvcRunModeClusterServer({ behaviors }) {
46
+ behaviors.require(RvcRunModeServer360.enable({
47
+ commands: {
48
+ changeToMode: true
49
+ }
50
+ }), {
51
+ // Constant attributes
52
+ supportedModes: [{
53
+ label: 'Idle',
54
+ mode: RvcRunMode360.Idle,
55
+ modeTags: [{ value: RvcRunMode.ModeTag.Idle }]
56
+ }, {
57
+ label: 'Cleaning',
58
+ mode: RvcRunMode360.Cleaning,
59
+ modeTags: [{ value: RvcRunMode.ModeTag.Cleaning }]
60
+ }, {
61
+ label: 'Mapping',
62
+ mode: RvcRunMode360.Mapping,
63
+ modeTags: [{ value: RvcRunMode.ModeTag.Mapping }]
64
+ }],
65
+ // Variable attributes (with dummy defaults)
66
+ currentMode: RvcRunMode360.Idle
67
+ });
68
+ }
69
+ // Create the RVC Clean Mode cluster
70
+ export function createRvcCleanModeClusterServer({ behaviors }, { labels }) {
71
+ // Mode tags to use for each mode
72
+ const CLEAN_MODE_TAGS = {
73
+ [RvcCleanMode360.Quiet]: [
74
+ { value: RvcCleanMode.ModeTag.Vacuum },
75
+ { value: RvcCleanMode.ModeTag.LowEnergy },
76
+ { value: RvcCleanMode.ModeTag.LowNoise },
77
+ { value: RvcCleanMode.ModeTag.Min },
78
+ { value: RvcCleanMode.ModeTag.Night },
79
+ { value: RvcCleanMode.ModeTag.Quiet }
80
+ ],
81
+ [RvcCleanMode360.Quick]: [
82
+ { value: RvcCleanMode.ModeTag.Vacuum },
83
+ { value: RvcCleanMode.ModeTag.Day },
84
+ { value: RvcCleanMode.ModeTag.Quick }
85
+ ],
86
+ [RvcCleanMode360.High]: [
87
+ { value: RvcCleanMode.ModeTag.Vacuum },
88
+ { value: RvcCleanMode.ModeTag.Day }
89
+ ],
90
+ [RvcCleanMode360.MaxBoost]: [
91
+ { value: RvcCleanMode.ModeTag.Vacuum },
92
+ { value: RvcCleanMode.ModeTag.Day },
93
+ { value: RvcCleanMode.ModeTag.DeepClean },
94
+ { value: RvcCleanMode.ModeTag.Max }
95
+ ],
96
+ [RvcCleanMode360.Auto]: [
97
+ { value: RvcCleanMode.ModeTag.Vacuum },
98
+ { value: RvcCleanMode.ModeTag.Auto },
99
+ { value: RvcCleanMode.ModeTag.Day }
100
+ ]
101
+ };
102
+ // Create the cluster
103
+ behaviors.require(RvcCleanModeServer360.enable({
104
+ commands: {
105
+ changeToMode: true
106
+ }
107
+ }), {
108
+ // Constant attributes
109
+ supportedModes: labels.map(([mode, label]) => ({
110
+ label,
111
+ mode,
112
+ modeTags: CLEAN_MODE_TAGS[mode]
113
+ })),
114
+ // Variable attributes (with dummy defaults)
115
+ currentMode: RvcCleanMode360.Quiet
116
+ });
117
+ }
118
+ // Create the RVC Operational State cluster
119
+ export function createRvcOperationalStateClusterServer({ behaviors }) {
120
+ behaviors.require(RvcOperationalStateServer360.enable({
121
+ events: {
122
+ operationalError: true,
123
+ operationCompletion: true
124
+ }, commands: {
125
+ pause: true,
126
+ resume: true,
127
+ goHome: true
128
+ }
129
+ }), {
130
+ // Constant attributes
131
+ operationalStateList: [
132
+ { operationalStateId: RvcOperationalState.OperationalState.Stopped },
133
+ { operationalStateId: RvcOperationalState.OperationalState.Running },
134
+ { operationalStateId: RvcOperationalState.OperationalState.Paused },
135
+ { operationalStateId: RvcOperationalState.OperationalState.Error },
136
+ { operationalStateId: RvcOperationalState.OperationalState.SeekingCharger },
137
+ { operationalStateId: RvcOperationalState.OperationalState.Charging },
138
+ { operationalStateId: RvcOperationalState.OperationalState.Docked }
139
+ ],
140
+ // Variable attributes (with dummy defaults)
141
+ operationalState: RvcOperationalState.OperationalState.Stopped,
142
+ operationalError: RvcOperationalStateError.toStruct(),
143
+ // Unsupported attributes
144
+ phaseList: null,
145
+ currentPhase: null,
146
+ countdownTime: null
147
+ });
148
+ }
149
+ //# sourceMappingURL=endpoint-360-rvc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"endpoint-360-rvc.js","sourceRoot":"","sources":["../src/endpoint-360-rvc.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import { PowerSource, RvcOperationalState } from 'matterbridge/matter/clusters';
2
+ import { AnsiLogger } from 'matterbridge/logger';
3
+ import { Config } from './config-types.js';
4
+ import { BatteryPowerSourceOptions, RvcCleanModeOptions } from './endpoint-360-rvc.js';
5
+ import { EndpointBase, EndpointOptionsBase } from './endpoint-base.js';
6
+ import { BehaviorDevice360, EndpointCommands360, RvcCleanMode360, RvcRunMode360 } from './endpoint-360-behavior.js';
7
+ export interface EndpointOptions360 extends EndpointOptionsBase {
8
+ powerSource: BatteryPowerSourceOptions;
9
+ rvcCleanMode: RvcCleanModeOptions;
10
+ }
11
+ export interface UpdatePowerSource360 {
12
+ activeBatChargeFaults: PowerSource.BatChargeFault[];
13
+ activeBatFaults: PowerSource.BatFault[];
14
+ batChargeLevel: PowerSource.BatChargeLevel;
15
+ batChargeState: PowerSource.BatChargeState;
16
+ batPercentRemaining: number;
17
+ status: PowerSource.PowerSourceStatus;
18
+ }
19
+ export interface UpdateRvcOperationalState360 {
20
+ isActive: boolean;
21
+ operationalError: RvcOperationalState.ErrorStateStruct;
22
+ operationalState: RvcOperationalState.OperationalState;
23
+ }
24
+ export declare class Endpoint360 extends EndpointBase {
25
+ readonly options: EndpointOptions360;
26
+ readonly behaviorDevice360: BehaviorDevice360;
27
+ startActive: number;
28
+ constructor(log: AnsiLogger, config: Config, options: EndpointOptions360);
29
+ setCommandHandler360<Command extends keyof EndpointCommands360>(command: Command, handler: EndpointCommands360[Command]): this;
30
+ updatePowerSource(attributes: UpdatePowerSource360): Promise<void>;
31
+ updateRvcRunMode(runMode: RvcRunMode360): Promise<void>;
32
+ updateRvcCleanMode(cleanMode: RvcCleanMode360): Promise<void>;
33
+ updateRvcOperationalState(attributes: UpdateRvcOperationalState360): Promise<void>;
34
+ }
35
+ //# sourceMappingURL=endpoint-360.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"endpoint-360.d.ts","sourceRoot":"","sources":["../src/endpoint-360.ts"],"names":[],"mappings":"AAUA,OAAO,EAEH,WAAW,EAGX,mBAAmB,EACtB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAKH,yBAAyB,EACzB,mBAAmB,EACtB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACH,YAAY,EACZ,mBAAmB,EAEtB,MAAM,oBAAoB,CAAC;AAI5B,OAAO,EAEH,iBAAiB,EACjB,mBAAmB,EACnB,eAAe,EACf,aAAa,EAChB,MAAM,4BAA4B,CAAC;AAGpC,MAAM,WAAW,kBAAmB,SAAQ,mBAAmB;IAC3D,WAAW,EAAK,yBAAyB,CAAC;IAC1C,YAAY,EAAI,mBAAmB,CAAC;CACvC;AAGD,MAAM,WAAW,oBAAoB;IACjC,qBAAqB,EAAG,WAAW,CAAC,cAAc,EAAE,CAAC;IACrD,eAAe,EAAS,WAAW,CAAC,QAAQ,EAAE,CAAC;IAC/C,cAAc,EAAU,WAAW,CAAC,cAAc,CAAC;IACnD,cAAc,EAAU,WAAW,CAAC,cAAc,CAAC;IACnD,mBAAmB,EAAK,MAAM,CAAC;IAC/B,MAAM,EAAkB,WAAW,CAAC,iBAAiB,CAAC;CACzD;AAGD,MAAM,WAAW,4BAA4B;IACzC,QAAQ,EAAgB,OAAO,CAAC;IAChC,gBAAgB,EAAQ,mBAAmB,CAAC,gBAAgB,CAAC;IAC7D,gBAAgB,EAAQ,mBAAmB,CAAC,gBAAgB,CAAC;CAChE;AAGD,qBAAa,WAAY,SAAQ,YAAY;IAYrC,QAAQ,CAAC,OAAO,EAAI,kBAAkB;IAT1C,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB,CAAC;IAG9C,WAAW,SAAK;gBAIZ,GAAG,EAAiB,UAAU,EAC9B,MAAM,EAAc,MAAM,EACjB,OAAO,EAAI,kBAAkB;IAkB1C,oBAAoB,CAAC,OAAO,SAAS,MAAM,mBAAmB,EAC1D,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,mBAAmB,CAAC,OAAO,CAAC,GACtC,IAAI;IAOD,iBAAiB,CAAC,UAAU,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAmDlE,gBAAgB,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAQvD,kBAAkB,CAAC,SAAS,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ7D,yBAAyB,CAAC,UAAU,EAAE,4BAA4B,GAAG,OAAO,CAAC,IAAI,CAAC;CA2C3F"}
@@ -0,0 +1,197 @@
1
+ // Matterbridge plugin for Dyson robot vacuum and air treatment devices
2
+ // Copyright © 2025 Alexander Thoukydides
3
+ var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
4
+ var useValue = arguments.length > 2;
5
+ for (var i = 0; i < initializers.length; i++) {
6
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
7
+ }
8
+ return useValue ? value : void 0;
9
+ };
10
+ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
11
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
12
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
13
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
14
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
15
+ var _, done = false;
16
+ for (var i = decorators.length - 1; i >= 0; i--) {
17
+ var context = {};
18
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
19
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
20
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
21
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
22
+ if (kind === "accessor") {
23
+ if (result === void 0) continue;
24
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
25
+ if (_ = accept(result.get)) descriptor.get = _;
26
+ if (_ = accept(result.set)) descriptor.set = _;
27
+ if (_ = accept(result.init)) initializers.unshift(_);
28
+ }
29
+ else if (_ = accept(result)) {
30
+ if (kind === "field") initializers.unshift(_);
31
+ else descriptor[key] = _;
32
+ }
33
+ }
34
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
35
+ done = true;
36
+ };
37
+ import { bridgedNode, powerSource, roboticVacuumCleaner } from 'matterbridge';
38
+ import { PowerSource, RvcCleanMode, RvcRunMode, RvcOperationalState } from 'matterbridge/matter/clusters';
39
+ import { createBatteryPowerSourceClusterServer, createRvcCleanModeClusterServer, createRvcOperationalStateClusterServer, createRvcRunModeClusterServer } from './endpoint-360-rvc.js';
40
+ import { EndpointBase, formatEnumLog } from './endpoint-base.js';
41
+ import { ifValueChanged } from './decorator-changed.js';
42
+ import { formatList, formatSeconds, MS, plural } from './utils.js';
43
+ import { AN, AV, RI } from './logger-options.js';
44
+ import { Behavior360, BehaviorDevice360, RvcCleanMode360, RvcRunMode360 } from './endpoint-360-behavior.js';
45
+ // A Matterbridge endpoint with robot vacuum cleaner clusters
46
+ let Endpoint360 = (() => {
47
+ let _classSuper = EndpointBase;
48
+ let _instanceExtraInitializers = [];
49
+ let _updatePowerSource_decorators;
50
+ let _updateRvcRunMode_decorators;
51
+ let _updateRvcCleanMode_decorators;
52
+ let _updateRvcOperationalState_decorators;
53
+ return class Endpoint360 extends _classSuper {
54
+ static {
55
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
56
+ _updatePowerSource_decorators = [ifValueChanged];
57
+ _updateRvcRunMode_decorators = [ifValueChanged];
58
+ _updateRvcCleanMode_decorators = [ifValueChanged];
59
+ _updateRvcOperationalState_decorators = [ifValueChanged];
60
+ __esDecorate(this, null, _updatePowerSource_decorators, { kind: "method", name: "updatePowerSource", static: false, private: false, access: { has: obj => "updatePowerSource" in obj, get: obj => obj.updatePowerSource }, metadata: _metadata }, null, _instanceExtraInitializers);
61
+ __esDecorate(this, null, _updateRvcRunMode_decorators, { kind: "method", name: "updateRvcRunMode", static: false, private: false, access: { has: obj => "updateRvcRunMode" in obj, get: obj => obj.updateRvcRunMode }, metadata: _metadata }, null, _instanceExtraInitializers);
62
+ __esDecorate(this, null, _updateRvcCleanMode_decorators, { kind: "method", name: "updateRvcCleanMode", static: false, private: false, access: { has: obj => "updateRvcCleanMode" in obj, get: obj => obj.updateRvcCleanMode }, metadata: _metadata }, null, _instanceExtraInitializers);
63
+ __esDecorate(this, null, _updateRvcOperationalState_decorators, { kind: "method", name: "updateRvcOperationalState", static: false, private: false, access: { has: obj => "updateRvcOperationalState" in obj, get: obj => obj.updateRvcOperationalState }, metadata: _metadata }, null, _instanceExtraInitializers);
64
+ if (_metadata) Object.defineProperty(this, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
65
+ }
66
+ options = __runInitializers(this, _instanceExtraInitializers);
67
+ // Command handlers
68
+ behaviorDevice360;
69
+ // Start time of the most recent activity
70
+ startActive = 0;
71
+ // Construct a new endpoint
72
+ constructor(log, config, options) {
73
+ const definition = [roboticVacuumCleaner, bridgedNode, powerSource];
74
+ super(log, config, options, definition);
75
+ this.options = options;
76
+ // Create the device-specific clusters
77
+ createBatteryPowerSourceClusterServer(this, options.powerSource);
78
+ createRvcRunModeClusterServer(this);
79
+ createRvcCleanModeClusterServer(this, options.rvcCleanMode);
80
+ createRvcOperationalStateClusterServer(this);
81
+ // Add a command handler behavior
82
+ this.behaviorDevice360 = new BehaviorDevice360(this.log);
83
+ this.behaviors.require(Behavior360, { device: this.behaviorDevice360 });
84
+ }
85
+ // Set a command handler
86
+ setCommandHandler360(command, handler) {
87
+ this.behaviorDevice360.setCommandHandler(command, handler);
88
+ return this;
89
+ }
90
+ // Update the Power Source cluster attributes when required
91
+ async updatePowerSource(attributes) {
92
+ const { status, batPercentRemaining, batChargeLevel, batChargeState, activeBatChargeFaults, activeBatFaults } = attributes;
93
+ const clusterId = PowerSource.Cluster.id;
94
+ const logBattery = [
95
+ `${AV}${batPercentRemaining / 2}${RI}%`,
96
+ formatEnumLog(PowerSource.BatChargeLevel, batChargeLevel),
97
+ formatEnumLog(PowerSource.PowerSourceStatus, status),
98
+ formatEnumLog(PowerSource.BatChargeState, batChargeState)
99
+ ];
100
+ if (activeBatFaults.length) {
101
+ const faults = activeBatFaults.map(v => formatEnumLog(PowerSource.BatFault, v));
102
+ logBattery.push(`${AN}${plural(faults.length, 'battery fault', false)}${RI} [${formatList(faults)}${RI}]`);
103
+ }
104
+ if (activeBatChargeFaults.length) {
105
+ const faults = activeBatChargeFaults.map(v => formatEnumLog(PowerSource.BatChargeFault, v));
106
+ logBattery.push(`${AN}${plural(faults.length, 'charge fault', false)}${RI} [${formatList(faults)}${RI}]`);
107
+ }
108
+ this.log.info(`${AN}Battery status${RI}: ${formatList(logBattery)}`);
109
+ await this.updateAttribute(clusterId, 'status', status, this.log);
110
+ await this.updateAttribute(clusterId, 'batPercentRemaining', batPercentRemaining, this.log);
111
+ await this.updateAttribute(clusterId, 'batChargeLevel', batChargeLevel, this.log);
112
+ await this.updateAttribute(clusterId, 'batChargeState', batChargeState, this.log);
113
+ await this.updateAttribute(clusterId, 'activeBatChargeFaults', activeBatChargeFaults, this.log);
114
+ await this.updateAttribute(clusterId, 'activeBatFaults', activeBatFaults, this.log);
115
+ // Trigger BatFaultChange event if activeBatFaults has changed
116
+ const prevActiveBatFaults = (this.changed.prevValues.get('activeBatFaults') ?? []);
117
+ if (this.changed.isChanged('activeBatFaults', activeBatFaults)) {
118
+ const payload = {
119
+ current: activeBatFaults,
120
+ previous: prevActiveBatFaults
121
+ };
122
+ this.log.info(`${AN}Battery Fault Change event${RI}`);
123
+ await this.triggerEvent(clusterId, 'batFaultChange', payload, this.log);
124
+ }
125
+ // Trigger BatChargeFaultChange event if activeBatChargeFaults has changed
126
+ const prevActiveBatChargeFaults = (this.changed.prevValues.get('activeBatChargeFaults') ?? []);
127
+ if (this.changed.isChanged('activeBatChargeFaults', activeBatChargeFaults)) {
128
+ const payload = {
129
+ current: activeBatChargeFaults,
130
+ previous: prevActiveBatChargeFaults
131
+ };
132
+ this.log.info(`${AN}Battery Charge Fault Change event${RI}`);
133
+ await this.triggerEvent(clusterId, 'batChargeFaultChange', payload, this.log);
134
+ }
135
+ }
136
+ // Update the RVC Run Mode cluster attributes when required
137
+ async updateRvcRunMode(runMode) {
138
+ const clusterId = RvcRunMode.Cluster.id;
139
+ this.log.info(`${AN}RVC Run Mode${RI}: ${formatEnumLog(RvcRunMode360, runMode)}`);
140
+ await this.updateAttribute(clusterId, 'currentMode', runMode, this.log);
141
+ }
142
+ // Update the RVC Clean Mode cluster attributes when required
143
+ async updateRvcCleanMode(cleanMode) {
144
+ const clusterId = RvcCleanMode.Cluster.id;
145
+ this.log.info(`${AN}RVC Clean Mode${RI}: ${formatEnumLog(RvcCleanMode360, cleanMode)}`);
146
+ await this.updateAttribute(clusterId, 'currentMode', cleanMode, this.log);
147
+ }
148
+ // Update the RVC Operational State cluster attributes when required
149
+ async updateRvcOperationalState(attributes) {
150
+ const { operationalState, operationalError, isActive } = attributes;
151
+ const clusterId = RvcOperationalState.Cluster.id;
152
+ this.log.info(`${AN}RVC Operational State${RI}: ${formatEnumLog(RvcOperationalState.OperationalState, operationalState)}`);
153
+ await this.updateAttribute(clusterId, 'operationalState', operationalState, this.log);
154
+ await this.updateAttribute(clusterId, 'operationalError', operationalError, this.log);
155
+ // Trigger OperationCompletion event when changing from active to idle
156
+ const { errorStateId, errorStateLabel, errorStateDetails } = operationalError;
157
+ const isError = errorStateId !== RvcOperationalState.ErrorState.NoError;
158
+ if (this.changed.isChanged('isActive', isActive)) {
159
+ if (isActive) {
160
+ this.log.info(`(${AN}RVC Operation Started${RI})`);
161
+ this.startActive = Date.now();
162
+ }
163
+ else if (this.startActive) {
164
+ const totalOperationalTime = Math.round((Date.now() - this.startActive) / MS);
165
+ this.log.info(`${AN}RVC Operation Completion event${RI} in ${AV}${formatSeconds(totalOperationalTime)}${RI}`);
166
+ const payload = {
167
+ completionErrorCode: errorStateId,
168
+ totalOperationalTime
169
+ };
170
+ await this.triggerEvent(clusterId, 'operationCompletion', payload, this.log);
171
+ }
172
+ }
173
+ // Trigger OperationalError event if there is a new error
174
+ if (this.changed.isChanged('operationalError', operationalError)) {
175
+ if (isError) {
176
+ const errorName = RvcOperationalState.ErrorState[errorStateId];
177
+ let logMessage = `${AN}RVC Operational Error event${RI}:`
178
+ + ` ${errorName ? `${AV}${errorName}${RI} (${AV}${errorStateId}${RI})` : `${AV}${errorStateId}${RI}`}`;
179
+ if (errorStateLabel)
180
+ logMessage += ` [${AV}${errorStateLabel}${RI}]`;
181
+ if (errorStateDetails)
182
+ logMessage += `: ${AV}${errorStateDetails}${RI}`;
183
+ this.log.info(logMessage);
184
+ const payload = {
185
+ errorState: operationalError
186
+ };
187
+ await this.triggerEvent(clusterId, 'operationalError', payload, this.log);
188
+ }
189
+ else {
190
+ this.log.info(`${AN}RVC Operational Error${RI}: ${AV}Error cleared${RI}`);
191
+ }
192
+ }
193
+ }
194
+ };
195
+ })();
196
+ export { Endpoint360 };
197
+ //# sourceMappingURL=endpoint-360.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"endpoint-360.js","sourceRoot":"","sources":["../src/endpoint-360.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { Endpoint } from 'matterbridge/matter';
2
+ interface FanRock {
3
+ rockLeftRight?: boolean;
4
+ rockUpDown?: boolean;
5
+ rockRound?: boolean;
6
+ }
7
+ interface FanWind {
8
+ sleepWind?: boolean;
9
+ naturalWind?: boolean;
10
+ }
11
+ export interface FanControlOptions {
12
+ rockSupport?: FanRock;
13
+ windSupport?: FanWind;
14
+ directionSupport: boolean;
15
+ }
16
+ export interface FilterMonitoringOptions {
17
+ filterPartNumbers?: string[];
18
+ }
19
+ export declare function createOnOffClusterServer({ behaviors }: Endpoint): void;
20
+ export declare function createFanControlClusterServer({ behaviors }: Endpoint, options: FanControlOptions): void;
21
+ export declare function createHepaFilterMonitoringClusterServer({ behaviors }: Endpoint, options: FilterMonitoringOptions): void;
22
+ export declare function createActivatedCarbonFilterMonitoringClusterServer({ behaviors }: Endpoint, options: FilterMonitoringOptions): void;
23
+ export {};
24
+ //# sourceMappingURL=endpoint-air-purifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"endpoint-air-purifier.d.ts","sourceRoot":"","sources":["../src/endpoint-air-purifier.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAM/C,UAAU,OAAO;IACb,aAAa,CAAC,EAAU,OAAO,CAAC;IAChC,UAAU,CAAC,EAAa,OAAO,CAAC;IAChC,SAAS,CAAC,EAAc,OAAO,CAAC;CACnC;AACD,UAAU,OAAO;IACb,SAAS,CAAC,EAAc,OAAO,CAAC;IAChC,WAAW,CAAC,EAAY,OAAO,CAAC;CACnC;AACD,MAAM,WAAW,iBAAiB;IAC9B,WAAW,CAAC,EAAY,OAAO,CAAC;IAChC,WAAW,CAAC,EAAY,OAAO,CAAC;IAChC,gBAAgB,EAAQ,OAAO,CAAC;CACnC;AACD,MAAM,WAAW,uBAAuB;IACpC,iBAAiB,CAAC,EAAM,MAAM,EAAE,CAAC;CACpC;AASD,wBAAgB,wBAAwB,CAAC,EAAE,SAAS,EAAE,EAAE,QAAQ,GAAG,IAAI,CAKtE;AAGD,wBAAgB,6BAA6B,CACzC,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,iBAAiB,GACpD,IAAI,CA4BN;AAGD,wBAAgB,uCAAuC,CACnD,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,uBAAuB,GAC1D,IAAI,CAaN;AAGD,wBAAgB,kDAAkD,CAC9D,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,uBAAuB,GAC1D,IAAI,CAaN"}