Initial implementaion of json support for charts

This commit is contained in:
Ziver Koc 2016-06-01 16:27:28 +02:00
parent 80a7989481
commit b229671abf
3 changed files with 138 additions and 57 deletions

View file

@ -21,34 +21,34 @@
$(function(){ $(function(){
chartData("min-power-chart", chartData("min-power-chart",
[ [
{ y: (Date.now()-24*60*60*1000) }, { time: (Date.now()-24*60*60*1000) },
{{#minData}} {{#minData}}
{ y: {{.timestamp}}, "{{.id}}": {{.data}} }, { time: {{.timestamp}}, "{{.id}}": {{.data}} },
{{/minData}} {{/minData}}
{ y: Date.now() } { time: Date.now() }
] ]
); );
chartData("hour-power-chart", chartData("hour-power-chart",
[ [
{ y: (Date.now()-7*24*60*60*1000) }, { time: (Date.now()-7*24*60*60*1000) },
{{#hourData}} {{#hourData}}
{ y: {{.timestamp}}, "{{.id}}": {{.data}} }, { time: {{.timestamp}}, "{{.id}}": {{.data}} },
{{/hourData}} {{/hourData}}
{ y: Date.now() } { time: Date.now() }
] ]
); );
chartData("day-power-chart", chartData("day-power-chart",
[{{#dayData}} [{{#dayData}}
{ y: {{.timestamp}}, "{{.id}}": {{.data}} }, { time: {{.timestamp}}, "{{.id}}": {{.data}} },
{{/dayData}} {{/dayData}}
{ y: Date.now() } { time: Date.now() }
] ]
); );
chartData("week-power-chart", chartData("week-power-chart",
[{{#weekData}} [{{#weekData}}
{ y: {{.timestamp}}, "{{.id}}": {{.data}} }, { time: {{.timestamp}}, "{{.id}}": {{.data}} },
{{/weekData}} {{/weekData}}
{ y: Date.now() } { time: Date.now() }
] ]
); );
}); });
@ -57,7 +57,7 @@
Morris.Line({ Morris.Line({
element: elementId, element: elementId,
data: data, data: data,
xkey: 'y', xkey: 'time',
ykeys: [ {{#sensors}} "{{.getId()}}", {{/sensors}} ], ykeys: [ {{#sensors}} "{{.getId()}}", {{/sensors}} ],
labels: [ {{#sensors}} "{{.getUser().getUsername()}}: {{.getName()}}", {{/sensors}} ], labels: [ {{#sensors}} "{{.getUser().getUsername()}}: {{.getName()}}", {{/sensors}} ],
continuousLine: false, continuousLine: false,

View file

@ -9,7 +9,9 @@ import zutil.io.file.FileUtil;
import zutil.net.http.HttpHeader; import zutil.net.http.HttpHeader;
import zutil.net.http.HttpPage; import zutil.net.http.HttpPage;
import zutil.net.http.HttpPrintStream; import zutil.net.http.HttpPrintStream;
import zutil.parser.DataNode;
import zutil.parser.Templator; import zutil.parser.Templator;
import zutil.parser.json.JSONWriter;
import java.io.IOException; import java.io.IOException;
import java.util.Map; import java.util.Map;
@ -46,17 +48,26 @@ public abstract class HalHttpPage implements HttpPage{
Map<String, String> request) throws IOException { Map<String, String> request) throws IOException {
try { try {
DBConnection db = HalContext.getDB(); if(this instanceof HalJsonPage &&
(("application/json").equals(client_info.getHeader("ContentType")) ||
Templator tmpl = new Templator(FileUtil.find(TEMPLATE)); request.containsKey("json"))){
tmpl.set("user", User.getLocalUser(db)); out.setHeader("Content-Type", "application/json");
tmpl.set("nav", nav.getNavBreadcrumb().get(1)); JSONWriter writer = new JSONWriter(out);
tmpl.set("rootNav", rootNav); writer.write(((HalJsonPage)this).jsonResponse(session,cookie, request));
tmpl.set("userNav", userNav); writer.close();
tmpl.set("alerts", HalAlertManager.getInstance().generateAlerts()); }
tmpl.set("content", httpRespond(session, cookie, request)); else{
out.print(tmpl.compile()); DBConnection db = HalContext.getDB();
Templator tmpl = new Templator(FileUtil.find(TEMPLATE));
tmpl.set("user", User.getLocalUser(db));
tmpl.set("nav", nav.getNavBreadcrumb().get(1));
tmpl.set("rootNav", rootNav);
tmpl.set("userNav", userNav);
tmpl.set("alerts", HalAlertManager.getInstance().generateAlerts());
tmpl.set("content", httpRespond(session, cookie, request));
out.print(tmpl.compile());
}
} catch (Exception e) { } catch (Exception e) {
throw new IOException(e); throw new IOException(e);
} }
@ -76,4 +87,13 @@ public abstract class HalHttpPage implements HttpPage{
Map<String, String> cookie, Map<String, String> cookie,
Map<String, String> request) Map<String, String> request)
throws Exception; throws Exception;
}
public interface HalJsonPage{
DataNode jsonResponse(
Map<String, Object> session,
Map<String, String> cookie,
Map<String, String> request)
throws Exception;
}
}

View file

@ -3,6 +3,7 @@ package se.hal.page;
import se.hal.HalContext; import se.hal.HalContext;
import se.hal.deamon.SensorDataAggregatorDaemon.AggregationPeriodLength; import se.hal.deamon.SensorDataAggregatorDaemon.AggregationPeriodLength;
import se.hal.intf.HalHttpPage; import se.hal.intf.HalHttpPage;
import se.hal.struct.PowerConsumptionSensorData;
import se.hal.struct.Sensor; import se.hal.struct.Sensor;
import se.hal.struct.User; import se.hal.struct.User;
import se.hal.util.AggregateDataListSqlResult; import se.hal.util.AggregateDataListSqlResult;
@ -10,60 +11,120 @@ import se.hal.util.AggregateDataListSqlResult.AggregateData;
import se.hal.util.UTCTimeUtility; import se.hal.util.UTCTimeUtility;
import zutil.db.DBConnection; import zutil.db.DBConnection;
import zutil.io.file.FileUtil; import zutil.io.file.FileUtil;
import zutil.parser.DataNode;
import zutil.parser.Templator; import zutil.parser.Templator;
import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
public class PCOverviewHttpPage extends HalHttpPage { public class PCOverviewHttpPage extends HalHttpPage implements HalHttpPage.HalJsonPage {
private static final String TEMPLATE = "resource/web/pc_overview.tmpl"; private static final String TEMPLATE = "resource/web/pc_overview.tmpl";
public PCOverviewHttpPage() { public PCOverviewHttpPage() {
super("Power;Challenge", "pc_overview"); super("Power;Challenge", "pc_overview");
super.getRootNav().getSubNav("sensors").addSubNav(super.getNav()); super.getRootNav().getSubNav("sensors").addSubNav(super.getNav());
} }
@Override @Override
public Templator httpRespond( public Templator httpRespond(
Map<String, Object> session, Map<String, Object> session,
Map<String, String> cookie, Map<String, String> cookie,
Map<String, String> request) Map<String, String> request)
throws Exception{ throws Exception {
DBConnection db = HalContext.getDB(); DBConnection db = HalContext.getDB();
List<User> users = User.getUsers(db); List<User> users = User.getUsers(db);
ArrayList<Sensor> sensors = new ArrayList<>(); ArrayList<AggregateData> minDataList = new ArrayList<>();
ArrayList<AggregateData> minDataList = new ArrayList<>(); ArrayList<AggregateData> hourDataList = new ArrayList<>();
ArrayList<AggregateData> hourDataList = new ArrayList<>(); ArrayList<AggregateData> dayDataList = new ArrayList<>();
ArrayList<AggregateData> dayDataList = new ArrayList<>(); ArrayList<AggregateData> weekDataList = new ArrayList<>();
ArrayList<AggregateData> weekDataList = new ArrayList<>();
for(User user : users){ List<Sensor> sensors = getSensorList(db);
List<Sensor> userSensors = Sensor.getSensors(db, user); for (Sensor sensor : sensors) {
for(Sensor sensor : userSensors){ minDataList.addAll(AggregateDataListSqlResult.getAggregateDataForPeriod(db, sensor, AggregationPeriodLength.FIVE_MINUTES, UTCTimeUtility.DAY_IN_MS));
sensors.add(sensor);
minDataList.addAll(AggregateDataListSqlResult.getAggregateDataForPeriod(db, sensor, AggregationPeriodLength.FIVE_MINUTES, UTCTimeUtility.DAY_IN_MS));
hourDataList.addAll(AggregateDataListSqlResult.getAggregateDataForPeriod(db, sensor, AggregationPeriodLength.HOUR, UTCTimeUtility.WEEK_IN_MS)); hourDataList.addAll(AggregateDataListSqlResult.getAggregateDataForPeriod(db, sensor, AggregationPeriodLength.HOUR, UTCTimeUtility.WEEK_IN_MS));
dayDataList.addAll(AggregateDataListSqlResult.getAggregateDataForPeriod(db, sensor, AggregationPeriodLength.DAY, UTCTimeUtility.INFINITY)); dayDataList.addAll(AggregateDataListSqlResult.getAggregateDataForPeriod(db, sensor, AggregationPeriodLength.DAY, UTCTimeUtility.INFINITY));
weekDataList.addAll(AggregateDataListSqlResult.getAggregateDataForPeriod(db, sensor, AggregationPeriodLength.WEEK, UTCTimeUtility.INFINITY)); weekDataList.addAll(AggregateDataListSqlResult.getAggregateDataForPeriod(db, sensor, AggregationPeriodLength.WEEK, UTCTimeUtility.INFINITY));
} }
}
Templator tmpl = new Templator(FileUtil.find(TEMPLATE)); Templator tmpl = new Templator(FileUtil.find(TEMPLATE));
tmpl.set("users", User.getUsers(db)); tmpl.set("users", User.getUsers(db));
tmpl.set("sensors", sensors); tmpl.set("sensors", sensors);
tmpl.set("minData", minDataList); tmpl.set("minData", minDataList);
tmpl.set("hourData", hourDataList); tmpl.set("hourData", hourDataList);
tmpl.set("dayData", dayDataList); tmpl.set("dayData", dayDataList);
tmpl.set("weekData", weekDataList); tmpl.set("weekData", weekDataList);
return tmpl; return tmpl;
} }
@Override
public DataNode jsonResponse(
Map<String, Object> session,
Map<String, String> cookie,
Map<String, String> request) throws Exception {
DataNode root = new DataNode(DataNode.DataType.Map);
DBConnection db = HalContext.getDB();
List<Sensor> sensors = getSensorList(db);
if (request.get("data").contains("minute")) {
DataNode node = new DataNode(DataNode.DataType.List);
for (Sensor sensor : sensors)
addAggregateDataToDataNode(node,
AggregateDataListSqlResult.getAggregateDataForPeriod(db, sensor, AggregationPeriodLength.FIVE_MINUTES, UTCTimeUtility.DAY_IN_MS));
root.set("minuteData", node);
}
if (request.get("data").contains("hour")) {
DataNode node = new DataNode(DataNode.DataType.List);
for (Sensor sensor : sensors)
addAggregateDataToDataNode(node,
AggregateDataListSqlResult.getAggregateDataForPeriod(db, sensor, AggregationPeriodLength.HOUR, UTCTimeUtility.WEEK_IN_MS));
root.set("minuteData", node);
}
if (request.get("data").contains("day")) {
DataNode node = new DataNode(DataNode.DataType.List);
for (Sensor sensor : sensors)
addAggregateDataToDataNode(node,
AggregateDataListSqlResult.getAggregateDataForPeriod(db, sensor, AggregationPeriodLength.DAY, UTCTimeUtility.INFINITY));
root.set("minuteData", node);
}
if (request.get("data").contains("week")) {
DataNode node = new DataNode(DataNode.DataType.List);
for (Sensor sensor : sensors)
addAggregateDataToDataNode(node,
AggregateDataListSqlResult.getAggregateDataForPeriod(db, sensor, AggregationPeriodLength.WEEK, UTCTimeUtility.INFINITY));
root.set("minuteData", node);
}
return root;
}
private void addAggregateDataToDataNode(DataNode root, List<AggregateData> dataList) {
for (AggregateDataListSqlResult.AggregateData data : dataList) {
DataNode dataNode = new DataNode(DataNode.DataType.Map);
dataNode.set("time", data.timestamp);
dataNode.set("" + data.id, data.data);
root.add(dataNode);
}
}
/**
* @return a List of all PowerConsumption sensors
*/
private List<Sensor> getSensorList(DBConnection db) throws SQLException {
List<Sensor> sensors = new ArrayList<>();
for (Sensor sensor : Sensor.getSensors(db)) {
if (sensor instanceof PowerConsumptionSensorData)
sensors.add(sensor);
}
return sensors;
}
} }