//PV-Tabelle Jahresarchiv (function () { var ARCHIVE_BASE = '0_userdata.0.PV-Tabelle.archive.'; var currentYear = new Date().getFullYear(); function round1(v) { return Math.round((Number(v) || 0) * 10) / 10; } function setValue(id, value, unit) { var el = document.getElementById(id); if (!el) return; el.textContent = round1(value) + ' ' + unit; } function getVal(states, id) { return states[id] ? states[id].val : 0; } function loadYear(year) { vis.conn.getStates(ARCHIVE_BASE + year + '.year.*', function (err, states) { if (err || !states) return; var base = ARCHIVE_BASE + year + '.year'; setValue('pv-year-production', getVal(states, base + '.production'), 'kWh'); setValue('pv-year-consumption', getVal(states, base + '.consumption'), 'kWh'); setValue('pv-year-batteryCharge', getVal(states, base + '.batteryCharge'), 'kWh'); setValue('pv-year-batteryDischarge', getVal(states, base + '.batteryDischarge'), 'kWh'); setValue('pv-year-export', getVal(states, base + '.export'), 'kWh'); setValue('pv-year-import', getVal(states, base + '.import'), 'kWh'); }); } function refreshSelected() { var sel = document.getElementById('pv-year-select'); if (!sel || !sel.value) return; loadYear(sel.value); } function populateYears() { vis.conn.getStates(ARCHIVE_BASE + '*.year.production', function (err, states) { var years = []; if (states) { Object.keys(states).forEach(function (id) { var m = id.match(/archive\.(\d{4})\.year\.production$/); if (m) years.push(m[1]); }); } if (years.indexOf(String(currentYear)) === -1) { years.push(String(currentYear)); } years = years.filter(function (y, i) { return years.indexOf(y) === i; }); years.sort(function (a, b) { return b - a; }); var sel = document.getElementById('pv-year-select'); if (!sel) return; sel.innerHTML = ''; years.forEach(function (y) { var opt = document.createElement('option'); opt.value = y; opt.textContent = y; sel.appendChild(opt); }); sel.onchange = refreshSelected; sel.value = String(currentYear); loadYear(sel.value); }); } setTimeout(function () { populateYears(); setInterval(refreshSelected, 30000); }, 1000); })();