Initial implementaion of json support for charts
This commit is contained in:
parent
80a7989481
commit
b229671abf
3 changed files with 138 additions and 57 deletions
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue