async function loadBootstrap(showMessage = false) { if (app.loading) { app.bootstrapReloadPending = true; return; } app.loading = true; try { const [data, sections] = await Promise.all([api('/api/bootstrap'), fetchSettingsSections()]); app.devices = data.devices || []; app.zones = data.zones || []; app.groups = data.groups || []; app.schedules = data.schedules || []; app.automations = data.automations || []; app.flows = data.flows || []; app.accessTokens = data.access_tokens || []; app.settings = aggregateSettingsSections(sections, data.house?.mode || 'cool'); app.sensorAliases = { ...(app.settings.home_assistant?.sensor_aliases || {}) }; app.flowSharedInputs = JSON.parse(JSON.stringify(app.settings.home_assistant?.flow_inputs || [])); app.system = data.system || {}; app.systemSnapshotAt = Date.now(); app.outdoorTemperature = Number.isFinite(Number(data.outdoor_temperature)) ? Number(data.outdoor_temperature) : null; app.controlPlan = data.control_plan || app.controlPlan; app.controlPlanRevision = Number.isFinite(Number(data.control_plan_revision)) ? Number(data.control_plan_revision) : app.controlPlanRevision; renderAll(); if (!data.control_plan) scheduleControlPlanLoad(0); if (app.settings?.debug?.overlay_enabled) loadDebugBacklog(); if (showMessage) toast(tr('common.updated')); if ($('#tokenDialog').open) $('#tokenDialog').close(); connectWebSocket(); } catch (error) { if (!String(error.message).toLowerCase().includes('token')) toast(error.message, true); } finally { app.loading = false; if (app.bootstrapReloadPending) { app.bootstrapReloadPending = false; setTimeout(() => loadBootstrap(), 0); } } }