Newer
Older
Authors: Tristan Wright, July 2012, Lillian Gray 2017-2020
This reads the json formatted data generated by data_gen.py
the data is piped into the Google Charts API and a graph with controls are made
If more buildings are added increment buildingNum and add
a new color to buildingColors
Benchmark functions or sections by wrapping them in:
console.log(var a = new Date()-0)
console.log(var b = new Date()-0 - a)
*/
//init globals
//chart data source is global so we don't have to reload every time.
var lineChartData
var dashboard
var controlWrapper
var chartWrapper
const buildingNum = 8
var whichBuildings = new Array()
var buildingColors = new Array( '#9c1c34', '#0A22af', '#ff381a','#00ff00', '#009944','#50D8F1','#e9af32', '#E07628')
//variables for range of control under chart
var endDate
var startDate
var URLComponents = document.URL.split('?')
whichBuildings[which] = !whichBuildings[which]
if(which===0){
handleTotalOptions(whichBuildings[0])
}
drawLineChart()
}
function handleTotalOptions(totalVisible){
if(totalVisible===true){
//adds options for separate series for total data
chartWrapper.setOption('series',{0: {'targetAxisIndex': 1}})
chartWrapper.setOption('vAxes', {1: {
'title': 'Total Campus Usage in Kilowatts',
'titleColor': buildingColors[0],
'textColor': buildingColors[0],
'gridlines': {'color': 'transparent'},
'baselineColor': 'transparent'
chartWrapper.setOption('series',{})
}
}
function drawLineChart(){
// column 0 is date and should always be included
var visibleColumns = [0]
var visibleColors = []
for(i=0;i<whichBuildings.length;i++){
if(whichBuildings[i]){
//since column 0 is date, column index is one greater for API
visibleColumns.push(i+1)
visibleColors.push(buildingColors[i])
lineChartData.setColumns(visibleColumns)
chartWrapper.setOption('colors', visibleColors)
// Total is not displayed in controlWrapper if it is enabled
if(whichBuildings[0]===true){
controlWrapper.setOption('ui.chartOptions.colors', visibleColors.slice(1))
//Control wrapper columns are based on indexes of chart columns, include every index but 1 for Total
var controlWrapperColumns = [0]
controlWrapperColumns.push(i)
controlWrapper.setOption('ui.chartView.columns', controlWrapperColumns)
controlWrapper.setOption('ui.chartOptions.colors', visibleColors)
controlWrapper.setOption('ui.chartView.columns', null)
dashboard.draw(lineChartData)
function onAPILoad(){
getData().done(initializeLineChart)
}
function getData(){
url: "raw_line_chart.txt", //location of data file
dataType: "json",
})
}
function initializeLineChart(data){
lineChartData = new google.visualization.DataView(new google.visualization.DataTable(data))
dashboard = new google.visualization.Dashboard(document.getElementById('dashboard'))
var latestEntryDate = new Date(lineChartData.getValue(lineChartData.getNumberOfRows()-1, 0))
endDate = new Date(latestEntryDate)
startDate = new Date(latestEntryDate.setMonth(latestEntryDate.getMonth() - 1))
parsePermalink()
//settings for control bar below chart
controlWrapper = new google.visualization.ControlWrapper({
controlType: 'ChartRangeFilter',
containerId: 'control',
options: {
filterColumnIndex: 0,
ui: {
chartType: 'LineChart',
chartOptions: {
chartArea: {width: '100%'},
colors: buildingColors.slice(1),
hAxis: {baselineColor: 'none'}},
state: {range: {start: startDate, end: endDate}}
//chart settings
chartWrapper = new google.visualization.ChartWrapper({
chartType: 'LineChart',
containerId: 'lineChart',
options: {
fontName: 'Georgia',
vAxis: {title: 'Individual Building Usage in Kilowatts'},
hAxis: {
textStyle: {fontSize: 14},
gridlines: {
count: -1,
color: '#fff',
units: {
years: {format: ['yyyy', "''yy"]},
months: {format: ['MMM yyyy', "MMM ''yy",'MMM']},
days: {format: ['EEE MMM d, yyyy', "MMM d, ''yy", 'MMM d']},
hours: {format: ['']}
minorGridlines: {
units: {
months: {format: ['MMM']},
days: {format: ['d']},
hours: {format: ['']}
//event handler saves date
google.visualization.events.addListener(controlWrapper, 'statechange',
function(){
startDate = controlWrapper.getState().range.start
endDate = controlWrapper.getState().range.end
dashboard.bind(controlWrapper, chartWrapper) //bind control to chart
handleTotalOptions(whichBuildings[0])
google.visualization.events.addOneTimeListener(dashboard, 'ready', disableLoadingScreen);
function disableLoadingScreen() {
document.getElementById("spinner").classList.add('displayNone')
}
function parsePermalink(){
permalinked = URLComponents.length==2
if(permalinked){
var args = URLComponents[1]
var argsArray = args.split("+")
var startTemp = parseDate(argsArray[0])
var endTemp = parseDate(argsArray[1])
var whichArgs = parseInts(argsArray[2].split(""))
for(i=0; i<whichArgs.length; i++){
whichBuildings[whichArgs[i]] = !whichBuildings[whichArgs[i]]
}
if(startTemp < endTemp){
startDate = startTemp
endDate = endTemp
var dateArr = urlArg.split("-")
return new Date(parseInt(dateArr[0]), parseInt(dateArr[1]) - 1, parseInt(dateArr[2]))
a.push(parseInt(strArray[i]))
return a
}
// Generating a permalink
function genPermalink(){
//month is zero-indexed
var startStr = startDate.getFullYear()+"-"+(startDate.getMonth() + 1)+"-"+startDate.getDate()
var endStr = endDate.getFullYear()+"-"+(endDate.getMonth() + 1)+"-"+endDate.getDate()
var disabledBuildings = ""
var permalink = URLComponents[0]+"?"+startStr+"+"+endStr+"+"+disabledBuildings
//Copies permalink and puts permalink in text box next to the button
var permalinkTextField = document.getElementById('permalink')
permalinkTextField.value = permalink
permalinkTextField.select()
document.execCommand('copy')
var permalinkButton = document.querySelector('.getPermalink')
permalinkButton.classList.add('active')
permalinkButton.classList.remove('inactive')
permalinkButton.classList.remove('active')
permalinkButton.classList.add('inactive')
function downloadCSV(el) {
//prepares and then downloads a csv file based on what is currently shown in the chart
//creates csvString using same visible data as chart
var dataView = new google.visualization.DataView(lineChartData)
var filteredRows = dataView.getFilteredRows([{column: 0, minValue: startDate, maxValue: endDate}])
dataView.setRows(filteredRows)
var csvString = google.visualization.dataTableToCsv(dataView)
csvHeader += lineChartData.getColumnLabel(i)
csvHeader += ","
csvString = csvHeader + "\n" + csvString
var encodedUri = 'data:application/csv;charset=utf-8,' + encodeURIComponent(csvString)
el.href = encodedUri
el.download = 'energy-monitoring-data.csv'
el.target = '_blank'
}
if(button=="close"){
document.getElementById("lineChart").classList.remove('displayNone')
document.getElementById("control").classList.remove('displayNone')
document.getElementById("howToUse").classList.add('displayNone')
document.getElementById("aboutText").classList.add('displayNone')
document.getElementById("closeButton").classList.add('displayNone')
}
else{
document.getElementById("lineChart").classList.add('displayNone')
document.getElementById("control").classList.add('displayNone')
document.getElementById("closeButton").classList.remove('displayNone')
if(button=="about"){
document.getElementById("howToUse").classList.add('displayNone')
document.getElementById("aboutText").classList.remove('displayNone')
}
if(button=="howToUse"){
document.getElementById("aboutText").classList.add('displayNone')
document.getElementById("howToUse").classList.remove('displayNone')
$(window).resize(function() {
dashboard.draw(lineChartData)
})