diff --git a/resource/web/pc_overview.tmpl b/resource/web/pc_overview.tmpl index 0a8bd563..cce2aad2 100755 --- a/resource/web/pc_overview.tmpl +++ b/resource/web/pc_overview.tmpl @@ -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, diff --git a/src/se/hal/intf/HalHttpPage.java b/src/se/hal/intf/HalHttpPage.java index eab14b90..370fc333 100755 --- a/src/se/hal/intf/HalHttpPage.java +++ b/src/se/hal/intf/HalHttpPage.java @@ -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,17 +48,26 @@ public abstract class HalHttpPage implements HttpPage{ Map request) throws IOException { try { - 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()); + 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)); + 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) { throw new IOException(e); } @@ -76,4 +87,13 @@ public abstract class HalHttpPage implements HttpPage{ Map cookie, Map request) throws Exception; -} + + + public interface HalJsonPage{ + DataNode jsonResponse( + Map session, + Map cookie, + Map request) + throws Exception; + } +} \ No newline at end of file diff --git a/src/se/hal/page/PCOverviewHttpPage.java b/src/se/hal/page/PCOverviewHttpPage.java index 3a6e1f1b..8019d9b3 100755 --- a/src/se/hal/page/PCOverviewHttpPage.java +++ b/src/se/hal/page/PCOverviewHttpPage.java @@ -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,60 +11,120 @@ 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 { - private static final String TEMPLATE = "resource/web/pc_overview.tmpl"; +public class PCOverviewHttpPage extends HalHttpPage implements HalHttpPage.HalJsonPage { + private static final String TEMPLATE = "resource/web/pc_overview.tmpl"; - public PCOverviewHttpPage() { - super("Power;Challenge", "pc_overview"); + public PCOverviewHttpPage() { + super("Power;Challenge", "pc_overview"); super.getRootNav().getSubNav("sensors").addSubNav(super.getNav()); - } + } - @Override - public Templator httpRespond( - Map session, - Map cookie, - Map request) - throws Exception{ + @Override + public Templator httpRespond( + Map session, + Map cookie, + Map request) + throws Exception { - DBConnection db = HalContext.getDB(); + DBConnection db = HalContext.getDB(); - List users = User.getUsers(db); - ArrayList sensors = new ArrayList<>(); - ArrayList minDataList = new ArrayList<>(); - ArrayList hourDataList = new ArrayList<>(); - ArrayList dayDataList = new ArrayList<>(); - ArrayList weekDataList = new ArrayList<>(); + List users = User.getUsers(db); + ArrayList minDataList = new ArrayList<>(); + ArrayList hourDataList = new ArrayList<>(); + ArrayList dayDataList = new ArrayList<>(); + ArrayList weekDataList = new ArrayList<>(); - for(User user : users){ - List userSensors = Sensor.getSensors(db, user); - for(Sensor sensor : userSensors){ - sensors.add(sensor); - minDataList.addAll(AggregateDataListSqlResult.getAggregateDataForPeriod(db, sensor, AggregationPeriodLength.FIVE_MINUTES, UTCTimeUtility.DAY_IN_MS)); + List 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)); + 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("sensors", sensors); - tmpl.set("minData", minDataList); - tmpl.set("hourData", hourDataList); - tmpl.set("dayData", dayDataList); - tmpl.set("weekData", weekDataList); + tmpl.set("minData", minDataList); + tmpl.set("hourData", hourDataList); + tmpl.set("dayData", dayDataList); + tmpl.set("weekData", weekDataList); - return tmpl; - } + return tmpl; + } + @Override + public DataNode jsonResponse( + Map session, + Map cookie, + Map request) throws Exception { + DataNode root = new DataNode(DataNode.DataType.Map); + + DBConnection db = HalContext.getDB(); + List 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 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 getSensorList(DBConnection db) throws SQLException { + List sensors = new ArrayList<>(); + for (Sensor sensor : Sensor.getSensors(db)) { + if (sensor instanceof PowerConsumptionSensorData) + sensors.add(sensor); + } + return sensors; + } }