/* * main.js * * This file is part of the VE.Direct web UI * https://git.schauaus.at/VE-Tools/VE.Direct-webui * It is licensed under the GPL3.0 or later. * You should have received a copy of the license with this software */ var deviceDataParsed = false var deviceDataSet = {} var deviceDataTimer; var deviceIds = {} var devices = []; var deviceTimer; var i18n = {} var lang = 'de' function checkFile(url) { let xhr = new XMLHttpRequest() xhr.open('HEAD', url, false); xhr.send() return xhr.status !==404 } function fileReadJson(ReturnFunction, url, params = "") { let xhr = new XMLHttpRequest() xhr.onload = function () { if(xhr.status == 200) ReturnFunction(xhr.response) else return false } xhr.onerror = function() { return false } xhr.open('POST', url, true) xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); xhr.responseType = 'json' xhr.send(params) } function getDeviceData(device) { if(!device.startsWith('0x')) //check if device ID is valid return false fileReadJson(parseDeviceData, './dbQuery.php', 'q=deviceData&device=' + device) } function getDeviceIds() { let xhr = new XMLHttpRequest() xhr.onload = function() { if(xhr.status === 200) deviceIds = xhr.response } xhr.open('GET', './deviceIds.json', true) xhr.responseType = 'json' xhr.send() } function getDevices() { if(Object.keys(deviceIds).length < 1) return if(Object.keys(i18n).lenght < 1) return clearInterval(deviceTimer) let xhr = new XMLHttpRequest() xhr.onload = function() { if(xhr.status != 200) { // error handling devices = false } else { //process data devices = [] for(let i=0; i' block.addEventListener("click", showDevice) } } function showDevice(event) { let deviceName = event.currentTarget.id.substr(2) if(deviceName == "Dashboard") { document.getElementById('deviceDetails').style.display = "none" //hide device details document.getElementById('dashboard').style.display = "inline-block" } else { document.getElementById('dashboard').style.display = "none" //hide dashboard //cleanup device details let deviceDetailNode = document.getElementById('deviceDetails') while(deviceDetailNode.children.length > 3) deviceDetailNode.removeChild( deviceDetailNode.children[ deviceDetailNode.children.length - 1 ] ) //show device data block and fill in the details document.getElementById('deviceDetails').style.display = "inline-block" renderDeviceDetails(deviceName) } } function showDeviceData() { if(!deviceDataParsed) return clearInterval(deviceDataTimer) //parse years, months, days and timestamps let years = Object.keys(deviceDataSet) years.sort() let latestYear = years[years.length - 1] let months = Object.keys(deviceDataSet[latestYear]) months.sort() let latestMonth = months[months.length - 1] let days = Object.keys(deviceDataSet[latestYear][latestMonth]) days.sort() let latestDay = days[days.length - 1] let timestamps = Object.keys( deviceDataSet[latestYear][latestMonth][latestDay] ) timestamps.sort() let latestTimestamp = timestamps[timestamps.length - 1] let latestDataPoint = document.createElement('div') latestDataPoint.innerHTML = i18n[lang]['latestDataPoint'] + ': ' + latestYear + '-' + latestMonth + '-' + latestDay + ' ' + latestTimestamp document.getElementById('deviceDetails').appendChild(latestDataPoint) //parse latest datapoint regarding system power, system voltage, solar power, solar voltage let latestDataSet = deviceDataSet[latestYear][latestMonth][latestDay][latestTimestamp] let latestPowerData = document.createElement('table') //solar panel data latestPowerData.innerHTML += '' + i18n[lang]['datafield_CS'] + ':' + ( (latestDataSet['CS']) ? i18n[lang]['operatingStatus_' + latestDataSet['CS']] : '---') + '' + i18n[lang]['datafield_VPV'] + ':' + ( (latestDataSet['VPV']) ? parseInt(latestDataSet['VPV']) / 1000 : '---' ) + 'V' + '' + i18n[lang]['datafield_PPV'] + ':' + ( (latestDataSet['PPV']) ? latestDataSet['PPV'] : '---' ) + 'W' + '' //battery / channel 1 data latestPowerData.innerHTML += '' + i18n[lang]['datafield_I'] + ':' + ( (latestDataSet['I']) ? parseInt(latestDataSet['I']) / 1000 : '---' ) + 'A' + '' + i18n[lang]['datafield_V'] + ':' + ( (latestDataSet['V']) ? parseInt(latestDataSet['V']) / 1000 : '---' ) + 'V' + '' + i18n[lang]['datafield_P'] + ':' + ( (latestDataSet['P']) ? latestDataSet['P'] : ( ( latestDataSet['I'] && latestDataSet['V'] ) ? parseInt(latestDataSet['I']) * parseInt(latestDataSet['V']) /1000000 : '---' ) ) + 'W' + '' //yield data latestPowerData.innerHTML += '' + i18n[lang]['datafield_H20'] + ':' + ( (latestDataSet['H20']) ? parseInt(latestDataSet['H20']) * 0.01 : '---' ) + 'kWh' + '' + i18n[lang]['datafield_H22'] + ':' + ( (latestDataSet['H22']) ? parseInt(latestDataSet['H22']) / 100 : '---' ) + 'kWh' + '' + i18n[lang]['datafield_H19'] + ':' + ( ( latestDataSet['H19'] ) ? parseInt(latestDataSet['H19']) / 100 : '---' ) + 'kWh' + '' //power data latestPowerData.innerHTML += '' + i18n[lang]['datafield_H21'] + ':' + parseInt(latestDataSet['H21']) + 'W' + '' + i18n[lang]['datafield_H23'] + ': ' + parseInt(latestDataSet['H23']) + 'W' + '' document.getElementById('deviceDetails').appendChild(latestPowerData) }