add templates for plugins: Google gauge and multiline charts
This commit is contained in:
5
app/views/plugins/templates/chart.css
Normal file
5
app/views/plugins/templates/chart.css
Normal file
@ -0,0 +1,5 @@
|
||||
<style type="text/css">
|
||||
body { background-color: white; height: 100%; margin: 0; padding: 0; }
|
||||
#chart-container { width: 425px; height: 235px; display: block; position:absolute; bottom:0; top:0; left:0; right:0; margin: 5px 15px 15px 0; overflow: hidden; }
|
||||
</style>
|
||||
|
18
app/views/plugins/templates/chart.html
Normal file
18
app/views/plugins/templates/chart.html
Normal file
@ -0,0 +1,18 @@
|
||||
<!DOCTYPE html>
|
||||
<html style="height: 100%;">
|
||||
<head>
|
||||
<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
|
||||
<script type="text/javascript" src="//thingspeak.com/highcharts-3.0.8.js"></script>
|
||||
<script type="text/javascript" src="//thingspeak.com/exporting.js"></script>
|
||||
|
||||
%%PLUGIN_CSS%%
|
||||
%%PLUGIN_JAVASCRIPT%%
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<div id="chart-container">
|
||||
<img alt="Ajax loader" src="/assets/ajax-loader.gif" style="position: absolute; margin: auto; top: 0; left: 0; right: 0; bottom: 0;" />
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
122
app/views/plugins/templates/chart.js
Normal file
122
app/views/plugins/templates/chart.js
Normal file
@ -0,0 +1,122 @@
|
||||
<script type="text/javascript">
|
||||
// variables for the first series
|
||||
var series_1_channel_id = 9;
|
||||
var series_1_field_number = 1;
|
||||
var series_1_read_api_key = '';
|
||||
var series_1_results = 10;
|
||||
var series_1_color = '#d62020';
|
||||
|
||||
// variables for the second series
|
||||
var series_2_channel_id = 9;
|
||||
var series_2_field_number = 2;
|
||||
var series_2_read_api_key = '';
|
||||
var series_2_results = 10;
|
||||
var series_2_color = '#00aaff';
|
||||
|
||||
// chart title
|
||||
var chart_title = 'Light & Temperature';
|
||||
// y axis title
|
||||
var y_axis_title = 'Values';
|
||||
|
||||
// user's timezone offset
|
||||
var my_offset = new Date().getTimezoneOffset();
|
||||
// chart variable
|
||||
var my_chart;
|
||||
|
||||
// when the document is ready
|
||||
$(document).on('ready', function() {
|
||||
// add a blank chart
|
||||
addChart();
|
||||
// add the first series
|
||||
addSeries(series_1_channel_id, series_1_field_number, series_1_read_api_key, series_1_results, series_1_color);
|
||||
// add the second series
|
||||
addSeries(series_2_channel_id, series_2_field_number, series_2_read_api_key, series_2_results, series_2_color);
|
||||
});
|
||||
|
||||
// add the base chart
|
||||
function addChart() {
|
||||
// variable for the local date in milliseconds
|
||||
var localDate;
|
||||
|
||||
// specify the chart options
|
||||
var chartOptions = {
|
||||
chart: {
|
||||
renderTo: 'chart-container',
|
||||
defaultSeriesType: 'line',
|
||||
backgroundColor: '#ffffff',
|
||||
events: { }
|
||||
},
|
||||
title: { text: chart_title },
|
||||
plotOptions: {
|
||||
series: {
|
||||
marker: { radius: 3 },
|
||||
animation: true,
|
||||
step: false,
|
||||
borderWidth: 0,
|
||||
turboThreshold: 0
|
||||
}
|
||||
},
|
||||
tooltip: {
|
||||
// reformat the tooltips so that local times are displayed
|
||||
formatter: function() {
|
||||
var d = new Date(this.x + (my_offset*60000));
|
||||
var n = (this.point.name === undefined) ? '' : '<br>' + this.point.name;
|
||||
return this.series.name + ':<b>' + this.y + '</b>' + n + '<br>' + d.toDateString() + '<br>' + d.toTimeString().replace(/\(.*\)/, "");
|
||||
}
|
||||
},
|
||||
xAxis: {
|
||||
type: 'datetime',
|
||||
title: { text: 'Date' }
|
||||
},
|
||||
yAxis: { title: { text: y_axis_title } },
|
||||
exporting: { enabled: false },
|
||||
legend: { enabled: false },
|
||||
credits: {
|
||||
text: 'ThingSpeak.com',
|
||||
href: 'https://thingspeak.com/',
|
||||
style: { color: '#D62020' }
|
||||
}
|
||||
};
|
||||
|
||||
// draw the chart
|
||||
my_chart = new Highcharts.Chart(chartOptions);
|
||||
}
|
||||
|
||||
// add a series to the chart
|
||||
function addSeries(channel_id, field_number, api_key, results, color) {
|
||||
var field_name = 'field' + field_number;
|
||||
|
||||
// get the data with a webservice call
|
||||
$.getJSON('https://api.thingspeak.com/channels/' + channel_id + '/fields/' + field_number + '.json?offset=0&round=2&results=' + results + '&api_key=' + api_key, function(data) {
|
||||
|
||||
// blank array for holding chart data
|
||||
var chart_data = [];
|
||||
|
||||
// iterate through each feed
|
||||
$.each(data.feeds, function() {
|
||||
var point = new Highcharts.Point();
|
||||
// set the proper values
|
||||
var value = this[field_name];
|
||||
point.x = getChartDate(this.created_at);
|
||||
point.y = parseFloat(value);
|
||||
// add location if possible
|
||||
if (this.location) { point.name = this.location; }
|
||||
// if a numerical value exists add it
|
||||
if (!isNaN(parseInt(value))) { chart_data.push(point); }
|
||||
});
|
||||
|
||||
// add the chart data
|
||||
my_chart.addSeries({ data: chart_data, name: data.channel[field_name], color: color });
|
||||
});
|
||||
}
|
||||
|
||||
// converts date format from JSON
|
||||
function getChartDate(d) {
|
||||
// get the data using javascript's date object (year, month, day, hour, minute, second)
|
||||
// months in javascript start at 0, so remember to subtract 1 when specifying the month
|
||||
// offset in minutes is converted to milliseconds and subtracted so that chart's x-axis is correct
|
||||
return Date.UTC(d.substring(0,4), d.substring(5,7)-1, d.substring(8,10), d.substring(11,13), d.substring(14,16), d.substring(17,19)) - (my_offset * 60000);
|
||||
}
|
||||
|
||||
</script>
|
||||
|
3
app/views/plugins/templates/default.css
Normal file
3
app/views/plugins/templates/default.css
Normal file
@ -0,0 +1,3 @@
|
||||
<style type="text/css">
|
||||
body { background-color: #ddd; }
|
||||
</style>
|
13
app/views/plugins/templates/default.html
Normal file
13
app/views/plugins/templates/default.html
Normal file
@ -0,0 +1,13 @@
|
||||
<html>
|
||||
<head>
|
||||
|
||||
%%PLUGIN_CSS%%
|
||||
%%PLUGIN_JAVASCRIPT%%
|
||||
|
||||
</head>
|
||||
<body>
|
||||
|
||||
my plugin
|
||||
|
||||
</body>
|
||||
</html>
|
3
app/views/plugins/templates/default.js
Normal file
3
app/views/plugins/templates/default.js
Normal file
@ -0,0 +1,3 @@
|
||||
<script type="text/javascript">
|
||||
document.write('<div>javascript active</div>');
|
||||
</script>
|
7
app/views/plugins/templates/gauge.css
Normal file
7
app/views/plugins/templates/gauge.css
Normal file
@ -0,0 +1,7 @@
|
||||
<style type="text/css">
|
||||
body { background-color: #ddd; }
|
||||
#container { height: 100%; width: 100%; display: table; }
|
||||
#inner { vertical-align: middle; display: table-cell; }
|
||||
#gauge_div { width: 120px; margin: 0 auto; }
|
||||
</style>
|
||||
|
19
app/views/plugins/templates/gauge.html
Normal file
19
app/views/plugins/templates/gauge.html
Normal file
@ -0,0 +1,19 @@
|
||||
<html>
|
||||
<head>
|
||||
|
||||
<title>Google Gauge - ThingSpeak</title>
|
||||
|
||||
%%PLUGIN_CSS%%
|
||||
%%PLUGIN_JAVASCRIPT%%
|
||||
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="container">
|
||||
<div id="inner">
|
||||
<div id="gauge_div"></div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
66
app/views/plugins/templates/gauge.js
Normal file
66
app/views/plugins/templates/gauge.js
Normal file
@ -0,0 +1,66 @@
|
||||
<script type='text/javascript' src='https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js'></script>
|
||||
<script type='text/javascript' src='https://www.google.com/jsapi'></script>
|
||||
<script type='text/javascript'>
|
||||
|
||||
// set your channel id here
|
||||
var channel_id = 9;
|
||||
// set your channel's read api key here if necessary
|
||||
var api_key = '';
|
||||
// maximum value for the gauge
|
||||
var max_gauge_value = 1023;
|
||||
// name of the gauge
|
||||
var gauge_name = 'Light Level';
|
||||
|
||||
// global variables
|
||||
var chart, charts, data;
|
||||
|
||||
// load the google gauge visualization
|
||||
google.load('visualization', '1', {packages:['gauge']});
|
||||
google.setOnLoadCallback(initChart);
|
||||
|
||||
// display the data
|
||||
function displayData(point) {
|
||||
data.setValue(0, 0, gauge_name);
|
||||
data.setValue(0, 1, point);
|
||||
chart.draw(data, options);
|
||||
}
|
||||
|
||||
// load the data
|
||||
function loadData() {
|
||||
// variable for the data point
|
||||
var p;
|
||||
|
||||
// get the data from thingspeak
|
||||
$.getJSON('https://api.thingspeak.com/channels/' + channel_id + '/feed/last.json?api_key=' + api_key, function(data) {
|
||||
|
||||
// get the data point
|
||||
p = data.field1;
|
||||
|
||||
// if there is a data point display it
|
||||
if (p) {
|
||||
p = Math.round((p / max_gauge_value) * 100);
|
||||
displayData(p);
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
// initialize the chart
|
||||
function initChart() {
|
||||
|
||||
data = new google.visualization.DataTable();
|
||||
data.addColumn('string', 'Label');
|
||||
data.addColumn('number', 'Value');
|
||||
data.addRows(1);
|
||||
|
||||
chart = new google.visualization.Gauge(document.getElementById('gauge_div'));
|
||||
options = {width: 120, height: 120, redFrom: 90, redTo: 100, yellowFrom:75, yellowTo: 90, minorTicks: 5};
|
||||
|
||||
loadData();
|
||||
|
||||
// load new data every 15 seconds
|
||||
setInterval('loadData()', 15000);
|
||||
}
|
||||
|
||||
</script>
|
||||
|
Reference in New Issue
Block a user