| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- (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);
- })();
|