SITERA Sistem Informasi Tegangan & Energi Terintegrasi
Checking...
`; const blob = new Blob( [html], { type:'application/vnd.ms-excel' } ); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = 'SITERA-Power-Consumption-' + meta.unit + '-' + meta.start + '-' + meta.stop + '.xls'; document.body.appendChild(a); a.click(); a.remove(); setTimeout( () => URL.revokeObjectURL(url), 1000 ); } function pcExport(){ const rows = window.__siteraPowerRows || []; const meta = window.__siteraPowerMeta || {}; if(!rows.length){ alert( 'Tidak ada data Power Consumption untuk diexport.' ); return; } /* * Pakai XLSX bila tersedia. */ if( typeof XLSX !== 'undefined' ){ const data = [[ 'DATE', 'DEVICE', 'PV ENERGY (kWh)', 'LOAD ENERGY (kWh)' ]]; let pv = 0; let load = 0; rows.forEach(row => { pv += row.pv; load += row.load; data.push([ row.date, row.unit, row.pv, row.load ]); }); data.push([ 'TOTAL', '', pv, load ]); const ws = XLSX.utils.aoa_to_sheet(data); ws['!cols'] = [ {wch:16}, {wch:16}, {wch:20}, {wch:20} ]; const wb = XLSX.utils.book_new(); XLSX.utils.book_append_sheet( wb, ws, 'Power Consumption' ); XLSX.writeFile( wb, 'SITERA-Power-Consumption-' + meta.unit + '-' + meta.start + '-' + meta.stop + '.xlsx' ); return; } /* * Fallback Excel-compatible .xls. */ pcExcelFallback( rows, meta ); } async function openPage(){ const page = document.getElementById('page'); if(!page){ return; } let units = []; try{ const result = await api('/api/units'); units = Array.isArray(result?.items) ? result.items : []; }catch(err){ console.error( '[SITERA] Power Consumption units:', err ); } let unit = pcGetUnit(); if(!unit){ unit = units[0] || ''; } const now = new Date(); const startDefault = new Date(now); startDefault.setHours( 0,0,0,0 ); startDefault.setDate( startDefault.getDate()-6 ); page.innerHTML = `

Power Consumption

Konsumsi energi PV dan Load

Power Consumption Table

Loading...
DATE DEVICE PV ENERGY (kWh) LOAD ENERGY (kWh)
Loading...
TOTAL 0.000 kWh 0.000 kWh
`; const device = document.getElementById( 'pcDeviceOnly' ); const start = document.getElementById( 'pcStartOnly' ); const stop = document.getElementById( 'pcStopOnly' ); const apply = document.getElementById( 'pcApplyOnly' ); const exportBtn = document.getElementById( 'pcExportOnly' ); const body = document.getElementById( 'pcBodyOnly' ); const info = document.getElementById( 'pcInfoOnly' ); const totalPv = document.getElementById( 'pcTotalPvOnly' ); const totalLoad = document.getElementById( 'pcTotalLoadOnly' ); async function load(){ const selectedUnit = device.value; const startValue = start.value; const stopValue = stop.value; if( !selectedUnit || !startValue || !stopValue ){ info.textContent = 'Device dan tanggal harus diisi.'; return; } const from = new Date( startValue + 'T00:00:00' ); const to = new Date( stopValue + 'T00:00:00' ); if(from > to){ info.textContent = 'Tanggal mulai tidak boleh lebih besar.'; return; } const days = Math.floor( (to - from) / 86400000 ) + 1; body.innerHTML = ` Mengambil data... `; info.textContent = `Mengambil data ${days} hari...`; totalPv.textContent = '0.000 kWh'; totalLoad.textContent = '0.000 kWh'; const rows = []; let sumPv = 0; let sumLoad = 0; try{ for(let i=0;i current ? current : dayEnd; let pvValue = 0; let loadValue = 0; if(selectedUnit === 'ALL'){ /* * ALL = jumlah seluruh device * pada tanggal tersebut. */ const results = await Promise.all( units.map(async currentUnit => { const data = await pcEnergy( currentUnit, dayStart, dayStop ); return { pv:Number(data?.pv?.kwh), load:Number(data?.load?.kwh) }; }) ); for(const item of results){ if(Number.isFinite(item.pv)){ pvValue += item.pv; } if(Number.isFinite(item.load)){ loadValue += item.load; } } }else{ /* * Single device = perilaku lama. */ const data = await pcEnergy( selectedUnit, dayStart, dayStop ); const pv = Number(data?.pv?.kwh); const load = Number(data?.load?.kwh); pvValue = Number.isFinite(pv) ? pv : 0; loadValue = Number.isFinite(load) ? load : 0; } sumPv += pvValue; sumLoad += loadValue; rows.push({ date:pcDate(dayStart), unit:selectedUnit, pv:pvValue, load:loadValue }); } body.innerHTML = rows.map(row => ` ${pcEsc(row.date)} ${pcEsc(row.unit)} ${pcFmt(row.pv)} ${pcFmt(row.load)} `).join(''); totalPv.textContent = pcFmt(sumPv) + ' kWh'; totalLoad.textContent = pcFmt(sumLoad) + ' kWh'; info.textContent = `${rows.length} hari • Device ${selectedUnit}`; window.__siteraPowerRows = rows; window.__siteraPowerMeta = { unit:selectedUnit, start:startValue, stop:stopValue }; const head = document.getElementById( 'pcHeadMeta' ); if(head){ head.textContent = selectedUnit + ' • ' + startValue + ' s/d ' + stopValue; } }catch(err){ console.error( '[SITERA] Power Consumption load:', err ); body.innerHTML = ` Gagal mengambil data: ${pcEsc(err.message)} `; info.textContent = 'Gagal mengambil data.'; } } device.onchange = function(){ try{ state.unit = this.value; localStorage.setItem( 'ppa_unit', this.value ); }catch(e){} }; apply.onclick = load; exportBtn.onclick = pcExport; await load(); } window.__SITERA_POWER_OPEN__ = openPage; /* * Handler khusus Power Consumption. * TIDAK mengubah handler menu lain. */ function bind(){ const btn = document.getElementById( 'navPowerConsumption' ); if(!btn){ return false; } btn.onclick = function(e){ e.preventDefault(); try{ state.page = 'power-consumption'; document .querySelectorAll('.nav button') .forEach(b => b.classList.toggle( 'active', b === btn ) ); }catch(err){} openPage() .catch(err => { console.error( '[SITERA] Power Consumption:', err ); }); }; return true; } if(!bind()){ const timer = setInterval( function(){ if(bind()){ clearInterval(timer); } }, 200 ); setTimeout( () => clearInterval(timer), 10000 ); } })();
Sistem Informasi Tegangan & Energi Terintegrasi
Login
Silakan masuk untuk mengakses SITERA
Selamat Datang di SITERA
Sistem Informasi Tegangan & Energi Terintegrasi
PPA - ICT Jobsite Alamtri Geo