@matter/examples 0.13.0-alpha.0-20250415-475996bb5 → 0.13.0-alpha.0-20250418-8cfc0b832

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 (33) hide show
  1. package/dist/esm/controller/ControllerNode.js +3 -2
  2. package/dist/esm/controller/ControllerNode.js.map +1 -1
  3. package/dist/esm/device-air-quality-sensor/AirQualitySensorDeviceNode.js +68 -0
  4. package/dist/esm/device-air-quality-sensor/AirQualitySensorDeviceNode.js.map +6 -0
  5. package/dist/esm/device-onoff-advanced/DeviceNodeFull.js +1 -0
  6. package/dist/esm/device-onoff-advanced/DeviceNodeFull.js.map +1 -1
  7. package/dist/esm/device-robotic-vacuum-cleaner/RoboticVacuumCleanerDevice.js +138 -0
  8. package/dist/esm/device-robotic-vacuum-cleaner/RoboticVacuumCleanerDevice.js.map +6 -0
  9. package/dist/esm/device-robotic-vacuum-cleaner/RvcDeviceLogic.js +368 -0
  10. package/dist/esm/device-robotic-vacuum-cleaner/RvcDeviceLogic.js.map +6 -0
  11. package/dist/esm/device-robotic-vacuum-cleaner/behaviors/CustomRvcCleanModeServer.js +35 -0
  12. package/dist/esm/device-robotic-vacuum-cleaner/behaviors/CustomRvcCleanModeServer.js.map +6 -0
  13. package/dist/esm/device-robotic-vacuum-cleaner/behaviors/CustomRvcOperationalStateServer.js +60 -0
  14. package/dist/esm/device-robotic-vacuum-cleaner/behaviors/CustomRvcOperationalStateServer.js.map +6 -0
  15. package/dist/esm/device-robotic-vacuum-cleaner/behaviors/CustomRvcRunModeServer.js +34 -0
  16. package/dist/esm/device-robotic-vacuum-cleaner/behaviors/CustomRvcRunModeServer.js.map +6 -0
  17. package/dist/esm/device-smoke-co-alarm/SmokeCOAlarmDeviceNode.js +41 -0
  18. package/dist/esm/device-smoke-co-alarm/SmokeCOAlarmDeviceNode.js.map +6 -0
  19. package/package.json +9 -5
  20. package/src/controller/ControllerNode.ts +3 -2
  21. package/src/controller/README.md +3 -3
  22. package/src/device-air-quality-sensor/AirQualitySensorDeviceNode.ts +87 -0
  23. package/src/device-air-quality-sensor/README.md +14 -0
  24. package/src/device-onoff-advanced/DeviceNodeFull.ts +2 -1
  25. package/src/device-robotic-vacuum-cleaner/README.md +22 -0
  26. package/src/device-robotic-vacuum-cleaner/RoboticVacuumCleanerDevice.ts +158 -0
  27. package/src/device-robotic-vacuum-cleaner/RvcDeviceLogic.ts +421 -0
  28. package/src/device-robotic-vacuum-cleaner/behaviors/CustomRvcCleanModeServer.ts +39 -0
  29. package/src/device-robotic-vacuum-cleaner/behaviors/CustomRvcOperationalStateServer.ts +79 -0
  30. package/src/device-robotic-vacuum-cleaner/behaviors/CustomRvcRunModeServer.ts +39 -0
  31. package/src/device-smoke-co-alarm/README.md +14 -0
  32. package/src/device-smoke-co-alarm/SmokeCOAlarmDeviceNode.ts +60 -0
  33. package/src/tsconfig.json +3 -0
@@ -0,0 +1,368 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022-2025 Matter.js Authors
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { Behavior, Logger, Time } from "@matter/main";
7
+ import { ServiceAreaServer } from "@matter/main/behaviors/service-area";
8
+ import { RvcOperationalState } from "@matter/main/clusters/rvc-operational-state";
9
+ import { CustomRvcCleanModeServer } from "./behaviors/CustomRvcCleanModeServer.js";
10
+ import { CustomRvcOperationalStateServer } from "./behaviors/CustomRvcOperationalStateServer.js";
11
+ import { CustomRvcRunModeServer } from "./behaviors/CustomRvcRunModeServer.js";
12
+ const logger = Logger.get("RvcDeviceLogic");
13
+ var RvcDeviceRunModes = /* @__PURE__ */ ((RvcDeviceRunModes2) => {
14
+ RvcDeviceRunModes2[RvcDeviceRunModes2["Idle"] = 0] = "Idle";
15
+ RvcDeviceRunModes2[RvcDeviceRunModes2["AutoCleaning"] = 1] = "AutoCleaning";
16
+ RvcDeviceRunModes2[RvcDeviceRunModes2["QuickCleaning"] = 2] = "QuickCleaning";
17
+ RvcDeviceRunModes2[RvcDeviceRunModes2["Mapping"] = 3] = "Mapping";
18
+ return RvcDeviceRunModes2;
19
+ })(RvcDeviceRunModes || {});
20
+ var RvcDeviceCleanMode = /* @__PURE__ */ ((RvcDeviceCleanMode2) => {
21
+ RvcDeviceCleanMode2[RvcDeviceCleanMode2["Vacuuming"] = 0] = "Vacuuming";
22
+ RvcDeviceCleanMode2[RvcDeviceCleanMode2["Mopping"] = 1] = "Mopping";
23
+ return RvcDeviceCleanMode2;
24
+ })(RvcDeviceCleanMode || {});
25
+ var CleaningAreas = /* @__PURE__ */ ((CleaningAreas2) => {
26
+ CleaningAreas2[CleaningAreas2["Kitchen"] = 0] = "Kitchen";
27
+ CleaningAreas2[CleaningAreas2["LivingRoom"] = 1] = "LivingRoom";
28
+ CleaningAreas2[CleaningAreas2["Bedroom"] = 2] = "Bedroom";
29
+ CleaningAreas2[CleaningAreas2["Bathroom"] = 3] = "Bathroom";
30
+ return CleaningAreas2;
31
+ })(CleaningAreas || {});
32
+ var DesiredOperationalDeviceState = /* @__PURE__ */ ((DesiredOperationalDeviceState2) => {
33
+ DesiredOperationalDeviceState2[DesiredOperationalDeviceState2["Idle"] = 0] = "Idle";
34
+ DesiredOperationalDeviceState2[DesiredOperationalDeviceState2["Paused"] = 1] = "Paused";
35
+ DesiredOperationalDeviceState2[DesiredOperationalDeviceState2["Working"] = 2] = "Working";
36
+ return DesiredOperationalDeviceState2;
37
+ })(DesiredOperationalDeviceState || {});
38
+ var DetailOperationalDeviceState = /* @__PURE__ */ ((DetailOperationalDeviceState2) => {
39
+ DetailOperationalDeviceState2[DetailOperationalDeviceState2["SeekingCharger"] = 0] = "SeekingCharger";
40
+ DetailOperationalDeviceState2[DetailOperationalDeviceState2["Docked"] = 1] = "Docked";
41
+ DetailOperationalDeviceState2[DetailOperationalDeviceState2["Charging"] = 2] = "Charging";
42
+ DetailOperationalDeviceState2[DetailOperationalDeviceState2["Cleaning"] = 3] = "Cleaning";
43
+ DetailOperationalDeviceState2[DetailOperationalDeviceState2["Mapping"] = 4] = "Mapping";
44
+ return DetailOperationalDeviceState2;
45
+ })(DetailOperationalDeviceState || {});
46
+ const CLEANING_MAPPING_ROUND_TIME = 10 * 6e4;
47
+ class RvcDeviceLogic extends Behavior {
48
+ static id = "rvcDeviceLogic";
49
+ static early = true;
50
+ async initialize() {
51
+ this.reactTo(this.endpoint.lifecycle.partsReady, this.#initializeNode);
52
+ this.internal.cleaningTimer = Time.getTimer(
53
+ "CleaningTimer",
54
+ CLEANING_MAPPING_ROUND_TIME,
55
+ () => this.#handleCleaningDone()
56
+ );
57
+ this.internal.mappingTimer = Time.getTimer(
58
+ "MappingTimer",
59
+ CLEANING_MAPPING_ROUND_TIME,
60
+ () => this.#handleMappingDone()
61
+ );
62
+ this.internal.rechargingTimer = Time.getTimer("RechargingTimer", 2 * 6e4, () => this.#handleRechargeDone());
63
+ this.internal.autoWaitTimer = Time.getTimer("AutoWaitTimer", 180 * 6e4, () => this.#handleAutoWaitDone());
64
+ this.internal.seekingChargerTimer = Time.getTimer("SeekingChargerTimer", 3e4, () => this.#handleDocking());
65
+ }
66
+ async #initializeNode() {
67
+ const runMode = await this.agent.load(CustomRvcRunModeServer);
68
+ this.reactTo(runMode.events.currentMode$Changed, this.#handleRvcModeChange, {
69
+ offline: true
70
+ });
71
+ const operationalState = await this.agent.load(CustomRvcOperationalStateServer);
72
+ this.reactTo(operationalState.events.pauseTriggered, this.#handlePause);
73
+ this.reactTo(operationalState.events.resumeTriggered, this.#handleResume);
74
+ this.reactTo(operationalState.events.goHomeTriggered, this.#handleGoHome);
75
+ const serviceArea = await this.agent.load(ServiceAreaServer);
76
+ this.reactTo(serviceArea.events.selectedAreas$Changed, this.#selectedAreasChange);
77
+ }
78
+ /**
79
+ * When the run mode is changed, start the relevant timers based on the mode and clean mode
80
+ */
81
+ async #handleRvcModeChange(newMode, oldMode) {
82
+ logger.info(`RVC mode changed from ${RvcDeviceRunModes[oldMode]} to ${RvcDeviceRunModes[newMode]}`);
83
+ this.internal.runMode = newMode;
84
+ switch (newMode) {
85
+ case 0 /* Idle */:
86
+ await this.#returnToIdleMode();
87
+ break;
88
+ case 1 /* AutoCleaning */:
89
+ case 2 /* QuickCleaning */:
90
+ await this.#startCleaningMode(newMode);
91
+ break;
92
+ case 3 /* Mapping */:
93
+ await this.#startMappingMode();
94
+ }
95
+ }
96
+ /**
97
+ * Returns the device to idle mode by switching the desired operational state to idle.
98
+ * This means that also after recharging nothing happens.
99
+ * This stops all timers and sets the device to seeking charger mode if it is cleaning or mapping.
100
+ */
101
+ async #returnToIdleMode() {
102
+ this.internal.autoWaitTimer.stop();
103
+ this.internal.mappingTimer.stop();
104
+ this.internal.cleaningTimer.stop();
105
+ await this.endpoint.setStateOf(ServiceAreaServer, {
106
+ currentArea: null
107
+ });
108
+ this.internal.cleaningRoundsLeft = 0;
109
+ this.internal.desiredOperationalState = 0 /* Idle */;
110
+ if (this.internal.detailOperationalState === 3 /* Cleaning */ || this.internal.detailOperationalState === 4 /* Mapping */) {
111
+ logger.info(
112
+ `Switching to Idle mode. Cancelling ${DetailOperationalDeviceState[this.internal.detailOperationalState]} and returning to dock now ...`
113
+ );
114
+ this.internal.detailOperationalState = 0 /* SeekingCharger */;
115
+ await this.endpoint.setStateOf(CustomRvcOperationalStateServer, {
116
+ operationalState: RvcOperationalState.OperationalState.SeekingCharger
117
+ });
118
+ this.internal.seekingChargerTimer.start();
119
+ } else {
120
+ logger.info("Switch to Idle mode");
121
+ }
122
+ }
123
+ /**
124
+ * Starts the cleaning mode.
125
+ * If the device is not docked, it will wait until it is docked to start cleaning.
126
+ * If the cleaning ist started in AutoCleaning mode, it will do three rounds of cleaning, in QuickCleaning mode
127
+ * just one round. If action was paused it will continue with the planned rounds.
128
+ */
129
+ async #startCleaningMode(mode) {
130
+ this.internal.desiredOperationalState = 2 /* Working */;
131
+ if (this.internal.detailOperationalState === 1 /* Docked */ || this.internal.detailOperationalState === 3 /* Cleaning */ || this.internal.detailOperationalState === 4 /* Mapping */) {
132
+ this.internal.detailOperationalState = 3 /* Cleaning */;
133
+ await this.endpoint.setStateOf(CustomRvcOperationalStateServer, {
134
+ operationalState: RvcOperationalState.OperationalState.Running
135
+ });
136
+ if (this.internal.cleaningRoundsLeft === 0) {
137
+ this.internal.cleaningRoundsLeft = mode === 1 /* AutoCleaning */ ? 3 : 1;
138
+ }
139
+ this.internal.cleaningTimer.start();
140
+ await this.#startServiceAreaChange();
141
+ const cleanMode = this.endpoint.stateOf(CustomRvcCleanModeServer).currentMode;
142
+ logger.info(
143
+ `Starting ${RvcDeviceCleanMode[cleanMode]} ${RvcDeviceRunModes[mode]} (${this.internal.cleaningRoundsLeft} round(s)) ...`
144
+ );
145
+ } else {
146
+ logger.info(
147
+ `Delayed start of cleaning with mode ${RvcDeviceRunModes[mode]} until docked (currently ${DetailOperationalDeviceState[this.internal.detailOperationalState]})`
148
+ );
149
+ }
150
+ }
151
+ /**
152
+ * Starts the mapping mode.
153
+ * If the device is not docked, it will wait until it is docked to start mapping.
154
+ */
155
+ async #startMappingMode() {
156
+ this.internal.desiredOperationalState = 2 /* Working */;
157
+ if (this.internal.detailOperationalState === 1 /* Docked */) {
158
+ this.internal.detailOperationalState = 4 /* Mapping */;
159
+ await this.endpoint.setStateOf(CustomRvcOperationalStateServer, {
160
+ operationalState: RvcOperationalState.OperationalState.Running
161
+ });
162
+ this.internal.mappingTimer.start();
163
+ await this.#startServiceAreaChange();
164
+ logger.info(`Starting mapping ...`);
165
+ } else {
166
+ logger.info(
167
+ `Delayed start of mapping until docked (currently ${DetailOperationalDeviceState[this.internal.detailOperationalState]})`
168
+ );
169
+ }
170
+ }
171
+ /** Handles a Pause command and pauses the current action, but remembers the current mode. */
172
+ async #handlePause() {
173
+ if (this.internal.desiredOperationalState === 2 /* Working */) {
174
+ const cleanMode = this.endpoint.stateOf(CustomRvcCleanModeServer).currentMode;
175
+ logger.info(
176
+ `Pausing current action ${RvcDeviceCleanMode[cleanMode]} ${RvcDeviceRunModes[this.internal.runMode]}...`
177
+ );
178
+ this.internal.desiredOperationalState = 1 /* Paused */;
179
+ await this.endpoint.setStateOf(CustomRvcOperationalStateServer, {
180
+ operationalState: RvcOperationalState.OperationalState.Paused
181
+ });
182
+ this.internal.mappingTimer.stop();
183
+ this.internal.cleaningTimer.stop();
184
+ }
185
+ }
186
+ /** Handles a Resume command and resumes the current action in the previous mode. */
187
+ async #handleResume() {
188
+ if (this.internal.desiredOperationalState === 1 /* Paused */) {
189
+ const cleanMode = this.endpoint.stateOf(CustomRvcCleanModeServer).currentMode;
190
+ logger.info(
191
+ `Resuming current action ${RvcDeviceCleanMode[cleanMode]} ${RvcDeviceRunModes[this.internal.runMode]}...`
192
+ );
193
+ this.internal.desiredOperationalState = 2 /* Working */;
194
+ await this.endpoint.setStateOf(CustomRvcOperationalStateServer, {
195
+ operationalState: RvcOperationalState.OperationalState.Running
196
+ });
197
+ switch (this.internal.runMode) {
198
+ case 1 /* AutoCleaning */:
199
+ case 2 /* QuickCleaning */:
200
+ await this.#startCleaningMode(this.internal.runMode);
201
+ break;
202
+ case 3 /* Mapping */:
203
+ await this.#startMappingMode();
204
+ break;
205
+ }
206
+ }
207
+ }
208
+ /** Handles a GoHome command and returns the device to the dock and cancels all activities. */
209
+ async #handleGoHome() {
210
+ if (this.internal.desiredOperationalState !== 0 /* Idle */) {
211
+ this.internal.cleaningRoundsLeft = 0;
212
+ this.internal.desiredOperationalState = 0 /* Idle */;
213
+ if (this.internal.detailOperationalState === 3 /* Cleaning */ || this.internal.detailOperationalState === 4 /* Mapping */) {
214
+ this.internal.cleaningTimer.stop();
215
+ this.internal.mappingTimer.stop();
216
+ await this.endpoint.setStateOf(ServiceAreaServer, {
217
+ currentArea: null
218
+ });
219
+ const cleanMode = this.endpoint.stateOf(CustomRvcCleanModeServer).currentMode;
220
+ logger.info(
221
+ `Returning to dock from ${RvcDeviceCleanMode[cleanMode]} ${DetailOperationalDeviceState[this.internal.detailOperationalState]} ...`
222
+ );
223
+ await this.endpoint.setStateOf(CustomRvcOperationalStateServer, {
224
+ operationalState: RvcOperationalState.OperationalState.SeekingCharger
225
+ });
226
+ this.internal.seekingChargerTimer.start();
227
+ }
228
+ }
229
+ }
230
+ /** Handles the end of one cleaning round and sends the device back to the charging station. */
231
+ async #handleCleaningDone() {
232
+ this.internal.cleaningRoundsLeft--;
233
+ logger.info(
234
+ `Cleaning run done. ${this.internal.cleaningRoundsLeft} rounds left. Returning to dock for recharge...`
235
+ );
236
+ await this.endpoint.setStateOf(CustomRvcOperationalStateServer, {
237
+ operationalState: RvcOperationalState.OperationalState.SeekingCharger
238
+ });
239
+ this.internal.seekingChargerTimer.start();
240
+ }
241
+ /** Handles the end of one mapping round and sends the device back to the charging station. */
242
+ async #handleMappingDone() {
243
+ logger.info(
244
+ `Mapping run done. ${this.internal.cleaningRoundsLeft} rounds left. Returning to dock for recharge...`
245
+ );
246
+ await this.endpoint.setStateOf(CustomRvcOperationalStateServer, {
247
+ operationalState: RvcOperationalState.OperationalState.SeekingCharger
248
+ });
249
+ this.internal.seekingChargerTimer.start();
250
+ }
251
+ /** handles the return of the device to the charger and starts the charging cycle. */
252
+ async #handleDocking() {
253
+ logger.info(
254
+ `Docked successfully. Recharging now ... ${this.internal.cleaningRoundsLeft} cleaning rounds left.`
255
+ );
256
+ this.internal.detailOperationalState = 2 /* Charging */;
257
+ await this.endpoint.setStateOf(CustomRvcOperationalStateServer, {
258
+ operationalState: RvcOperationalState.OperationalState.Charging
259
+ });
260
+ this.internal.rechargingTimer.start();
261
+ if (this.internal.cleaningRoundsLeft === 0) {
262
+ logger.info("Current actions done, switch to Idle Mode ...");
263
+ this.internal.desiredOperationalState = 0 /* Idle */;
264
+ await this.endpoint.setStateOf(CustomRvcRunModeServer, {
265
+ currentMode: 0 /* Idle */
266
+ });
267
+ }
268
+ }
269
+ /** Handles the end of the recharging cycle and starts the next cleaning round or goes to idle mode. */
270
+ async #handleRechargeDone() {
271
+ if (this.internal.desiredOperationalState === 2 /* Working */) {
272
+ if (this.internal.cleaningRoundsLeft > 0) {
273
+ const cleanMode = this.endpoint.stateOf(CustomRvcCleanModeServer).currentMode;
274
+ logger.info(
275
+ `Recharging done. Executing next ${RvcDeviceCleanMode[cleanMode]} ${DetailOperationalDeviceState[this.internal.detailOperationalState]} round ...`
276
+ );
277
+ await this.#startCleaningMode(this.internal.runMode);
278
+ return;
279
+ } else if (this.internal.runMode === 1 /* AutoCleaning */) {
280
+ this.internal.autoWaitTimer.start();
281
+ logger.info(`Recharging done. Waiting for next cleaning round in Auto mode ...`);
282
+ } else {
283
+ logger.info(`Recharging done. Switching to Idle mode ...`);
284
+ this.internal.desiredOperationalState = 0 /* Idle */;
285
+ await this.endpoint.setStateOf(CustomRvcRunModeServer, {
286
+ currentMode: 0 /* Idle */
287
+ });
288
+ }
289
+ } else {
290
+ logger.info(`Recharging done. Switching to Idle mode ...`);
291
+ }
292
+ this.internal.detailOperationalState = 1 /* Docked */;
293
+ await this.endpoint.setStateOf(CustomRvcOperationalStateServer, {
294
+ operationalState: RvcOperationalState.OperationalState.Docked
295
+ });
296
+ }
297
+ /** Handles passing the time of the Auto Clean waiting time and starts a new cleaning round. */
298
+ async #handleAutoWaitDone() {
299
+ logger.info(`Auto wait done. Starting next cleaning round ...`);
300
+ await this.#startCleaningMode(this.internal.runMode);
301
+ }
302
+ /** Logs changed elected areas. */
303
+ #selectedAreasChange(newAreas) {
304
+ logger.info(
305
+ "Selected areas changed to",
306
+ newAreas.map((area) => CleaningAreas[area])
307
+ );
308
+ }
309
+ /** Initialize the service area change timer to change the current area while cleaning or mapping. */
310
+ async #startServiceAreaChange() {
311
+ this.internal.serviceAreaChangeTimer?.stop();
312
+ const selectedAreas = this.endpoint.stateOf(ServiceAreaServer).selectedAreas;
313
+ const numberOfAreas = selectedAreas.length || this.endpoint.stateOf(ServiceAreaServer).supportedAreas.length;
314
+ this.internal.serviceAreaChangeTimer = Time.getPeriodicTimer(
315
+ "ServiceAreaChangeTimer",
316
+ CLEANING_MAPPING_ROUND_TIME / numberOfAreas + 1e3,
317
+ // Two Areas by default
318
+ () => this.#changeCurrentServiceArea()
319
+ ).start();
320
+ await this.#changeCurrentServiceArea();
321
+ }
322
+ /**
323
+ * During Cleaning otr Mapping we simulate that we also work through the selected areas, so we need to change the
324
+ * current area.
325
+ */
326
+ async #changeCurrentServiceArea() {
327
+ const serviceAreaState = this.endpoint.stateOf(ServiceAreaServer);
328
+ const selectedAreas = serviceAreaState.selectedAreas.length ? serviceAreaState.selectedAreas : serviceAreaState.supportedAreas;
329
+ const currentArea = serviceAreaState.currentArea ?? 0;
330
+ const nextArea = (currentArea + 1) % selectedAreas.length;
331
+ await this.endpoint.setStateOf(ServiceAreaServer, {
332
+ currentArea: nextArea
333
+ });
334
+ logger.info(`Changed service area to ${CleaningAreas[nextArea]}`);
335
+ }
336
+ /** When the Endpoint is closed stop all timer. */
337
+ async [Symbol.asyncDispose]() {
338
+ this.internal.cleaningTimer.stop();
339
+ this.internal.mappingTimer.stop();
340
+ this.internal.rechargingTimer.stop();
341
+ this.internal.autoWaitTimer.stop();
342
+ this.internal.seekingChargerTimer.stop();
343
+ this.internal.serviceAreaChangeTimer?.stop();
344
+ await super[Symbol.asyncDispose]?.();
345
+ }
346
+ }
347
+ ((RvcDeviceLogic2) => {
348
+ class Internal {
349
+ desiredOperationalState = 0 /* Idle */;
350
+ detailOperationalState = 1 /* Docked */;
351
+ runMode = 0 /* Idle */;
352
+ cleaningTimer;
353
+ mappingTimer;
354
+ serviceAreaChangeTimer;
355
+ rechargingTimer;
356
+ autoWaitTimer;
357
+ seekingChargerTimer;
358
+ cleaningRoundsLeft = 0;
359
+ }
360
+ RvcDeviceLogic2.Internal = Internal;
361
+ })(RvcDeviceLogic || (RvcDeviceLogic = {}));
362
+ export {
363
+ CleaningAreas,
364
+ RvcDeviceCleanMode,
365
+ RvcDeviceLogic,
366
+ RvcDeviceRunModes
367
+ };
368
+ //# sourceMappingURL=RvcDeviceLogic.js.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/device-robotic-vacuum-cleaner/RvcDeviceLogic.ts"],
4
+ "mappings": "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",
5
+ "names": ["RvcDeviceRunModes", "RvcDeviceCleanMode", "CleaningAreas", "DesiredOperationalDeviceState", "DetailOperationalDeviceState", "RvcDeviceLogic"]
6
+ }
@@ -0,0 +1,35 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022-2025 Matter.js Authors
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { ModeUtils } from "@matter/main/behaviors/mode-base";
7
+ import { RvcCleanModeServer } from "@matter/main/behaviors/rvc-clean-mode";
8
+ import { ModeBase } from "@matter/main/clusters/mode-base";
9
+ import { RvcOperationalState } from "@matter/main/clusters/rvc-operational-state";
10
+ import { CustomRvcOperationalStateServer } from "./CustomRvcOperationalStateServer.js";
11
+ class CustomRvcCleanModeServer extends RvcCleanModeServer {
12
+ initialize() {
13
+ super.initialize();
14
+ }
15
+ /** Change more implementation. We do not call super.changeToMode() here because we want to add own validations. */
16
+ changeToMode({ newMode }) {
17
+ const result = ModeUtils.assertModeChange(this.state.supportedModes, this.state.currentMode, newMode);
18
+ if (result.status !== ModeBase.ModeChangeStatus.Success) {
19
+ return result;
20
+ }
21
+ const state = this.endpoint.stateOf(CustomRvcOperationalStateServer).operationalState;
22
+ if (state === RvcOperationalState.OperationalState.Running) {
23
+ return {
24
+ status: ModeBase.ModeChangeStatus.InvalidInMode,
25
+ statusText: "Can not switch operative modes while device is operating."
26
+ };
27
+ }
28
+ this.state.currentMode = newMode;
29
+ return result;
30
+ }
31
+ }
32
+ export {
33
+ CustomRvcCleanModeServer
34
+ };
35
+ //# sourceMappingURL=CustomRvcCleanModeServer.js.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/device-robotic-vacuum-cleaner/behaviors/CustomRvcCleanModeServer.ts"],
4
+ "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,SAAS,iBAAiB;AAC1B,SAAS,0BAA0B;AACnC,SAAS,gBAAgB;AACzB,SAAS,2BAA2B;AACpC,SAAS,uCAAuC;AAOzC,MAAM,iCAAiC,mBAAmB;AAAA,EACpD,aAAa;AAClB,UAAM,WAAW;AAAA,EACrB;AAAA;AAAA,EAGS,aAAa,EAAE,QAAQ,GAAgE;AAC5F,UAAM,SAAS,UAAU,iBAAiB,KAAK,MAAM,gBAAgB,KAAK,MAAM,aAAa,OAAO;AACpG,QAAI,OAAO,WAAW,SAAS,iBAAiB,SAAS;AACrD,aAAO;AAAA,IACX;AACA,UAAM,QAAQ,KAAK,SAAS,QAAQ,+BAA+B,EAAE;AACrE,QAAI,UAAU,oBAAoB,iBAAiB,SAAS;AACxD,aAAO;AAAA,QACH,QAAQ,SAAS,iBAAiB;AAAA,QAClC,YAAY;AAAA,MAChB;AAAA,IACJ;AACA,SAAK,MAAM,cAAc;AACzB,WAAO;AAAA,EACX;AACJ;",
5
+ "names": []
6
+ }
@@ -0,0 +1,60 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022-2025 Matter.js Authors
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { AsyncObservable } from "@matter/main";
7
+ import { OperationalStateUtils } from "@matter/main/behaviors/operational-state";
8
+ import { RvcOperationalStateServer } from "@matter/main/behaviors/rvc-operational-state";
9
+ import { OperationalState } from "@matter/main/clusters/operational-state";
10
+ import { RvcOperationalState } from "@matter/main/clusters/rvc-operational-state";
11
+ class CustomRvcOperationalStateServer extends RvcOperationalStateServer {
12
+ async goHome() {
13
+ const result = OperationalStateUtils.assertRvcGoHome(this.state.operationalState);
14
+ if (result.commandResponseState.errorStateId === OperationalState.ErrorState.NoError && this.state.operationalState !== RvcOperationalState.OperationalState.SeekingCharger) {
15
+ await this.events.goHomeTriggered.emit();
16
+ }
17
+ return result;
18
+ }
19
+ async pause() {
20
+ const result = OperationalStateUtils.assertPause(this.state.operationalState);
21
+ if (result.commandResponseState.errorStateId === OperationalState.ErrorState.NoError && this.state.operationalState !== RvcOperationalState.OperationalState.Paused) {
22
+ if (this.state.operationalState === RvcOperationalState.OperationalState.Charging || this.state.operationalState === RvcOperationalState.OperationalState.Docked) {
23
+ return {
24
+ commandResponseState: {
25
+ errorStateId: OperationalState.ErrorState.CommandInvalidInState
26
+ }
27
+ };
28
+ }
29
+ await this.events.pauseTriggered.emit();
30
+ }
31
+ return result;
32
+ }
33
+ async resume() {
34
+ const result = OperationalStateUtils.assertResume(this.state.operationalState);
35
+ if (result.commandResponseState.errorStateId === OperationalState.ErrorState.NoError && this.state.operationalState !== RvcOperationalState.OperationalState.Paused) {
36
+ if (this.state.operationalState === RvcOperationalState.OperationalState.SeekingCharger) {
37
+ return {
38
+ commandResponseState: {
39
+ errorStateId: OperationalState.ErrorState.CommandInvalidInState
40
+ }
41
+ };
42
+ }
43
+ } else {
44
+ await this.events.resumeTriggered.emit();
45
+ }
46
+ return result;
47
+ }
48
+ }
49
+ ((CustomRvcOperationalStateServer2) => {
50
+ class Events extends RvcOperationalStateServer.Events {
51
+ resumeTriggered = AsyncObservable();
52
+ pauseTriggered = AsyncObservable();
53
+ goHomeTriggered = AsyncObservable();
54
+ }
55
+ CustomRvcOperationalStateServer2.Events = Events;
56
+ })(CustomRvcOperationalStateServer || (CustomRvcOperationalStateServer = {}));
57
+ export {
58
+ CustomRvcOperationalStateServer
59
+ };
60
+ //# sourceMappingURL=CustomRvcOperationalStateServer.js.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/device-robotic-vacuum-cleaner/behaviors/CustomRvcOperationalStateServer.ts"],
4
+ "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAKA,SAAS,uBAAuB;AAChC,SAAS,6BAA6B;AACtC,SAAS,iCAAiC;AAC1C,SAAS,wBAAwB;AACjC,SAAS,2BAA2B;AAQ7B,MAAM,wCAAwC,0BAA0B;AAAA,EAG3E,MAAe,SAAkE;AAC7E,UAAM,SAAS,sBAAsB,gBAAgB,KAAK,MAAM,gBAAgB;AAChF,QACI,OAAO,qBAAqB,iBAAiB,iBAAiB,WAAW,WACzE,KAAK,MAAM,qBAAqB,oBAAoB,iBAAiB,gBACvE;AACE,YAAM,KAAK,OAAO,gBAAgB,KAAK;AAAA,IAC3C;AACA,WAAO;AAAA,EACX;AAAA,EAEA,MAAe,QAAiE;AAC5E,UAAM,SAAS,sBAAsB,YAAY,KAAK,MAAM,gBAAgB;AAC5E,QACI,OAAO,qBAAqB,iBAAiB,iBAAiB,WAAW,WACzE,KAAK,MAAM,qBAAqB,oBAAoB,iBAAiB,QACvE;AACE,UACI,KAAK,MAAM,qBAAqB,oBAAoB,iBAAiB,YACrE,KAAK,MAAM,qBAAqB,oBAAoB,iBAAiB,QACvE;AACE,eAAO;AAAA,UACH,sBAAsB;AAAA,YAClB,cAAc,iBAAiB,WAAW;AAAA,UAC9C;AAAA,QACJ;AAAA,MACJ;AACA,YAAM,KAAK,OAAO,eAAe,KAAK;AAAA,IAC1C;AACA,WAAO;AAAA,EACX;AAAA,EAEA,MAAe,SAAkE;AAC7E,UAAM,SAAS,sBAAsB,aAAa,KAAK,MAAM,gBAAgB;AAC7E,QACI,OAAO,qBAAqB,iBAAiB,iBAAiB,WAAW,WACzE,KAAK,MAAM,qBAAqB,oBAAoB,iBAAiB,QACvE;AACE,UAAI,KAAK,MAAM,qBAAqB,oBAAoB,iBAAiB,gBAAgB;AACrF,eAAO;AAAA,UACH,sBAAsB;AAAA,YAClB,cAAc,iBAAiB,WAAW;AAAA,UAC9C;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ,OAAO;AACH,YAAM,KAAK,OAAO,gBAAgB,KAAK;AAAA,IAC3C;AACA,WAAO;AAAA,EACX;AACJ;AAAA,CAEO,CAAUA,qCAAV;AAAA,EACI,MAAM,eAAe,0BAA0B,OAAO;AAAA,IACzD,kBAAkB,gBAAgB;AAAA,IAClC,iBAAiB,gBAAgB;AAAA,IACjC,kBAAkB,gBAAgB;AAAA,EACtC;AAJO,EAAAA,iCAAM;AAAA,GADA;",
5
+ "names": ["CustomRvcOperationalStateServer"]
6
+ }
@@ -0,0 +1,34 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022-2025 Matter.js Authors
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { ModeUtils } from "@matter/main/behaviors/mode-base";
7
+ import { RvcRunModeServer } from "@matter/main/behaviors/rvc-run-mode";
8
+ import { ModeBase } from "@matter/main/clusters/mode-base";
9
+ import { RvcDeviceRunModes } from "../RvcDeviceLogic.js";
10
+ class CustomRvcRunModeServer extends RvcRunModeServer {
11
+ initialize() {
12
+ super.initialize();
13
+ this.state.currentMode = RvcDeviceRunModes.Idle;
14
+ }
15
+ /** Change more implementation. We do not call super.changeToMode() here because we want to add own validations. */
16
+ changeToMode({ newMode }) {
17
+ const result = ModeUtils.assertModeChange(this.state.supportedModes, this.state.currentMode, newMode);
18
+ if (result.status !== ModeBase.ModeChangeStatus.Success) {
19
+ return result;
20
+ }
21
+ if (newMode !== RvcDeviceRunModes.Idle && this.state.currentMode !== RvcDeviceRunModes.Idle) {
22
+ return {
23
+ status: ModeBase.ModeChangeStatus.InvalidInMode,
24
+ statusText: `Can not switch operative modes while in a non-idle state (${this.state.currentMode})`
25
+ };
26
+ }
27
+ this.state.currentMode = newMode;
28
+ return result;
29
+ }
30
+ }
31
+ export {
32
+ CustomRvcRunModeServer
33
+ };
34
+ //# sourceMappingURL=CustomRvcRunModeServer.js.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/device-robotic-vacuum-cleaner/behaviors/CustomRvcRunModeServer.ts"],
4
+ "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,SAAS,iBAAiB;AAC1B,SAAS,wBAAwB;AACjC,SAAS,gBAAgB;AACzB,SAAS,yBAAyB;AAQ3B,MAAM,+BAA+B,iBAAiB;AAAA,EAChD,aAAa;AAClB,UAAM,WAAW;AACjB,SAAK,MAAM,cAAc,kBAAkB;AAAA,EAC/C;AAAA;AAAA,EAGS,aAAa,EAAE,QAAQ,GAAgE;AAC5F,UAAM,SAAS,UAAU,iBAAiB,KAAK,MAAM,gBAAgB,KAAK,MAAM,aAAa,OAAO;AACpG,QAAI,OAAO,WAAW,SAAS,iBAAiB,SAAS;AACrD,aAAO;AAAA,IACX;AACA,QAAI,YAAY,kBAAkB,QAAQ,KAAK,MAAM,gBAAgB,kBAAkB,MAAM;AACzF,aAAO;AAAA,QACH,QAAQ,SAAS,iBAAiB;AAAA,QAClC,YAAY,6DAA6D,KAAK,MAAM,WAAW;AAAA,MACnG;AAAA,IACJ;AACA,SAAK,MAAM,cAAc;AACzB,WAAO;AAAA,EACX;AACJ;",
5
+ "names": []
6
+ }
@@ -0,0 +1,41 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * @license
4
+ * Copyright 2022-2025 Matter.js Authors
5
+ * SPDX-License-Identifier: Apache-2.0
6
+ */
7
+ import { Endpoint, ServerNode } from "@matter/main";
8
+ import { CarbonDioxideConcentrationMeasurementServer } from "@matter/main/behaviors/carbon-dioxide-concentration-measurement";
9
+ import { SmokeCoAlarmServer } from "@matter/main/behaviors/smoke-co-alarm";
10
+ import { ConcentrationMeasurement } from "@matter/main/clusters/concentration-measurement";
11
+ import { SmokeCoAlarmDevice } from "@matter/main/devices/smoke-co-alarm";
12
+ const smokeCoAlarmEndpoint = new Endpoint(
13
+ SmokeCoAlarmDevice.with(
14
+ CarbonDioxideConcentrationMeasurementServer.with("NumericMeasurement", "PeakMeasurement", "AverageMeasurement"),
15
+ SmokeCoAlarmServer.with("SmokeAlarm", "CoAlarm")
16
+ ),
17
+ {
18
+ id: "smokeCoAlarm",
19
+ smokeCoAlarm: {
20
+ /*
21
+ The following values are set as defaults by the SmokeCoAlarmServer class. You can override them here.
22
+ expressedState: SmokeCoAlarm.ExpressedState.Normal,
23
+ smokeState: SmokeCoAlarm.AlarmState.Normal,
24
+ coState: SmokeCoAlarm.AlarmState.Normal,
25
+ batteryAlert: SmokeCoAlarm.AlarmState.Normal,
26
+ testInProgress: false,
27
+ hardwareFaultAlert: false,
28
+ endOfServiceAlert: SmokeCoAlarm.EndOfService.Normal,
29
+ */
30
+ },
31
+ carbonDioxideConcentrationMeasurement: {
32
+ measuredValue: 12.34,
33
+ measurementUnit: ConcentrationMeasurement.MeasurementUnit.Ppm,
34
+ measurementMedium: ConcentrationMeasurement.MeasurementMedium.Air
35
+ }
36
+ }
37
+ );
38
+ const node = await ServerNode.create();
39
+ await node.add(smokeCoAlarmEndpoint);
40
+ await node.run();
41
+ //# sourceMappingURL=SmokeCOAlarmDeviceNode.js.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/device-smoke-co-alarm/SmokeCOAlarmDeviceNode.ts"],
4
+ "mappings": ";AACA;AAAA;AAAA;AAAA;AAAA;AAWA,SAAS,UAAU,kBAAkB;AACrC,SAAS,mDAAmD;AAC5D,SAAS,0BAA0B;AACnC,SAAS,gCAAgC;AACzC,SAAS,0BAA0B;AAGnC,MAAM,uBAAuB,IAAI;AAAA,EAC7B,mBAAmB;AAAA,IACf,4CAA4C,KAAK,sBAAsB,mBAAmB,oBAAoB;AAAA,IAC9G,mBAAmB,KAAK,cAAc,SAAS;AAAA,EACnD;AAAA,EACA;AAAA,IACI,IAAI;AAAA,IACJ,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAWd;AAAA,IACA,uCAAuC;AAAA,MACnC,eAAe;AAAA,MACf,iBAAiB,yBAAyB,gBAAgB;AAAA,MAC1D,mBAAmB,yBAAyB,kBAAkB;AAAA,IAClE;AAAA,EACJ;AACJ;AAOA,MAAM,OAAO,MAAM,WAAW,OAAO;AAGrC,MAAM,KAAK,IAAI,oBAAoB;AAKnC,MAAM,KAAK,IAAI;",
5
+ "names": []
6
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@matter/examples",
3
- "version": "0.13.0-alpha.0-20250415-475996bb5",
3
+ "version": "0.13.0-alpha.0-20250418-8cfc0b832",
4
4
  "description": "Matter.js examples and reference implementations",
5
5
  "keywords": [
6
6
  "iot",
@@ -30,12 +30,15 @@
30
30
  "build-clean": "matter-build --clean",
31
31
  "matter-light": "matter-run src/device-onoff-light/LightDevice.ts",
32
32
  "matter-measuredsocket": "matter-run src/device-measuring-socket/MeasuredSocketDevice.ts",
33
+ "matter-rvc": "matter-run src/device-robotic-vacuum-cleaner/RoboticVacuumCleanerDevice.ts",
33
34
  "matter-sensor": "matter-run src/device-sensor/SensorDeviceNode.ts",
34
35
  "matter-excelsior1000": "matter-run src/device-composed-wc-light/IlluminatedRollerShade.ts",
35
36
  "matter-device": "matter-run src/device-onoff/DeviceNode.ts",
36
37
  "matter-bridge": "matter-run src/device-bridge-onoff/BridgedDevicesNode.ts",
37
38
  "matter-composeddevice": "matter-run src/device-composed-onoff/ComposedDeviceNode.ts",
38
39
  "matter-multidevice": "matter-run src/device-multiple-onoff/MultiDeviceNode.ts",
40
+ "matter-air-quality-sensor": "matter-run src/device-air-quality-sensor/AirQualitySensorDeviceNode.ts",
41
+ "matter-smoke-co-alarm": "matter-run src/device-smoke-co-alarm/SmokeCoAlarmDeviceNode.ts",
39
42
  "matter-controller": "matter-run src/controller/ControllerNode.ts",
40
43
  "bundle-device": "esbuild src/device-onoff/DeviceNode.ts --bundle --platform=node --conditions=esbuild --external:@stoprocent/bleno --external:@stoprocent/bluetooth-hci-socket --sourcemap --minify --keep-names --outfile=build/bundle/DeviceNode.cjs",
41
44
  "matter-device-bundled": "node --enable-source-maps build/bundle/DeviceNode.cjs"
@@ -52,13 +55,14 @@
52
55
  "matter-controller": "dist/esm/controller/ControllerNode.js"
53
56
  },
54
57
  "dependencies": {
55
- "@matter/main": "0.13.0-alpha.0-20250415-475996bb5",
56
- "@matter/nodejs": "0.13.0-alpha.0-20250415-475996bb5",
57
- "@matter/tools": "0.13.0-alpha.0-20250415-475996bb5",
58
+ "@matter/main": "0.13.0-alpha.0-20250418-8cfc0b832",
59
+ "@matter/nodejs": "0.13.0-alpha.0-20250418-8cfc0b832",
60
+ "@matter/tools": "0.13.0-alpha.0-20250418-8cfc0b832",
61
+ "@project-chip/matter.js": "0.13.0-alpha.0-20250418-8cfc0b832",
58
62
  "esbuild": "^0.25.2"
59
63
  },
60
64
  "optionalDependencies": {
61
- "@matter/nodejs-ble": "0.13.0-alpha.0-20250415-475996bb5"
65
+ "@matter/nodejs-ble": "0.13.0-alpha.0-20250418-8cfc0b832"
62
66
  },
63
67
  "engines": {
64
68
  "node": ">=18.0.0"