matterbridge-example-dynamic-platform 1.1.8 → 1.2.0-edge.3

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.
@@ -0,0 +1,351 @@
1
+ import { DeviceClasses, DeviceTypeDefinition, MatterbridgeEndpoint, Status, Matterbridge, VendorId, DeviceTypeId, MatterbridgeServer, smokeCoAlarm, } from 'matterbridge';
2
+ import { ClusterBehavior, LogLevel as MatterLogLevel, LogFormat as MatterLogFormat, EndpointServer, logEndpoint } from 'matterbridge/matter';
3
+ import { Identify, OperationalState, OnOff, TemperatureControl, DishwasherAlarm, DishwasherMode, LaundryWasherControls, LaundryWasherMode, TemperatureMeasurement, OvenMode, RefrigeratorAndTemperatureControlledCabinetMode, } from 'matterbridge/matter/clusters';
4
+ import { DishwasherAlarmServer, OperationalStateBehavior, TemperatureControlBehavior } from 'matterbridge/matter/behaviors';
5
+ import { OvenCavityOperationalState } from './implementations/ovenCavityOperationalStateCluster.js';
6
+ import { AnsiLogger } from 'matterbridge/logger';
7
+ import { Robot } from './robot.js';
8
+ export class Appliances extends MatterbridgeEndpoint {
9
+ static temperatureControlledCabinetCooler = DeviceTypeDefinition({
10
+ name: 'MA-temperaturecontrolledcabinetcooler',
11
+ code: 0x71,
12
+ deviceClass: DeviceClasses.Simple,
13
+ revision: 3,
14
+ requiredServerClusters: [TemperatureControl.Cluster.id, RefrigeratorAndTemperatureControlledCabinetMode.Cluster.id],
15
+ optionalServerClusters: [TemperatureMeasurement.Cluster.id],
16
+ });
17
+ static temperatureControlledCabinetHeater = DeviceTypeDefinition({
18
+ name: 'MA-temperaturecontrolledcabinetheater',
19
+ code: 0x71,
20
+ deviceClass: DeviceClasses.Simple,
21
+ revision: 3,
22
+ requiredServerClusters: [TemperatureControl.Cluster.id, OvenMode.Cluster.id, OvenCavityOperationalState.Cluster.id],
23
+ optionalServerClusters: [TemperatureMeasurement.Cluster.id],
24
+ });
25
+ static laundryWasher = DeviceTypeDefinition({
26
+ name: 'MA-laundrywasher',
27
+ code: 0x73,
28
+ deviceClass: DeviceClasses.Simple,
29
+ revision: 1,
30
+ requiredServerClusters: [OperationalState.Cluster.id],
31
+ optionalServerClusters: [Identify.Cluster.id, LaundryWasherMode.Cluster.id, OnOff.Cluster.id, LaundryWasherControls.Cluster.id, TemperatureControl.Cluster.id],
32
+ });
33
+ static dishwasher = DeviceTypeDefinition({
34
+ name: 'MA-dishwasher',
35
+ code: 0x75,
36
+ deviceClass: DeviceClasses.Simple,
37
+ revision: 1,
38
+ requiredServerClusters: [OperationalState.Cluster.id],
39
+ optionalServerClusters: [Identify.Cluster.id, OnOff.Cluster.id, TemperatureControl.Cluster.id, DishwasherMode.Cluster.id, DishwasherAlarm.Cluster.id],
40
+ });
41
+ constructor(deviceType, name, serial) {
42
+ super(deviceType, { uniqueStorageKey: `${name}-${serial}` });
43
+ if (deviceType.code === Appliances.laundryWasher.code) {
44
+ this.createDefaultIdentifyClusterServer();
45
+ this.createDefaultBasicInformationClusterServer(name, serial, 0xfff1, 'Matterbridge', 0x8000, 'Laundry Washer');
46
+ this.createLevelTemperatureControlClusterServer(1, ['Cold', '30°', '40°', '60°']);
47
+ this.createDefaultOperationalStateClusterServer(OperationalState.OperationalStateEnum.Stopped);
48
+ }
49
+ else if (deviceType.code === Appliances.dishwasher.code) {
50
+ this.createDefaultIdentifyClusterServer();
51
+ this.createDeadFrontOnOffClusterServer();
52
+ this.createDefaultBasicInformationClusterServer(name, serial, 0xfff1, 'Matterbridge', 0x8000, 'Dishwasher');
53
+ this.createLevelTemperatureControlClusterServer(1, ['Cold', '30°', '40°', '60°']);
54
+ this.createDefaultDishwasherModeClusterServer();
55
+ this.createDefaultDishwasherAlarmClusterServer();
56
+ this.createDefaultOperationalStateClusterServer(OperationalState.OperationalStateEnum.Stopped);
57
+ }
58
+ else if (deviceType.name === Appliances.temperatureControlledCabinetCooler.name) {
59
+ this.createDefaultIdentifyClusterServer();
60
+ this.createDefaultBasicInformationClusterServer(name, serial, 0xfff1, 'Matterbridge', 0x8000, 'Temperature Controlled Cabinet Cooler');
61
+ this.createLevelTemperatureControlClusterServer(1, ['Cold', 'Warm', 'Hot']);
62
+ this.createDefaultTemperatureMeasurementClusterServer(1500);
63
+ this.createDefaultRefrigeratorAndTemperatureControlledCabinetModeClusterServer(1);
64
+ }
65
+ else if (deviceType.name === Appliances.temperatureControlledCabinetHeater.name) {
66
+ this.createDefaultIdentifyClusterServer();
67
+ this.createDefaultBasicInformationClusterServer(name, serial, 0xfff1, 'Matterbridge', 0x8000, 'Temperature Controlled Cabinet Heater');
68
+ this.createLevelTemperatureControlClusterServer(1, ['Cold', 'Warm', 'Hot']);
69
+ this.createDefaultTemperatureMeasurementClusterServer(2500);
70
+ this.createDefaultOvenModeClusterServer(3);
71
+ this.createDefaultOvenCavityOperationalStateClusterServer(OperationalState.OperationalStateEnum.Stopped);
72
+ }
73
+ }
74
+ createDefaultOperationalStateClusterServer(operationalState = OperationalState.OperationalStateEnum.Stopped) {
75
+ this.behaviors.require(MatterbridgeOperationalStateServer, {
76
+ phaseList: [],
77
+ currentPhase: null,
78
+ operationalStateList: [
79
+ { operationalStateId: OperationalState.OperationalStateEnum.Stopped, operationalStateLabel: 'Stopped' },
80
+ { operationalStateId: OperationalState.OperationalStateEnum.Running, operationalStateLabel: 'Running' },
81
+ { operationalStateId: OperationalState.OperationalStateEnum.Paused, operationalStateLabel: 'Paused' },
82
+ { operationalStateId: OperationalState.OperationalStateEnum.Error, operationalStateLabel: 'Error' },
83
+ ],
84
+ operationalState,
85
+ operationalError: { errorStateId: OperationalState.ErrorState.NoError, errorStateLabel: 'No error', errorStateDetails: 'Fully operational' },
86
+ });
87
+ return this;
88
+ }
89
+ createDefaultOvenCavityOperationalStateClusterServer(operationalState = OperationalState.OperationalStateEnum.Stopped) {
90
+ this.behaviors.require(OvenCavityOperationalStateServer, {
91
+ phaseList: [],
92
+ currentPhase: null,
93
+ operationalStateList: [
94
+ { operationalStateId: OperationalState.OperationalStateEnum.Stopped, operationalStateLabel: 'Stopped' },
95
+ { operationalStateId: OperationalState.OperationalStateEnum.Running, operationalStateLabel: 'Running' },
96
+ { operationalStateId: OperationalState.OperationalStateEnum.Error, operationalStateLabel: 'Error' },
97
+ ],
98
+ operationalState,
99
+ operationalError: { errorStateId: OperationalState.ErrorState.NoError, errorStateLabel: 'No error', errorStateDetails: 'Fully operational' },
100
+ });
101
+ return this;
102
+ }
103
+ createDefaultRefrigeratorAndTemperatureControlledCabinetModeClusterServer(currentMode) {
104
+ this.behaviors.require(RefrigeratorAndTemperatureControlledCabinetModeServer, {
105
+ supportedModes: [
106
+ { label: 'RapidCool', mode: 1, modeTags: [{ value: RefrigeratorAndTemperatureControlledCabinetMode.ModeTag.RapidCool }] },
107
+ { label: 'RapidFreeze', mode: 2, modeTags: [{ value: RefrigeratorAndTemperatureControlledCabinetMode.ModeTag.RapidFreeze }] },
108
+ ],
109
+ currentMode,
110
+ });
111
+ return this;
112
+ }
113
+ createDefaultDishwasherModeClusterServer(currentMode) {
114
+ this.behaviors.require(DishwasherModeServer, {
115
+ supportedModes: [
116
+ { label: 'Light', mode: 1, modeTags: [{ value: DishwasherMode.ModeTag.Light }] },
117
+ { label: 'Normal', mode: 2, modeTags: [{ value: DishwasherMode.ModeTag.Normal }] },
118
+ { label: 'Heavy', mode: 3, modeTags: [{ value: DishwasherMode.ModeTag.Heavy }] },
119
+ ],
120
+ currentMode,
121
+ });
122
+ return this;
123
+ }
124
+ createDefaultDishwasherAlarmClusterServer() {
125
+ this.behaviors.require(DishwasherAlarmServer, {
126
+ mask: { inflowError: true, drainError: true, doorError: true, tempTooLow: true, tempTooHigh: true, waterLevelError: true },
127
+ state: { inflowError: false, drainError: false, doorError: false, tempTooLow: false, tempTooHigh: false, waterLevelError: false },
128
+ supported: { inflowError: true, drainError: true, doorError: true, tempTooLow: true, tempTooHigh: true, waterLevelError: true },
129
+ });
130
+ return this;
131
+ }
132
+ createDefaultOvenModeClusterServer(currentMode) {
133
+ this.behaviors.require(OvenModeServer, {
134
+ supportedModes: [
135
+ { label: 'Bake', mode: 1, modeTags: [{ value: OvenMode.ModeTag.Bake }] },
136
+ { label: 'Convection', mode: 2, modeTags: [{ value: OvenMode.ModeTag.Convection }] },
137
+ { label: 'Grill', mode: 3, modeTags: [{ value: OvenMode.ModeTag.Grill }] },
138
+ { label: 'Roast', mode: 4, modeTags: [{ value: OvenMode.ModeTag.Roast }] },
139
+ { label: 'Clean', mode: 5, modeTags: [{ value: OvenMode.ModeTag.Clean }] },
140
+ { label: 'Convection Bake', mode: 6, modeTags: [{ value: OvenMode.ModeTag.ConvectionBake }] },
141
+ { label: 'Convection Roast', mode: 7, modeTags: [{ value: OvenMode.ModeTag.ConvectionRoast }] },
142
+ { label: 'Warming', mode: 8, modeTags: [{ value: OvenMode.ModeTag.Warming }] },
143
+ { label: 'Proofing', mode: 9, modeTags: [{ value: OvenMode.ModeTag.Proofing }] },
144
+ { label: 'Steam', mode: 10, modeTags: [{ value: OvenMode.ModeTag.Steam }] },
145
+ ],
146
+ currentMode,
147
+ });
148
+ return this;
149
+ }
150
+ createLevelTemperatureControlClusterServer(selectedTemperatureLevel = 1, supportedTemperatureLevels = ['Cold', 'Warm', 'Hot']) {
151
+ this.behaviors.require(MatterbridgeLevelTemperatureControlServer.with(TemperatureControl.Feature.TemperatureLevel), {
152
+ selectedTemperatureLevel,
153
+ supportedTemperatureLevels,
154
+ });
155
+ return this;
156
+ }
157
+ createNumberTemperatureControlClusterServer(temperatureSetpoint, minTemperature, maxTemperature, step = 1) {
158
+ this.behaviors.require(MatterbridgeNumberTemperatureControlServer.with(TemperatureControl.Feature.TemperatureNumber, TemperatureControl.Feature.TemperatureStep), {
159
+ temperatureSetpoint,
160
+ minTemperature,
161
+ maxTemperature,
162
+ step,
163
+ });
164
+ return this;
165
+ }
166
+ }
167
+ class MatterbridgeOperationalStateServer extends OperationalStateBehavior {
168
+ initialize() {
169
+ const device = this.agent.get(MatterbridgeServer).state.deviceCommand;
170
+ device.log.info('MatterbridgeOperationalStateServer initialized: setting operational state to Docked');
171
+ this.state.operationalState = OperationalState.OperationalStateEnum.Stopped;
172
+ this.state.operationalError = { errorStateId: OperationalState.ErrorState.NoError, errorStateLabel: 'No error', errorStateDetails: 'Fully operational' };
173
+ }
174
+ pause() {
175
+ const device = this.agent.get(MatterbridgeServer).state.deviceCommand;
176
+ device.log.info('MatterbridgeOperationalStateServer: pause called setting operational state to Paused and currentMode to Paused');
177
+ this.state.operationalState = OperationalState.OperationalStateEnum.Paused;
178
+ this.state.operationalError = { errorStateId: OperationalState.ErrorState.NoError, errorStateLabel: 'No error', errorStateDetails: 'Fully operational' };
179
+ return {
180
+ commandResponseState: { errorStateId: OperationalState.ErrorState.NoError, errorStateLabel: 'No error', errorStateDetails: 'Fully operational' },
181
+ };
182
+ }
183
+ stop() {
184
+ const device = this.agent.get(MatterbridgeServer).state.deviceCommand;
185
+ device.log.info('MatterbridgeOperationalStateServer: stop called setting operational state to Stopped and currentMode to Idle');
186
+ this.state.operationalState = OperationalState.OperationalStateEnum.Stopped;
187
+ this.state.operationalError = { errorStateId: OperationalState.ErrorState.NoError, errorStateLabel: 'No error', errorStateDetails: 'Fully operational' };
188
+ return {
189
+ commandResponseState: { errorStateId: OperationalState.ErrorState.NoError, errorStateLabel: 'No error', errorStateDetails: 'Fully operational' },
190
+ };
191
+ }
192
+ start() {
193
+ const device = this.agent.get(MatterbridgeServer).state.deviceCommand;
194
+ device.log.info('MatterbridgeOperationalStateServer: start called setting operational state to Running and currentMode to Running');
195
+ this.state.operationalState = OperationalState.OperationalStateEnum.Running;
196
+ this.state.operationalError = { errorStateId: OperationalState.ErrorState.NoError, errorStateLabel: 'No error', errorStateDetails: 'Fully operational' };
197
+ return {
198
+ commandResponseState: { errorStateId: OperationalState.ErrorState.NoError, errorStateLabel: 'No error', errorStateDetails: 'Fully operational' },
199
+ };
200
+ }
201
+ resume() {
202
+ const device = this.agent.get(MatterbridgeServer).state.deviceCommand;
203
+ device.log.info('MatterbridgeOperationalStateServer: resume called setting operational state to Running and currentMode to Cleaning');
204
+ this.state.operationalState = OperationalState.OperationalStateEnum.Running;
205
+ this.state.operationalError = { errorStateId: OperationalState.ErrorState.NoError, errorStateLabel: 'No error', errorStateDetails: 'Fully operational' };
206
+ return {
207
+ commandResponseState: { errorStateId: OperationalState.ErrorState.NoError, errorStateLabel: 'No error', errorStateDetails: 'Fully operational' },
208
+ };
209
+ }
210
+ }
211
+ class MatterbridgeLevelTemperatureControlServer extends TemperatureControlBehavior.with(TemperatureControl.Feature.TemperatureLevel) {
212
+ initialize() {
213
+ if (this.state.supportedTemperatureLevels.length >= 2) {
214
+ const device = this.agent.get(MatterbridgeServer).state.deviceCommand;
215
+ device.log.info('MatterbridgeLevelTemperatureControlServer initialized: setting selectedTemperatureLevel to 1');
216
+ this.state.selectedTemperatureLevel = 1;
217
+ }
218
+ }
219
+ setTemperature(request) {
220
+ const device = this.agent.get(MatterbridgeServer).state.deviceCommand;
221
+ if (request.targetTemperatureLevel && request.targetTemperatureLevel >= 0 && request.targetTemperatureLevel < this.state.supportedTemperatureLevels.length) {
222
+ device.log.info(`MatterbridgeLevelTemperatureControlServer: setTemperature called setting selectedTemperatureLevel to ${request.targetTemperatureLevel}: ${this.state.supportedTemperatureLevels[request.targetTemperatureLevel]}`);
223
+ this.state.selectedTemperatureLevel = request.targetTemperatureLevel;
224
+ }
225
+ else {
226
+ device.log.error(`MatterbridgeLevelTemperatureControlServer: setTemperature called with invalid targetTemperatureLevel ${request.targetTemperatureLevel}`);
227
+ }
228
+ }
229
+ }
230
+ class MatterbridgeNumberTemperatureControlServer extends TemperatureControlBehavior.with(TemperatureControl.Feature.TemperatureNumber) {
231
+ initialize() {
232
+ const device = this.agent.get(MatterbridgeServer).state.deviceCommand;
233
+ device.log.info('MatterbridgeNumberTemperatureControlServer initialized');
234
+ }
235
+ setTemperature(request) {
236
+ const device = this.agent.get(MatterbridgeServer).state.deviceCommand;
237
+ if (request.targetTemperature && request.targetTemperature >= this.state.minTemperature && request.targetTemperature <= this.state.maxTemperature) {
238
+ device.log.info(`MatterbridgeNumberTemperatureControlServer: setTemperature called setting temperatureSetpoint to ${request.targetTemperature}`);
239
+ this.state.temperatureSetpoint = request.targetTemperature;
240
+ }
241
+ else {
242
+ device.log.error(`MatterbridgeNumberTemperatureControlServer: setTemperature called with invalid targetTemperature ${request.targetTemperature}`);
243
+ }
244
+ }
245
+ }
246
+ export const OvenCavityOperationalStateBehavior = ClusterBehavior.withInterface().for(OvenCavityOperationalState.Cluster);
247
+ export class OvenCavityOperationalStateServer extends OvenCavityOperationalStateBehavior {
248
+ initialize() {
249
+ const device = this.agent.get(MatterbridgeServer).state.deviceCommand;
250
+ device.log.info('OvenCavityOperationalStateServer initialized: setting operational state to Stopped and operational error to No error');
251
+ this.state.operationalState = OperationalState.OperationalStateEnum.Stopped;
252
+ this.state.operationalError = { errorStateId: OperationalState.ErrorState.NoError, errorStateLabel: 'No error', errorStateDetails: 'Fully operational' };
253
+ }
254
+ stop() {
255
+ const device = this.agent.get(MatterbridgeServer).state.deviceCommand;
256
+ device.log.info('OvenCavityOperationalStateServer: stop called setting operational state to Stopped and operational error to No error');
257
+ this.state.operationalState = OperationalState.OperationalStateEnum.Stopped;
258
+ this.state.operationalError = { errorStateId: OperationalState.ErrorState.NoError, errorStateLabel: 'No error', errorStateDetails: 'Fully operational' };
259
+ return {
260
+ commandResponseState: { errorStateId: OperationalState.ErrorState.NoError, errorStateLabel: 'No error', errorStateDetails: 'Fully operational' },
261
+ };
262
+ }
263
+ start() {
264
+ const device = this.agent.get(MatterbridgeServer).state.deviceCommand;
265
+ device.log.info('OvenCavityOperationalStateServer: start called setting operational state to Running and operational error to No error');
266
+ this.state.operationalState = OperationalState.OperationalStateEnum.Running;
267
+ this.state.operationalError = { errorStateId: OperationalState.ErrorState.NoError, errorStateLabel: 'No error', errorStateDetails: 'Fully operational' };
268
+ return {
269
+ commandResponseState: { errorStateId: OperationalState.ErrorState.NoError, errorStateLabel: 'No error', errorStateDetails: 'Fully operational' },
270
+ };
271
+ }
272
+ }
273
+ export const RefrigeratorAndTemperatureControlledCabinetModeBehavior = ClusterBehavior.withInterface().for(RefrigeratorAndTemperatureControlledCabinetMode.Cluster);
274
+ class RefrigeratorAndTemperatureControlledCabinetModeServer extends RefrigeratorAndTemperatureControlledCabinetModeBehavior {
275
+ initialize() {
276
+ const device = this.agent.get(MatterbridgeServer).state.deviceCommand;
277
+ device.log.info('MatterbridgeRefrigeratorAndTemperatureControlledCabinetModeServer initialized: setting currentMode to 1');
278
+ this.state.currentMode = 1;
279
+ }
280
+ changeToMode(request) {
281
+ const device = this.agent.get(MatterbridgeServer).state.deviceCommand;
282
+ if (this.state.supportedModes.find((mode) => mode.mode === request.newMode)) {
283
+ device.log.info(`MatterbridgeRefrigeratorAndTemperatureControlledCabinetModeServer: changeToMode called with mode ${request.newMode} = ${this.state.supportedModes[request.newMode].label}`);
284
+ this.state.currentMode = request.newMode;
285
+ return { status: Status.Success, statusText: 'Success' };
286
+ }
287
+ else {
288
+ device.log.info(`MatterbridgeRefrigeratorAndTemperatureControlledCabinetModeServer: changeToMode called with invalid mode ${request.newMode}`);
289
+ return { status: Status.InvalidCommand, statusText: 'Invalid mode' };
290
+ }
291
+ }
292
+ }
293
+ export const OvenModeBehavior = ClusterBehavior.withInterface().for(OvenMode.Cluster);
294
+ class OvenModeServer extends OvenModeBehavior {
295
+ initialize() {
296
+ const device = this.agent.get(MatterbridgeServer).state.deviceCommand;
297
+ device.log.info('OvenModeServer initialized: setting currentMode to 3');
298
+ this.state.currentMode = 3;
299
+ }
300
+ changeToMode(request) {
301
+ const device = this.agent.get(MatterbridgeServer).state.deviceCommand;
302
+ if (this.state.supportedModes.find((mode) => mode.mode === request.newMode)) {
303
+ device.log.info(`OvenModeServer: changeToMode called with mode ${request.newMode} = ${this.state.supportedModes[request.newMode].label}`);
304
+ this.state.currentMode = request.newMode;
305
+ return { status: Status.Success, statusText: 'Success' };
306
+ }
307
+ else {
308
+ device.log.info(`OvenModeServer: changeToMode called with invalid mode ${request.newMode}`);
309
+ return { status: Status.InvalidCommand, statusText: 'Invalid mode' };
310
+ }
311
+ }
312
+ }
313
+ export const DishwasherModeBehavior = ClusterBehavior.withInterface().for(DishwasherMode.Cluster);
314
+ class DishwasherModeServer extends DishwasherModeBehavior {
315
+ initialize() {
316
+ const device = this.agent.get(MatterbridgeServer).state.deviceCommand;
317
+ device.log.info('DishwasherModeServer initialized: setting currentMode to 3');
318
+ this.state.currentMode = 3;
319
+ }
320
+ changeToMode(request) {
321
+ const device = this.agent.get(MatterbridgeServer).state.deviceCommand;
322
+ if (this.state.supportedModes.find((mode) => mode.mode === request.newMode)) {
323
+ device.log.info(`DishwasherModeServer: changeToMode called with mode ${request.newMode} = ${this.state.supportedModes[request.newMode].label}`);
324
+ this.state.currentMode = request.newMode;
325
+ return { status: Status.Success, statusText: 'Success' };
326
+ }
327
+ else {
328
+ device.log.error(`DishwasherModeServer: changeToMode called with invalid mode ${request.newMode}`);
329
+ return { status: Status.InvalidCommand, statusText: 'Invalid mode' };
330
+ }
331
+ }
332
+ }
333
+ if (process.argv.includes('-testRobot')) {
334
+ const matterbridge = await Matterbridge.loadInstance(false);
335
+ matterbridge.log = new AnsiLogger({ logName: 'Matterbridge', logTimestampFormat: 4, logLevel: "debug" });
336
+ matterbridge.environment.vars.set('log.level', MatterLogLevel.DEBUG);
337
+ matterbridge.environment.vars.set('log.format', MatterLogFormat.ANSI);
338
+ matterbridge.environment.vars.set('path.root', 'matterstorage');
339
+ matterbridge.environment.vars.set('runtime.signals', true);
340
+ matterbridge.environment.vars.set('runtime.exitcode', true);
341
+ matterbridge.environment.vars.set('mdns.networkInterface', 'Wi-Fi');
342
+ await matterbridge.startMatterStorage();
343
+ const deviceType = smokeCoAlarm;
344
+ const context = await matterbridge.createServerNodeContext('Jest', deviceType.name, DeviceTypeId(deviceType.code), VendorId(0xfff1), 'Matterbridge', 0x8000, 'Matterbridge device');
345
+ const server = await matterbridge.createServerNode(context);
346
+ const device = new Robot('Robot Vacuum', '99914248654');
347
+ await server.add(device);
348
+ logEndpoint(EndpointServer.forEndpoint(device));
349
+ await matterbridge.startServerNode(server);
350
+ logEndpoint(EndpointServer.forEndpoint(server));
351
+ }
@@ -0,0 +1,113 @@
1
+ import { ClusterBehavior } from 'matterbridge/matter';
2
+ import { Attribute, MutableCluster, OptionalAttribute, TlvEnum, TlvNullable, TlvUInt32, TlvFloat, FixedAttribute, BitFlag, ClusterType, ClusterRegistry, } from 'matterbridge/matter/types';
3
+ export var CarbonMonoxideConcentrationMeasurement;
4
+ (function (CarbonMonoxideConcentrationMeasurement) {
5
+ let Feature;
6
+ (function (Feature) {
7
+ Feature["NumericMeasurement"] = "NumericMeasurement";
8
+ Feature["LevelIndication"] = "LevelIndication";
9
+ Feature["MediumLevel"] = "MediumLevel";
10
+ Feature["CriticalLevel"] = "CriticalLevel";
11
+ Feature["PeakMeasurement"] = "PeakMeasurement";
12
+ Feature["AverageMeasurement"] = "AverageMeasurement";
13
+ })(Feature = CarbonMonoxideConcentrationMeasurement.Feature || (CarbonMonoxideConcentrationMeasurement.Feature = {}));
14
+ let MeasurementUnit;
15
+ (function (MeasurementUnit) {
16
+ MeasurementUnit[MeasurementUnit["Ppm"] = 0] = "Ppm";
17
+ MeasurementUnit[MeasurementUnit["Ppb"] = 1] = "Ppb";
18
+ MeasurementUnit[MeasurementUnit["Ppt"] = 2] = "Ppt";
19
+ MeasurementUnit[MeasurementUnit["Mgm3"] = 3] = "Mgm3";
20
+ MeasurementUnit[MeasurementUnit["Ugm3"] = 4] = "Ugm3";
21
+ MeasurementUnit[MeasurementUnit["Ngm3"] = 5] = "Ngm3";
22
+ MeasurementUnit[MeasurementUnit["Pm3"] = 6] = "Pm3";
23
+ MeasurementUnit[MeasurementUnit["Bqm3"] = 7] = "Bqm3";
24
+ })(MeasurementUnit = CarbonMonoxideConcentrationMeasurement.MeasurementUnit || (CarbonMonoxideConcentrationMeasurement.MeasurementUnit = {}));
25
+ let LevelValue;
26
+ (function (LevelValue) {
27
+ LevelValue[LevelValue["Unknown"] = 0] = "Unknown";
28
+ LevelValue[LevelValue["Low"] = 1] = "Low";
29
+ LevelValue[LevelValue["Medium"] = 2] = "Medium";
30
+ LevelValue[LevelValue["High"] = 3] = "High";
31
+ LevelValue[LevelValue["Critical"] = 4] = "Critical";
32
+ })(LevelValue = CarbonMonoxideConcentrationMeasurement.LevelValue || (CarbonMonoxideConcentrationMeasurement.LevelValue = {}));
33
+ let MeasurementMedium;
34
+ (function (MeasurementMedium) {
35
+ MeasurementMedium[MeasurementMedium["Air"] = 0] = "Air";
36
+ MeasurementMedium[MeasurementMedium["Water"] = 1] = "Water";
37
+ MeasurementMedium[MeasurementMedium["Soil"] = 2] = "Soil";
38
+ })(MeasurementMedium = CarbonMonoxideConcentrationMeasurement.MeasurementMedium || (CarbonMonoxideConcentrationMeasurement.MeasurementMedium = {}));
39
+ CarbonMonoxideConcentrationMeasurement.NumericMeasurementComponent = MutableCluster.Component({
40
+ attributes: {
41
+ measuredValue: Attribute(0x0, TlvNullable(TlvFloat), { default: null }),
42
+ minMeasuredValue: Attribute(0x1, TlvNullable(TlvFloat), { default: null }),
43
+ maxMeasuredValue: Attribute(0x2, TlvNullable(TlvFloat), { default: null }),
44
+ uncertainty: OptionalAttribute(0x7, TlvFloat),
45
+ measurementUnit: FixedAttribute(0x8, TlvEnum()),
46
+ },
47
+ });
48
+ CarbonMonoxideConcentrationMeasurement.PeakMeasurementComponent = MutableCluster.Component({
49
+ attributes: {
50
+ peakMeasuredValue: Attribute(0x3, TlvNullable(TlvFloat), { default: null }),
51
+ peakMeasuredValueWindow: Attribute(0x4, TlvUInt32.bound({ max: 604800 }), { default: 1 }),
52
+ },
53
+ });
54
+ CarbonMonoxideConcentrationMeasurement.AverageMeasurementComponent = MutableCluster.Component({
55
+ attributes: {
56
+ averageMeasuredValue: Attribute(0x5, TlvNullable(TlvFloat), { default: null }),
57
+ averageMeasuredValueWindow: Attribute(0x6, TlvUInt32.bound({ max: 604800 }), { default: 1 }),
58
+ },
59
+ });
60
+ CarbonMonoxideConcentrationMeasurement.LevelIndicationComponent = MutableCluster.Component({
61
+ attributes: {
62
+ levelValue: Attribute(0xa, TlvEnum(), { default: LevelValue.Unknown }),
63
+ },
64
+ });
65
+ CarbonMonoxideConcentrationMeasurement.Base = MutableCluster.Component({
66
+ id: 0x40c,
67
+ name: 'CarbonMonoxideConcentrationMeasurement',
68
+ revision: 3,
69
+ features: {
70
+ numericMeasurement: BitFlag(0),
71
+ levelIndication: BitFlag(1),
72
+ mediumLevel: BitFlag(2),
73
+ criticalLevel: BitFlag(3),
74
+ peakMeasurement: BitFlag(4),
75
+ averageMeasurement: BitFlag(5),
76
+ },
77
+ attributes: {
78
+ measurementMedium: FixedAttribute(0x9, TlvEnum()),
79
+ },
80
+ extensions: MutableCluster.Extensions({ flags: { numericMeasurement: true }, component: CarbonMonoxideConcentrationMeasurement.NumericMeasurementComponent }, { flags: { peakMeasurement: true }, component: CarbonMonoxideConcentrationMeasurement.PeakMeasurementComponent }, { flags: { averageMeasurement: true }, component: CarbonMonoxideConcentrationMeasurement.AverageMeasurementComponent }, { flags: { levelIndication: true }, component: CarbonMonoxideConcentrationMeasurement.LevelIndicationComponent }, { flags: { mediumLevel: true, levelIndication: false }, component: false }, { flags: { criticalLevel: true, levelIndication: false }, component: false }, { flags: { peakMeasurement: true, numericMeasurement: false }, component: false }, { flags: { averageMeasurement: true, numericMeasurement: false }, component: false }, { flags: { numericMeasurement: false, levelIndication: false }, component: false }),
81
+ });
82
+ CarbonMonoxideConcentrationMeasurement.ClusterInstance = MutableCluster.ExtensibleOnly(CarbonMonoxideConcentrationMeasurement.Base);
83
+ CarbonMonoxideConcentrationMeasurement.Cluster = CarbonMonoxideConcentrationMeasurement.ClusterInstance;
84
+ const MEA = { numericMeasurement: true };
85
+ const PEA = { peakMeasurement: true };
86
+ const AVG = { averageMeasurement: true };
87
+ const LEV = { levelIndication: true };
88
+ CarbonMonoxideConcentrationMeasurement.CompleteInstance = MutableCluster({
89
+ id: CarbonMonoxideConcentrationMeasurement.Base.id,
90
+ name: CarbonMonoxideConcentrationMeasurement.Base.name,
91
+ revision: CarbonMonoxideConcentrationMeasurement.Base.revision,
92
+ features: CarbonMonoxideConcentrationMeasurement.Base.features,
93
+ attributes: {
94
+ ...CarbonMonoxideConcentrationMeasurement.Base.attributes,
95
+ measuredValue: MutableCluster.AsConditional(CarbonMonoxideConcentrationMeasurement.NumericMeasurementComponent.attributes.measuredValue, { mandatoryIf: [MEA] }),
96
+ minMeasuredValue: MutableCluster.AsConditional(CarbonMonoxideConcentrationMeasurement.NumericMeasurementComponent.attributes.minMeasuredValue, { mandatoryIf: [MEA] }),
97
+ maxMeasuredValue: MutableCluster.AsConditional(CarbonMonoxideConcentrationMeasurement.NumericMeasurementComponent.attributes.maxMeasuredValue, { mandatoryIf: [MEA] }),
98
+ peakMeasuredValue: MutableCluster.AsConditional(CarbonMonoxideConcentrationMeasurement.PeakMeasurementComponent.attributes.peakMeasuredValue, { mandatoryIf: [PEA] }),
99
+ peakMeasuredValueWindow: MutableCluster.AsConditional(CarbonMonoxideConcentrationMeasurement.PeakMeasurementComponent.attributes.peakMeasuredValueWindow, { mandatoryIf: [PEA] }),
100
+ averageMeasuredValue: MutableCluster.AsConditional(CarbonMonoxideConcentrationMeasurement.AverageMeasurementComponent.attributes.averageMeasuredValue, { mandatoryIf: [AVG] }),
101
+ averageMeasuredValueWindow: MutableCluster.AsConditional(CarbonMonoxideConcentrationMeasurement.AverageMeasurementComponent.attributes.averageMeasuredValueWindow, { mandatoryIf: [AVG] }),
102
+ uncertainty: MutableCluster.AsConditional(CarbonMonoxideConcentrationMeasurement.NumericMeasurementComponent.attributes.uncertainty, { optionalIf: [MEA] }),
103
+ measurementUnit: MutableCluster.AsConditional(CarbonMonoxideConcentrationMeasurement.NumericMeasurementComponent.attributes.measurementUnit, { mandatoryIf: [MEA] }),
104
+ levelValue: MutableCluster.AsConditional(CarbonMonoxideConcentrationMeasurement.LevelIndicationComponent.attributes.levelValue, { mandatoryIf: [LEV] }),
105
+ },
106
+ });
107
+ CarbonMonoxideConcentrationMeasurement.Complete = CarbonMonoxideConcentrationMeasurement.CompleteInstance;
108
+ })(CarbonMonoxideConcentrationMeasurement || (CarbonMonoxideConcentrationMeasurement = {}));
109
+ export const CarbonMonoxideConcentrationMeasurementCluster = CarbonMonoxideConcentrationMeasurement.Cluster;
110
+ ClusterRegistry.register(ClusterType(CarbonMonoxideConcentrationMeasurement.Complete));
111
+ export const CarbonMonoxideConcentrationMeasurementBehavior = ClusterBehavior.for(ClusterType(CarbonMonoxideConcentrationMeasurement.Base));
112
+ export class CarbonMonoxideConcentrationMeasurementServer extends CarbonMonoxideConcentrationMeasurementBehavior.for(ClusterType(CarbonMonoxideConcentrationMeasurement.Base)) {
113
+ }
@@ -0,0 +1,30 @@
1
+ import { OperationalState } from 'matterbridge/matter/clusters';
2
+ import { Attribute, EventPriority, MutableCluster, OptionalAttribute, TlvArray, Event, TlvEnum, TlvNullable, TlvString, TlvUInt32, TlvUInt8, OptionalEvent, ClusterRegistry, TlvNoArguments, Command, } from 'matterbridge/matter/types';
3
+ export var OvenCavityOperationalState;
4
+ (function (OvenCavityOperationalState) {
5
+ OvenCavityOperationalState.ClusterInstance = MutableCluster({
6
+ id: 0x48,
7
+ name: 'OvenCavityOperationalState',
8
+ revision: 2,
9
+ attributes: {
10
+ phaseList: Attribute(0x0, TlvNullable(TlvArray(TlvString, { maxLength: 32 }))),
11
+ currentPhase: Attribute(0x1, TlvNullable(TlvUInt8)),
12
+ countdownTime: OptionalAttribute(0x2, TlvNullable(TlvUInt32.bound({ max: 259200 })), { default: null }),
13
+ operationalStateList: Attribute(0x3, TlvArray(OperationalState.TlvOperationalStateStruct), { default: [] }),
14
+ operationalState: Attribute(0x4, TlvEnum()),
15
+ operationalError: Attribute(0x5, OperationalState.TlvErrorStateStruct),
16
+ },
17
+ commands: {
18
+ stop: Command(0x1, TlvNoArguments, 0x4, OperationalState.TlvOperationalCommandResponse),
19
+ start: Command(0x2, TlvNoArguments, 0x4, OperationalState.TlvOperationalCommandResponse),
20
+ },
21
+ events: {
22
+ operationalError: Event(0x0, EventPriority.Critical, OperationalState.TlvOperationalErrorEvent),
23
+ operationCompletion: OptionalEvent(0x1, EventPriority.Info, OperationalState.TlvOperationCompletionEvent),
24
+ },
25
+ });
26
+ OvenCavityOperationalState.Cluster = OvenCavityOperationalState.ClusterInstance;
27
+ OvenCavityOperationalState.Complete = OvenCavityOperationalState.Cluster;
28
+ })(OvenCavityOperationalState || (OvenCavityOperationalState = {}));
29
+ export const OvenCavityOperationalStateCluster = OvenCavityOperationalState.Cluster;
30
+ ClusterRegistry.register(OvenCavityOperationalState.Complete);
@@ -0,0 +1,71 @@
1
+ import { OperationalState as OperationalStateNamespace } from 'matterbridge/matter/clusters';
2
+ import { Attribute, ClusterRegistry, Event, EventPriority, MutableCluster, OptionalAttribute, OptionalCommand, OptionalEvent, TlvArray, TlvEnum, TlvField, TlvNoArguments, TlvNullable, TlvObject, TlvOptionalField, TlvString, TlvUInt32, TlvUInt8, } from 'matterbridge/matter/types';
3
+ export var RvcOperationalState;
4
+ (function (RvcOperationalState) {
5
+ let OperationalState;
6
+ (function (OperationalState) {
7
+ OperationalState[OperationalState["Stopped"] = 0] = "Stopped";
8
+ OperationalState[OperationalState["Running"] = 1] = "Running";
9
+ OperationalState[OperationalState["Paused"] = 2] = "Paused";
10
+ OperationalState[OperationalState["Error"] = 3] = "Error";
11
+ OperationalState[OperationalState["SeekingCharger"] = 64] = "SeekingCharger";
12
+ OperationalState[OperationalState["Charging"] = 65] = "Charging";
13
+ OperationalState[OperationalState["Docked"] = 66] = "Docked";
14
+ })(OperationalState = RvcOperationalState.OperationalState || (RvcOperationalState.OperationalState = {}));
15
+ RvcOperationalState.TlvOperationalStateStruct = TlvObject({
16
+ operationalStateId: TlvField(0, TlvEnum()),
17
+ operationalStateLabel: TlvOptionalField(1, TlvString.bound({ maxLength: 64 })),
18
+ });
19
+ let ErrorState;
20
+ (function (ErrorState) {
21
+ ErrorState[ErrorState["NoError"] = 0] = "NoError";
22
+ ErrorState[ErrorState["UnableToStartOrResume"] = 1] = "UnableToStartOrResume";
23
+ ErrorState[ErrorState["UnableToCompleteOperation"] = 2] = "UnableToCompleteOperation";
24
+ ErrorState[ErrorState["CommandInvalidInState"] = 3] = "CommandInvalidInState";
25
+ ErrorState[ErrorState["FailedToFindChargingDock"] = 64] = "FailedToFindChargingDock";
26
+ ErrorState[ErrorState["Stuck"] = 65] = "Stuck";
27
+ ErrorState[ErrorState["DustBinMissing"] = 66] = "DustBinMissing";
28
+ ErrorState[ErrorState["DustBinFull"] = 67] = "DustBinFull";
29
+ ErrorState[ErrorState["WaterTankEmpty"] = 68] = "WaterTankEmpty";
30
+ ErrorState[ErrorState["WaterTankMissing"] = 69] = "WaterTankMissing";
31
+ ErrorState[ErrorState["WaterTankLidOpen"] = 70] = "WaterTankLidOpen";
32
+ ErrorState[ErrorState["MopCleaningPadMissing"] = 71] = "MopCleaningPadMissing";
33
+ })(ErrorState = RvcOperationalState.ErrorState || (RvcOperationalState.ErrorState = {}));
34
+ RvcOperationalState.TlvErrorStateStruct = TlvObject({
35
+ errorStateId: TlvField(0, TlvEnum()),
36
+ errorStateLabel: TlvOptionalField(1, TlvString.bound({ maxLength: 64 })),
37
+ errorStateDetails: TlvOptionalField(2, TlvString.bound({ maxLength: 64 })),
38
+ });
39
+ RvcOperationalState.TlvOperationalCommandResponse = TlvObject({
40
+ commandResponseState: TlvField(0, RvcOperationalState.TlvErrorStateStruct),
41
+ });
42
+ RvcOperationalState.TlvOperationalErrorEvent = TlvObject({ errorState: TlvField(0, RvcOperationalState.TlvErrorStateStruct) });
43
+ RvcOperationalState.ClusterInstance = MutableCluster({
44
+ id: 0x61,
45
+ name: 'RvcOperationalState',
46
+ revision: 2,
47
+ attributes: {
48
+ phaseList: Attribute(0x0, TlvNullable(TlvArray(TlvString, { maxLength: 32 }))),
49
+ currentPhase: Attribute(0x1, TlvNullable(TlvUInt8)),
50
+ countdownTime: OptionalAttribute(0x2, TlvNullable(TlvUInt32.bound({ max: 259200 })), { default: null }),
51
+ operationalStateList: Attribute(0x3, TlvArray(RvcOperationalState.TlvOperationalStateStruct), { default: [] }),
52
+ operationalState: Attribute(0x4, TlvEnum()),
53
+ operationalError: Attribute(0x5, RvcOperationalState.TlvErrorStateStruct),
54
+ },
55
+ commands: {
56
+ pause: OptionalCommand(0x0, TlvNoArguments, 0x4, RvcOperationalState.TlvOperationalCommandResponse),
57
+ stop: OptionalCommand(0x1, TlvNoArguments, 0x4, RvcOperationalState.TlvOperationalCommandResponse),
58
+ start: OptionalCommand(0x2, TlvNoArguments, 0x4, RvcOperationalState.TlvOperationalCommandResponse),
59
+ resume: OptionalCommand(0x3, TlvNoArguments, 0x4, RvcOperationalState.TlvOperationalCommandResponse),
60
+ goHome: OptionalCommand(0x80, TlvNoArguments, 0x4, RvcOperationalState.TlvOperationalCommandResponse),
61
+ },
62
+ events: {
63
+ operationalError: Event(0x0, EventPriority.Critical, RvcOperationalState.TlvOperationalErrorEvent),
64
+ operationCompletion: OptionalEvent(0x1, EventPriority.Info, OperationalStateNamespace.TlvOperationCompletionEvent),
65
+ },
66
+ });
67
+ RvcOperationalState.Cluster = RvcOperationalState.ClusterInstance;
68
+ RvcOperationalState.Complete = RvcOperationalState.Cluster;
69
+ })(RvcOperationalState || (RvcOperationalState = {}));
70
+ export const RvcOperationalStateCluster = RvcOperationalState.Cluster;
71
+ ClusterRegistry.register(RvcOperationalState.Complete);