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(){
|
||||
chartData("min-power-chart",
|
||||
[
|
||||
{ y: (Date.now()-24*60*60*1000) },
|
||||
{ time: (Date.now()-24*60*60*1000) },
|
||||
{{#minData}}
|
||||
{ y: {{.timestamp}}, "{{.id}}": {{.data}} },
|
||||
{ time: {{.timestamp}}, "{{.id}}": {{.data}} },
|
||||
{{/minData}}
|
||||
{ y: Date.now() }
|
||||
{ time: Date.now() }
|
||||
]
|
||||
);
|
||||
chartData("hour-power-chart",
|
||||
[
|
||||
{ y: (Date.now()-7*24*60*60*1000) },
|
||||
{ time: (Date.now()-7*24*60*60*1000) },
|
||||
{{#hourData}}
|
||||
{ y: {{.timestamp}}, "{{.id}}": {{.data}} },
|
||||
{ time: {{.timestamp}}, "{{.id}}": {{.data}} },
|
||||
{{/hourData}}
|
||||
{ y: Date.now() }
|
||||
{ time: Date.now() }
|
||||
]
|
||||
);
|
||||
chartData("day-power-chart",
|
||||
[{{#dayData}}
|
||||
{ y: {{.timestamp}}, "{{.id}}": {{.data}} },
|
||||
{ time: {{.timestamp}}, "{{.id}}": {{.data}} },
|
||||
{{/dayData}}
|
||||
{ y: Date.now() }
|
||||
{ time: Date.now() }
|
||||
]
|
||||
);
|
||||
chartData("week-power-chart",
|
||||
[{{#weekData}}
|
||||
{ y: {{.timestamp}}, "{{.id}}": {{.data}} },
|
||||
{ time: {{.timestamp}}, "{{.id}}": {{.data}} },
|
||||
{{/weekData}}
|
||||
{ y: Date.now() }
|
||||
{ time: Date.now() }
|
||||
]
|
||||
);
|
||||
});
|
||||
|
|
@ -57,7 +57,7 @@
|
|||
Morris.Line({
|
||||
element: elementId,
|
||||
data: data,
|
||||
xkey: 'y',
|
||||
xkey: 'time',
|
||||
ykeys: [ {{#sensors}} "{{.getId()}}", {{/sensors}} ],
|
||||
labels: [ {{#sensors}} "{{.getUser().getUsername()}}: {{.getName()}}", {{/sensors}} ],
|
||||
continuousLine: false,
|
||||
|
|
|
|||
|
|
@ -9,7 +9,9 @@ import zutil.io.file.FileUtil;
|
|||
import zutil.net.http.HttpHeader;
|
||||
import zutil.net.http.HttpPage;
|
||||
import zutil.net.http.HttpPrintStream;
|
||||
import zutil.parser.DataNode;
|
||||
import zutil.parser.Templator;
|
||||
import zutil.parser.json.JSONWriter;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Map;
|
||||
|
|
@ -46,6 +48,15 @@ public abstract class HalHttpPage implements HttpPage{
|
|||
Map<String, String> request) throws IOException {
|
||||
|
||||
try {
|
||||
if(this instanceof HalJsonPage &&
|
||||
(("application/json").equals(client_info.getHeader("ContentType")) ||
|
||||
request.containsKey("json"))){
|
||||
out.setHeader("Content-Type", "application/json");
|
||||
JSONWriter writer = new JSONWriter(out);
|
||||
writer.write(((HalJsonPage)this).jsonResponse(session,cookie, request));
|
||||
writer.close();
|
||||
}
|
||||
else{
|
||||
DBConnection db = HalContext.getDB();
|
||||
|
||||
Templator tmpl = new Templator(FileUtil.find(TEMPLATE));
|
||||
|
|
@ -56,7 +67,7 @@ public abstract class HalHttpPage implements HttpPage{
|
|||
tmpl.set("alerts", HalAlertManager.getInstance().generateAlerts());
|
||||
tmpl.set("content", httpRespond(session, cookie, request));
|
||||
out.print(tmpl.compile());
|
||||
|
||||
}
|
||||
} catch (Exception e) {
|
||||
throw new IOException(e);
|
||||
}
|
||||
|
|
@ -76,4 +87,13 @@ public abstract class HalHttpPage implements HttpPage{
|
|||
Map<String, String> cookie,
|
||||
Map<String, String> request)
|
||||
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.deamon.SensorDataAggregatorDaemon.AggregationPeriodLength;
|
||||
import se.hal.intf.HalHttpPage;
|
||||
import se.hal.struct.PowerConsumptionSensorData;
|
||||
import se.hal.struct.Sensor;
|
||||
import se.hal.struct.User;
|
||||
import se.hal.util.AggregateDataListSqlResult;
|
||||
|
|
@ -10,13 +11,15 @@ import se.hal.util.AggregateDataListSqlResult.AggregateData;
|
|||
import se.hal.util.UTCTimeUtility;
|
||||
import zutil.db.DBConnection;
|
||||
import zutil.io.file.FileUtil;
|
||||
import zutil.parser.DataNode;
|
||||
import zutil.parser.Templator;
|
||||
|
||||
import java.sql.SQLException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
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";
|
||||
|
||||
public PCOverviewHttpPage() {
|
||||
|
|
@ -34,16 +37,13 @@ public class PCOverviewHttpPage extends HalHttpPage {
|
|||
DBConnection db = HalContext.getDB();
|
||||
|
||||
List<User> users = User.getUsers(db);
|
||||
ArrayList<Sensor> sensors = new ArrayList<>();
|
||||
ArrayList<AggregateData> minDataList = new ArrayList<>();
|
||||
ArrayList<AggregateData> hourDataList = new ArrayList<>();
|
||||
ArrayList<AggregateData> dayDataList = new ArrayList<>();
|
||||
ArrayList<AggregateData> weekDataList = new ArrayList<>();
|
||||
|
||||
for(User user : users){
|
||||
List<Sensor> userSensors = Sensor.getSensors(db, user);
|
||||
for(Sensor sensor : userSensors){
|
||||
sensors.add(sensor);
|
||||
List<Sensor> sensors = getSensorList(db);
|
||||
for (Sensor sensor : sensors) {
|
||||
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));
|
||||
|
|
@ -52,7 +52,6 @@ public class PCOverviewHttpPage extends HalHttpPage {
|
|||
|
||||
weekDataList.addAll(AggregateDataListSqlResult.getAggregateDataForPeriod(db, sensor, AggregationPeriodLength.WEEK, UTCTimeUtility.INFINITY));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Templator tmpl = new Templator(FileUtil.find(TEMPLATE));
|
||||
|
|
@ -66,4 +65,66 @@ public class PCOverviewHttpPage extends HalHttpPage {
|
|||
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