배터리 잔여 시간을 실제 방전 추세로 계산

This commit is contained in:
seo
2026-06-26 02:03:16 +09:00
parent 527d7d6094
commit b6cdb0f162
3 changed files with 338 additions and 60 deletions
+35
View File
@@ -674,6 +674,38 @@
if (node) node.textContent = value ?? 'N/A';
}
function batteryRemainingTitle(remaining) {
if (!remaining || typeof remaining !== 'object') {
return '';
}
const sourceMap = {
soc_multi_window: 'SOC 다중 시간창 추세',
capacity_power_fallback: '배터리 용량과 최근 전력 평균',
battery_soc_missing: 'SOC 없음',
avg_watts_missing: '전력 평균 없음',
battery_capacity_missing: '배터리 용량 설정 없음',
};
const lines = [sourceMap[remaining.source] || remaining.source || '-'];
if (remaining.drop_per_hour !== undefined && remaining.drop_per_hour !== null) {
lines.push(`시간당 SOC 감소: ${Number(remaining.drop_per_hour).toFixed(3)}%`);
}
if (remaining.confidence !== undefined && remaining.confidence !== null) {
lines.push(`추세 신뢰도: ${(Number(remaining.confidence) * 100).toFixed(0)}%`);
}
if (remaining.recent_watts !== undefined && remaining.recent_watts !== null) {
lines.push(`최근 CPU 전력: ${Number(remaining.recent_watts).toFixed(3)}W`);
} else if (remaining.avg_watts !== undefined && remaining.avg_watts !== null) {
lines.push(`평균 CPU 전력: ${Number(remaining.avg_watts).toFixed(3)}W`);
}
if (Array.isArray(remaining.windows) && remaining.windows.length > 0) {
lines.push(`반영 구간: ${remaining.windows.map(row => `${row.minutes}`).join(', ')}`);
}
return lines.join('\n');
}
function renderTop(data) {
setText(els.updated, data.generated_at || '-');
setText(els.temp, Number(data.system?.temp_c || 0).toFixed(1) + '°C');
@@ -867,6 +899,9 @@
setText(els.statusBatteryVoltage, battery.voltage === null || battery.voltage === undefined ? '-' : `${Number(battery.voltage).toFixed(3)} V`);
setText(els.statusBatterySoc, battery.percent === null || battery.percent === undefined ? '-' : `${Number(battery.percent).toFixed(2)}%`);
setText(els.statusBatteryRemaining, battery.remaining?.display || '-');
if (els.statusBatteryRemaining) {
els.statusBatteryRemaining.title = batteryRemainingTitle(battery.remaining);
}
if (els.statusUsers) {
const names = String(activeUsers.names || '').trim();
els.statusUsers.innerHTML = names