homebridge 2.0.0-beta.109 → 2.0.0-beta.110

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.
@@ -49,6 +49,53 @@ export interface SwitchAPI {
49
49
  position?: number;
50
50
  partId?: string;
51
51
  }) => Promise<void>;
52
+ /**
53
+ * Emit a high-level gesture for a `GenericSwitch` accessory.
54
+ *
55
+ * Convenience helper for integrations that already classify gestures (e.g. remotes that
56
+ * report only `single`, `double`, or `hold`). Translates each gesture into the canonical
57
+ * `press` / `release` sequence that Matter.js `SwitchServer` expects, so the server still
58
+ * determines the correct Switch cluster events (`shortRelease`, `longRelease`,
59
+ * `multiPressComplete`) based on timing.
60
+ *
61
+ * | Gesture | Translated sequence |
62
+ * |---------------|-----------------------------------------------------------------|
63
+ * | `singlePress` | `press` → `release` |
64
+ * | `doublePress` | `press` → `release` → *(multiPressDelayMs)* → `press` → `release` |
65
+ * | `longPress` | `press` → *(longPressDelayMs)* → `release` |
66
+ *
67
+ * Default delays:
68
+ * - `longPressDelayMs` – `2500` ms (just above the Matter.js `longPressDelay` default of 2000 ms)
69
+ * - `multiPressDelayMs` – `100` ms (well within the Matter.js `multiPressDelay` window of 300 ms)
70
+ *
71
+ * @param uuid - UUID of the GenericSwitch accessory
72
+ * @param gesture - The gesture to emit: `'singlePress'`, `'doublePress'`, or `'longPress'`
73
+ * @param options - Optional configuration
74
+ * @param options.position - Button position index (1-based). Defaults to `1`.
75
+ * @param options.partId - Part ID for composed devices with GenericSwitch parts.
76
+ * @param options.longPressDelayMs - How long (ms) to hold the button for a long press.
77
+ * Defaults to `2500`. Only relevant for `'longPress'`.
78
+ * @param options.multiPressDelayMs - Delay (ms) between the two press cycles of a double press.
79
+ * Defaults to `100`. Only relevant for `'doublePress'`.
80
+ *
81
+ * @example
82
+ * ```typescript
83
+ * // Single press on a simple remote
84
+ * await api.matter?.switch.emitGesture(uuid, 'singlePress')
85
+ *
86
+ * // Double press on button 2 of a multi-button remote
87
+ * await api.matter?.switch.emitGesture(uuid, 'doublePress', { position: 2 })
88
+ *
89
+ * // Long press on a composed device part
90
+ * await api.matter?.switch.emitGesture(uuid, 'longPress', { partId: 'button-top' })
91
+ * ```
92
+ */
93
+ emitGesture: (uuid: string, gesture: 'singlePress' | 'doublePress' | 'longPress', options?: {
94
+ position?: number;
95
+ partId?: string;
96
+ longPressDelayMs?: number;
97
+ multiPressDelayMs?: number;
98
+ }) => Promise<void>;
52
99
  }
53
100
  /**
54
101
  * Implementation of {@link SwitchAPI}.
@@ -66,5 +113,11 @@ export declare class SwitchAPIImpl implements SwitchAPI {
66
113
  position?: number;
67
114
  partId?: string;
68
115
  }): Promise<void>;
116
+ emitGesture(uuid: string, gesture: 'singlePress' | 'doublePress' | 'longPress', options?: {
117
+ position?: number;
118
+ partId?: string;
119
+ longPressDelayMs?: number;
120
+ multiPressDelayMs?: number;
121
+ }): Promise<void>;
69
122
  }
70
123
  //# sourceMappingURL=SwitchAPI.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"SwitchAPI.d.ts","sourceRoot":"","sources":["../../src/matter/SwitchAPI.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAO1C;;;;;GAKG;AACH,MAAM,WAAW,SAAS;IACxB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAsCG;IACH,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,SAAS,EAAE,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CACrH;AAED;;;;;;;;GAQG;AACH,qBAAa,aAAc,YAAW,SAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAAT,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,sBAAsB,CAAC;IAEzE,IAAI,CACR,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,OAAO,GAAG,SAAS,EAC3B,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAC/C,OAAO,CAAC,IAAI,CAAC;CAgCjB"}
1
+ {"version":3,"file":"SwitchAPI.d.ts","sourceRoot":"","sources":["../../src/matter/SwitchAPI.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAO1C;;;;;GAKG;AACH,MAAM,WAAW,SAAS;IACxB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAsCG;IACH,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,SAAS,EAAE,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAEpH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAwCG;IACH,WAAW,EAAE,CACX,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,aAAa,GAAG,aAAa,GAAG,WAAW,EACpD,OAAO,CAAC,EAAE;QACR,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,gBAAgB,CAAC,EAAE,MAAM,CAAA;QACzB,iBAAiB,CAAC,EAAE,MAAM,CAAA;KAC3B,KACE,OAAO,CAAC,IAAI,CAAC,CAAA;CACnB;AAED;;;;;;;;GAQG;AACH,qBAAa,aAAc,YAAW,SAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAAT,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,sBAAsB,CAAC;IAEzE,IAAI,CACR,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,OAAO,GAAG,SAAS,EAC3B,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAC/C,OAAO,CAAC,IAAI,CAAC;IAiCV,WAAW,CACf,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,aAAa,GAAG,aAAa,GAAG,WAAW,EACpD,OAAO,CAAC,EAAE;QACR,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,gBAAgB,CAAC,EAAE,MAAM,CAAA;QACzB,iBAAiB,CAAC,EAAE,MAAM,CAAA;KAC3B,GACA,OAAO,CAAC,IAAI,CAAC;CAuCjB"}
@@ -42,5 +42,39 @@ export class SwitchAPIImpl {
42
42
  log.debug(`Emitting switch ${action} for accessory ${uuid}: currentPosition=${position}${partId ? `, partId=${partId}` : ''}`);
43
43
  await this.matterApi.updateAccessoryState(uuid, clusterNames.Switch, { currentPosition: position }, partId);
44
44
  }
45
+ async emitGesture(uuid, gesture, options) {
46
+ if (!uuid) {
47
+ log.error('switch.emitGesture: uuid parameter is required');
48
+ return;
49
+ }
50
+ if (gesture !== 'singlePress' && gesture !== 'doublePress' && gesture !== 'longPress') {
51
+ log.error(`switch.emitGesture: invalid gesture "${gesture}" — must be "singlePress", "doublePress", or "longPress"`);
52
+ return;
53
+ }
54
+ const emitOpts = { position: options?.position, partId: options?.partId };
55
+ switch (gesture) {
56
+ case 'singlePress': {
57
+ await this.emit(uuid, 'press', emitOpts);
58
+ await this.emit(uuid, 'release', emitOpts);
59
+ break;
60
+ }
61
+ case 'doublePress': {
62
+ const multiPressDelayMs = options?.multiPressDelayMs ?? 100;
63
+ await this.emit(uuid, 'press', emitOpts);
64
+ await this.emit(uuid, 'release', emitOpts);
65
+ await new Promise(resolve => setTimeout(resolve, multiPressDelayMs));
66
+ await this.emit(uuid, 'press', emitOpts);
67
+ await this.emit(uuid, 'release', emitOpts);
68
+ break;
69
+ }
70
+ case 'longPress': {
71
+ const longPressDelayMs = options?.longPressDelayMs ?? 2500;
72
+ await this.emit(uuid, 'press', emitOpts);
73
+ await new Promise(resolve => setTimeout(resolve, longPressDelayMs));
74
+ await this.emit(uuid, 'release', emitOpts);
75
+ break;
76
+ }
77
+ }
78
+ }
45
79
  }
46
80
  //# sourceMappingURL=SwitchAPI.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SwitchAPI.js","sourceRoot":"","sources":["../../src/matter/SwitchAPI.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAEzC,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,eAAe,CAAC,CAAA;AAmD9C;;;;;;;;GAQG;AACH,MAAM,OAAO,aAAa;IACK;IAA7B,YAA6B,SAAkD;QAAlD,cAAS,GAAT,SAAS,CAAyC;IAAG,CAAC;IAEnF,KAAK,CAAC,IAAI,CACR,IAAY,EACZ,MAA2B,EAC3B,OAAgD;QAEhD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,GAAG,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAA;YACpD,OAAM;QACR,CAAC;QAED,IAAI,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YAC/C,GAAG,CAAC,KAAK,CAAC,gCAAgC,MAAgB,kCAAkC,CAAC,CAAA;YAC7F,OAAM;QACR,CAAC;QAED,IAAI,QAAgB,CAAA;QACpB,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;YACvB,MAAM,WAAW,GAAG,OAAO,EAAE,QAAQ,IAAI,CAAC,CAAA;YAC1C,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,WAAW,GAAG,CAAC,EAAE,CAAC;gBACtD,GAAG,CAAC,IAAI,CAAC,iCAAiC,WAAW,mDAAmD,CAAC,CAAA;gBACzG,QAAQ,GAAG,CAAC,CAAA;YACd,CAAC;iBAAM,CAAC;gBACN,QAAQ,GAAG,WAAW,CAAA;YACxB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,QAAQ,GAAG,CAAC,CAAA;QACd,CAAC;QAED,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,CAAA;QAE9B,GAAG,CAAC,KAAK,CACP,mBAAmB,MAAM,kBAAkB,IAAI,qBAAqB,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,YAAY,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CACpH,CAAA;QAED,MAAM,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC,IAAI,EAAE,YAAY,CAAC,MAAM,EAAE,EAAE,eAAe,EAAE,QAAQ,EAAE,EAAE,MAAM,CAAC,CAAA;IAC7G,CAAC;CACF"}
1
+ {"version":3,"file":"SwitchAPI.js","sourceRoot":"","sources":["../../src/matter/SwitchAPI.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "homebridge",
3
3
  "type": "module",
4
- "version": "2.0.0-beta.109",
4
+ "version": "2.0.0-beta.110",
5
5
  "description": "HomeKit support for the impatient",
6
6
  "author": "Nick Farina",
7
7
  "license": "Apache-2.0",