(function () { function formatDateTime(value) { if (!value) return '暂无'; const date = new Date(value); if (Number.isNaN(date.getTime())) return value; const pad = (number) => String(number).padStart(2, '0'); return `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())} ${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(date.getSeconds())}`; } function updateMqttStatus(status) { const root = document.getElementById('mqttStatus'); const text = document.getElementById('mqttStatusText'); if (!root || !text || !status) return; root.classList.toggle('connected', Boolean(status.connected)); root.classList.toggle('disconnected', !status.connected); root.title = status.lastError || ''; text.textContent = `MQTT ${status.connected ? '已连接' : (status.message || '未连接')}`; } function updateHomeStatus(data) { const summary = document.getElementById('lightSummary'); if (summary && data.summary) { summary.textContent = `${data.summary.on} 组开启,${data.summary.off} 组关闭。`; } const nextOccurrence = document.getElementById('nextOccurrenceText'); if (nextOccurrence) { nextOccurrence.textContent = data.nextOccurrence ? `下一次:${data.nextOccurrence.actionLabel},${data.nextOccurrence.at}。` : '暂无后续计划。'; } for (const state of data.states || []) { const card = document.querySelector(`[data-state-card="${state.channel}"]`); if (!card) continue; const value = card.querySelector('[data-state-value]'); const lastSeen = card.querySelector('[data-last-seen]'); if (value) { value.textContent = state.state; value.classList.remove('state-on', 'state-off', 'state-unknown'); value.classList.add(`state-${String(state.state).toLowerCase()}`); } if (lastSeen) lastSeen.textContent = formatDateTime(state.last_seen_at); } } async function refreshStatus() { try { const response = await fetch('/api/status', { cache: 'no-store' }); if (!response.ok) return; const data = await response.json(); updateMqttStatus(data.mqttStatus); updateHomeStatus(data); } catch { updateMqttStatus({ connected: false, message: '刷新失败' }); } } refreshStatus(); setInterval(refreshStatus, 5000); })();