@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.
- package/MIGRATION.md +10 -0
- package/README.md +43 -0
- package/TODO.md +263 -0
- package/config.schema.json +27 -10
- package/dist/device-types.d.ts.map +1 -1
- package/dist/device-types.js +93 -63
- package/dist/device-types.js.map +1 -1
- package/dist/deviceFactory.d.ts.map +1 -1
- package/dist/deviceFactory.js +55 -33
- package/dist/deviceFactory.js.map +1 -1
- package/dist/devices/genericDevice.d.ts +12 -1
- package/dist/devices/genericDevice.d.ts.map +1 -1
- package/dist/devices/genericDevice.js +121 -1
- package/dist/devices/genericDevice.js.map +1 -1
- package/dist/errors.d.ts +5 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +51 -0
- package/dist/errors.js.map +1 -0
- package/dist/homebridge-ui/endpoints/devices.d.ts.map +1 -1
- package/dist/homebridge-ui/endpoints/devices.js +80 -1
- package/dist/homebridge-ui/endpoints/devices.js.map +1 -1
- package/dist/homebridge-ui/endpoints/discovery.d.ts.map +1 -1
- package/dist/homebridge-ui/endpoints/discovery.js +73 -41
- package/dist/homebridge-ui/endpoints/discovery.js.map +1 -1
- package/dist/homebridge-ui/public/css/styles.css +209 -16
- package/dist/homebridge-ui/public/index.html +87 -56
- package/dist/homebridge-ui/public/js/api.d.ts +24 -1
- package/dist/homebridge-ui/public/js/api.d.ts.map +1 -1
- package/dist/homebridge-ui/public/js/api.js +33 -2
- package/dist/homebridge-ui/public/js/api.js.map +1 -1
- package/dist/homebridge-ui/public/js/api.ts +52 -3
- package/dist/homebridge-ui/public/js/app.js +1604 -143
- package/dist/homebridge-ui/public/js/app.js.map +3 -3
- package/dist/homebridge-ui/public/js/app.ts +2 -1
- package/dist/homebridge-ui/public/js/devices.d.ts.map +1 -1
- package/dist/homebridge-ui/public/js/devices.js +2 -0
- package/dist/homebridge-ui/public/js/devices.js.map +1 -1
- package/dist/homebridge-ui/public/js/devices.ts +13 -1
- package/dist/homebridge-ui/public/js/discovery.d.ts +1 -0
- package/dist/homebridge-ui/public/js/discovery.d.ts.map +1 -1
- package/dist/homebridge-ui/public/js/discovery.js +1244 -124
- package/dist/homebridge-ui/public/js/discovery.js.map +1 -1
- package/dist/homebridge-ui/public/js/discovery.ts +1344 -142
- package/dist/homebridge-ui/public/js/modals.d.ts.map +1 -1
- package/dist/homebridge-ui/public/js/modals.js +42 -0
- package/dist/homebridge-ui/public/js/modals.js.map +1 -1
- package/dist/homebridge-ui/public/js/modals.ts +50 -1
- package/dist/homebridge-ui/public/js/render.d.ts +3 -0
- package/dist/homebridge-ui/public/js/render.d.ts.map +1 -1
- package/dist/homebridge-ui/public/js/render.js +389 -36
- package/dist/homebridge-ui/public/js/render.js.map +1 -1
- package/dist/homebridge-ui/public/js/render.ts +421 -38
- package/dist/platform.d.ts +1 -0
- package/dist/platform.d.ts.map +1 -1
- package/dist/platform.js +3 -4
- package/dist/platform.js.map +1 -1
- package/dist/switchbotClient.d.ts.map +1 -1
- package/dist/switchbotClient.js +51 -5
- package/dist/switchbotClient.js.map +1 -1
- package/docs/assets/highlight.css +9 -2
- package/docs/index.html +28 -2
- package/docs/variables/default.html +1 -1
- package/package.json +9 -8
- package/src/device-types.ts +95 -64
- package/src/deviceFactory.ts +55 -33
- package/src/devices/genericDevice.ts +113 -1
- package/src/errors.ts +43 -0
- package/src/homebridge-ui/endpoints/devices.ts +82 -1
- package/src/homebridge-ui/endpoints/discovery.ts +78 -44
- package/src/homebridge-ui/public/css/styles.css +209 -16
- package/src/homebridge-ui/public/index.html +87 -56
- package/src/homebridge-ui/public/js/api.ts +52 -3
- package/src/homebridge-ui/public/js/app.ts +2 -1
- package/src/homebridge-ui/public/js/devices.ts +13 -1
- package/src/homebridge-ui/public/js/discovery.ts +1344 -142
- package/src/homebridge-ui/public/js/modals.ts +50 -1
- package/src/homebridge-ui/public/js/render.ts +421 -38
- package/src/platform.ts +3 -4
- package/src/switchbotClient.ts +44 -9
- package/test/e2e/run-e2e.spec.ts +12 -10
- package/test/helpers/matter-harness.ts +2 -2
- package/test/matter-integration.spec.ts +21 -0
- package/todo/COMPLETED.md +313 -0
- package/todo/TODO.md +80 -66
- 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:
|
|
78
|
+
padding: 10px;
|
|
79
79
|
}
|
|
80
80
|
|
|
81
81
|
h1 {
|
|
82
|
-
font-size:
|
|
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:
|
|
156
|
+
margin-bottom: 10px;
|
|
156
157
|
}
|
|
157
158
|
|
|
158
159
|
label {
|
|
159
160
|
display: block;
|
|
160
|
-
margin-bottom:
|
|
161
|
+
margin-bottom: 4px;
|
|
161
162
|
font-weight: 500;
|
|
162
|
-
font-size:
|
|
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
|
|
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:
|
|
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:
|
|
207
|
-
margin-top:
|
|
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:
|
|
225
|
+
padding: 12px;
|
|
225
226
|
border-radius: 8px;
|
|
226
|
-
margin-bottom:
|
|
227
|
+
margin-bottom: 10px;
|
|
227
228
|
}
|
|
228
229
|
|
|
229
|
-
.
|
|
230
|
-
padding: 10px
|
|
231
|
-
|
|
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:
|
|
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(-
|
|
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
|
-
<
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
<
|
|
21
|
-
|
|
22
|
-
type="password"
|
|
23
|
-
id="
|
|
24
|
-
|
|
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
|
-
<
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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
|
-
|
|
55
|
-
|
|
56
|
-
|
|
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>
|
|
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="
|
|
63
|
-
|
|
64
|
-
|
|
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
|
-
|
|
95
|
+
Cancel
|
|
67
96
|
</button>
|
|
68
|
-
<div id="discoverStatus" style="margin-bottom:
|
|
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:
|
|
93
|
-
padding-top:
|
|
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:
|
|
103
|
-
font-size:
|
|
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
|
|
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,
|
|
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":"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
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../../../src/homebridge-ui/public/js/api.ts"],"names":[],"mappings":"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"}
|