@switchbot/homebridge-switchbot 5.0.0-beta.111 → 5.0.0-beta.113

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/MIGRATION.md +10 -0
  2. package/README.md +43 -0
  3. package/TODO.md +263 -0
  4. package/config.schema.json +27 -10
  5. package/dist/device-types.d.ts.map +1 -1
  6. package/dist/device-types.js +93 -63
  7. package/dist/device-types.js.map +1 -1
  8. package/dist/deviceFactory.d.ts.map +1 -1
  9. package/dist/deviceFactory.js +55 -33
  10. package/dist/deviceFactory.js.map +1 -1
  11. package/dist/devices/genericDevice.d.ts +12 -1
  12. package/dist/devices/genericDevice.d.ts.map +1 -1
  13. package/dist/devices/genericDevice.js +121 -1
  14. package/dist/devices/genericDevice.js.map +1 -1
  15. package/dist/errors.d.ts +5 -0
  16. package/dist/errors.d.ts.map +1 -0
  17. package/dist/errors.js +51 -0
  18. package/dist/errors.js.map +1 -0
  19. package/dist/homebridge-ui/endpoints/devices.d.ts.map +1 -1
  20. package/dist/homebridge-ui/endpoints/devices.js +80 -1
  21. package/dist/homebridge-ui/endpoints/devices.js.map +1 -1
  22. package/dist/homebridge-ui/endpoints/discovery.d.ts.map +1 -1
  23. package/dist/homebridge-ui/endpoints/discovery.js +73 -41
  24. package/dist/homebridge-ui/endpoints/discovery.js.map +1 -1
  25. package/dist/homebridge-ui/public/css/styles.css +209 -16
  26. package/dist/homebridge-ui/public/index.html +87 -56
  27. package/dist/homebridge-ui/public/js/api.d.ts +24 -1
  28. package/dist/homebridge-ui/public/js/api.d.ts.map +1 -1
  29. package/dist/homebridge-ui/public/js/api.js +33 -2
  30. package/dist/homebridge-ui/public/js/api.js.map +1 -1
  31. package/dist/homebridge-ui/public/js/api.ts +52 -3
  32. package/dist/homebridge-ui/public/js/app.js +1604 -143
  33. package/dist/homebridge-ui/public/js/app.js.map +3 -3
  34. package/dist/homebridge-ui/public/js/app.ts +2 -1
  35. package/dist/homebridge-ui/public/js/devices.d.ts.map +1 -1
  36. package/dist/homebridge-ui/public/js/devices.js +2 -0
  37. package/dist/homebridge-ui/public/js/devices.js.map +1 -1
  38. package/dist/homebridge-ui/public/js/devices.ts +13 -1
  39. package/dist/homebridge-ui/public/js/discovery.d.ts +1 -0
  40. package/dist/homebridge-ui/public/js/discovery.d.ts.map +1 -1
  41. package/dist/homebridge-ui/public/js/discovery.js +1244 -124
  42. package/dist/homebridge-ui/public/js/discovery.js.map +1 -1
  43. package/dist/homebridge-ui/public/js/discovery.ts +1344 -142
  44. package/dist/homebridge-ui/public/js/modals.d.ts.map +1 -1
  45. package/dist/homebridge-ui/public/js/modals.js +42 -0
  46. package/dist/homebridge-ui/public/js/modals.js.map +1 -1
  47. package/dist/homebridge-ui/public/js/modals.ts +50 -1
  48. package/dist/homebridge-ui/public/js/render.d.ts +3 -0
  49. package/dist/homebridge-ui/public/js/render.d.ts.map +1 -1
  50. package/dist/homebridge-ui/public/js/render.js +389 -36
  51. package/dist/homebridge-ui/public/js/render.js.map +1 -1
  52. package/dist/homebridge-ui/public/js/render.ts +421 -38
  53. package/dist/platform.d.ts +1 -0
  54. package/dist/platform.d.ts.map +1 -1
  55. package/dist/platform.js +3 -4
  56. package/dist/platform.js.map +1 -1
  57. package/dist/switchbotClient.d.ts.map +1 -1
  58. package/dist/switchbotClient.js +51 -5
  59. package/dist/switchbotClient.js.map +1 -1
  60. package/docs/assets/highlight.css +9 -2
  61. package/docs/index.html +28 -2
  62. package/docs/variables/default.html +1 -1
  63. package/package.json +9 -8
  64. package/src/device-types.ts +95 -64
  65. package/src/deviceFactory.ts +55 -33
  66. package/src/devices/genericDevice.ts +113 -1
  67. package/src/errors.ts +43 -0
  68. package/src/homebridge-ui/endpoints/devices.ts +82 -1
  69. package/src/homebridge-ui/endpoints/discovery.ts +78 -44
  70. package/src/homebridge-ui/public/css/styles.css +209 -16
  71. package/src/homebridge-ui/public/index.html +87 -56
  72. package/src/homebridge-ui/public/js/api.ts +52 -3
  73. package/src/homebridge-ui/public/js/app.ts +2 -1
  74. package/src/homebridge-ui/public/js/devices.ts +13 -1
  75. package/src/homebridge-ui/public/js/discovery.ts +1344 -142
  76. package/src/homebridge-ui/public/js/modals.ts +50 -1
  77. package/src/homebridge-ui/public/js/render.ts +421 -38
  78. package/src/platform.ts +3 -4
  79. package/src/switchbotClient.ts +44 -9
  80. package/test/e2e/run-e2e.spec.ts +12 -10
  81. package/test/helpers/matter-harness.ts +2 -2
  82. package/test/matter-integration.spec.ts +21 -0
  83. package/todo/COMPLETED.md +313 -0
  84. package/todo/TODO.md +80 -66
  85. package/switchbot-homebridge-switchbot-5.0.0.tgz +0 -0
@@ -75,12 +75,13 @@ body {
75
75
  system-ui,
76
76
  -apple-system,
77
77
  Arial;
78
- padding: 16px;
78
+ padding: 10px;
79
79
  }
80
80
 
81
81
  h1 {
82
- font-size: 24px;
82
+ font-size: 18px;
83
83
  margin-top: 0;
84
+ margin-bottom: 10px;
84
85
  }
85
86
 
86
87
  h2 {
@@ -152,25 +153,25 @@ code {
152
153
  }
153
154
 
154
155
  .form-group {
155
- margin-bottom: 16px;
156
+ margin-bottom: 10px;
156
157
  }
157
158
 
158
159
  label {
159
160
  display: block;
160
- margin-bottom: 6px;
161
+ margin-bottom: 4px;
161
162
  font-weight: 500;
162
- font-size: 12px;
163
+ font-size: 11px;
163
164
  color: #6b7280;
164
165
  }
165
166
 
166
167
  input {
167
168
  width: 100%;
168
169
  max-width: 400px;
169
- padding: 8px 10px;
170
+ padding: 6px 8px;
170
171
  border: 1px solid #d1d5db;
171
172
  border-radius: 6px;
172
173
  font-family: system-ui, -apple-system, monospace;
173
- font-size: 14px;
174
+ font-size: 12px;
174
175
  transition: all 0.2s ease;
175
176
  }
176
177
 
@@ -203,8 +204,8 @@ select:focus {
203
204
  }
204
205
 
205
206
  .status {
206
- font-size: 14px;
207
- margin-top: 4px;
207
+ font-size: 11px;
208
+ margin-top: 3px;
208
209
  }
209
210
 
210
211
  .status.ok {
@@ -221,27 +222,207 @@ select:focus {
221
222
  }
222
223
 
223
224
  .card {
224
- padding: 16px;
225
+ padding: 12px;
225
226
  border-radius: 8px;
226
- margin-bottom: 16px;
227
+ margin-bottom: 10px;
227
228
  }
228
229
 
229
- .device-item {
230
- padding: 10px 12px;
231
- border-radius: 6px;
230
+ .card.compact {
231
+ padding: 10px;
232
+ margin-bottom: 10px;
233
+ }
234
+
235
+ .card.compact h2 {
236
+ margin-top: 0;
237
+ margin-bottom: 6px;
238
+ font-size: 13px;
239
+ font-weight: 600;
240
+ }
241
+
242
+ .card.compact .form-group {
232
243
  margin-bottom: 6px;
244
+ }
245
+
246
+ .card.compact label {
247
+ font-size: 11px;
248
+ margin-bottom: 2px;
249
+ display: block;
250
+ }
251
+
252
+ .card.compact input {
253
+ padding: 5px 8px;
254
+ font-size: 12px;
255
+ }
256
+
257
+ .card.compact button {
258
+ padding: 6px 12px;
259
+ font-size: 12px;
260
+ }
261
+
262
+ .card.compact .status {
263
+ font-size: 11px;
264
+ margin-top: 4px;
265
+ }
266
+
267
+ .credentials-row {
268
+ display: flex;
269
+ flex-wrap: wrap;
270
+ gap: 8px;
271
+ }
272
+
273
+ .credentials-row .form-group {
274
+ flex: 1 1 100%;
275
+ min-width: 0;
276
+ }
277
+
278
+ @media (min-width: 700px) {
279
+ .credentials-row {
280
+ gap: 10px;
281
+ align-items: start;
282
+ }
283
+
284
+ .credentials-row .form-group {
285
+ flex: 1 1 calc(50% - 5px);
286
+ }
287
+ }
288
+
289
+ .device-item {
290
+ padding: 5px 8px;
291
+ border-radius: 5px;
292
+ margin-bottom: 0;
233
293
  display: flex;
234
- gap: 10px;
294
+ gap: 8px;
235
295
  align-items: center;
236
296
  justify-content: space-between;
237
297
  transition: all 0.2s ease;
298
+ height: 100%;
299
+ min-width: 0;
238
300
  }
239
301
 
240
302
  .device-item:hover {
241
- transform: translateY(-1px);
303
+ transform: translateY(-0.5px);
242
304
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
243
305
  }
244
306
 
307
+ .device-actions {
308
+ display: flex;
309
+ flex-wrap: wrap;
310
+ gap: 6px;
311
+ }
312
+
313
+ .discover-phase-progress {
314
+ margin-bottom: 8px;
315
+ }
316
+
317
+ .discovery-settings-row {
318
+ display: flex;
319
+ flex-wrap: wrap;
320
+ gap: 8px;
321
+ align-items: center;
322
+ }
323
+
324
+ .discover-phase-track {
325
+ width: 100%;
326
+ height: 5px;
327
+ border-radius: 999px;
328
+ background: rgba(148, 163, 184, 0.35);
329
+ overflow: hidden;
330
+ }
331
+
332
+ .discover-phase-fill {
333
+ width: 0%;
334
+ height: 100%;
335
+ border-radius: 999px;
336
+ background: var(--switchbot-red, #ef4444);
337
+ transition: width 0.25s ease;
338
+ }
339
+
340
+ .discover-phase-label {
341
+ margin-top: 3px;
342
+ font-size: 10px;
343
+ opacity: 0.75;
344
+ }
345
+
346
+ .discovery-groups {
347
+ display: block;
348
+ max-height: 400px;
349
+ overflow-y: auto;
350
+ margin-top: 10px;
351
+ }
352
+
353
+ .discovery-group {
354
+ margin-top: 8px;
355
+ }
356
+
357
+ .discovery-group:first-child {
358
+ margin-top: 0;
359
+ }
360
+
361
+ .discovery-group-header {
362
+ margin: 0 0 4px;
363
+ font-size: 11px;
364
+ font-weight: 600;
365
+ opacity: 0.85;
366
+ }
367
+
368
+ .discovery-group-header-btn {
369
+ width: 100%;
370
+ text-align: left;
371
+ margin: 0 0 4px;
372
+ padding: 2px 0;
373
+ border: 0;
374
+ background: transparent;
375
+ color: inherit;
376
+ font-size: 11px;
377
+ font-weight: 600;
378
+ opacity: 0.9;
379
+ cursor: pointer;
380
+ border-radius: 0;
381
+ box-shadow: none;
382
+ transform: none;
383
+ }
384
+
385
+ .discovery-group-header-btn:hover,
386
+ .discovery-group-header-btn:active {
387
+ background: transparent;
388
+ color: inherit;
389
+ box-shadow: none;
390
+ transform: none;
391
+ }
392
+
393
+ .discovery-group-empty {
394
+ font-size: 11px;
395
+ opacity: 0.75;
396
+ padding: 4px 0;
397
+ }
398
+
399
+ #devices.device-grid,
400
+ #discoveredDevices.device-grid,
401
+ ul.device-grid {
402
+ display: grid;
403
+ grid-template-columns: repeat(auto-fit, minmax(210px, 1fr));
404
+ gap: 6px;
405
+ padding-left: 0;
406
+ list-style: none;
407
+ margin: 0;
408
+ }
409
+
410
+ .device-item code {
411
+ display: inline-block;
412
+ max-width: 100%;
413
+ white-space: normal;
414
+ overflow-wrap: anywhere;
415
+ word-break: break-word;
416
+ }
417
+
418
+ @media (max-width: 900px) {
419
+ .device-actions {
420
+ width: 100%;
421
+ justify-content: flex-start !important;
422
+ margin-left: 0 !important;
423
+ }
424
+ }
425
+
245
426
  .card {
246
427
  padding: 16px;
247
428
  border-radius: 8px;
@@ -252,3 +433,15 @@ select:focus {
252
433
  .card:hover {
253
434
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);
254
435
  }
436
+ @keyframes pulse {
437
+ 0%, 100% {
438
+ opacity: 1;
439
+ }
440
+ 50% {
441
+ opacity: 0.5;
442
+ }
443
+ }
444
+
445
+ .discovery-scanning-pulse {
446
+ animation: pulse 1.5s ease-in-out infinite;
447
+ }
@@ -9,65 +9,101 @@
9
9
  <body>
10
10
  <h1>🤖 SwitchBot Configuration</h1>
11
11
 
12
- <div class="card">
12
+ <div class="card compact">
13
13
  <h2>API Credentials</h2>
14
- <p>
15
- Configure your SwitchBot API token and secret to enable device discovery
16
- and control.
17
- </p>
18
-
19
- <div class="form-group">
20
- <label for="token">API Token:</label>
21
- <input
22
- type="password"
23
- id="token"
24
- placeholder="Enter your SwitchBot API token"
25
- />
26
- <div class="status" id="tokenStatus"></div>
27
- </div>
28
-
29
- <div class="form-group">
30
- <label for="secret">API Secret:</label>
31
- <input
32
- type="password"
33
- id="secret"
34
- placeholder="Enter your SwitchBot API secret"
35
- />
36
- <div class="status" id="secretStatus"></div>
14
+ <div class="credentials-row">
15
+ <div class="form-group">
16
+ <label for="token">Token:</label>
17
+ <input type="password" id="token" placeholder="Enter token" />
18
+ <div class="status" id="tokenStatus"></div>
19
+ </div>
20
+ <div class="form-group">
21
+ <label for="secret">Secret:</label>
22
+ <input type="password" id="secret" placeholder="Enter secret" />
23
+ <div class="status" id="secretStatus"></div>
24
+ </div>
37
25
  </div>
38
-
39
- <button id="saveBtn" onclick="saveCredentials()">Save Credentials</button>
26
+ <button id="saveBtn" onclick="saveCredentials()">Save</button>
40
27
  <div id="saveStatus"></div>
41
28
  </div>
42
29
 
43
- <div class="card">
30
+ <div class="card compact">
44
31
  <h2>Discover Devices</h2>
45
- <p>
46
- Click "Discover" to find all devices available in your SwitchBot account
47
- and add them to your configuration.
48
- </p>
49
- <div style="margin-bottom: 16px">
50
- <label
51
- style="display: flex; align-items: center; gap: 8px; cursor: pointer"
52
- >
32
+ <div style="margin-bottom: 6px">
33
+ <label style="display: flex; align-items: center; gap: 4px; cursor: pointer; font-size: 11px">
34
+ <input type="checkbox" id="autoAddAllCheckbox" style="width: auto; margin: 0" />
35
+ <span>Auto-add all</span>
36
+ <span
37
+ title="When enabled, Discover immediately adds all found devices to your config. Existing devices are skipped automatically."
38
+ style="font-size: 11px; opacity: 0.7"
39
+ >ⓘ</span>
40
+ </label>
41
+ <div style="margin-top: 2px; margin-left: 22px; font-size: 10px; opacity: 0.75; line-height: 1.25">
42
+ Adds all discovered devices automatically; already configured devices are skipped.
43
+ </div>
44
+ </div>
45
+ <div class="discovery-settings-row" style="margin-bottom: 2px">
46
+ <label id="bleScanSetting" style="display: inline-flex; align-items: center; gap: 4px; font-size: 11px">
47
+ <span>Scan:</span>
48
+ <select id="bleScanDurationSelect" style="font-size: 11px; padding: 2px 6px">
49
+ <option value="3">3s</option>
50
+ <option value="5" selected>5s</option>
51
+ <option value="10">10s</option>
52
+ <option value="15">15s</option>
53
+ </select>
54
+ </label>
55
+ <label id="bleTimeoutSetting" style="display: inline-flex; align-items: center; gap: 4px; font-size: 11px">
56
+ <span>Timeout:</span>
53
57
  <input
54
- type="checkbox"
55
- id="autoAddAllCheckbox"
56
- style="width: auto; margin: 0"
58
+ id="bleTimeoutInput"
59
+ type="number"
60
+ min="3"
61
+ max="30"
62
+ step="1"
63
+ value="8"
64
+ style="width: 56px; font-size: 11px; padding: 2px 4px"
57
65
  />
58
- <span>Auto-add all discovered devices</span>
66
+ <span>s</span>
67
+ </label>
68
+ <label style="display: flex; align-items: center; gap: 4px; cursor: pointer; font-size: 11px">
69
+ <input type="checkbox" id="disableBleScanCheckbox" style="width: auto; margin: 0" />
70
+ <span>Disable BLE scan</span>
71
+ </label>
72
+ </div>
73
+ <div id="bluetoothStatus" style="margin-bottom: 4px; font-size: 10px; opacity: 0.8">Bluetooth: checking...</div>
74
+ <div class="discovery-settings-row" style="margin-bottom: 8px">
75
+ <div id="lastScannedStatus" style="font-size: 10px; opacity: 0.8; flex: 1 1 auto">Last scanned: never</div>
76
+ <label style="font-size: 11px">
77
+ Auto-refresh:
78
+ <select id="autoRefreshIntervalSelect" style="margin-left: 4px; font-size: 11px; padding: 2px 6px">
79
+ <option value="0" selected>Off</option>
80
+ <option value="30">30s</option>
81
+ <option value="60">1m</option>
82
+ <option value="300">5m</option>
83
+ </select>
59
84
  </label>
85
+ <button id="refreshDiscoverBtn" class="secondary" style="padding: 4px 9px; font-size: 11px">Refresh</button>
60
86
  </div>
87
+ <button id="discoverBtn" onclick="discoverDevices()" style="margin-bottom: 8px">
88
+ 🔍 Discover
89
+ </button>
61
90
  <button
62
- id="discoverBtn"
63
- onclick="discoverDevices()"
64
- style="margin-bottom: 16px"
91
+ id="cancelDiscoverBtn"
92
+ style="margin-left: 6px; margin-bottom: 8px; display: none; padding: 6px 10px; font-size: 11px"
93
+ class="secondary"
65
94
  >
66
- 🔍 Discover Devices
95
+ Cancel
67
96
  </button>
68
- <div id="discoverStatus" style="margin-bottom: 16px"></div>
97
+ <div id="discoverStatus" style="margin-bottom: 6px; font-size: 11px"></div>
98
+ <div id="discoverDevicesFound" style="margin-bottom: 6px; font-size: 11px; display: none"></div>
99
+ <div id="discoverPhaseProgress" class="discover-phase-progress" style="display: none">
100
+ <div class="discover-phase-track">
101
+ <div id="discoverPhaseFill" class="discover-phase-fill"></div>
102
+ </div>
103
+ <div id="discoverPhaseLabel" class="discover-phase-label"></div>
104
+ </div>
69
105
  <div id="discoveredList" style="display: none">
70
- <h3 style="margin-top: 0">Available Devices</h3>
106
+ <h3 style="margin-top: 0; font-size: 12px; margin-bottom: 6px; font-weight: 600">Available Devices</h3>
71
107
  <ul
72
108
  id="discoveredDevices"
73
109
  style="max-height: 300px; overflow-y: auto"
@@ -75,22 +111,17 @@
75
111
  </div>
76
112
  </div>
77
113
 
78
- <div class="card">
114
+ <div class="card compact">
79
115
  <h2>Configured Devices</h2>
80
- <p>
81
- This page lists devices found in your Homebridge config for the
82
- SwitchBot platform. Use the copy button to insert device IDs into the
83
- plugin configuration. Connection preference (BLE/OpenAPI) is shown when
84
- available.
85
- </p>
86
116
  <div id="status">Loading…</div>
87
117
  <ul id="devices"></ul>
118
+ <!-- BLE encryption key fields will be rendered dynamically per device in the UI (see app.ts/devices.js) -->
88
119
  <div
89
120
  id="removeAllContainer"
90
121
  style="
91
122
  display: none;
92
- margin-top: 16px;
93
- padding-top: 16px;
123
+ margin-top: 12px;
124
+ padding-top: 10px;
94
125
  border-top: 1px solid rgba(0, 0, 0, 0.1);
95
126
  "
96
127
  >
@@ -99,8 +130,8 @@
99
130
  style="
100
131
  background: #dc2626;
101
132
  width: 100%;
102
- padding: 10px 16px;
103
- font-size: 14px;
133
+ padding: 7px 12px;
134
+ font-size: 12px;
104
135
  font-weight: 500;
105
136
  "
106
137
  >
@@ -3,11 +3,34 @@ export declare function syncParentPluginConfigFromDisk(autoSave?: boolean): Prom
3
3
  export declare function fetchCredentialStatus(): Promise<any>;
4
4
  export declare function saveCredentials(token: string, secret: string): Promise<any>;
5
5
  export declare function fetchDevices(): Promise<any[]>;
6
- export declare function discoverDevices(): Promise<any[]>;
6
+ export type DiscoverRequestOptions = {
7
+ bleEnabled?: boolean;
8
+ bleScanDurationSeconds?: number;
9
+ bleTimeoutSeconds?: number;
10
+ };
11
+ export declare function discoverDevices(mode?: 'all' | 'ble' | 'openapi', options?: DiscoverRequestOptions): Promise<any[]>;
12
+ export declare function fetchBluetoothStatus(): Promise<{
13
+ available: boolean;
14
+ message: string;
15
+ }>;
16
+ export declare function testDeviceConnection(payload: {
17
+ deviceId: string;
18
+ connectionType?: string;
19
+ address?: string;
20
+ }): Promise<{
21
+ success: boolean;
22
+ deviceId: string;
23
+ method: string;
24
+ latencyMs: number;
25
+ message: string;
26
+ state?: Record<string, any>;
27
+ }>;
7
28
  export declare function addDevice(deviceId: string, name: string, type: string, options?: {
8
29
  address?: string;
9
30
  model?: string;
10
31
  rssi?: number;
32
+ encryptionKey?: string;
33
+ keyId?: string;
11
34
  }): Promise<any>;
12
35
  export declare function addDevicesInBulk(devices: Array<{
13
36
  deviceId: string;
@@ -1 +1 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../../src/homebridge-ui/public/js/api.ts"],"names":[],"mappings":"AACA,OAAO,YAAY,CAAA;AAYnB,wBAAsB,8BAA8B,CAAC,QAAQ,UAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CA2CvF;AAED,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,GAAG,CAAC,CAe1D;AAED,wBAAsB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAcjF;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CASnD;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAatD;AAED,wBAAsB,SAAS,CAC7B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5D,OAAO,CAAC,GAAG,CAAC,CAmBd;AAED,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,KAAK,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GAChH,OAAO,CAAC,GAAG,CAAC,CAad;AAED,wBAAsB,YAAY,CAChC,QAAQ,EAAE,MAAM,EAChB,gBAAgB,CAAC,EAAE,MAAM,EACzB,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,CAAC,GAAG,CAAC,CAkBd;AAED,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAcjE;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,GAAG,CAAC,CAcrD"}
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../../src/homebridge-ui/public/js/api.ts"],"names":[],"mappings":"AACA,OAAO,YAAY,CAAA;AAYnB,wBAAsB,8BAA8B,CAAC,QAAQ,UAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CA2CvF;AAED,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,GAAG,CAAC,CAe1D;AAED,wBAAsB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAcjF;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CASnD;AAED,MAAM,MAAM,sBAAsB,GAAG;IACnC,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAC/B,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC3B,CAAA;AAED,wBAAsB,eAAe,CACnC,IAAI,GAAE,KAAK,GAAG,KAAK,GAAG,SAAiB,EACvC,OAAO,CAAC,EAAE,sBAAsB,GAC/B,OAAO,CAAC,GAAG,EAAE,CAAC,CAahB;AAED,wBAAsB,oBAAoB,IAAI,OAAO,CAAC;IAAE,SAAS,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAU7F;AAED,wBAAsB,oBAAoB,CAAC,OAAO,EAAE;IAClD,QAAQ,EAAE,MAAM,CAAA;IAChB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB,GAAG,OAAO,CAAC;IACV,OAAO,EAAE,OAAO,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;CAC5B,CAAC,CAaD;AAED,wBAAsB,SAAS,CAC7B,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,GACpG,OAAO,CAAC,GAAG,CAAC,CAqBd;AAED,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,KAAK,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GAChH,OAAO,CAAC,GAAG,CAAC,CAad;AAED,wBAAsB,YAAY,CAChC,QAAQ,EAAE,MAAM,EAChB,gBAAgB,CAAC,EAAE,MAAM,EACzB,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,CAAC,GAAG,CAAC,CAkBd;AAED,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAcjE;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,GAAG,CAAC,CAcrD"}
@@ -86,9 +86,9 @@ export async function fetchDevices() {
86
86
  return [];
87
87
  }
88
88
  }
89
- export async function discoverDevices() {
89
+ export async function discoverDevices(mode = 'all', options) {
90
90
  try {
91
- const resp = await homebridge.request('/discover', {});
91
+ const resp = await homebridge.request('/discover', { mode, ...options });
92
92
  uiLog.info('Discover response:', resp);
93
93
  if (!resp || resp.success === false) {
94
94
  throw new Error(resp?.data?.message || 'Discovery failed');
@@ -99,6 +99,31 @@ export async function discoverDevices() {
99
99
  throw e;
100
100
  }
101
101
  }
102
+ export async function fetchBluetoothStatus() {
103
+ try {
104
+ const resp = await homebridge.request('/ble-status', {});
105
+ if (!resp || resp.success === false) {
106
+ return { available: false, message: 'Bluetooth status unavailable' };
107
+ }
108
+ return resp.data || { available: false, message: 'Bluetooth status unavailable' };
109
+ }
110
+ catch (_e) {
111
+ return { available: false, message: 'Bluetooth status unavailable' };
112
+ }
113
+ }
114
+ export async function testDeviceConnection(payload) {
115
+ const resp = await homebridge.request('/test-connection', payload);
116
+ if (!resp || resp.success === false) {
117
+ throw new Error(resp?.data?.message || 'Connection test failed');
118
+ }
119
+ return resp.data || {
120
+ success: false,
121
+ deviceId: payload.deviceId,
122
+ method: 'Auto',
123
+ latencyMs: 0,
124
+ message: 'Connection test failed',
125
+ };
126
+ }
102
127
  export async function addDevice(deviceId, name, type, options) {
103
128
  try {
104
129
  const payload = { deviceId, name, type };
@@ -111,6 +136,12 @@ export async function addDevice(deviceId, name, type, options) {
111
136
  if (options?.rssi !== undefined && options?.rssi !== null && options?.rssi !== 0) {
112
137
  payload.rssi = options.rssi;
113
138
  }
139
+ if (options?.encryptionKey) {
140
+ payload.encryptionKey = options.encryptionKey;
141
+ }
142
+ if (options?.keyId) {
143
+ payload.keyId = options.keyId;
144
+ }
114
145
  uiLog.info('Adding device to config:', payload);
115
146
  const resp = await homebridge.request('/add-device', payload);
116
147
  uiLog.info('Add device response:', resp);
@@ -1 +1 @@
1
- {"version":3,"file":"api.js","sourceRoot":"","sources":["../../../../src/homebridge-ui/public/js/api.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,OAAO,YAAY,CAAA;AACnB,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAEnC,SAAS,yBAAyB,CAAC,KAAU;IAC3C,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,EAAE,QAAQ,IAAI,KAAK,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAA;IAC/E,OAAO,CACL,YAAY,KAAK,WAAW;WACzB,YAAY,KAAK,iCAAiC;WAClD,YAAY,CAAC,QAAQ,CAAC,WAAW,CAAC,CACtC,CAAA;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,8BAA8B,CAAC,QAAQ,GAAG,KAAK;IACnE,IAAI,CAAC;QACH,IACE,OAAO,UAAU,CAAC,eAAe,KAAK,UAAU;eAC7C,OAAO,UAAU,CAAC,kBAAkB,KAAK,UAAU,EACtD,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAA;YAClD,OAAO,KAAK,CAAA;QACd,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAA;QACjE,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,OAAO,KAAK,KAAK,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC9D,KAAK,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAA;YAC7D,OAAO,KAAK,CAAA;QACd,CAAC;QAED,MAAM,kBAAkB,GAAG,MAAM,UAAU,CAAC,eAAe,EAAE,CAAA;QAC7D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,CAAC;YACrE,KAAK,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAA;YAC9D,OAAO,KAAK,CAAA;QACd,CAAC;QAED,MAAM,KAAK,GAAG,kBAAkB,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC,CAAA;QACrF,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACd,KAAK,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAA;YAC5E,OAAO,KAAK,CAAA;QACd,CAAC;QAED,kBAAkB,CAAC,KAAK,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAA;QACzC,MAAM,UAAU,CAAC,kBAAkB,CAAC,kBAAkB,CAAC,CAAA;QAEvD,wFAAwF;QACxF,IAAI,QAAQ,IAAI,OAAO,UAAU,CAAC,gBAAgB,KAAK,UAAU,EAAE,CAAC;YAClE,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAA;YAC3C,MAAM,UAAU,CAAC,gBAAgB,EAAE,CAAA;YACnC,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAA;QACzC,CAAC;QAED,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,KAAK,CAAC,IAAI,CAAC,4CAA4C,EAAE,CAAC,CAAC,CAAA;QAC3D,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB;IACzC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAA;QACzD,KAAK,CAAC,IAAI,CAAC,4BAA4B,EAAE,IAAI,CAAC,CAAA;QAE9C,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YACpC,KAAK,CAAC,KAAK,CAAC,6BAA6B,EAAE,IAAI,CAAC,CAAA;YAChD,OAAO,IAAI,CAAA;QACb,CAAC;QAED,OAAO,IAAI,CAAC,IAAI,IAAI,EAAE,CAAA;IACxB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,KAAK,CAAC,KAAK,CAAC,4BAA4B,EAAE,CAAC,CAAC,CAAA;QAC5C,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,KAAa,EAAE,MAAc;IACjE,IAAI,CAAC;QACH,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAA;QACnC,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;QACxE,KAAK,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAA;QAElC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE,OAAO,IAAI,aAAa,CAAC,CAAA;QACjD,CAAC;QAED,OAAO,IAAI,CAAC,IAAI,IAAI,IAAI,CAAA;IAC1B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,CAAC,CAAA;IACT,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAA;QACrD,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YAAC,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,IAAI,gBAAgB,CAAC,CAAA;QAAC,CAAC;QACjG,OAAO,IAAI,CAAC,IAAI,IAAI,EAAE,CAAA;IACxB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,KAAK,CAAC,KAAK,CAAC,yBAAyB,EAAE,CAAC,CAAC,CAAA;QACzC,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAA;QACtD,KAAK,CAAC,IAAI,CAAC,oBAAoB,EAAE,IAAI,CAAC,CAAA;QAEtC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,IAAI,kBAAkB,CAAC,CAAA;QAC5D,CAAC;QAED,OAAO,IAAI,CAAC,IAAI,IAAI,EAAE,CAAA;IACxB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,CAAC,CAAA;IACT,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,QAAgB,EAChB,IAAY,EACZ,IAAY,EACZ,OAA6D;IAE7D,IAAI,CAAC;QACH,MAAM,OAAO,GAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,CAAA;QAC7C,IAAI,OAAO,EAAE,OAAO,EAAE,CAAC;YAAC,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAA;QAAC,CAAC;QAC3D,IAAI,OAAO,EAAE,KAAK,EAAE,CAAC;YAAC,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAA;QAAC,CAAC;QACrD,IAAI,OAAO,EAAE,IAAI,KAAK,SAAS,IAAI,OAAO,EAAE,IAAI,KAAK,IAAI,IAAI,OAAO,EAAE,IAAI,KAAK,CAAC,EAAE,CAAC;YAAC,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAA;QAAC,CAAC;QAEjH,KAAK,CAAC,IAAI,CAAC,0BAA0B,EAAE,OAAO,CAAC,CAAA;QAC/C,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,aAAa,EAAE,OAAO,CAAC,CAAA;QAC7D,KAAK,CAAC,IAAI,CAAC,sBAAsB,EAAE,IAAI,CAAC,CAAA;QAExC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,IAAI,sBAAsB,CAAC,CAAA;QAChE,CAAC;QAED,OAAO,IAAI,CAAC,IAAI,IAAI,IAAI,CAAA;IAC1B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,CAAC,CAAA;IACT,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAAiH;IAEjH,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,OAAO,EAAE,CAAC,CAAA;QAClE,KAAK,CAAC,IAAI,CAAC,oBAAoB,EAAE,IAAI,CAAC,CAAA;QAEtC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,IAAI,iBAAiB,CAAC,CAAA;QAC3D,CAAC;QAED,OAAO,IAAI,CAAC,IAAI,IAAI,IAAI,CAAA;IAC1B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,CAAC,CAAA;IACT,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,QAAgB,EAChB,gBAAyB,EACzB,gBAAyB;IAEzB,IAAI,CAAC;QACH,MAAM,MAAM,GAAQ,EAAE,QAAQ,EAAE,CAAA;QAChC,IAAI,gBAAgB,EAAE,CAAC;YAAC,MAAM,CAAC,gBAAgB,GAAG,gBAAgB,CAAA;QAAC,CAAC;QACpE,IAAI,gBAAgB,EAAE,CAAC;YAAC,MAAM,CAAC,gBAAgB,GAAG,gBAAgB,CAAA;QAAC,CAAC;QAEpE,KAAK,CAAC,IAAI,CAAC,qDAAqD,EAAE,MAAM,CAAC,CAAA;QACzE,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAA;QAC/D,KAAK,CAAC,IAAI,CAAC,kCAAkC,EAAE,IAAI,CAAC,CAAA;QAEpD,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,IAAI,yBAAyB,CAAC,CAAA;QACnE,CAAC;QAED,OAAO,IAAI,CAAC,IAAI,IAAI,IAAI,CAAA;IAC1B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,CAAC,CAAA;IACT,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAgB;IACjD,IAAI,CAAC;QACH,KAAK,CAAC,IAAI,CAAC,sCAAsC,EAAE,QAAQ,CAAC,CAAA;QAC5D,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAA;QACrE,KAAK,CAAC,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,CAAA;QAEpC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,IAAI,yBAAyB,CAAC,CAAA;QACnE,CAAC;QAED,OAAO,IAAI,CAAC,IAAI,IAAI,IAAI,CAAA;IAC1B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,CAAC,CAAA;IACT,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,IAAI,CAAC;QACH,KAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAA;QAChD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAA;QAChE,KAAK,CAAC,IAAI,CAAC,sBAAsB,EAAE,IAAI,CAAC,CAAA;QAExC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,IAAI,8BAA8B,CAAC,CAAA;QACxE,CAAC;QAED,OAAO,IAAI,CAAC,IAAI,IAAI,IAAI,CAAA;IAC1B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,CAAC,CAAA;IACT,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../../../src/homebridge-ui/public/js/api.ts"],"names":[],"mappings":"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"}