diff --git a/src/se/hal/HalServer.java b/src/se/hal/HalServer.java index 2fc13ded..dc988f3f 100755 --- a/src/se/hal/HalServer.java +++ b/src/se/hal/HalServer.java @@ -79,6 +79,7 @@ public class HalServer { HalHttpPage.getRootNav().addSubNav(new HalNavigation("sensors", "Sensors")); HalHttpPage.getRootNav().addSubNav(new HalNavigation("events", "Events")); pages = new HalHttpPage[]{ + new SensorOverviewHttpPage(), new PCOverviewHttpPage(), new PCHeatMapHttpPage(), new SensorConfigHttpPage(), diff --git a/src/se/hal/page/EventOverviewHttpPage.java b/src/se/hal/page/EventOverviewHttpPage.java index 7d702f65..cd156fd8 100755 --- a/src/se/hal/page/EventOverviewHttpPage.java +++ b/src/se/hal/page/EventOverviewHttpPage.java @@ -2,23 +2,16 @@ package se.hal.page; import se.hal.ControllerManager; import se.hal.HalContext; -import se.hal.intf.HalEventData; import se.hal.intf.HalHttpPage; import se.hal.struct.Event; import se.hal.struct.SwitchEventData; -import se.hal.struct.User; +import se.hal.util.HistoryDataListSqlResult; +import se.hal.util.HistoryDataListSqlResult.*; import zutil.db.DBConnection; -import zutil.db.SQLResultHandler; import zutil.io.file.FileUtil; import zutil.parser.Templator; -import zutil.ui.Configurator; -import zutil.ui.Configurator.ConfigurationParam; import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -74,25 +67,4 @@ public class EventOverviewHttpPage extends HalHttpPage { return tmpl; } } - - - - protected static class HistoryData{ - public long timestamp; - public double data; - } - - protected class HistoryDataListSqlResult implements SQLResultHandler> { - @Override - public List handleQueryResult(Statement stmt, ResultSet result) throws SQLException { - ArrayList list = new ArrayList(); - while(result.next()){ - HistoryData data = new HistoryData(); - data.timestamp = result.getLong("timestamp"); - data.data = result.getLong("data"); - list.add(data); - } - return list; - } - } } diff --git a/src/se/hal/page/SensorOverviewHttpPage.java b/src/se/hal/page/SensorOverviewHttpPage.java new file mode 100755 index 00000000..f07c6878 --- /dev/null +++ b/src/se/hal/page/SensorOverviewHttpPage.java @@ -0,0 +1,62 @@ +package se.hal.page; + +import se.hal.ControllerManager; +import se.hal.HalContext; +import se.hal.intf.HalHttpPage; +import se.hal.struct.Event; +import se.hal.struct.Sensor; +import se.hal.struct.SwitchEventData; +import zutil.db.DBConnection; +import se.hal.util.HistoryDataListSqlResult; +import se.hal.util.HistoryDataListSqlResult.*; +import zutil.io.file.FileUtil; +import zutil.parser.Templator; + +import java.sql.PreparedStatement; +import java.util.List; +import java.util.Map; + +public class SensorOverviewHttpPage extends HalHttpPage { + private static final int HISTORY_LIMIT = 1000; + private static final String OVERVIEW_TEMPLATE = "web-resource/sensor_overview.tmpl"; + private static final String DETAIL_TEMPLATE = "web-resource/sensor_detail.tmpl"; + + + public SensorOverviewHttpPage(){ + super("Overview", "sensor_overview"); + super.getRootNav().getSubNav("sensors").addSubNav(super.getNav()); + } + + @Override + public Templator httpRespond( + Map session, + Map cookie, + Map request) + throws Exception{ + + DBConnection db = HalContext.getDB(); + int id = (request.containsKey("id") ? Integer.parseInt(request.get("id")) : -1); + + // Save new input + if(id >= 0){ + Sensor sensor = Sensor.getSensor(db, id); + + // get history data + PreparedStatement stmt = db.getPreparedStatement("SELECT * FROM sensor_data_raw WHERE sensor_id == ? LIMIT ?"); + stmt.setLong(1, sensor.getId()); + stmt.setLong(2, HISTORY_LIMIT); + List history = DBConnection.exec(stmt, new HistoryDataListSqlResult()); + + Templator tmpl = new Templator(FileUtil.find(DETAIL_TEMPLATE)); + tmpl.set("sensor", sensor); + tmpl.set("history", history); + return tmpl; + } + else { + Templator tmpl = new Templator(FileUtil.find(OVERVIEW_TEMPLATE)); + tmpl.set("sensors", Sensor.getLocalSensors(db)); + return tmpl; + } + } + +} diff --git a/src/se/hal/util/HistoryDataListSqlResult.java b/src/se/hal/util/HistoryDataListSqlResult.java new file mode 100755 index 00000000..03a7b1e7 --- /dev/null +++ b/src/se/hal/util/HistoryDataListSqlResult.java @@ -0,0 +1,28 @@ +package se.hal.util; + +import zutil.db.SQLResultHandler; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.ArrayList; +import java.util.List; + +public class HistoryDataListSqlResult implements SQLResultHandler> { + public static class HistoryData{ + public long timestamp; + public double data; + } + + @Override + public List handleQueryResult(Statement stmt, ResultSet result) throws SQLException { + ArrayList list = new ArrayList(); + while(result.next()){ + HistoryData data = new HistoryData(); + data.timestamp = result.getLong("timestamp"); + data.data = result.getLong("data"); + list.add(data); + } + return list; + } + } \ No newline at end of file diff --git a/web-resource/event_detail.tmpl b/web-resource/event_detail.tmpl index 4ace90ae..2e0096e4 100755 --- a/web-resource/event_detail.tmpl +++ b/web-resource/event_detail.tmpl @@ -15,6 +15,10 @@ Type: {{event.getDeviceData().getClass().getSimpleName()}} + + Owner: + {{event.getUser().getUsername()}} + diff --git a/web-resource/sensor_detail.tmpl b/web-resource/sensor_detail.tmpl new file mode 100755 index 00000000..78ebb6e2 --- /dev/null +++ b/web-resource/sensor_detail.tmpl @@ -0,0 +1,50 @@ +

Details for {{sensor.getName()}}

+ +
+
+
Configuration
+
+ + + + + + + + + + + + + + + + + + + +
Name:{{sensor.getName()}}
Type:{{sensor.getDeviceData().getClass().getSimpleName()}}
Public:{{sensor.isSynced()}}
Owner:{{sensor.getUser().getUsername()}}
+
+
+
+ +
+
+
History data
+
+ + + + + + + {{#history}} + + + + + {{/history}} +
TimestampData
{{.timestamp}}{{.data}}
+
+
+
diff --git a/web-resource/sensor_overview.tmpl b/web-resource/sensor_overview.tmpl new file mode 100755 index 00000000..a080036b --- /dev/null +++ b/web-resource/sensor_overview.tmpl @@ -0,0 +1,34 @@ +

Sensor Overview

+ +
+
+
Local Sensors
+
+ + + + + + + + + {{#sensors}} + + + + + + + {{/sensors}} +
NameTypeDataLast Update
{{.getName()}}{{.getDeviceData().getClass().getSimpleName()}}{{.getDeviceData().getData()}}1 min ago
+
+
+
+ + \ No newline at end of file