@switchbot/homebridge-switchbot 5.0.0-beta.56 → 5.0.0-beta.57

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.
@@ -121,7 +121,7 @@
121
121
  <h5>Help/About</h5>
122
122
  <ul>
123
123
  <li>
124
- <a href="https://github.com/OpenWonderLabs/homebridge-switchbot/issues/new/choose" target="_blank">Support
124
+ <a href="https://
125
125
  Request</a>
126
126
  </li>
127
127
  <li>
@@ -223,6 +223,23 @@
223
223
  option.value = a.UUID;
224
224
  deviceSelect.add(option);
225
225
  });
226
+ const validateConfig = (config) => {
227
+ const deviceIds = new Set();
228
+ const isValid = config[0].options.devices.every((device) => {
229
+ if (!device.deviceId || typeof device.deviceId !== 'string') {
230
+ homebridge.toast.error(`Invalid device ID: ${device.deviceId}`, 'Error');
231
+ return false;
232
+ }
233
+ if (deviceIds.has(device.deviceId)) {
234
+ homebridge.toast.error(`Duplicate device ID found: ${device.deviceId}`, 'Error');
235
+ return false;
236
+ }
237
+ deviceIds.add(device.deviceId);
238
+ return true;
239
+ });
240
+ return isValid;
241
+ };
242
+
226
243
  const addDeviceToConfig = async (deviceId) => {
227
244
  try {
228
245
  homebridge.showSpinner();
@@ -237,6 +254,10 @@
237
254
  allowPush: false,
238
255
  disableCaching: false,
239
256
  });
257
+ if (!validateConfig(currentConfig)) {
258
+ homebridge.hideSpinner();
259
+ return;
260
+ }
240
261
  await homebridge.updatePluginConfig(currentConfig);
241
262
  await homebridge.savePluginConfig();
242
263
  homebridge.toast.success('Device added to config successfully!', 'Success');
@@ -250,7 +271,7 @@
250
271
  const addDeviceButton = document.createElement('button');
251
272
  addDeviceButton.textContent = 'Add Device to Config';
252
273
  addDeviceButton.className = 'btn btn-success';
253
- addDeviceButton.style.marginLeft = '10px';
274
+ addDeviceButton.style.marginTop = '10px';
254
275
  addDeviceButton.addEventListener('click', () => {
255
276
  const deviceId = document.getElementById('deviceId').textContent;
256
277
  if (deviceId) {
@@ -259,63 +280,60 @@
259
280
  homebridge.toast.error('No device ID found!', 'Error');
260
281
  }
261
282
  });
262
- document.getElementById('displayName').appendChild(addDeviceButton);
283
+ document.getElementById('deviceInfo').appendChild(addDeviceButton);
263
284
 
264
285
  const protocolInfo = document.createElement('p');
265
286
  protocolInfo.id = 'protocolInfo';
266
287
  protocolInfo.style.marginTop = '10px';
267
288
  document.getElementById('deviceInfo').appendChild(protocolInfo);
268
289
 
269
- const showDeviceDetailsDropdown = (deviceContext) => {
270
- const dropdown = document.createElement('select');
271
- dropdown.className = 'form-control';
272
- dropdown.style.marginTop = '10px';
290
+ const updateTableWithDetails = (deviceContext) => {
291
+ const tableBody = document.querySelector('#deviceTable tbody');
292
+ tableBody.innerHTML = '';
273
293
 
274
294
  Object.entries(deviceContext).forEach(([key, value]) => {
275
- const option = document.createElement('option');
276
- option.textContent = `${key}: ${value}`;
277
- dropdown.appendChild(option);
295
+ if (value !== undefined && value !== null && String(value).trim() !== '') {
296
+ const row = document.createElement('tr');
297
+ const keyCell = document.createElement('th');
298
+ keyCell.scope = 'row';
299
+ keyCell.textContent = key;
300
+ const valueCell = document.createElement('td');
301
+ valueCell.textContent = value;
302
+ row.appendChild(keyCell);
303
+ row.appendChild(valueCell);
304
+ tableBody.appendChild(row);
305
+ }
278
306
  });
279
-
280
- const existingDropdown = document.getElementById('deviceDetailsDropdown');
281
- if (existingDropdown) {
282
- existingDropdown.replaceWith(dropdown);
283
- } else {
284
- dropdown.id = 'deviceDetailsDropdown';
285
- document.getElementById('deviceInfo').appendChild(dropdown);
286
- }
287
307
  };
288
308
 
289
309
  showDeviceInfo = async (UUID) => {
290
- homebridge.showSpinner();
291
- const thisAcc = cachedAccessories.find((x) => x.UUID === UUID);
292
- const context = thisAcc.context;
293
-
294
- const updateElement = (id, value) => {
295
- const element = document.getElementById(id);
296
- if (value === undefined || value === null || String(value).trim() === '') {
297
- element.style.display = 'none';
298
- } else {
299
- element.style.display = '';
300
- element.innerHTML = value;
310
+ try {
311
+ homebridge.showSpinner();
312
+ const thisAcc = cachedAccessories.find((x) => x.UUID === UUID);
313
+ if (!thisAcc) {
314
+ throw new Error('Device not found');
301
315
  }
302
- };
303
-
304
- updateElement('displayName', thisAcc.displayName);
305
- updateElement('deviceId', context.deviceId);
306
- updateElement('model', context.model);
307
- updateElement('version', context.version);
308
- updateElement('deviceType', context.deviceType);
309
- updateElement('connectionType', context.connectionType);
310
- updateElement('refreshRate', context.refreshRate);
311
- updateElement('updateRate', context.updateRate);
312
- updateElement('pushRate', context.pushRate);
316
+ const context = thisAcc.context;
317
+ document.getElementById('displayName').innerHTML = thisAcc.displayName;
318
+ document.getElementById('deviceId').innerHTML = context.deviceId;
319
+ document.getElementById('model').innerHTML = context.model;
320
+ document.getElementById('version').innerHTML = context.version;
321
+ document.getElementById('deviceType').innerHTML = context.deviceType;
322
+ document.getElementById('connectionType').innerHTML = context.connectionType;
323
+ document.getElementById('refreshRate').innerHTML = context.refreshRate;
324
+ document.getElementById('updateRate').innerHTML = context.updateRate;
325
+ document.getElementById('pushRate').innerHTML = context.pushRate;
326
+ document.getElementById('deviceTable').style.display = 'inline-table';
313
327
 
314
- document.getElementById('deviceTable').style.display = 'inline-table';
315
- updateElement('protocolInfo', thisAcc.isMatter ? 'Matter Protocol' : 'HAP Protocol');
328
+ const protocol = thisAcc.isMatter ? 'Matter Protocol' : 'HAP Protocol';
329
+ document.getElementById('protocolInfo').textContent = protocol;
316
330
 
317
- showDeviceDetailsDropdown(context);
318
- homebridge.hideSpinner();
331
+ updateTableWithDetails(context);
332
+ } catch (error) {
333
+ homebridge.toast.error(error.message, 'Error');
334
+ } finally {
335
+ homebridge.hideSpinner();
336
+ }
319
337
  };
320
338
  deviceSelect.addEventListener('change', (event) => showDeviceInfo(event.target.value));
321
339
  if (cachedAccessories.length > 0) {
@@ -1 +1 @@
1
- <!DOCTYPE html><html class="default" lang="en" data-base="../"><head><meta charset="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>default | @switchbot/homebridge-switchbot</title><meta name="description" content="Documentation for @switchbot/homebridge-switchbot"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script async src="../assets/icons.js" id="tsd-icons-script"></script><script async src="../assets/search.js" id="tsd-search-script"></script><script async src="../assets/navigation.js" id="tsd-nav-script"></script></head><body><script>document.documentElement.dataset.theme = localStorage.getItem("tsd-theme") || "os";document.body.style.display="none";setTimeout(() => window.app?app.showPage():document.body.style.removeProperty("display"),500)</script><header class="tsd-page-toolbar"><div class="tsd-toolbar-contents container"><a href="../index.html" class="title">@switchbot/homebridge-switchbot</a><div id="tsd-toolbar-links"></div><button id="tsd-search-trigger" class="tsd-widget" aria-label="Search"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-search"></use></svg></button><dialog id="tsd-search" aria-label="Search"><input role="combobox" id="tsd-search-input" aria-controls="tsd-search-results" aria-autocomplete="list" aria-expanded="true" autocapitalize="off" autocomplete="off" placeholder="Search the docs" maxLength="100"/><ul role="listbox" id="tsd-search-results"></ul><div id="tsd-search-status" aria-live="polite" aria-atomic="true"><div>Preparing search index...</div></div></dialog><a href="#" class="tsd-widget menu" id="tsd-toolbar-menu-trigger" data-toggle="menu" aria-label="Menu"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-menu"></use></svg></a></div></header><div class="container container-main"><div class="col-content"><div class="tsd-page-title"><ul class="tsd-breadcrumb" aria-label="Breadcrumb"><li><a href="" aria-current="page">default</a></li></ul><h1>Variable default</h1></div><div class="tsd-signature"><span class="tsd-kind-variable">default</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-symbol">(</span><span class="tsd-kind-parameter">api</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">API</span><span class="tsd-signature-symbol">)</span> <span class="tsd-signature-symbol">=&gt;</span> <span class="tsd-signature-type">void</span></div><div class="tsd-type-declaration"><h4>Type Declaration</h4><ul class="tsd-parameters"><li class="tsd-parameter-signature"><ul class="tsd-signatures"><li class="tsd-signature" id="__type"><span class="tsd-signature-symbol">(</span><span class="tsd-kind-parameter">api</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">API</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">void</span></li><li class="tsd-description"><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><span><span class="tsd-kind-parameter">api</span>: <span class="tsd-signature-type">API</span></span></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4></li></ul></li></ul></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/OpenWonderLabs/homebridge-switchbot/blob/c54b1e8490ae8c9d4967e1f0cc561142055fadc4/src/index.ts#L13">index.ts:13</a></li></ul></aside></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-accordion"><summary class="tsd-accordion-summary"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg><h3>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><span class="settings-label">Member Visibility</span><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li></ul></div><div class="tsd-theme-toggle"><label class="settings-label" for="tsd-theme">Theme</label><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div></div><div class="site-menu"><nav class="tsd-navigation"><a href="../modules.html">@switchbot/homebridge-switchbot</a><ul class="tsd-small-nested-navigation" id="tsd-nav-container"><li>Loading...</li></ul></nav></div></div></div><footer></footer><div class="overlay"></div></body></html>
1
+ <!DOCTYPE html><html class="default" lang="en" data-base="../"><head><meta charset="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>default | @switchbot/homebridge-switchbot</title><meta name="description" content="Documentation for @switchbot/homebridge-switchbot"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script async src="../assets/icons.js" id="tsd-icons-script"></script><script async src="../assets/search.js" id="tsd-search-script"></script><script async src="../assets/navigation.js" id="tsd-nav-script"></script></head><body><script>document.documentElement.dataset.theme = localStorage.getItem("tsd-theme") || "os";document.body.style.display="none";setTimeout(() => window.app?app.showPage():document.body.style.removeProperty("display"),500)</script><header class="tsd-page-toolbar"><div class="tsd-toolbar-contents container"><a href="../index.html" class="title">@switchbot/homebridge-switchbot</a><div id="tsd-toolbar-links"></div><button id="tsd-search-trigger" class="tsd-widget" aria-label="Search"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-search"></use></svg></button><dialog id="tsd-search" aria-label="Search"><input role="combobox" id="tsd-search-input" aria-controls="tsd-search-results" aria-autocomplete="list" aria-expanded="true" autocapitalize="off" autocomplete="off" placeholder="Search the docs" maxLength="100"/><ul role="listbox" id="tsd-search-results"></ul><div id="tsd-search-status" aria-live="polite" aria-atomic="true"><div>Preparing search index...</div></div></dialog><a href="#" class="tsd-widget menu" id="tsd-toolbar-menu-trigger" data-toggle="menu" aria-label="Menu"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-menu"></use></svg></a></div></header><div class="container container-main"><div class="col-content"><div class="tsd-page-title"><ul class="tsd-breadcrumb" aria-label="Breadcrumb"><li><a href="" aria-current="page">default</a></li></ul><h1>Variable default</h1></div><div class="tsd-signature"><span class="tsd-kind-variable">default</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-symbol">(</span><span class="tsd-kind-parameter">api</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">API</span><span class="tsd-signature-symbol">)</span> <span class="tsd-signature-symbol">=&gt;</span> <span class="tsd-signature-type">void</span></div><div class="tsd-type-declaration"><h4>Type Declaration</h4><ul class="tsd-parameters"><li class="tsd-parameter-signature"><ul class="tsd-signatures"><li class="tsd-signature" id="__type"><span class="tsd-signature-symbol">(</span><span class="tsd-kind-parameter">api</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">API</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">void</span></li><li class="tsd-description"><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><span><span class="tsd-kind-parameter">api</span>: <span class="tsd-signature-type">API</span></span></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4></li></ul></li></ul></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/OpenWonderLabs/homebridge-switchbot/blob/8cfcfbaee78e0dc036ec65e75177c849e69cddc2/src/index.ts#L13">index.ts:13</a></li></ul></aside></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-accordion"><summary class="tsd-accordion-summary"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg><h3>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><span class="settings-label">Member Visibility</span><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li></ul></div><div class="tsd-theme-toggle"><label class="settings-label" for="tsd-theme">Theme</label><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div></div><div class="site-menu"><nav class="tsd-navigation"><a href="../modules.html">@switchbot/homebridge-switchbot</a><ul class="tsd-small-nested-navigation" id="tsd-nav-container"><li>Loading...</li></ul></nav></div></div></div><footer></footer><div class="overlay"></div></body></html>
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@switchbot/homebridge-switchbot",
3
3
  "displayName": "SwitchBot",
4
4
  "type": "module",
5
- "version": "5.0.0-beta.56",
5
+ "version": "5.0.0-beta.57",
6
6
  "description": "The SwitchBot plugin allows you to access your SwitchBot device(s) from HomeKit.",
7
7
  "author": "SwitchBot <support@wondertechlabs.com> (https://github.com/SwitchBot)",
8
8
  "contributors": [
@@ -121,7 +121,7 @@
121
121
  <h5>Help/About</h5>
122
122
  <ul>
123
123
  <li>
124
- <a href="https://github.com/OpenWonderLabs/homebridge-switchbot/issues/new/choose" target="_blank">Support
124
+ <a href="https://
125
125
  Request</a>
126
126
  </li>
127
127
  <li>
@@ -223,6 +223,23 @@
223
223
  option.value = a.UUID;
224
224
  deviceSelect.add(option);
225
225
  });
226
+ const validateConfig = (config) => {
227
+ const deviceIds = new Set();
228
+ const isValid = config[0].options.devices.every((device) => {
229
+ if (!device.deviceId || typeof device.deviceId !== 'string') {
230
+ homebridge.toast.error(`Invalid device ID: ${device.deviceId}`, 'Error');
231
+ return false;
232
+ }
233
+ if (deviceIds.has(device.deviceId)) {
234
+ homebridge.toast.error(`Duplicate device ID found: ${device.deviceId}`, 'Error');
235
+ return false;
236
+ }
237
+ deviceIds.add(device.deviceId);
238
+ return true;
239
+ });
240
+ return isValid;
241
+ };
242
+
226
243
  const addDeviceToConfig = async (deviceId) => {
227
244
  try {
228
245
  homebridge.showSpinner();
@@ -237,6 +254,10 @@
237
254
  allowPush: false,
238
255
  disableCaching: false,
239
256
  });
257
+ if (!validateConfig(currentConfig)) {
258
+ homebridge.hideSpinner();
259
+ return;
260
+ }
240
261
  await homebridge.updatePluginConfig(currentConfig);
241
262
  await homebridge.savePluginConfig();
242
263
  homebridge.toast.success('Device added to config successfully!', 'Success');
@@ -250,7 +271,7 @@
250
271
  const addDeviceButton = document.createElement('button');
251
272
  addDeviceButton.textContent = 'Add Device to Config';
252
273
  addDeviceButton.className = 'btn btn-success';
253
- addDeviceButton.style.marginLeft = '10px';
274
+ addDeviceButton.style.marginTop = '10px';
254
275
  addDeviceButton.addEventListener('click', () => {
255
276
  const deviceId = document.getElementById('deviceId').textContent;
256
277
  if (deviceId) {
@@ -259,63 +280,60 @@
259
280
  homebridge.toast.error('No device ID found!', 'Error');
260
281
  }
261
282
  });
262
- document.getElementById('displayName').appendChild(addDeviceButton);
283
+ document.getElementById('deviceInfo').appendChild(addDeviceButton);
263
284
 
264
285
  const protocolInfo = document.createElement('p');
265
286
  protocolInfo.id = 'protocolInfo';
266
287
  protocolInfo.style.marginTop = '10px';
267
288
  document.getElementById('deviceInfo').appendChild(protocolInfo);
268
289
 
269
- const showDeviceDetailsDropdown = (deviceContext) => {
270
- const dropdown = document.createElement('select');
271
- dropdown.className = 'form-control';
272
- dropdown.style.marginTop = '10px';
290
+ const updateTableWithDetails = (deviceContext) => {
291
+ const tableBody = document.querySelector('#deviceTable tbody');
292
+ tableBody.innerHTML = '';
273
293
 
274
294
  Object.entries(deviceContext).forEach(([key, value]) => {
275
- const option = document.createElement('option');
276
- option.textContent = `${key}: ${value}`;
277
- dropdown.appendChild(option);
295
+ if (value !== undefined && value !== null && String(value).trim() !== '') {
296
+ const row = document.createElement('tr');
297
+ const keyCell = document.createElement('th');
298
+ keyCell.scope = 'row';
299
+ keyCell.textContent = key;
300
+ const valueCell = document.createElement('td');
301
+ valueCell.textContent = value;
302
+ row.appendChild(keyCell);
303
+ row.appendChild(valueCell);
304
+ tableBody.appendChild(row);
305
+ }
278
306
  });
279
-
280
- const existingDropdown = document.getElementById('deviceDetailsDropdown');
281
- if (existingDropdown) {
282
- existingDropdown.replaceWith(dropdown);
283
- } else {
284
- dropdown.id = 'deviceDetailsDropdown';
285
- document.getElementById('deviceInfo').appendChild(dropdown);
286
- }
287
307
  };
288
308
 
289
309
  showDeviceInfo = async (UUID) => {
290
- homebridge.showSpinner();
291
- const thisAcc = cachedAccessories.find((x) => x.UUID === UUID);
292
- const context = thisAcc.context;
293
-
294
- const updateElement = (id, value) => {
295
- const element = document.getElementById(id);
296
- if (value === undefined || value === null || String(value).trim() === '') {
297
- element.style.display = 'none';
298
- } else {
299
- element.style.display = '';
300
- element.innerHTML = value;
310
+ try {
311
+ homebridge.showSpinner();
312
+ const thisAcc = cachedAccessories.find((x) => x.UUID === UUID);
313
+ if (!thisAcc) {
314
+ throw new Error('Device not found');
301
315
  }
302
- };
303
-
304
- updateElement('displayName', thisAcc.displayName);
305
- updateElement('deviceId', context.deviceId);
306
- updateElement('model', context.model);
307
- updateElement('version', context.version);
308
- updateElement('deviceType', context.deviceType);
309
- updateElement('connectionType', context.connectionType);
310
- updateElement('refreshRate', context.refreshRate);
311
- updateElement('updateRate', context.updateRate);
312
- updateElement('pushRate', context.pushRate);
316
+ const context = thisAcc.context;
317
+ document.getElementById('displayName').innerHTML = thisAcc.displayName;
318
+ document.getElementById('deviceId').innerHTML = context.deviceId;
319
+ document.getElementById('model').innerHTML = context.model;
320
+ document.getElementById('version').innerHTML = context.version;
321
+ document.getElementById('deviceType').innerHTML = context.deviceType;
322
+ document.getElementById('connectionType').innerHTML = context.connectionType;
323
+ document.getElementById('refreshRate').innerHTML = context.refreshRate;
324
+ document.getElementById('updateRate').innerHTML = context.updateRate;
325
+ document.getElementById('pushRate').innerHTML = context.pushRate;
326
+ document.getElementById('deviceTable').style.display = 'inline-table';
313
327
 
314
- document.getElementById('deviceTable').style.display = 'inline-table';
315
- updateElement('protocolInfo', thisAcc.isMatter ? 'Matter Protocol' : 'HAP Protocol');
328
+ const protocol = thisAcc.isMatter ? 'Matter Protocol' : 'HAP Protocol';
329
+ document.getElementById('protocolInfo').textContent = protocol;
316
330
 
317
- showDeviceDetailsDropdown(context);
318
- homebridge.hideSpinner();
331
+ updateTableWithDetails(context);
332
+ } catch (error) {
333
+ homebridge.toast.error(error.message, 'Error');
334
+ } finally {
335
+ homebridge.hideSpinner();
336
+ }
319
337
  };
320
338
  deviceSelect.addEventListener('change', (event) => showDeviceInfo(event.target.value));
321
339
  if (cachedAccessories.length > 0) {
@@ -1,38 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" width="800" height="600" viewBox="0 0 800 600">
2
- <!-- Background -->
3
- <rect width="800" height="600" fill="#f8f9fa" />
4
-
5
- <!-- Header -->
6
- <rect x="0" y="0" width="800" height="50" fill="#343a40" />
7
- <text x="400" y="30" fill="#ffffff" font-size="20" text-anchor="middle" font-family="Arial">SwitchBot - Device Details</text>
8
-
9
- <!-- Device Info Section -->
10
- <rect x="50" y="70" width="700" height="400" fill="#ffffff" stroke="#ced4da" stroke-width="1" />
11
-
12
- <!-- Device Name -->
13
- <text x="70" y="110" fill="#212529" font-size="16" font-family="Arial">Device Name:</text>
14
- <text x="200" y="110" fill="#212529" font-size="16" font-family="Arial">Master Bedroom Left Curtain</text>
15
-
16
- <!-- Device ID -->
17
- <text x="70" y="140" fill="#212529" font-size="16" font-family="Arial">Device ID:</text>
18
- <text x="200" y="140" fill="#212529" font-size="16" font-family="Arial">84F703B3A45A</text>
19
-
20
- <!-- Model -->
21
- <text x="70" y="170" fill="#212529" font-size="16" font-family="Arial">Model:</text>
22
- <text x="200" y="170" fill="#212529" font-size="16" font-family="Arial">Color Bulb</text>
23
-
24
- <!-- Connection Type -->
25
- <text x="70" y="200" fill="#212529" font-size="16" font-family="Arial">Connection Type:</text>
26
- <text x="200" y="200" fill="#212529" font-size="16" font-family="Arial">BLE</text>
27
-
28
- <!-- Protocol -->
29
- <text x="70" y="230" fill="#212529" font-size="16" font-family="Arial">Protocol:</text>
30
- <text x="200" y="230" fill="#212529" font-size="16" font-family="Arial">HAP Protocol</text>
31
-
32
- <!-- Dropdown for Device Details -->
33
- <rect x="70" y="270" width="660" height="40" fill="#ffffff" stroke="#ced4da" stroke-width="1" />
34
- <text x="400" y="295" fill="#212529" font-size="16" text-anchor="middle" font-family="Arial">Key: Value</text>
35
-
36
- <!-- Footer -->
37
- <text x="400" y="550" fill="#6c757d" font-size="14" text-anchor="middle" font-family="Arial">External accessories will not be displayed here.</text>
38
- </svg>