@switchbot/homebridge-switchbot 5.0.0-beta.112 → 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 (82) 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 +98 -0
  26. package/dist/homebridge-ui/public/index.html +57 -0
  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 +1503 -104
  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 +1223 -126
  42. package/dist/homebridge-ui/public/js/discovery.js.map +1 -1
  43. package/dist/homebridge-ui/public/js/discovery.ts +1323 -145
  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 +311 -1
  51. package/dist/homebridge-ui/public/js/render.js.map +1 -1
  52. package/dist/homebridge-ui/public/js/render.ts +341 -2
  53. package/dist/platform.d.ts +1 -0
  54. package/dist/platform.d.ts.map +1 -1
  55. package/dist/platform.js +6 -2
  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 +2 -2
  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 +98 -0
  71. package/src/homebridge-ui/public/index.html +57 -0
  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 +1323 -145
  76. package/src/homebridge-ui/public/js/modals.ts +50 -1
  77. package/src/homebridge-ui/public/js/render.ts +341 -2
  78. package/src/platform.ts +6 -2
  79. package/src/switchbotClient.ts +44 -9
  80. package/test/matter-integration.spec.ts +21 -0
  81. package/todo/COMPLETED.md +300 -0
  82. package/todo/TODO.md +80 -66
@@ -1 +1 @@
1
- {"version":3,"file":"modals.d.ts","sourceRoot":"","sources":["../../../../src/homebridge-ui/public/js/modals.ts"],"names":[],"mappings":"AAGA,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC;IAAE,gBAAgB,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAqKlJ;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAoM3D"}
1
+ {"version":3,"file":"modals.d.ts","sourceRoot":"","sources":["../../../../src/homebridge-ui/public/js/modals.ts"],"names":[],"mappings":"AAGA,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC;IAAE,gBAAgB,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAsNlJ;AAED,wBAAsB,UAAU,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAoM3D"}
@@ -97,6 +97,42 @@ export async function importDiscoveredDevice(device) {
97
97
  macInput.style.borderRadius = '6px';
98
98
  macInput.style.fontSize = '14px';
99
99
  macInput.style.boxSizing = 'border-box';
100
+ // BLE Encryption Key
101
+ const encryptionKeyLabel = document.createElement('label');
102
+ encryptionKeyLabel.textContent = 'BLE Encryption Key (optional)';
103
+ encryptionKeyLabel.style.display = 'block';
104
+ encryptionKeyLabel.style.marginBottom = '6px';
105
+ encryptionKeyLabel.style.fontWeight = '500';
106
+ encryptionKeyLabel.style.fontSize = '12px';
107
+ encryptionKeyLabel.style.color = '#6b7280';
108
+ const encryptionKeyInput = document.createElement('input');
109
+ encryptionKeyInput.type = 'password';
110
+ encryptionKeyInput.value = device.encryptionKey || '';
111
+ encryptionKeyInput.placeholder = 'Paste device BLE encryption key';
112
+ encryptionKeyInput.style.width = '100%';
113
+ encryptionKeyInput.style.marginBottom = '12px';
114
+ encryptionKeyInput.style.padding = '8px 10px';
115
+ encryptionKeyInput.style.borderRadius = '6px';
116
+ encryptionKeyInput.style.fontSize = '14px';
117
+ encryptionKeyInput.style.boxSizing = 'border-box';
118
+ // BLE Key ID
119
+ const keyIdLabel = document.createElement('label');
120
+ keyIdLabel.textContent = 'BLE Key ID (optional)';
121
+ keyIdLabel.style.display = 'block';
122
+ keyIdLabel.style.marginBottom = '6px';
123
+ keyIdLabel.style.fontWeight = '500';
124
+ keyIdLabel.style.fontSize = '12px';
125
+ keyIdLabel.style.color = '#6b7280';
126
+ const keyIdInput = document.createElement('input');
127
+ keyIdInput.type = 'text';
128
+ keyIdInput.value = device.keyId || '';
129
+ keyIdInput.placeholder = 'e.g. ff';
130
+ keyIdInput.style.width = '100%';
131
+ keyIdInput.style.marginBottom = '12px';
132
+ keyIdInput.style.padding = '8px 10px';
133
+ keyIdInput.style.borderRadius = '6px';
134
+ keyIdInput.style.fontSize = '14px';
135
+ keyIdInput.style.boxSizing = 'border-box';
100
136
  const buttons = document.createElement('div');
101
137
  buttons.style.display = 'flex';
102
138
  buttons.style.gap = '10px';
@@ -124,6 +160,8 @@ export async function importDiscoveredDevice(device) {
124
160
  configDeviceName: nameInput.value || device.name || device.id,
125
161
  configDeviceType: typeSelect.value || device.type,
126
162
  address: macInput.value || undefined,
163
+ encryptionKey: encryptionKeyInput.value || undefined,
164
+ keyId: keyIdInput.value || undefined,
127
165
  });
128
166
  div.addEventListener('click', (event) => {
129
167
  if (event.target === div) {
@@ -138,6 +176,10 @@ export async function importDiscoveredDevice(device) {
138
176
  contentDiv.appendChild(typeSelect);
139
177
  contentDiv.appendChild(macLabel);
140
178
  contentDiv.appendChild(macInput);
179
+ contentDiv.appendChild(encryptionKeyLabel);
180
+ contentDiv.appendChild(encryptionKeyInput);
181
+ contentDiv.appendChild(keyIdLabel);
182
+ contentDiv.appendChild(keyIdInput);
141
183
  contentDiv.appendChild(buttons);
142
184
  modal.appendChild(title);
143
185
  modal.appendChild(contentDiv);
@@ -1 +1 @@
1
- {"version":3,"file":"modals.js","sourceRoot":"","sources":["../../../../src/homebridge-ui/public/js/modals.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"modals.js","sourceRoot":"","sources":["../../../../src/homebridge-ui/public/js/modals.ts"],"names":[],"mappings":"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"}
@@ -111,6 +111,47 @@ export async function importDiscoveredDevice(device: any): Promise<{ configDevic
111
111
  macInput.style.fontSize = '14px'
112
112
  macInput.style.boxSizing = 'border-box'
113
113
 
114
+
115
+ // BLE Encryption Key
116
+ const encryptionKeyLabel = document.createElement('label')
117
+ encryptionKeyLabel.textContent = 'BLE Encryption Key (optional)'
118
+ encryptionKeyLabel.style.display = 'block'
119
+ encryptionKeyLabel.style.marginBottom = '6px'
120
+ encryptionKeyLabel.style.fontWeight = '500'
121
+ encryptionKeyLabel.style.fontSize = '12px'
122
+ encryptionKeyLabel.style.color = '#6b7280'
123
+
124
+ const encryptionKeyInput = document.createElement('input')
125
+ encryptionKeyInput.type = 'password'
126
+ encryptionKeyInput.value = device.encryptionKey || ''
127
+ encryptionKeyInput.placeholder = 'Paste device BLE encryption key'
128
+ encryptionKeyInput.style.width = '100%'
129
+ encryptionKeyInput.style.marginBottom = '12px'
130
+ encryptionKeyInput.style.padding = '8px 10px'
131
+ encryptionKeyInput.style.borderRadius = '6px'
132
+ encryptionKeyInput.style.fontSize = '14px'
133
+ encryptionKeyInput.style.boxSizing = 'border-box'
134
+
135
+ // BLE Key ID
136
+ const keyIdLabel = document.createElement('label')
137
+ keyIdLabel.textContent = 'BLE Key ID (optional)'
138
+ keyIdLabel.style.display = 'block'
139
+ keyIdLabel.style.marginBottom = '6px'
140
+ keyIdLabel.style.fontWeight = '500'
141
+ keyIdLabel.style.fontSize = '12px'
142
+ keyIdLabel.style.color = '#6b7280'
143
+
144
+ const keyIdInput = document.createElement('input')
145
+ keyIdInput.type = 'text'
146
+ keyIdInput.value = device.keyId || ''
147
+ keyIdInput.placeholder = 'e.g. ff'
148
+ keyIdInput.style.width = '100%'
149
+ keyIdInput.style.marginBottom = '12px'
150
+ keyIdInput.style.padding = '8px 10px'
151
+ keyIdInput.style.borderRadius = '6px'
152
+ keyIdInput.style.fontSize = '14px'
153
+ keyIdInput.style.boxSizing = 'border-box'
154
+
114
155
  const buttons = document.createElement('div')
115
156
  buttons.style.display = 'flex'
116
157
  buttons.style.gap = '10px'
@@ -132,7 +173,8 @@ export async function importDiscoveredDevice(device: any): Promise<{ configDevic
132
173
  importBtn.style.padding = '8px 20px'
133
174
  importBtn.style.fontSize = '13px'
134
175
 
135
- const cleanup = (result: { configDeviceName: string, configDeviceType: string, address?: string } | null) => {
176
+
177
+ const cleanup = (result: { configDeviceName: string, configDeviceType: string, address?: string, encryptionKey?: string, keyId?: string } | null) => {
136
178
  div.remove()
137
179
  resolve(result)
138
180
  }
@@ -142,6 +184,8 @@ export async function importDiscoveredDevice(device: any): Promise<{ configDevic
142
184
  configDeviceName: nameInput.value || device.name || device.id,
143
185
  configDeviceType: typeSelect.value || device.type,
144
186
  address: macInput.value || undefined,
187
+ encryptionKey: encryptionKeyInput.value || undefined,
188
+ keyId: keyIdInput.value || undefined,
145
189
  })
146
190
 
147
191
  div.addEventListener('click', (event) => {
@@ -150,6 +194,7 @@ export async function importDiscoveredDevice(device: any): Promise<{ configDevic
150
194
  }
151
195
  })
152
196
 
197
+
153
198
  buttons.appendChild(cancelBtn)
154
199
  buttons.appendChild(importBtn)
155
200
  contentDiv.appendChild(nameLabel)
@@ -158,6 +203,10 @@ export async function importDiscoveredDevice(device: any): Promise<{ configDevic
158
203
  contentDiv.appendChild(typeSelect)
159
204
  contentDiv.appendChild(macLabel)
160
205
  contentDiv.appendChild(macInput)
206
+ contentDiv.appendChild(encryptionKeyLabel)
207
+ contentDiv.appendChild(encryptionKeyInput)
208
+ contentDiv.appendChild(keyIdLabel)
209
+ contentDiv.appendChild(keyIdInput)
161
210
  contentDiv.appendChild(buttons)
162
211
 
163
212
  modal.appendChild(title)
@@ -25,8 +25,11 @@ export declare function renderSignalQualityBadge(rssi: number | undefined): HTML
25
25
  export declare function renderBadge(text: string, style: string): HTMLElement;
26
26
  export declare function renderConnectionBadge(connectionType: string): HTMLElement | null;
27
27
  export declare function renderIRBadge(): HTMLElement;
28
+ export declare function renderDeviceDetailsPanel(device: any): HTMLElement;
28
29
  export declare function renderDiscoveredDevices(devices: any[], options?: {
29
30
  configuredIds?: Set<string>;
31
+ selectedIds?: Set<string>;
32
+ onToggleSelect?: (device: any, selected: boolean) => void;
30
33
  }): Promise<HTMLElement>;
31
34
  /**
32
35
  * Filter devices by connection type and search query
@@ -1 +1 @@
1
- {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../../../src/homebridge-ui/public/js/render.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG;IAC9D,KAAK,EAAE,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;IACzD,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,EAAE,MAAM,CAAA;CACb,CA8CA;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,CA+BtE;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,CAiB9E;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,WAAW,CAKpE;AAED,wBAAgB,qBAAqB,CAAC,cAAc,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAiBhF;AAED,wBAAgB,aAAa,IAAI,WAAW,CAK3C;AAwBD,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,GAAG,EAAE,EACd,OAAO,GAAE;IAAE,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CAAO,GAC5C,OAAO,CAAC,WAAW,CAAC,CA2JtB;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,GAAG,EAAE,EACd,cAAc,GAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,IAAY,EAC7D,WAAW,SAAK,GACf,GAAG,EAAE,CAmCP;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,GAAG,EAAE,EACd,MAAM,GAAE,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,YAAqB,GACzD,GAAG,EAAE,CA8CP;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI;IACzC,cAAc,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,IAAI,CAAA;IACrD,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,YAAY,CAAA;IACjD,WAAW,EAAE,MAAM,CAAA;CACpB,CAeA;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,WAAW,EAAE;IACnD,cAAc,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,IAAI,CAAA;IACrD,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,YAAY,CAAA;IACjD,WAAW,EAAE,MAAM,CAAA;CACpB,GAAG,IAAI,CAMP;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CA0IlD"}
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../../../src/homebridge-ui/public/js/render.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG;IAC9D,KAAK,EAAE,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAA;IACzD,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,EAAE,MAAM,CAAA;CACb,CA8CA;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,CA+BtE;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,CAiB9E;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,WAAW,CAKpE;AAED,wBAAgB,qBAAqB,CAAC,cAAc,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAiBhF;AAED,wBAAgB,aAAa,IAAI,WAAW,CAK3C;AAgGD,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,GAAG,GAAG,WAAW,CAoJjE;AAED,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,GAAG,EAAE,EACd,OAAO,GAAE;IACP,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAC3B,WAAW,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IACzB,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAA;CACrD,GACL,OAAO,CAAC,WAAW,CAAC,CAgPtB;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,OAAO,EAAE,GAAG,EAAE,EACd,cAAc,GAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,IAAY,EAC7D,WAAW,SAAK,GACf,GAAG,EAAE,CAmCP;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CACzB,OAAO,EAAE,GAAG,EAAE,EACd,MAAM,GAAE,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,YAAqB,GACzD,GAAG,EAAE,CA8CP;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI;IACzC,cAAc,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,IAAI,CAAA;IACrD,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,YAAY,CAAA;IACjD,WAAW,EAAE,MAAM,CAAA;CACpB,CAeA;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,WAAW,EAAE;IACnD,cAAc,EAAE,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,MAAM,GAAG,IAAI,CAAA;IACrD,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,MAAM,GAAG,YAAY,CAAA;IACjD,WAAW,EAAE,MAAM,CAAA;CACpB,GAAG,IAAI,CAMP;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAsKlD"}
@@ -151,6 +151,212 @@ function scrollToConfiguredDevice(deviceId) {
151
151
  target.style.background = originalBackground;
152
152
  }, 1800);
153
153
  }
154
+ function createConnectionTestControls(device) {
155
+ const controls = document.createElement('div');
156
+ controls.style.display = 'inline-flex';
157
+ controls.style.alignItems = 'center';
158
+ controls.style.gap = '6px';
159
+ const button = document.createElement('button');
160
+ button.textContent = 'Test Connection';
161
+ button.className = 'secondary';
162
+ button.style.padding = '4px 9px';
163
+ button.style.fontSize = '11px';
164
+ const status = document.createElement('span');
165
+ status.style.fontSize = '10px';
166
+ status.style.opacity = '0.85';
167
+ status.style.whiteSpace = 'normal';
168
+ status.style.overflowWrap = 'anywhere';
169
+ button.onclick = async () => {
170
+ const startedAt = Date.now();
171
+ button.disabled = true;
172
+ button.textContent = 'Testing...';
173
+ status.textContent = 'Checking...';
174
+ status.style.color = '#6b7280';
175
+ try {
176
+ const { testDeviceConnection } = await import('./api.js');
177
+ const result = await testDeviceConnection({
178
+ deviceId: String(device?.id || device?.deviceId || ''),
179
+ connectionType: device?.connectionType,
180
+ address: device?.address,
181
+ });
182
+ const measuredLatency = Number(result?.latencyMs) > 0
183
+ ? Number(result.latencyMs)
184
+ : Date.now() - startedAt;
185
+ if (result?.success) {
186
+ const method = result?.method || 'Auto';
187
+ status.textContent = `✓ ${method} · ${measuredLatency}ms`;
188
+ status.style.color = '#16a34a';
189
+ }
190
+ else {
191
+ const detail = result?.message ? ` · ${result.message}` : '';
192
+ status.textContent = `✗ Failed · ${measuredLatency}ms${detail}`;
193
+ status.style.color = '#dc2626';
194
+ }
195
+ }
196
+ catch (e) {
197
+ status.textContent = `✗ Failed · ${Date.now() - startedAt}ms`;
198
+ status.style.color = '#dc2626';
199
+ }
200
+ finally {
201
+ button.disabled = false;
202
+ button.textContent = 'Test Connection';
203
+ }
204
+ };
205
+ controls.appendChild(button);
206
+ controls.appendChild(status);
207
+ return controls;
208
+ }
209
+ function formatLastSeen(value) {
210
+ if (!value) {
211
+ return 'N/A';
212
+ }
213
+ try {
214
+ const date = new Date(value);
215
+ return Number.isNaN(date.getTime()) ? String(value) : date.toLocaleString();
216
+ }
217
+ catch (_e) {
218
+ return String(value);
219
+ }
220
+ }
221
+ export function renderDeviceDetailsPanel(device) {
222
+ const details = document.createElement('div');
223
+ details.style.cssText = `
224
+ border-top: 1px solid #ddd;
225
+ padding: 8px;
226
+ background: #f9fafb;
227
+ border-radius: 4px;
228
+ font-size: 12px;
229
+ margin-top: 4px;
230
+ `;
231
+ // --- Battery history trending ---
232
+ // Persist battery readings in localStorage per device
233
+ const batteryHistoryKey = `batteryHistory:${device?.id || device?.deviceId}`;
234
+ let batteryHistory = [];
235
+ try {
236
+ const raw = localStorage.getItem(batteryHistoryKey);
237
+ if (raw)
238
+ batteryHistory = JSON.parse(raw);
239
+ }
240
+ catch { }
241
+ const now = Date.now();
242
+ if (typeof device?.battery === 'number') {
243
+ // Only add if different from last or >1h since last
244
+ const last = batteryHistory[batteryHistory.length - 1];
245
+ if (!last || last.value !== device.battery || now - last.ts > 60 * 60 * 1000) {
246
+ batteryHistory.push({ value: device.battery, ts: now });
247
+ // Keep only last 30 entries (about a month if daily)
248
+ if (batteryHistory.length > 30)
249
+ batteryHistory = batteryHistory.slice(-30);
250
+ try {
251
+ localStorage.setItem(batteryHistoryKey, JSON.stringify(batteryHistory));
252
+ }
253
+ catch { }
254
+ }
255
+ }
256
+ const rows = [
257
+ { label: 'Device ID', value: String(device?.id || device?.deviceId || 'N/A'), copyable: !!(device?.id || device?.deviceId) },
258
+ { label: 'MAC Address', value: String(device?.address || 'N/A'), copyable: !!device?.address },
259
+ { label: 'Device Type', value: String(device?.type || device?.configDeviceType || 'N/A') },
260
+ { label: 'Model', value: String(device?.model || 'N/A') },
261
+ { label: 'Hub ID', value: String(device?.hubDeviceId || 'N/A') },
262
+ { label: 'Battery', value: device?.battery !== undefined && device?.battery !== null ? `${device.battery}%` : 'N/A' },
263
+ { label: 'Firmware', value: String(device?.version || device?.firmware || 'N/A') },
264
+ { label: 'Cloud Service', value: device?.enabled === false ? 'Disabled' : 'Enabled' },
265
+ { label: 'Last Seen', value: formatLastSeen(device?.lastSeen || device?.lastseen || device?.updatedAt) },
266
+ ];
267
+ for (const row of rows) {
268
+ const line = document.createElement('div');
269
+ line.style.display = 'flex';
270
+ line.style.alignItems = 'center';
271
+ line.style.justifyContent = 'space-between';
272
+ line.style.gap = '8px';
273
+ line.style.padding = '2px 0';
274
+ const label = document.createElement('span');
275
+ label.style.fontWeight = '600';
276
+ label.style.minWidth = '110px';
277
+ label.textContent = `${row.label}:`;
278
+ const valueWrap = document.createElement('span');
279
+ valueWrap.style.display = 'inline-flex';
280
+ valueWrap.style.alignItems = 'center';
281
+ valueWrap.style.gap = '6px';
282
+ valueWrap.style.flex = '1';
283
+ valueWrap.style.justifyContent = 'flex-end';
284
+ valueWrap.style.minWidth = '0';
285
+ const value = document.createElement('span');
286
+ value.style.fontFamily = 'monospace';
287
+ value.style.fontSize = '11px';
288
+ value.style.opacity = '0.9';
289
+ value.style.whiteSpace = 'normal';
290
+ value.style.overflowWrap = 'anywhere';
291
+ value.style.wordBreak = 'break-word';
292
+ value.style.textAlign = 'right';
293
+ value.textContent = row.value;
294
+ valueWrap.appendChild(value);
295
+ if (row.copyable && row.value && row.value !== 'N/A') {
296
+ const copyBtn = document.createElement('button');
297
+ copyBtn.textContent = '📋';
298
+ copyBtn.title = `Copy ${row.label}`;
299
+ copyBtn.style.padding = '2px 6px';
300
+ copyBtn.style.fontSize = '10px';
301
+ copyBtn.style.lineHeight = '1';
302
+ copyBtn.style.background = '#e5e7eb';
303
+ copyBtn.style.color = '#111827';
304
+ copyBtn.onclick = async () => {
305
+ try {
306
+ await navigator.clipboard.writeText(row.value);
307
+ copyBtn.textContent = '✓';
308
+ setTimeout(() => {
309
+ copyBtn.textContent = '📋';
310
+ }, 1200);
311
+ }
312
+ catch (_e) {
313
+ copyBtn.textContent = '!';
314
+ setTimeout(() => {
315
+ copyBtn.textContent = '📋';
316
+ }, 1200);
317
+ }
318
+ };
319
+ valueWrap.appendChild(copyBtn);
320
+ }
321
+ line.appendChild(label);
322
+ line.appendChild(valueWrap);
323
+ details.appendChild(line);
324
+ }
325
+ // --- Expose advanced/extra features dynamically ---
326
+ const featureKeys = [
327
+ 'airQuality', 'pm25', 'pm10', 'voc', 'co2', 'humidity', 'temperature',
328
+ 'preset', 'mode', 'presetMode', 'direction', 'calibration', 'multiCommand',
329
+ 'extendedInfo', 'segmentedControl', 'features', 'capabilities', 'state',
330
+ ];
331
+ const shown = new Set(rows.map(r => r.label.toLowerCase().replace(/\s/g, '')));
332
+ for (const key of featureKeys) {
333
+ if (device && device[key] !== undefined && !shown.has(key.toLowerCase())) {
334
+ const line = document.createElement('div');
335
+ line.style.display = 'flex';
336
+ line.style.alignItems = 'center';
337
+ line.style.justifyContent = 'space-between';
338
+ line.style.gap = '8px';
339
+ line.style.padding = '2px 0';
340
+ const label = document.createElement('span');
341
+ label.style.fontWeight = '600';
342
+ label.style.minWidth = '110px';
343
+ label.textContent = key.replace(/([A-Z])/g, ' $1').replace(/^./, s => s.toUpperCase()) + ':';
344
+ const value = document.createElement('span');
345
+ value.style.fontFamily = 'monospace';
346
+ value.style.fontSize = '11px';
347
+ value.style.opacity = '0.9';
348
+ value.style.whiteSpace = 'normal';
349
+ value.style.overflowWrap = 'anywhere';
350
+ value.style.wordBreak = 'break-word';
351
+ value.style.textAlign = 'right';
352
+ value.textContent = typeof device[key] === 'object' ? JSON.stringify(device[key]) : String(device[key]);
353
+ line.appendChild(label);
354
+ line.appendChild(value);
355
+ details.appendChild(line);
356
+ }
357
+ }
358
+ return details;
359
+ }
154
360
  export async function renderDiscoveredDevices(devices, options = {}) {
155
361
  const ul = document.createElement('ul');
156
362
  ul.className = 'device-grid';
@@ -162,6 +368,8 @@ export async function renderDiscoveredDevices(devices, options = {}) {
162
368
  const { addDeviceToConfig } = await import('./discovery.js');
163
369
  const { loadConfiguredDevices } = await import('./devices.js');
164
370
  const configuredIds = options.configuredIds ?? new Set();
371
+ const selectedIds = options.selectedIds ?? new Set();
372
+ const onToggleSelect = options.onToggleSelect;
165
373
  for (const d of devices) {
166
374
  const deviceId = normalizeId(d.id);
167
375
  const alreadyAdded = configuredIds.has(deviceId);
@@ -189,7 +397,70 @@ export async function renderDiscoveredDevices(devices, options = {}) {
189
397
  name.style.fontWeight = '500';
190
398
  name.style.fontSize = '13px';
191
399
  name.textContent = d.name || d.id;
400
+ const selectCheckbox = document.createElement('input');
401
+ selectCheckbox.type = 'checkbox';
402
+ selectCheckbox.style.width = 'auto';
403
+ selectCheckbox.style.margin = '0 2px 0 0';
404
+ selectCheckbox.checked = selectedIds.has(deviceId);
405
+ if (alreadyAdded) {
406
+ selectCheckbox.disabled = true;
407
+ selectCheckbox.title = 'Already configured';
408
+ }
409
+ selectCheckbox.onchange = () => {
410
+ onToggleSelect?.(d, selectCheckbox.checked);
411
+ // Notify listeners (e.g., batch buttons) of selection change
412
+ window.dispatchEvent(new CustomEvent('discovery-selection-changed'));
413
+ };
414
+ nameContainer.appendChild(selectCheckbox);
192
415
  nameContainer.appendChild(name);
416
+ // Show firmware update available indicator if present
417
+ if (d.firmwareUpdateAvailable) {
418
+ const fwBadge = document.createElement('span');
419
+ fwBadge.textContent = 'Update Available';
420
+ fwBadge.style.cssText = 'background: #fb923c; color: #111; padding: 1px 7px; border-radius: 3px; font-size: 10px; font-weight: 600; margin-left: 6px;';
421
+ fwBadge.title = 'A firmware update is available for this device.';
422
+ nameContainer.appendChild(fwBadge);
423
+ }
424
+ // Show offline/unreachable indicator if device is offline
425
+ let offline = false;
426
+ let lastSeen = d.lastSeen || d.lastseen || d.updatedAt;
427
+ if (typeof d.offline === 'boolean') {
428
+ offline = d.offline;
429
+ }
430
+ else if (lastSeen) {
431
+ try {
432
+ const last = new Date(lastSeen).getTime();
433
+ if (!isNaN(last) && Date.now() - last > 1000 * 60 * 60) { // 1 hour
434
+ offline = true;
435
+ }
436
+ }
437
+ catch { }
438
+ }
439
+ if (offline) {
440
+ const offlineBadge = document.createElement('span');
441
+ offlineBadge.textContent = 'Offline';
442
+ offlineBadge.style.cssText = 'background: #dc2626; color: white; padding: 1px 7px; border-radius: 3px; font-size: 10px; font-weight: 600; margin-left: 6px;';
443
+ offlineBadge.title = 'Device is offline or unreachable.';
444
+ nameContainer.appendChild(offlineBadge);
445
+ }
446
+ const expandedDetails = document.createElement('div');
447
+ expandedDetails.style.display = 'none';
448
+ expandedDetails.appendChild(renderDeviceDetailsPanel(d));
449
+ const expandBtn = document.createElement('button');
450
+ expandBtn.textContent = '▾';
451
+ expandBtn.title = 'Show details';
452
+ expandBtn.style.padding = '2px 6px';
453
+ expandBtn.style.fontSize = '11px';
454
+ expandBtn.style.marginLeft = '4px';
455
+ expandBtn.style.background = '#e5e7eb';
456
+ expandBtn.style.color = '#111827';
457
+ expandBtn.style.transition = 'transform 0.2s ease';
458
+ expandBtn.onclick = () => {
459
+ const isHidden = expandedDetails.style.display === 'none';
460
+ expandedDetails.style.display = isHidden ? 'block' : 'none';
461
+ expandBtn.style.transform = isHidden ? 'rotate(180deg)' : 'rotate(0deg)';
462
+ };
463
+ nameContainer.appendChild(expandBtn);
193
464
  const duplicateBadge = document.createElement('span');
194
465
  duplicateBadge.textContent = alreadyAdded ? '✓ Already Added' : '➕ New Device';
195
466
  duplicateBadge.style.cssText = alreadyAdded
@@ -212,6 +483,17 @@ export async function renderDiscoveredDevices(devices, options = {}) {
212
483
  nameContainer.appendChild(renderSignalBars(d.rssi));
213
484
  nameContainer.appendChild(renderSignalQualityBadge(d.rssi));
214
485
  }
486
+ // Add battery warning indicator if battery < 20%
487
+ if (typeof d.battery === 'number' && d.battery < 20) {
488
+ const batteryWarn = document.createElement('span');
489
+ batteryWarn.textContent = `⚠️ ${d.battery}%`;
490
+ batteryWarn.style.cssText =
491
+ d.battery < 10
492
+ ? 'background: #dc2626; color: white; padding: 1px 6px; border-radius: 3px; font-size: 10px; font-weight: 600; margin-left: 6px;'
493
+ : 'background: #fbbf24; color: #111; padding: 1px 6px; border-radius: 3px; font-size: 10px; font-weight: 600; margin-left: 6px;';
494
+ batteryWarn.title = d.battery < 10 ? 'Battery critically low' : 'Battery low';
495
+ nameContainer.appendChild(batteryWarn);
496
+ }
215
497
  const details = document.createElement('div');
216
498
  details.style.fontSize = '10px';
217
499
  details.style.opacity = '0.7';
@@ -230,6 +512,7 @@ export async function renderDiscoveredDevices(devices, options = {}) {
230
512
  details.textContent = detailsText;
231
513
  info.appendChild(nameContainer);
232
514
  info.appendChild(details);
515
+ info.appendChild(expandedDetails);
233
516
  const addBtn = document.createElement('button');
234
517
  addBtn.textContent = alreadyAdded ? 'Already Added' : 'Add to Config';
235
518
  addBtn.style.marginLeft = '0';
@@ -274,6 +557,7 @@ export async function renderDiscoveredDevices(devices, options = {}) {
274
557
  actions.style.gap = '5px';
275
558
  actions.appendChild(viewBtn);
276
559
  actions.appendChild(addBtn);
560
+ actions.appendChild(createConnectionTestControls(d));
277
561
  li.appendChild(actions);
278
562
  ul.appendChild(li);
279
563
  continue;
@@ -288,6 +572,7 @@ export async function renderDiscoveredDevices(devices, options = {}) {
288
572
  actions.style.marginTop = '2px';
289
573
  actions.style.gap = '5px';
290
574
  actions.appendChild(addBtn);
575
+ actions.appendChild(createConnectionTestControls(d));
291
576
  li.appendChild(info);
292
577
  li.appendChild(actions);
293
578
  ul.appendChild(li);
@@ -461,6 +746,23 @@ export function renderDeviceList(list) {
461
746
  name.style.fontWeight = '500';
462
747
  name.style.fontSize = '13px';
463
748
  name.textContent = d.name || d.id;
749
+ const expandedDetails = document.createElement('div');
750
+ expandedDetails.style.display = 'none';
751
+ expandedDetails.appendChild(renderDeviceDetailsPanel(d));
752
+ const expandBtn = document.createElement('button');
753
+ expandBtn.textContent = '▾';
754
+ expandBtn.title = 'Show details';
755
+ expandBtn.style.padding = '2px 6px';
756
+ expandBtn.style.fontSize = '11px';
757
+ expandBtn.style.marginLeft = '4px';
758
+ expandBtn.style.background = '#e5e7eb';
759
+ expandBtn.style.color = '#111827';
760
+ expandBtn.style.transition = 'transform 0.2s ease';
761
+ expandBtn.onclick = () => {
762
+ const isHidden = expandedDetails.style.display === 'none';
763
+ expandedDetails.style.display = isHidden ? 'block' : 'none';
764
+ expandBtn.style.transform = isHidden ? 'rotate(180deg)' : 'rotate(0deg)';
765
+ };
464
766
  const code = document.createElement('code');
465
767
  code.textContent = d.id;
466
768
  code.style.fontSize = '10px';
@@ -470,7 +772,13 @@ export function renderDeviceList(list) {
470
772
  code.style.overflowWrap = 'anywhere';
471
773
  code.style.wordBreak = 'break-word';
472
774
  code.style.maxWidth = '100%';
473
- nameContainer.appendChild(name);
775
+ const headerRow = document.createElement('div');
776
+ headerRow.style.display = 'inline-flex';
777
+ headerRow.style.alignItems = 'center';
778
+ headerRow.style.gap = '4px';
779
+ headerRow.appendChild(name);
780
+ headerRow.appendChild(expandBtn);
781
+ nameContainer.appendChild(headerRow);
474
782
  nameContainer.appendChild(code);
475
783
  // Add signal strength visualization if RSSI is available
476
784
  if (d.rssi !== undefined && d.rssi !== null && d.rssi !== 0) {
@@ -487,6 +795,7 @@ export function renderDeviceList(list) {
487
795
  meta.textContent = [typeText, connText, roomText].filter(Boolean).join(' | ');
488
796
  info.appendChild(nameContainer);
489
797
  info.appendChild(meta);
798
+ info.appendChild(expandedDetails);
490
799
  const buttons = document.createElement('div');
491
800
  buttons.className = 'device-actions';
492
801
  buttons.style.display = 'flex';
@@ -533,6 +842,7 @@ export function renderDeviceList(list) {
533
842
  };
534
843
  buttons.appendChild(editBtn);
535
844
  buttons.appendChild(copyBtn);
845
+ buttons.appendChild(createConnectionTestControls(d));
536
846
  buttons.appendChild(deleteBtn);
537
847
  li.appendChild(info);
538
848
  li.appendChild(buttons);