diff --git a/js/dashboard.js b/js/dashboard.js index a19f4ea..563c474 100644 --- a/js/dashboard.js +++ b/js/dashboard.js @@ -29,6 +29,8 @@ class BlueWeatherDashboard { loadDashboard() { window.history.pushState("object or string", "Title", this.buildUrl({ "params": JSON.stringify(this.params) })); + this.setTimeRange(this.params.from, this.params.to, false, false) + // page: -1 for dashboard or sensor id var mainContent = document.getElementById('mainContent') var loader = document.getElementById('loader') @@ -39,6 +41,10 @@ class BlueWeatherDashboard { var page = this.params.page + if(this.initDone){ + document.getElementById("navbarPage" + page + "Link").classList.add("active") + } + this.blueweather.getLocationData(this.params.loc, { from: this.params.range.from, to: this.params.range.to }, this.params.maxVals, true, function (locationData) { // refresh sensors list dashboard.loadSensors(locationData.sensors) @@ -59,14 +65,14 @@ class BlueWeatherDashboard { var table = document.createElement("table") tableContainer.appendChild(table) table.classList.add("table", "table-hover") - + // create forst row of table var tableHead = document.createElement("thead") table.appendChild(tableHead) tableHead.innerHTML = "SensorMinimumMaximumAverage" var tableBody = document.createElement("tbody") table.appendChild(tableBody) - + for (var i = 0; i < locationData.sensors.length; i++) { var sensor = locationData.sensors[i] @@ -84,34 +90,38 @@ class BlueWeatherDashboard { // get all relevant meassurement values var vals = [] var sum = 0 - var min - var max + var min = undefined + var max = undefined + var avg = 0 for (s = 0; s < locationData["measvalues"].length; s++) { var thisValue = locationData["measvalues"][s] if (parseInt(thisValue['sensorid']) === parseInt(sensor.id)) { vals.push(thisValue) - sum += thisValue.measvalue - if(thisValue.measvalue < min || min === undefined) { - min = thisValue.measvalue + if (parseFloat(thisValue.measvalue) < min || min === undefined) { + min = parseFloat(thisValue.measvalue) } - if(thisValue.measvalue > max || max === undefined) { - max = thisValue.measvalue + if (parseFloat(thisValue.measvalue) > max || max === undefined) { + max = parseFloat(thisValue.measvalue) } } } - if(vals.length < 1) { + for (s = 0; s < vals.length; s++) { + avg += vals[s].measvalue / vals.length + } + + if (vals.length < 1) { continue } - vals.sort(function(a,b){ + vals.sort(function (a, b) { return b.timestamp - a.timestamp }) // create table col var tableRow = document.createElement("tr") - tableRow.innerHTML = "" + sensor.sensorname + " (" + valueType.valuetype + ", " + valueType.valueunit + ")" + "" + min + "" + max + "" + (Math.round((sum / vals.length)*100)/100) + "" + tableRow.innerHTML = "" + sensor.sensorname + " (" + valueType.valuetype + ", " + valueType.valueunit + ")" + "" + min + "" + max + "" + (Math.round((avg) * 100) / 100) + "" tableBody.appendChild(tableRow) // - create widget card - @@ -139,7 +149,7 @@ class BlueWeatherDashboard { var thisUpdateTime = document.createElement("small") thisUpdateTime.classList.add("text-muted") var lastUpdated = new Date(latestVal.timestamp * 1000) - thisUpdateTime.innerHTML = "last updated " + (lastUpdated.getDate() === new Date().getDate() ? "today" : lastUpdated.getFullYear+"-"+lastUpdated.getMonth()+"-"+lastUpdated.getDate()) + " at " + lastUpdated.getHours() + ":" + lastUpdated.getMinutes() + thisUpdateTime.innerHTML = "last updated " + (lastUpdated.getDate() === new Date().getDate() ? "today" : lastUpdated.getFullYear + "-" + lastUpdated.getMonth() + "-" + lastUpdated.getDate()) + " at " + lastUpdated.getHours() + ":" + lastUpdated.getMinutes() thisFooter.appendChild(thisUpdateTime) thisWidget.appendChild(thisFooter) @@ -148,44 +158,44 @@ class BlueWeatherDashboard { switch (displayProperties.type) { case "doughnut": - // the widget is gauge-like - var thisChart = document.createElement("canvas") - thisChart.id = "chartOf" + sensor.sensorname + // the widget is gauge-like + var thisChart = document.createElement("canvas") + thisChart.id = "chartOf" + sensor.sensorname - var chartData = { - datasets: [ - { - label: sensor.sensorname + " (" + valueType.valuetype + ")", - data: [ - parseInt(latestVal.measvalue), - 100 -parseInt( latestVal.measvalue) - ] - } - ], - labels: false - } + var chartData = { + datasets: [ + { + label: sensor.sensorname + " (" + valueType.valuetype + ")", + data: [ + parseInt(latestVal.measvalue), + 100 - parseInt(latestVal.measvalue) + ] + } + ], + labels: false + } - Object.assign(chartData.datasets[0], displayProperties.properties) - - dashboard.createPercentCircle(thisChart, chartData) + Object.assign(chartData.datasets[0], displayProperties.properties) - thisBody.appendChild(thisChart) + dashboard.createPercentCircle(thisChart, chartData) + + thisBody.appendChild(thisChart) break - case "text": - // the widget is pure text - thisWidget.classList.add("text-center") - thisBody.innerHTML = '

' + latestVal.measvalue + valueType.valueunit + '

' + case "text": + // the widget is pure text + thisWidget.classList.add("text-center") + thisBody.innerHTML = '

' + latestVal.measvalue + valueType.valueunit + '

' - //thisBody.innerHTML = 'Fit Meeeeeeeeeeee' - break + //thisBody.innerHTML = 'Fit Meeeeeeeeeeee' + break } firstRow.appendChild(thisWidget) } - + mainContent.innerHTML = ""; mainContent.appendChild(firstRow) @@ -218,18 +228,49 @@ class BlueWeatherDashboard { this.loadDashboard() } - setTimeRange(from = "", to = "") { + setTimeRange(from = "", to = "", offset = true, autoReload = true) { + // offset: if true the gien times will be substracted from the current time to get the target time this.blueweather.log("changing time range; form: " + from + "; to: " + to + "; (now is: " + new Date().getTime() + ")", 3) - if (from !== "") { - from = new Date().getTime() / 1000 - from + if (offset) { + if (from !== "") { + from = new Date().getTime() / 1000 - from + } + + if (to !== "") { + to = new Date().getTime() / 1000 - parseInt(to) + } + } + else { + if(from !== ""){ + from = parseInt(from) + } + if(to !== ""){ + to = parseInt(to) + } } - if (to !== "") { - to = new Date().getTime() / 1000 - parseInt(to) + var tmpFrom = from + var tmpTo = to + + if(tmpFrom === "") { + tmpFrom = Math.round( new Date().getTime() / 1000 - 60 * 60 * 24 ) } - this.updateParams({ range: { to: to, from: from } }) + if(tmpTo === "") { + tmpTo = Math.round(new Date().getTime() / 1000) + } + + var dateFromString = this.getDateTimeString(tmpFrom, tmpTo-tmpFrom) + var dateToString = this.getDateTimeString(tmpTo, tmpTo-tmpFrom) + + dropdownMenuButton.innerHTML = " " + dateFromString + " - " + dateToString + feather.replace() + + + if (this.initDone && autoReload) { + this.updateParams({ range: { to: to, from: from } }) + } } @@ -248,13 +289,13 @@ class BlueWeatherDashboard { } loadDiagram(parentId, locationData, sensorId) { - if(typeof(parentId) === "string"){ + if (typeof (parentId) === "string") { var mainContent = document.getElementById(parentId) } else { var mainContent = parentId } - + // get all relevant meassurement values var vals = [] @@ -386,37 +427,37 @@ class BlueWeatherDashboard { var to = data.range.to var from = data.range.from - if(to === ""){ + if (to === "") { to = new Date().getTime() } var range = data.range.to - data.range.from - if(range <= 60 * 60 * 24){ + if (range <= 60 * 60 * 24) { // covers one day or less datestr = ("0" + d.getHours()).slice(-2) + ":" + - ("0" + d.getMinutes()).slice(-2) + ":" + - ("0" + d.getSeconds()).slice(-2) + ("0" + d.getMinutes()).slice(-2) + ":" + + ("0" + d.getSeconds()).slice(-2) } - else if(range <= 60 * 60 * 24 * 31){ + else if (range <= 60 * 60 * 24 * 31) { // covers one month or less datestr = ("0" + d.getDate()).slice(-2) + "-" + - ("0"+(d.getMonth()+1)).slice(-2) + " " + - ("0" + d.getHours()).slice(-2) + ":" + - ("0" + d.getMinutes()).slice(-2) + ":" + - ("0" + d.getSeconds()).slice(-2) + ("0" + (d.getMonth() + 1)).slice(-2) + " " + + ("0" + d.getHours()).slice(-2) + ":" + + ("0" + d.getMinutes()).slice(-2) + ":" + + ("0" + d.getSeconds()).slice(-2) } else { // covers more than a month - datestr = - d.getFullYear() + "-" + - ("0" + d.getDate()).slice(-2) + "-" + - ("0"+(d.getMonth()+1)).slice(-2) + datestr = + d.getFullYear() + "-" + + ("0" + d.getDate()).slice(-2) + "-" + + ("0" + (d.getMonth() + 1)).slice(-2) } - + return datestr; } }, @@ -444,9 +485,9 @@ class BlueWeatherDashboard { var d = new Date(time * 1000); var datestr = - d.getFullYear() + "-" + + d.getFullYear() + "-" + ("0" + d.getDate()).slice(-2) + "-" + - ("0"+(d.getMonth()+1)).slice(-2) + " " + + ("0" + (d.getMonth() + 1)).slice(-2) + " " + ("0" + d.getHours()).slice(-2) + ":" + ("0" + d.getMinutes()).slice(-2) + ":" + ("0" + d.getSeconds()).slice(-2) @@ -468,6 +509,35 @@ class BlueWeatherDashboard { }) } + getDateTimeString(unixTime, range = 0) { + + if(Math.abs(unixTime - new Date().getTime() / 1000) <= 60 ) { + return "now" + } + + var d = new Date(parseInt(unixTime) * 1000); + var datestr = "" + if (range <= 60 * 60 * 24 * 31) { + // covers one month or less + + datestr = + ("0" + d.getDate()).slice(-2) + "-" + + ("0" + (d.getMonth() + 1)).slice(-2) + " " + + ("0" + d.getHours()).slice(-2) + ":" + + ("0" + d.getMinutes()).slice(-2) + } + else { + // covers more than a month + + datestr = + d.getFullYear() + "-" + + ("0" + d.getDate()).slice(-2) + "-" + + ("0" + (d.getMonth() + 1)).slice(-2) + } + + return datestr + } + setPageTitle(title) { document.getElementById("titleH1").innerHTML = title }