@switchbot/homebridge-switchbot
Version:
The SwitchBot plugin allows you to access your SwitchBot device(s) from HomeKit.
98 lines • 4.17 kB
JavaScript
import { addDevice, fetchDevices, syncParentPluginConfigFromDisk } from './api.js';
import { uiLog } from './logger.js';
import { hideBusyUi, showBusyUi } from './modal.js';
import { renderDeviceList } from './render.js';
import { toastError, toastInfo, toastSuccess, toastWarning } from './toast.js';
export async function addDeviceToConfig(device, options = {}) {
const { refresh = true, showStatus = true } = options;
try {
const { importDiscoveredDevice } = await import('./modals.js');
const importValues = await importDiscoveredDevice(device);
if (!importValues || typeof importValues !== 'object' || !importValues.configDeviceName || !importValues.configDeviceType) {
return { added: false };
}
showBusyUi();
uiLog.info('Adding device to config:', device);
// Never allow 'undefined' as a device name
let safeName = importValues.configDeviceName;
if (!safeName || safeName === 'undefined') {
safeName = device.name || device.id;
uiLog.warn(`Device name was invalid ("${importValues.configDeviceName}"), using fallback: "${safeName}"`);
}
const resp = await addDevice(device.id, safeName, importValues.configDeviceType, {
address: importValues.address,
model: device.model,
rssi: device.rssi,
encryptionKey: importValues.encryptionKey,
keyId: importValues.keyId,
});
uiLog.info('Add device response:', resp);
const alreadyExists = !!resp?.alreadyExists;
const message = resp?.message
|| (alreadyExists
? `Device "${importValues.configDeviceName}" already in config`
: `Device "${importValues.configDeviceName}" added successfully!`);
if (alreadyExists) {
toastInfo(message);
}
else {
toastSuccess(message);
}
if (showStatus) {
const status = document.getElementById('discoverStatus');
if (status) {
status.textContent = (alreadyExists ? '• ' : '✓ ') + message;
status.classList.remove('error');
status.classList.add('success-msg');
// Sync parent Homebridge form cache and auto-save to prevent cache overwrite
if (!alreadyExists) {
const synced = await syncParentPluginConfigFromDisk(true);
status.textContent += synced
? ' - Config saved automatically.'
: ' - Warning: config may not persist until you close/reopen settings.';
if (synced) {
toastSuccess('Configuration synced and saved automatically');
}
else {
toastWarning('Configuration sync failed; close and reopen settings before Save');
}
}
}
}
if (refresh) {
// Force reload of config from disk after add
await syncParentPluginConfigFromDisk(true);
await loadConfiguredDevices();
}
return { added: !alreadyExists };
}
catch (e) {
const msg = e instanceof Error ? e.message : String(e);
uiLog.error('Add device error:', msg);
const status = document.getElementById('discoverStatus');
if (status) {
status.textContent = `✗ Error: ${msg}`;
status.classList.add('error');
}
toastError(msg);
return { added: false };
}
finally {
hideBusyUi();
}
}
export async function initRemoveAllButton() {
const removeAllBtn = document.getElementById('removeAllBtn');
if (!removeAllBtn) {
return;
}
removeAllBtn.addEventListener('click', async () => {
const { deleteAllDevicesFromConfig } = await import('./devices-delete.js');
await deleteAllDevicesFromConfig();
});
}
export async function loadConfiguredDevices() {
const list = await fetchDevices();
renderDeviceList(list);
}
//# sourceMappingURL=devices.js.map