@homebridge-plugins/homebridge-matter 0.0.2 → 0.0.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,24 @@
1
+ {
2
+ "permissions": {
3
+ "allow": [
4
+ "Bash(git -C ../homebridge log -1 --oneline)",
5
+ "Bash(git -C ../homebridge show --stat 481784d)",
6
+ "Read(//Users/benpotter/Documents/GitHub/homebridge/src/matter/**)",
7
+ "Read(//Users/benpotter/Documents/GitHub/homebridge/src/**)",
8
+ "Bash(npm run build)",
9
+ "Read(//Users/benpotter/Documents/GitHub/homebridge/node_modules/@matter/**)",
10
+ "WebFetch(domain:github.com)",
11
+ "WebSearch",
12
+ "Read(//Users/benpotter/Documents/GitHub/homebridge/**)",
13
+ "Bash(git -C ../homebridge show --stat HEAD)",
14
+ "Bash(git -C ../homebridge log -10 --oneline)",
15
+ "Bash(git -C ../homebridge show --stat 0420d2b)",
16
+ "Bash(find:*)",
17
+ "Bash(cat:*)",
18
+ "Read(//Users/benpotter/.homebridge/matter/**)",
19
+ "Read(//Users/benpotter/.homebridge/**)"
20
+ ],
21
+ "deny": [],
22
+ "ask": []
23
+ }
24
+ }
package/CHANGELOG.md CHANGED
@@ -2,6 +2,17 @@
2
2
 
3
3
  All notable changes to `@homebridge-plugins/homebridge-matter` will be documented in this file.
4
4
 
5
+ ## v0.0.3 (2025-10-17)
6
+
7
+ ### Changes
8
+
9
+ - added more examples for lights, examples provided:
10
+ - light on/off
11
+ - light + brightness
12
+ - light + brightness + color
13
+ - light + brightness + color temperature
14
+ - light + brightness + color temperature + color
15
+
5
16
  ## v0.0.2 (2025-10-15)
6
17
 
7
18
  ### Changes
@@ -13,7 +13,7 @@ export declare class ExampleHomebridgePlatform implements DynamicPlatformPlugin
13
13
  * Required for DynamicPlatformPlugin
14
14
  * Called when homebridge restores cached accessories from disk at startup
15
15
  */
16
- configureAccessory(accessory: PlatformAccessory): void;
16
+ configureAccessory(): void;
17
17
  /**
18
18
  * Register all Matter accessory examples
19
19
  */
@@ -22,24 +22,4 @@ export declare class ExampleHomebridgePlatform implements DynamicPlatformPlugin
22
22
  * Lighting Devices
23
23
  */
24
24
  private registerLightingDevices;
25
- /**
26
- * Switches and Outlets
27
- */
28
- private registerSwitchesAndOutlets;
29
- /**
30
- * Sensors
31
- */
32
- private registerSensors;
33
- /**
34
- * HVAC Devices
35
- */
36
- private registerHVAC;
37
- /**
38
- * Security Devices
39
- */
40
- private registerSecurity;
41
- /**
42
- * Other Devices
43
- */
44
- private registerOtherDevices;
45
25
  }
package/dist/platform.js CHANGED
@@ -28,9 +28,8 @@ export class ExampleHomebridgePlatform {
28
28
  * Required for DynamicPlatformPlugin
29
29
  * Called when homebridge restores cached accessories from disk at startup
30
30
  */
31
- configureAccessory(accessory) {
32
- this.log.info('Loading accessory from cache:', accessory.displayName);
33
- this.accessories.set(accessory.UUID, accessory);
31
+ configureAccessory( /* accessory: PlatformAccessory */) {
32
+ // Note this is not used for Matter accessories, as they are registered dynamically
34
33
  }
35
34
  /**
36
35
  * Register all Matter accessory examples
@@ -45,287 +44,105 @@ export class ExampleHomebridgePlatform {
45
44
  // this.registerSecurity();
46
45
  // this.registerOtherDevices();
47
46
  this.log.info('Finished registering Matter accessories');
47
+ // You can read current state using the API
48
+ const onOffState = this.api.matter.getAccessoryState('matter-dimmable-light', this.api.matter.clusterNames.OnOff);
49
+ if (onOffState) {
50
+ this.log.info(`[On/Off Light] 📖 Reading Dimmable Light on/off via API: ${onOffState.onOff ? 'ON' : 'OFF'}`);
51
+ }
52
+ const levelState = this.api.matter.getAccessoryState('matter-dimmable-light', this.api.matter.clusterNames.LevelControl);
53
+ if (levelState) {
54
+ this.log.info(`[On/Off Light] 📖 Reading Dimmable Light brightness via API: ${levelState.currentLevel} (${Math.round((levelState?.currentLevel || 0) / 254 * 100)}%)`);
55
+ }
56
+ // // ═══════════════════════════════════════════════════════════════
57
+ // // PATTERN 2 DEMONSTRATION: Update Dimmable Light WITHOUT handler
58
+ // // ═══════════════════════════════════════════════════════════════
59
+ // // Simulating: Dimmable light state changed externally (like via native app)
60
+ // // This will update the Home app WITHOUT triggering the dimmable light's handler
61
+ // // Note: Homebridge automatically defers the update to avoid transaction conflicts
62
+ // this.log.info('[On/Off Light] → Updating Dimmable Light state using updateMatterAccessoryState (no handler!)')
63
+ //
64
+ // this.api.matter.updateAccessoryState(uuidLightDimmable, this.api.matter.clusterNames.OnOff, {
65
+ // onOff: true,
66
+ // })
48
67
  }
49
68
  /**
50
69
  * Lighting Devices
51
70
  */
52
71
  registerLightingDevices() {
53
- // Track state for both lights
54
- // eslint-disable-next-line unused-imports/no-unused-vars
55
- let onOffLightState = false;
56
- // eslint-disable-next-line unused-imports/no-unused-vars
57
- let dimmableLightOn = false;
58
- let dimmableBrightness = 127; // 50% brightness (1-254 scale)
59
- // 1. On/Off Light - WITH STATE MANAGEMENT EXAMPLE
60
- // When this light changes, it will update the dimmable light's state
61
- this.api.registerMatterAccessory({
62
- uuid: 'matter-onoff-light',
72
+ const uuidLightOnOff = this.api.matter.uuid.generate('matter-onoff-light');
73
+ const uuidLightDimmable = this.api.matter.uuid.generate('matter-dimmable-light');
74
+ const uuidLightColourTemp = this.api.matter.uuid.generate('matter-colour-temp-light');
75
+ const uuidLightColour = this.api.matter.uuid.generate('matter-colour-light');
76
+ const uuidLightExtendedColour = this.api.matter.uuid.generate('matter-extended-colour-light');
77
+ // 1. On/Off Light
78
+ this.api.matter.registerAccessory({
79
+ uuid: uuidLightOnOff,
63
80
  displayName: 'On/Off Light',
64
- deviceType: this.api.matterDeviceTypes.OnOffLight,
81
+ deviceType: this.api.matter.deviceTypes.OnOffLight,
65
82
  serialNumber: 'LIGHT-001',
66
83
  manufacturer: 'Matter Examples',
67
84
  model: 'OnOffLight v1',
68
- clusters: {},
69
- // clusters: {
70
- // onOff: {
71
- // onOff: onOffLightState,
72
- // },
73
- // },
74
- // PATTERN 1: Handlers (Home app → Device)
75
- // These execute when user controls via Home app
76
- handlers: {
85
+ clusters: {
77
86
  onOff: {
78
- on: async () => {
79
- this.log.info('[On/Off Light] ✓ Turned ON via Home app handler');
80
- // Update local state
81
- onOffLightState = true;
82
- // NOTE: This light's state automatically updates after handler completes!
83
- // ═══════════════════════════════════════════════════════════════
84
- // PATTERN 3: Reading Current State (api.getAccessoryState)
85
- // ═══════════════════════════════════════════════════════════════
86
- // You can read current state using the API (useful after plugin restarts)
87
- const onOffState = this.api.getAccessoryState('matter-dimmable-light', 'onOff');
88
- const levelState = this.api.getAccessoryState('matter-dimmable-light', 'levelControl');
89
- this.log.error(`[On/Off Light] 📖 Reading Dimmable Light on/off via API: ${onOffState?.onOff ? 'ON' : 'OFF'}`);
90
- this.log.error(`[On/Off Light] 📖 Reading Dimmable Light brightness via API: ${levelState?.currentLevel} (${Math.round((levelState?.currentLevel || 0) / 254 * 100)}%)`);
91
- // Note: You can also track state in local variables (same as HAP pattern)
92
- this.log.error(`[On/Off Light] 📖 Reading from local variable: ${dimmableBrightness} (${Math.round(dimmableBrightness / 254 * 100)}%)`);
93
- // ═══════════════════════════════════════════════════════════════
94
- // PATTERN 2 DEMONSTRATION: Update Dimmable Light WITHOUT handler
95
- // ═══════════════════════════════════════════════════════════════
96
- // Simulating: Dimmable light state changed externally (like via native app)
97
- // This will update the Home app WITHOUT triggering the dimmable light's handler
98
- // Note: Homebridge automatically defers the update to avoid transaction conflicts
99
- this.log.info('[On/Off Light] → Updating Dimmable Light state using updateMatterAccessoryState (no handler!)');
100
- dimmableLightOn = true;
101
- this.api.updateMatterAccessoryState('matter-dimmable-light', 'onOff', {
102
- onOff: true,
103
- });
104
- this.log.info('[On/Off Light] ✓ Dimmable Light state updated (handler was NOT called)');
105
- },
106
- off: async () => {
107
- this.log.info('[On/Off Light] ✓ Turned OFF via Home app handler');
108
- // Update local state
109
- onOffLightState = false;
110
- // Reading current state using the API
111
- const onOffState = this.api.getAccessoryState('matter-dimmable-light', 'onOff');
112
- const levelState = this.api.getAccessoryState('matter-dimmable-light', 'levelControl');
113
- this.log.error(`[On/Off Light] 📖 Reading Dimmable Light on/off via API: ${onOffState?.onOff ? 'ON' : 'OFF'}`);
114
- this.log.error(`[On/Off Light] 📖 Reading Dimmable Light brightness via API: ${levelState?.currentLevel} (${Math.round((levelState?.currentLevel || 0) / 254 * 100)}%)`);
115
- // Update Dimmable Light WITHOUT triggering its handler
116
- this.log.info('[On/Off Light] → Updating Dimmable Light state using updateMatterAccessoryState (no handler!)');
117
- dimmableLightOn = false;
118
- this.api.updateMatterAccessoryState('matter-dimmable-light', 'onOff', {
119
- onOff: false,
120
- });
121
- this.log.info('[On/Off Light] ✓ Dimmable Light state updated (handler was NOT called)');
122
- },
87
+ onOff: true,
123
88
  },
124
89
  },
125
- });
126
- // 2. Dimmable Light - Will be updated by On/Off Light
127
- // This demonstrates receiving state updates WITHOUT handler execution
128
- this.api.registerMatterAccessory({
129
- uuid: 'matter-dimmable-light',
130
- displayName: 'Dimmable Light',
131
- deviceType: this.api.matterDeviceTypes.DimmableLight,
132
- serialNumber: 'LIGHT-002',
133
- manufacturer: 'Matter Examples',
134
- model: 'DimmableLight v1',
135
- clusters: {},
136
- // onOff: {
137
- // onOff: dimmableLightOn,
138
- // },
139
- // levelControl: {
140
- // currentLevel: dimmableBrightness,
141
- // minLevel: 1,
142
- // maxLevel: 254,
143
- // },
144
- // },
145
- // These handlers will NOT be called when On/Off Light updates this accessory's state
90
+ // These are called when the user controls the accessory via the Home app
146
91
  handlers: {
147
92
  onOff: {
148
- on: async () => {
149
- this.log.info('[Dimmable Light] ✓ Handler ON called (user controlled via Home app)');
150
- dimmableLightOn = true;
93
+ on: async ( /* no args */) => {
94
+ this.log.info('[On/Off Light] ✓ Handler `on` called (user controlled via Home app)');
151
95
  },
152
- off: async () => {
153
- this.log.info('[Dimmable Light] ✓ Handler OFF called (user controlled via Home app)');
154
- dimmableLightOn = false;
155
- },
156
- },
157
- levelControl: {
158
- moveToLevel: async (args) => {
159
- this.log.info(`[Dimmable Light] ✓ Handler moveToLevel called with ${args.level} (${Math.round(args.level / 254 * 100)}%)`);
160
- dimmableBrightness = args.level;
96
+ off: async ( /* no args */) => {
97
+ this.log.info('[On/Off Light] ✓ Handler `off` called (user controlled via Home app)');
161
98
  },
162
99
  },
163
100
  },
164
101
  });
165
- //
166
- // // 3. Color Temperature Light
167
- // this.api.registerMatterAccessory({
168
- // uuid: 'matter-color-temp-light',
169
- // displayName: 'Color Temperature Light',
170
- // deviceType: this.api.matterDeviceTypes.ColorTemperatureLight,
171
- // serialNumber: 'LIGHT-003',
172
- // manufacturer: 'Matter Examples',
173
- // model: 'ColorTempLight v1',
174
- //
175
- // clusters: {
176
- // onOff: {
177
- // onOff: false,
178
- // },
179
- // levelControl: {
180
- // currentLevel: 127,
181
- // minLevel: 1,
182
- // maxLevel: 254,
183
- // },
184
- // colorControl: {
185
- // colorMode: 2, // Color temperature mode
186
- // colorTemperatureMireds: 250, // ~4000K
187
- // colorTempPhysicalMinMireds: 147, // 6800K
188
- // colorTempPhysicalMaxMireds: 454, // 2200K
189
- // },
190
- // },
191
- //
192
- // handlers: {
193
- // onOff: {
194
- // on: async () => {
195
- // this.log.info('[Color Temp Light] Turned ON');
196
- // },
197
- // off: async () => {
198
- // this.log.info('[Color Temp Light] Turned OFF');
199
- // },
200
- // },
201
- // levelControl: {
202
- // moveToLevel: async (args: any) => {
203
- // this.log.info(`[Color Temp Light] Brightness changed to ${args.level}`);
204
- // },
205
- // },
206
- // colorControl: {
207
- // moveToColorTemperature: async (args: any) => {
208
- // const kelvin = Math.round(1000000 / args.colorTemperatureMireds);
209
- // this.log.info(`[Color Temp Light] Color temperature changed to ${args.colorTemperatureMireds} mireds (~${kelvin}K)`);
210
- // },
211
- // },
212
- // },
213
- // });
214
- //
215
- // // 4. Extended Color Light (RGB)
216
- // this.api.registerMatterAccessory({
217
- // uuid: 'matter-rgb-light',
218
- // displayName: 'RGB Color Light',
219
- // deviceType: this.api.matterDeviceTypes.ExtendedColorLight,
220
- // serialNumber: 'LIGHT-004',
221
- // manufacturer: 'Matter Examples',
222
- // model: 'RGBLight v1',
223
- //
224
- // clusters: {
225
- // onOff: {
226
- // onOff: false,
227
- // },
228
- // levelControl: {
229
- // currentLevel: 127,
230
- // minLevel: 1,
231
- // maxLevel: 254,
232
- // },
233
- // colorControl: {
234
- // colorMode: 1, // Hue/Saturation mode
235
- // currentHue: 0, // Red
236
- // currentSaturation: 254, // Full saturation
237
- // colorCapabilities: 0x0001, // Hue/Saturation support
238
- // },
239
- // },
240
- //
241
- // handlers: {
242
- // onOff: {
243
- // on: async () => {
244
- // this.log.info('[RGB Light] Turned ON');
245
- // },
246
- // off: async () => {
247
- // this.log.info('[RGB Light] Turned OFF');
248
- // },
249
- // },
250
- // levelControl: {
251
- // moveToLevel: async (args: any) => {
252
- // this.log.info(`[RGB Light] Brightness changed to ${args.level}`);
253
- // },
254
- // },
255
- // colorControl: {
256
- // moveToHue: async (args: any) => {
257
- // this.log.info(`[RGB Light] Hue changed to ${args.hue}`);
258
- // },
259
- // moveToSaturation: async (args: any) => {
260
- // this.log.info(`[RGB Light] Saturation changed to ${args.saturation}`);
261
- // },
262
- // moveToHueAndSaturation: async (args: any) => {
263
- // this.log.info(`[RGB Light] Color changed to H:${args.hue} S:${args.saturation}`);
264
- // },
265
- // },
266
- // },
267
- // });
268
- }
269
- /**
270
- * Switches and Outlets
271
- */
272
- registerSwitchesAndOutlets() {
273
- // 5. On/Off Switch
274
- this.api.registerMatterAccessory({
275
- uuid: 'matter-switch',
276
- displayName: 'On/Off Switch',
277
- deviceType: this.api.matterDeviceTypes.OnOffSwitch,
278
- serialNumber: 'SWITCH-001',
102
+ // 2. Dimmable Light
103
+ this.api.matter.registerAccessory({
104
+ uuid: uuidLightDimmable,
105
+ displayName: 'Dimmable Light',
106
+ deviceType: this.api.matter.deviceTypes.DimmableLight,
107
+ serialNumber: 'LIGHT-002',
279
108
  manufacturer: 'Matter Examples',
280
- model: 'Switch v1',
109
+ model: 'DimmableLight v1',
281
110
  clusters: {
282
111
  onOff: {
283
112
  onOff: false,
284
113
  },
114
+ levelControl: {
115
+ currentLevel: 127,
116
+ minLevel: 1,
117
+ maxLevel: 254,
118
+ },
285
119
  },
120
+ // These are called when the user controls the accessory via the Home app
286
121
  handlers: {
287
122
  onOff: {
288
123
  on: async () => {
289
- this.log.info('[Switch] Turned ON');
124
+ this.log.info('[Dimmable Light] Handler `on` called (user controlled via Home app)');
290
125
  },
291
126
  off: async () => {
292
- this.log.info('[Switch] Turned OFF');
127
+ this.log.info('[Dimmable Light] Handler `off` called (user controlled via Home app)');
293
128
  },
294
129
  },
295
- },
296
- });
297
- // 6. On/Off Outlet
298
- this.api.registerMatterAccessory({
299
- uuid: 'matter-outlet',
300
- displayName: 'Smart Outlet',
301
- deviceType: this.api.matterDeviceTypes.OnOffOutlet,
302
- serialNumber: 'OUTLET-001',
303
- manufacturer: 'Matter Examples',
304
- model: 'Outlet v1',
305
- clusters: {
306
- onOff: {
307
- onOff: false,
308
- },
309
- },
310
- handlers: {
311
- onOff: {
312
- on: async () => {
313
- this.log.info('[Outlet] Turned ON');
314
- },
315
- off: async () => {
316
- this.log.info('[Outlet] Turned OFF');
130
+ levelControl: {
131
+ moveToLevelWithOnOff: async (request) => {
132
+ const { level } = request;
133
+ this.log.info(`[Dimmable Light] ✓ Handler \`moveToLevel\` called with ${level} (${Math.round(level / 254 * 100)}%)`);
317
134
  },
318
135
  },
319
136
  },
320
137
  });
321
- // 7. Dimmable Outlet
322
- this.api.registerMatterAccessory({
323
- uuid: 'matter-dimmable-outlet',
324
- displayName: 'Dimmable Outlet',
325
- deviceType: this.api.matterDeviceTypes.DimmableOutlet,
326
- serialNumber: 'OUTLET-002',
138
+ // 3. Colour Temperature Light
139
+ this.api.matter.registerAccessory({
140
+ uuid: uuidLightColourTemp,
141
+ displayName: 'Colour Temperature Light',
142
+ deviceType: this.api.matter.deviceTypes.ColorTemperatureLight,
143
+ serialNumber: 'LIGHT-003',
327
144
  manufacturer: 'Matter Examples',
328
- model: 'DimmableOutlet v1',
145
+ model: 'ColourTempLight v1',
329
146
  clusters: {
330
147
  onOff: {
331
148
  onOff: false,
@@ -335,341 +152,159 @@ export class ExampleHomebridgePlatform {
335
152
  minLevel: 1,
336
153
  maxLevel: 254,
337
154
  },
155
+ colorControl: {
156
+ colorMode: 2, // Colour temperature mode
157
+ colorTemperatureMireds: 250, // ~4000K
158
+ colorTempPhysicalMinMireds: 147, // 6800K (coolest)
159
+ colorTempPhysicalMaxMireds: 454, // 2200K (warmest)
160
+ coupleColorTempToLevelMinMireds: 147,
161
+ },
338
162
  },
163
+ // These are called when the user controls the accessory via the Home app
339
164
  handlers: {
340
165
  onOff: {
341
- on: async () => {
342
- this.log.info('[Dimmable Outlet] Turned ON');
166
+ on: async ( /* no args */) => {
167
+ this.log.info('[Colour Temp Light] handler `on` called (user controlled via Home app)');
343
168
  },
344
- off: async () => {
345
- this.log.info('[Dimmable Outlet] Turned OFF');
169
+ off: async ( /* no args */) => {
170
+ this.log.info('[Colour Temp Light] Turned `off` called (user controlled via Home app)');
346
171
  },
347
172
  },
348
173
  levelControl: {
349
- moveToLevel: async (args) => {
350
- this.log.info(`[Dimmable Outlet] Level changed to ${args.level}`);
174
+ moveToLevelWithOnOff: async (request) => {
175
+ const { level } = request;
176
+ this.log.info(`[Colour Light] ✓ Handler \`moveToLevel\` called with ${level} (${Math.round(level / 254 * 100)}%)`);
351
177
  },
352
178
  },
353
- },
354
- });
355
- }
356
- /**
357
- * Sensors
358
- */
359
- registerSensors() {
360
- // 8. Temperature Sensor
361
- this.api.registerMatterAccessory({
362
- uuid: 'matter-temp-sensor',
363
- displayName: 'Temperature Sensor',
364
- deviceType: this.api.matterDeviceTypes.TemperatureSensor,
365
- serialNumber: 'TEMP-001',
366
- manufacturer: 'Matter Examples',
367
- model: 'TempSensor v1',
368
- clusters: {
369
- temperatureMeasurement: {
370
- measuredValue: 2100, // 21.00°C (in hundredths of degree Celsius)
371
- minMeasuredValue: -5000, // -50°C
372
- maxMeasuredValue: 10000, // 100°C
373
- },
374
- },
375
- });
376
- // 9. Humidity Sensor
377
- this.api.registerMatterAccessory({
378
- uuid: 'matter-humidity-sensor',
379
- displayName: 'Humidity Sensor',
380
- deviceType: this.api.matterDeviceTypes.HumiditySensor,
381
- serialNumber: 'HUM-001',
382
- manufacturer: 'Matter Examples',
383
- model: 'HumiditySensor v1',
384
- clusters: {
385
- relativeHumidityMeasurement: {
386
- measuredValue: 5000, // 50% (in hundredths of percent)
387
- minMeasuredValue: 0,
388
- maxMeasuredValue: 10000, // 100%
389
- },
390
- },
391
- });
392
- // 10. Light Sensor
393
- this.api.registerMatterAccessory({
394
- uuid: 'matter-light-sensor',
395
- displayName: 'Light Sensor',
396
- deviceType: this.api.matterDeviceTypes.LightSensor,
397
- serialNumber: 'LIGHT-SENSOR-001',
398
- manufacturer: 'Matter Examples',
399
- model: 'LightSensor v1',
400
- clusters: {
401
- illuminanceMeasurement: {
402
- measuredValue: 1000, // Lux value
403
- minMeasuredValue: 1,
404
- maxMeasuredValue: 65535,
405
- },
406
- },
407
- });
408
- // 11. Motion Sensor
409
- this.api.registerMatterAccessory({
410
- uuid: 'matter-motion-sensor',
411
- displayName: 'Motion Sensor',
412
- deviceType: this.api.matterDeviceTypes.MotionSensor,
413
- serialNumber: 'MOTION-001',
414
- manufacturer: 'Matter Examples',
415
- model: 'MotionSensor v1',
416
- clusters: {
417
- occupancySensing: {
418
- occupancy: 0, // 0 = not occupied, 1 = occupied
419
- occupancySensorType: 0, // PIR sensor
420
- },
421
- },
422
- });
423
- // 12. Contact Sensor
424
- this.api.registerMatterAccessory({
425
- uuid: 'matter-contact-sensor',
426
- displayName: 'Contact Sensor',
427
- deviceType: this.api.matterDeviceTypes.ContactSensor,
428
- serialNumber: 'CONTACT-001',
429
- manufacturer: 'Matter Examples',
430
- model: 'ContactSensor v1',
431
- clusters: {
432
- booleanState: {
433
- stateValue: false, // false = contact, true = no contact
434
- },
435
- },
436
- });
437
- // 13. Leak Sensor
438
- this.api.registerMatterAccessory({
439
- uuid: 'matter-leak-sensor',
440
- displayName: 'Water Leak Sensor',
441
- deviceType: this.api.matterDeviceTypes.LeakSensor,
442
- serialNumber: 'LEAK-001',
443
- manufacturer: 'Matter Examples',
444
- model: 'LeakSensor v1',
445
- clusters: {
446
- booleanState: {
447
- stateValue: false, // false = no leak, true = leak detected
448
- },
449
- },
450
- });
451
- // 14. Smoke Sensor
452
- this.api.registerMatterAccessory({
453
- uuid: 'matter-smoke-sensor',
454
- displayName: 'Smoke/CO Alarm',
455
- deviceType: this.api.matterDeviceTypes.SmokeSensor,
456
- serialNumber: 'SMOKE-001',
457
- manufacturer: 'Matter Examples',
458
- model: 'SmokeCOAlarm v1',
459
- clusters: {
460
- smokeCoAlarm: {
461
- smokeState: 0, // 0 = normal, 1 = warning, 2 = critical
462
- coState: 0, // 0 = normal, 1 = warning, 2 = critical
463
- batteryAlert: 0, // 0 = normal, 1 = warning, 2 = critical
464
- },
465
- },
466
- });
467
- }
468
- /**
469
- * HVAC Devices
470
- */
471
- registerHVAC() {
472
- // 15. Thermostat
473
- this.api.registerMatterAccessory({
474
- uuid: 'matter-thermostat',
475
- displayName: 'Thermostat',
476
- deviceType: this.api.matterDeviceTypes.Thermostat,
477
- serialNumber: 'THERMO-001',
478
- manufacturer: 'Matter Examples',
479
- model: 'Thermostat v1',
480
- clusters: {
481
- thermostat: {
482
- localTemperature: 2100, // 21°C (in hundredths)
483
- occupiedCoolingSetpoint: 2400, // 24°C
484
- occupiedHeatingSetpoint: 2000, // 20°C
485
- systemMode: 1, // 0 = Off, 1 = Auto, 3 = Cool, 4 = Heat
486
- controlSequenceOfOperation: 4, // Cooling and heating
487
- },
488
- },
489
- handlers: {
490
- thermostat: {
491
- setpointRaiseLower: async (args) => {
492
- this.log.info(`[Thermostat] Setpoint changed by ${args.amount / 10}°C`);
179
+ colorControl: {
180
+ moveToColorTemperatureLogic: async (request) => {
181
+ const { targetMireds, transitionTime } = request;
182
+ const kelvin = Math.round(1000000 / targetMireds);
183
+ this.log.info(`[Colour Temp Light] ✓ Handler \`moveToColorTemperatureLogic\` called with ${targetMireds} mireds (~${kelvin}K), transition: ${transitionTime}s`);
493
184
  },
494
185
  },
495
186
  },
496
187
  });
497
- // 16. Fan
498
- this.api.registerMatterAccessory({
499
- uuid: 'matter-fan',
500
- displayName: 'Fan',
501
- deviceType: this.api.matterDeviceTypes.Fan,
502
- serialNumber: 'FAN-001',
188
+ // 4. Colour Light (Hue/Saturation ONLY - no CCT)
189
+ this.api.matter.registerAccessory({
190
+ uuid: uuidLightColour,
191
+ displayName: 'Colour Light (HS)',
192
+ deviceType: this.api.matter.deviceTypes.ExtendedColorLight,
193
+ serialNumber: 'LIGHT-004',
503
194
  manufacturer: 'Matter Examples',
504
- model: 'Fan v1',
195
+ model: 'ColorLight v1',
505
196
  clusters: {
506
- fanControl: {
507
- fanMode: 0, // 0 = Off, 1 = Low, 2 = Medium, 3 = High, 4 = On, 5 = Auto, 6 = Smart
508
- percentCurrent: 0,
509
- percentSetting: 0,
197
+ onOff: {
198
+ onOff: false,
510
199
  },
511
- },
512
- handlers: {
513
- fanControl: {
514
- step: async (args) => {
515
- this.log.info(`[Fan] Step ${args.direction === 0 ? 'increase' : 'decrease'}`);
516
- },
200
+ levelControl: {
201
+ currentLevel: 127,
202
+ minLevel: 1,
203
+ maxLevel: 254,
517
204
  },
518
- },
519
- });
520
- }
521
- /**
522
- * Security Devices
523
- */
524
- registerSecurity() {
525
- // 17. Door Lock
526
- this.api.registerMatterAccessory({
527
- uuid: 'matter-door-lock',
528
- displayName: 'Smart Door Lock',
529
- deviceType: this.api.matterDeviceTypes.DoorLock,
530
- serialNumber: 'LOCK-001',
531
- manufacturer: 'Matter Examples',
532
- model: 'DoorLock v1',
533
- clusters: {
534
- doorLock: {
535
- lockState: 1, // 0 = not fully locked, 1 = locked, 2 = unlocked
536
- lockType: 0, // 0 = dead bolt
537
- actuatorEnabled: true,
205
+ colorControl: {
206
+ colorMode: 0, // Hue/Saturation mode
207
+ currentHue: 0, // Red (0 degrees)
208
+ currentSaturation: 254, // Full saturation
209
+ currentX: 41942, // Also provide XY for compatibility
210
+ currentY: 21626,
538
211
  },
539
212
  },
213
+ // These are called when the user controls the accessory via the Home app
540
214
  handlers: {
541
- doorLock: {
542
- lockDoor: async () => {
543
- this.log.info('[Door Lock] Locked');
215
+ onOff: {
216
+ on: async () => {
217
+ this.log.info('[Colour Light HS] ✓ Handler `on` called (user controlled via Home app)');
544
218
  },
545
- unlockDoor: async () => {
546
- this.log.info('[Door Lock] Unlocked');
219
+ off: async () => {
220
+ this.log.info('[Colour Light HS] ✓ Handler `off` called (user controlled via Home app)');
547
221
  },
548
222
  },
549
- },
550
- });
551
- }
552
- /**
553
- * Other Devices
554
- */
555
- registerOtherDevices() {
556
- // 18. Window Covering
557
- this.api.registerMatterAccessory({
558
- uuid: 'matter-window-covering',
559
- displayName: 'Window Blinds',
560
- deviceType: this.api.matterDeviceTypes.WindowCovering,
561
- serialNumber: 'BLIND-001',
562
- manufacturer: 'Matter Examples',
563
- model: 'WindowCovering v1',
564
- clusters: {
565
- windowCovering: {
566
- currentPositionLiftPercent100ths: 0, // 0 = fully open, 10000 = fully closed
567
- targetPositionLiftPercent100ths: 0,
568
- type: 0, // 0 = rollershade
569
- configStatus: 0x03, // operational and online
570
- },
571
- },
572
- handlers: {
573
- windowCovering: {
574
- upOrOpen: async () => {
575
- this.log.info('[Window Covering] Opening');
576
- },
577
- downOrClose: async () => {
578
- this.log.info('[Window Covering] Closing');
579
- },
580
- stopMotion: async () => {
581
- this.log.info('[Window Covering] Stopped');
582
- },
583
- goToLiftPercentage: async (args) => {
584
- this.log.info(`[Window Covering] Moving to ${args.liftPercent100thsValue / 100}%`);
223
+ levelControl: {
224
+ moveToLevelWithOnOff: async (request) => {
225
+ const { level } = request;
226
+ this.log.info(`[Colour Light HS] ✓ Handler \`moveToLevel\` called with ${level} (${Math.round(level / 254 * 100)}%)`);
585
227
  },
586
228
  },
587
- },
588
- });
589
- // 19. Generic Switch
590
- this.api.registerMatterAccessory({
591
- uuid: 'matter-generic-switch',
592
- displayName: 'Generic Switch',
593
- deviceType: this.api.matterDeviceTypes.GenericSwitch,
594
- serialNumber: 'GSWITCH-001',
595
- manufacturer: 'Matter Examples',
596
- model: 'GenericSwitch v1',
597
- clusters: {
598
- switch: {
599
- numberOfPositions: 2,
600
- currentPosition: 0,
601
- },
602
- },
603
- });
604
- // 20. Pump
605
- this.api.registerMatterAccessory({
606
- uuid: 'matter-pump',
607
- displayName: 'Water Pump',
608
- deviceType: this.api.matterDeviceTypes.Pump,
609
- serialNumber: 'PUMP-001',
610
- manufacturer: 'Matter Examples',
611
- model: 'Pump v1',
612
- clusters: {
613
- onOff: {
614
- onOff: false,
615
- },
616
- pumpConfigurationAndControl: {
617
- effectiveOperationMode: 0, // 0 = normal
618
- effectiveControlMode: 0, // 0 = constant speed
619
- },
620
- },
621
- handlers: {
622
- onOff: {
623
- on: async () => {
624
- this.log.info('[Pump] Turned ON');
229
+ colorControl: {
230
+ moveToColorLogic: async (request) => {
231
+ const { targetX, targetY, transitionTime } = request;
232
+ const xFloat = (targetX / 65535).toFixed(4);
233
+ const yFloat = (targetY / 65535).toFixed(4);
234
+ this.log.info(`[Colour Light HS] ✓ Handler \`moveToColorLogic\` called with x=${targetX} (~${xFloat}), y=${targetY} (~${yFloat}), transition: ${transitionTime}s`);
625
235
  },
626
- off: async () => {
627
- this.log.info('[Pump] Turned OFF');
236
+ moveToHueAndSaturationLogic: async (request) => {
237
+ const { targetHue, targetSaturation, transitionTime } = request;
238
+ const hueDegrees = Math.round((targetHue / 254) * 360);
239
+ const saturationPercent = Math.round((targetSaturation / 254) * 100);
240
+ this.log.info(`[Colour Light HS] ✓ Handler \`moveToHueAndSaturationLogic\` called with hue=${targetHue} (~${hueDegrees}°), saturation=${targetSaturation} (~${saturationPercent}%), transition: ${transitionTime}s`);
628
241
  },
242
+ // NOTE: No moveToColorTemperatureLogic handler - this light only supports color, not CCT
629
243
  },
630
244
  },
631
245
  });
632
- // 21. Room Air Conditioner
633
- this.api.registerMatterAccessory({
634
- uuid: 'matter-air-conditioner',
635
- displayName: 'Air Conditioner',
636
- deviceType: this.api.matterDeviceTypes.RoomAirConditioner,
637
- serialNumber: 'AC-001',
246
+ // 5. Extended Colour Light (Hue/Saturation + CCT)
247
+ this.api.matter.registerAccessory({
248
+ uuid: uuidLightExtendedColour,
249
+ displayName: 'Extended Colour Light (HS+CCT)',
250
+ deviceType: this.api.matter.deviceTypes.ExtendedColorLight,
251
+ serialNumber: 'LIGHT-005',
638
252
  manufacturer: 'Matter Examples',
639
- model: 'RoomAC v1',
253
+ model: 'ExtendedColorLight v1',
640
254
  clusters: {
641
255
  onOff: {
642
256
  onOff: false,
643
257
  },
644
- thermostat: {
645
- localTemperature: 2500, // 25°C
646
- occupiedCoolingSetpoint: 2200, // 22°C
647
- systemMode: 3, // Cool mode
648
- controlSequenceOfOperation: 2, // Cooling only
258
+ levelControl: {
259
+ currentLevel: 127,
260
+ minLevel: 1,
261
+ maxLevel: 254,
649
262
  },
650
- fanControl: {
651
- fanMode: 5, // Auto
652
- percentCurrent: 50,
653
- percentSetting: 50,
263
+ colorControl: {
264
+ colorMode: 0, // Hue/Saturation mode
265
+ currentHue: 0, // Red (0 degrees)
266
+ currentSaturation: 254, // Full saturation
267
+ currentX: 41942, // Also provide XY for compatibility
268
+ currentY: 21626,
269
+ colorTemperatureMireds: 250, // ~4000K (for CCT mode)
270
+ colorTempPhysicalMinMireds: 147, // 6800K (coolest)
271
+ colorTempPhysicalMaxMireds: 454, // 2200K (warmest)
272
+ coupleColorTempToLevelMinMireds: 147,
654
273
  },
655
274
  },
275
+ // These are called when the user controls the accessory via the Home app
656
276
  handlers: {
657
277
  onOff: {
658
278
  on: async () => {
659
- this.log.info('[Air Conditioner] Turned ON');
279
+ this.log.info('[Extended Colour Light] Handler `on` called (user controlled via Home app)');
660
280
  },
661
281
  off: async () => {
662
- this.log.info('[Air Conditioner] Turned OFF');
282
+ this.log.info('[Extended Colour Light] Handler `off` called (user controlled via Home app)');
663
283
  },
664
284
  },
665
- thermostat: {
666
- setpointRaiseLower: async (args) => {
667
- this.log.info(`[Air Conditioner] Temperature setpoint changed by ${args.amount / 10}°C`);
285
+ levelControl: {
286
+ moveToLevelWithOnOff: async (request) => {
287
+ const { level } = request;
288
+ this.log.info(`[Extended Colour Light] ✓ Handler \`moveToLevel\` called with ${level} (${Math.round(level / 254 * 100)}%)`);
668
289
  },
669
290
  },
670
- fanControl: {
671
- step: async (args) => {
672
- this.log.info(`[Air Conditioner] Fan step ${args.direction === 0 ? 'increase' : 'decrease'}`);
291
+ colorControl: {
292
+ moveToColorLogic: async (request) => {
293
+ const { targetX, targetY, transitionTime } = request;
294
+ const xFloat = (targetX / 65535).toFixed(4);
295
+ const yFloat = (targetY / 65535).toFixed(4);
296
+ this.log.info(`[Extended Colour Light] ✓ Handler \`moveToColorLogic\` called with x=${targetX} (~${xFloat}), y=${targetY} (~${yFloat}), transition: ${transitionTime}s`);
297
+ },
298
+ moveToHueAndSaturationLogic: async (request) => {
299
+ const { targetHue, targetSaturation, transitionTime } = request;
300
+ const hueDegrees = Math.round((targetHue / 254) * 360);
301
+ const saturationPercent = Math.round((targetSaturation / 254) * 100);
302
+ this.log.info(`[Extended Colour Light] ✓ Handler \`moveToHueAndSaturationLogic\` called with hue=${targetHue} (~${hueDegrees}°), saturation=${targetSaturation} (~${saturationPercent}%), transition: ${transitionTime}s`);
303
+ },
304
+ moveToColorTemperatureLogic: async (request) => {
305
+ const { targetMireds, transitionTime } = request;
306
+ const kelvin = Math.round(1000000 / targetMireds);
307
+ this.log.info(`[Extended Colour Light] ✓ Handler \`moveToColorTemperatureLogic\` called with ${targetMireds} mireds (~${kelvin}K), transition: ${transitionTime}s`);
673
308
  },
674
309
  },
675
310
  },
@@ -1 +1 @@
1
- {"version":3,"file":"platform.js","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"platform.js","sourceRoot":"","sources":["../src/platform.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -2,17 +2,17 @@
2
2
  "name": "@homebridge-plugins/homebridge-matter",
3
3
  "displayName": "Homebridge Matter",
4
4
  "type": "module",
5
- "version": "0.0.2",
5
+ "version": "0.0.3",
6
6
  "description": "A short description about what your plugin does.",
7
7
  "author": "Your Name",
8
8
  "license": "Apache-2.0",
9
- "homepage": "https://github.com/@homebridge-plugins/homebridge-matter#readme",
9
+ "homepage": "https://github.com/homebridge-plugins/homebridge-matter#readme",
10
10
  "repository": {
11
11
  "type": "git",
12
- "url": "git+https://github.com/@homebridge-plugins/homebridge-matter.git"
12
+ "url": "git+https://github.com/homebridge-plugins/homebridge-matter.git"
13
13
  },
14
14
  "bugs": {
15
- "url": "https://github.com/@homebridge-plugins/homebridge-matter/issues"
15
+ "url": "https://github.com/homebridge-plugins/homebridge-matter/issues"
16
16
  },
17
17
  "keywords": [
18
18
  "homebridge-plugin"
@@ -32,9 +32,9 @@
32
32
  "homebridge-lib": "^7.1.9"
33
33
  },
34
34
  "devDependencies": {
35
- "@antfu/eslint-config": "^5.4.1",
36
- "@types/node": "^24.7.2",
37
- "homebridge": "2.0.0-alpha.46",
35
+ "@antfu/eslint-config": "^6.0.0",
36
+ "@types/node": "^24.8.1",
37
+ "homebridge": "2.0.0-alpha.47",
38
38
  "nodemon": "^3.1.10",
39
39
  "rimraf": "^6.0.1",
40
40
  "ts-node": "^10.9.2",
@@ -1,42 +0,0 @@
1
- import type { API, Logging } from 'homebridge';
2
- /**
3
- * State Management Examples for Matter Accessories
4
- *
5
- * This demonstrates the two key patterns for managing accessory state:
6
- *
7
- * 1. HANDLERS (Matter → Device)
8
- * - Called when user controls device via Home app
9
- * - Plugin sends command to actual device (cloud API, local network, etc.)
10
- * - Analogous to HAP's setCharacteristic handlers
11
- *
12
- * 2. STATE UPDATES (Device → Matter)
13
- * - Called when device state changes externally (native app, physical button, polling, etc.)
14
- * - Plugin updates Matter state to reflect actual device state
15
- * - Analogous to HAP's updateCharacteristic
16
- */
17
- export declare class StateManagementExample {
18
- private readonly log;
19
- private readonly api;
20
- constructor(log: Logging, api: API);
21
- /**
22
- * Example 1: Smart Outlet with Two-Way Communication
23
- *
24
- * Demonstrates:
25
- * - Handler: User turns on outlet via Home app → control actual device
26
- * - State Update: Outlet turned on via native app → update Home app state
27
- */
28
- registerSmartOutletExample(): void;
29
- /**
30
- * Example 2: Dimmable Light with Brightness
31
- *
32
- * Shows how to handle multiple cluster attributes
33
- */
34
- registerDimmableLightExample(): void;
35
- /**
36
- * Example 3: Temperature Sensor (Read-Only)
37
- *
38
- * Sensors don't have handlers (no user commands)
39
- * Only need state updates when sensor readings change
40
- */
41
- registerTemperatureSensorExample(): void;
42
- }
@@ -1,236 +0,0 @@
1
- /**
2
- * State Management Examples for Matter Accessories
3
- *
4
- * This demonstrates the two key patterns for managing accessory state:
5
- *
6
- * 1. HANDLERS (Matter → Device)
7
- * - Called when user controls device via Home app
8
- * - Plugin sends command to actual device (cloud API, local network, etc.)
9
- * - Analogous to HAP's setCharacteristic handlers
10
- *
11
- * 2. STATE UPDATES (Device → Matter)
12
- * - Called when device state changes externally (native app, physical button, polling, etc.)
13
- * - Plugin updates Matter state to reflect actual device state
14
- * - Analogous to HAP's updateCharacteristic
15
- */
16
- export class StateManagementExample {
17
- log;
18
- api;
19
- constructor(log, api) {
20
- this.log = log;
21
- this.api = api;
22
- }
23
- /**
24
- * Example 1: Smart Outlet with Two-Way Communication
25
- *
26
- * Demonstrates:
27
- * - Handler: User turns on outlet via Home app → control actual device
28
- * - State Update: Outlet turned on via native app → update Home app state
29
- */
30
- registerSmartOutletExample() {
31
- // Simulated device state (in real plugin, this would be your device API/SDK)
32
- let deviceIsOn = false;
33
- // Function to control the actual device (cloud API, local network, etc.)
34
- const controlDevice = async (turnOn) => {
35
- this.log.info(`[Device Control] Sending command to turn outlet ${turnOn ? 'ON' : 'OFF'}`);
36
- // Example: Call your device API
37
- // await yourDeviceAPI.setOutletState(turnOn)
38
- // Simulate device response
39
- deviceIsOn = turnOn;
40
- this.log.info(`[Device Control] ✓ Outlet is now ${turnOn ? 'ON' : 'OFF'}`);
41
- };
42
- // Register the Matter accessory
43
- this.api.registerMatterAccessory({
44
- uuid: 'example-outlet-state-management',
45
- displayName: 'Example Smart Outlet',
46
- deviceType: this.api.matterDeviceTypes.OnOffOutlet,
47
- serialNumber: 'OUTLET-STATE-001',
48
- manufacturer: 'State Management Examples',
49
- model: 'SmartOutlet v1',
50
- clusters: {
51
- onOff: {
52
- onOff: deviceIsOn, // Initial state
53
- },
54
- },
55
- // ===== PATTERN 1: HANDLERS (Matter → Device) =====
56
- // These are called when user controls device via Home app
57
- // Similar to HAP's characteristic.on('set', handler)
58
- handlers: {
59
- onOff: {
60
- on: async () => {
61
- this.log.info('[HANDLER] User turned ON outlet via Home app');
62
- // Control the actual device
63
- await controlDevice(true);
64
- // State is automatically updated in Matter after handler completes
65
- // No need to call updateMatterAccessoryState here!
66
- },
67
- off: async () => {
68
- this.log.info('[HANDLER] User turned OFF outlet via Home app');
69
- // Control the actual device
70
- await controlDevice(false);
71
- // State is automatically updated in Matter after handler completes
72
- },
73
- },
74
- },
75
- });
76
- // ===== PATTERN 2: STATE UPDATES (Device → Matter) =====
77
- // Call this when device state changes externally
78
- // Similar to HAP's characteristic.updateValue()
79
- // Example: Device state changed via native mobile app
80
- const handleNativeAppChange = (newState) => {
81
- this.log.info(`[EXTERNAL] Outlet turned ${newState ? 'ON' : 'OFF'} via native app`);
82
- // Update local state
83
- deviceIsOn = newState;
84
- // Update Matter state WITHOUT triggering handlers
85
- // This is like HAP's updateCharacteristic - it just syncs the state
86
- this.api.updateMatterAccessoryState('example-outlet-state-management', 'onOff', { onOff: newState });
87
- this.log.info('[EXTERNAL] ✓ Home app state updated to match device');
88
- };
89
- // Example: Device state changed via physical button
90
- const handlePhysicalButton = (newState) => {
91
- this.log.info(`[EXTERNAL] Outlet turned ${newState ? 'ON' : 'OFF'} via physical button`);
92
- deviceIsOn = newState;
93
- // Update Matter state without triggering handlers
94
- this.api.updateMatterAccessoryState('example-outlet-state-management', 'onOff', { onOff: newState });
95
- };
96
- // Example: Polling device state periodically
97
- // eslint-disable-next-line unused-imports/no-unused-vars
98
- const pollDeviceState = async () => {
99
- // In real plugin, fetch state from device API
100
- // const actualState = await yourDeviceAPI.getOutletState()
101
- // For demo, simulate random state changes
102
- const actualState = Math.random() > 0.5;
103
- if (actualState !== deviceIsOn) {
104
- this.log.info(`[POLLING] Detected state change: ${actualState ? 'ON' : 'OFF'}`);
105
- deviceIsOn = actualState;
106
- // Update Matter state without triggering handlers
107
- this.api.updateMatterAccessoryState('example-outlet-state-management', 'onOff', { onOff: actualState });
108
- }
109
- };
110
- // Simulate external state changes for demonstration
111
- // In real plugin, these would be triggered by:
112
- // - WebSocket/SSE from cloud API
113
- // - Physical button press events
114
- // - Polling interval
115
- // - Push notifications
116
- // Demo: Native app changes after 10 seconds
117
- setTimeout(() => handleNativeAppChange(true), 10000);
118
- // Demo: Physical button press after 20 seconds
119
- setTimeout(() => handlePhysicalButton(false), 20000);
120
- // Demo: Poll every 30 seconds (optional - use events/webhooks when possible)
121
- // setInterval(pollDeviceState, 30000);
122
- }
123
- /**
124
- * Example 2: Dimmable Light with Brightness
125
- *
126
- * Shows how to handle multiple cluster attributes
127
- */
128
- registerDimmableLightExample() {
129
- let deviceIsOn = false;
130
- let deviceBrightness = 127; // 0-254 scale
131
- // Device control function
132
- const controlDevice = async (on, brightness) => {
133
- if (on !== undefined) {
134
- deviceIsOn = on;
135
- this.log.info(`[Device] Light turned ${on ? 'ON' : 'OFF'}`);
136
- }
137
- if (brightness !== undefined) {
138
- deviceBrightness = brightness;
139
- this.log.info(`[Device] Brightness set to ${Math.round(brightness / 254 * 100)}%`);
140
- }
141
- };
142
- this.api.registerMatterAccessory({
143
- uuid: 'example-dimmable-light-state',
144
- displayName: 'Example Dimmable Light',
145
- deviceType: this.api.matterDeviceTypes.DimmableLight,
146
- serialNumber: 'LIGHT-STATE-001',
147
- manufacturer: 'State Management Examples',
148
- model: 'DimmableLight v1',
149
- clusters: {
150
- onOff: {
151
- onOff: deviceIsOn,
152
- },
153
- levelControl: {
154
- currentLevel: deviceBrightness,
155
- minLevel: 1,
156
- maxLevel: 254,
157
- },
158
- },
159
- handlers: {
160
- onOff: {
161
- on: async () => {
162
- await controlDevice(true);
163
- },
164
- off: async () => {
165
- await controlDevice(false);
166
- },
167
- },
168
- levelControl: {
169
- moveToLevel: async (args) => {
170
- this.log.info(`[HANDLER] User set brightness to ${args.level} via Home app`);
171
- await controlDevice(undefined, args.level);
172
- },
173
- },
174
- },
175
- });
176
- // Example: Device brightness changed via native app
177
- const handleBrightnessChange = (newBrightness) => {
178
- this.log.info(`[EXTERNAL] Brightness changed to ${Math.round(newBrightness / 254 * 100)}% via native app`);
179
- deviceBrightness = newBrightness;
180
- // Update only the brightness attribute
181
- this.api.updateMatterAccessoryState('example-dimmable-light-state', 'levelControl', { currentLevel: newBrightness });
182
- };
183
- // Example: Both on/off and brightness changed together
184
- const handleCompleteStateChange = (on, brightness) => {
185
- this.log.info(`[EXTERNAL] Complete state change: ${on ? 'ON' : 'OFF'} at ${Math.round(brightness / 254 * 100)}%`);
186
- deviceIsOn = on;
187
- deviceBrightness = brightness;
188
- // Update multiple clusters
189
- this.api.updateMatterAccessoryState('example-dimmable-light-state', 'onOff', { onOff: on });
190
- this.api.updateMatterAccessoryState('example-dimmable-light-state', 'levelControl', { currentLevel: brightness });
191
- };
192
- // Demo: Brightness change after 15 seconds
193
- setTimeout(() => handleBrightnessChange(200), 15000);
194
- // Demo: Complete state change after 25 seconds
195
- setTimeout(() => handleCompleteStateChange(true, 100), 25000);
196
- }
197
- /**
198
- * Example 3: Temperature Sensor (Read-Only)
199
- *
200
- * Sensors don't have handlers (no user commands)
201
- * Only need state updates when sensor readings change
202
- */
203
- registerTemperatureSensorExample() {
204
- let currentTemp = 2100; // 21.00°C in hundredths
205
- this.api.registerMatterAccessory({
206
- uuid: 'example-temp-sensor-state',
207
- displayName: 'Example Temperature Sensor',
208
- deviceType: this.api.matterDeviceTypes.TemperatureSensor,
209
- serialNumber: 'TEMP-STATE-001',
210
- manufacturer: 'State Management Examples',
211
- model: 'TempSensor v1',
212
- clusters: {
213
- temperatureMeasurement: {
214
- measuredValue: currentTemp,
215
- minMeasuredValue: -5000,
216
- maxMeasuredValue: 10000,
217
- },
218
- },
219
- // No handlers needed - sensors are read-only!
220
- });
221
- // Poll sensor reading every 60 seconds
222
- const updateTemperature = () => {
223
- // In real plugin: const temp = await yourSensorAPI.getTemperature()
224
- // Simulate temperature change
225
- currentTemp = 2100 + Math.floor(Math.random() * 500 - 250); // 21°C ± 2.5°C
226
- this.log.info(`[SENSOR] Temperature updated: ${(currentTemp / 100).toFixed(2)}°C`);
227
- // Update Matter state
228
- this.api.updateMatterAccessoryState('example-temp-sensor-state', 'temperatureMeasurement', { measuredValue: currentTemp });
229
- };
230
- // Update temperature every minute
231
- setInterval(updateTemperature, 60000);
232
- // Initial update after 5 seconds
233
- setTimeout(updateTemperature, 5000);
234
- }
235
- }
236
- //# sourceMappingURL=exampleStateManagement.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"exampleStateManagement.js","sourceRoot":"","sources":["../src/exampleStateManagement.ts"],"names":[],"mappings":"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"}