From 14608d80eb569fbedac1183a19617233200ad8ec Mon Sep 17 00:00:00 2001 From: Daniel Collin Date: Tue, 9 Feb 2016 12:43:28 +0100 Subject: [PATCH] Adding week aggregation with no age limit + small big fix where charts did cast all floating data points to int. Former-commit-id: e8f027e2272271f1e54a5bb822529df7a8af6a6c --- .../deamon/SensorDataAggregatorDaemon.java | 3 + .../hal/deamon/SensorDataCleanupDaemon.java | 2 + src/se/hal/page/PCOverviewHttpPage.java | 6 +- .../hal/util/AggregateDataListSqlResult.java | 73 ++++++------------- web-resource/pc_overview.tmpl | 11 +++ 5 files changed, 44 insertions(+), 51 deletions(-) diff --git a/src/se/hal/deamon/SensorDataAggregatorDaemon.java b/src/se/hal/deamon/SensorDataAggregatorDaemon.java index a7c8646f..fd1a4340 100755 --- a/src/se/hal/deamon/SensorDataAggregatorDaemon.java +++ b/src/se/hal/deamon/SensorDataAggregatorDaemon.java @@ -57,6 +57,9 @@ public class SensorDataAggregatorDaemon implements HalDaemon { logger.fine("aggregating raw data into one day periods"); aggregateRawData(sensor, TimeUtility.DAY_IN_MS, TimeUtility.INFINITY, 60*24); + + logger.fine("aggregating raw data into one week periods"); + aggregateRawData(sensor, TimeUtility.WEEK_IN_MS, TimeUtility.INFINITY, 60*24*7); } /** diff --git a/src/se/hal/deamon/SensorDataCleanupDaemon.java b/src/se/hal/deamon/SensorDataCleanupDaemon.java index d62267d1..d113c048 100755 --- a/src/se/hal/deamon/SensorDataCleanupDaemon.java +++ b/src/se/hal/deamon/SensorDataCleanupDaemon.java @@ -43,6 +43,8 @@ public class SensorDataCleanupDaemon implements HalDaemon { if (sensor.getUser() != null) { cleanupSensorData(sensor.getId(), TimeUtility.FIVE_MINUTES_IN_MS, TimeUtility.DAY_IN_MS); //clear 5-minute data older than a day cleanupSensorData(sensor.getId(), TimeUtility.HOUR_IN_MS, TimeUtility.WEEK_IN_MS); //clear 1-hour data older than a week + //cleanupSensorData(sensor.getId(), TimeUtility.DAY_IN_MS, TimeUtility.INFINITY); //clear 1-day data older than infinity + //cleanupSensorData(sensor.getId(), TimeUtility.WEEK_IN_MS, TimeUtility.INFINITY); //clear 1-week data older than infinity } } diff --git a/src/se/hal/page/PCOverviewHttpPage.java b/src/se/hal/page/PCOverviewHttpPage.java index f093f91a..9230e432 100755 --- a/src/se/hal/page/PCOverviewHttpPage.java +++ b/src/se/hal/page/PCOverviewHttpPage.java @@ -4,14 +4,12 @@ import se.hal.HalContext; import se.hal.intf.HalHttpPage; import se.hal.util.AggregateDataListSqlResult; import se.hal.util.AggregateDataListSqlResult.*; -import se.hal.util.TimeUtility; import se.hal.struct.Sensor; import se.hal.struct.User; import zutil.db.DBConnection; import zutil.io.file.FileUtil; import zutil.parser.Templator; -import java.sql.PreparedStatement; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -38,6 +36,7 @@ public class PCOverviewHttpPage extends HalHttpPage { 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); @@ -47,6 +46,8 @@ public class PCOverviewHttpPage extends HalHttpPage { hourDataList.addAll(AggregateDataListSqlResult.getHourAggregateData(db, sensor)); dayDataList.addAll(AggregateDataListSqlResult.getDayAggregateData(db, sensor)); + + weekDataList.addAll(AggregateDataListSqlResult.getWeekAggregateData(db, sensor)); } } @@ -55,6 +56,7 @@ public class PCOverviewHttpPage extends HalHttpPage { tmpl.set("minData", minDataList); tmpl.set("hourData", hourDataList); tmpl.set("dayData", dayDataList); + tmpl.set("weekData", weekDataList); tmpl.set("username", User.getUsers(db)); return tmpl; diff --git a/src/se/hal/util/AggregateDataListSqlResult.java b/src/se/hal/util/AggregateDataListSqlResult.java index 3053fcdb..346ba86f 100755 --- a/src/se/hal/util/AggregateDataListSqlResult.java +++ b/src/se/hal/util/AggregateDataListSqlResult.java @@ -26,36 +26,29 @@ public class AggregateDataListSqlResult implements SQLResultHandler getFiveMinuteAggregateData(DBConnection db, Sensor sensor) throws SQLException { - PreparedStatement stmt = db.getPreparedStatement( - "SELECT user.username as username," - + " sensor_data_aggr.timestamp_start as timestamp_start," - + " sensor_data_aggr.timestamp_end as timestamp_end," - + " sensor_data_aggr.data as data," - + " sensor_data_aggr.confidence as confidence," - + TimeUtility.FIVE_MINUTES_IN_MS + " as period_length" - + " FROM sensor_data_aggr, user, sensor" - + " WHERE sensor.id = sensor_data_aggr.sensor_id" - + " AND sensor.id = ?" - + " AND user.id = sensor.user_id" - + " AND user.id = ?" - + " AND timestamp_end-timestamp_start == ?" - + " AND timestamp_start > ?" - + " ORDER BY timestamp_start ASC"); - stmt.setLong(1, sensor.getId()); - stmt.setLong(2, sensor.getUser().getId()); - stmt.setLong(3, TimeUtility.FIVE_MINUTES_IN_MS-1); - stmt.setLong(4, (System.currentTimeMillis() - TimeUtility.DAY_IN_MS) ); - return DBConnection.exec(stmt , new AggregateDataListSqlResult()); + return getAggregateDataForPeriod(db, sensor, TimeUtility.FIVE_MINUTES_IN_MS, TimeUtility.DAY_IN_MS); } public static List getHourAggregateData(DBConnection db, Sensor sensor) throws SQLException { - PreparedStatement stmt = db.getPreparedStatement( + return getAggregateDataForPeriod(db, sensor, TimeUtility.HOUR_IN_MS, TimeUtility.WEEK_IN_MS); + } + + public static List getDayAggregateData(DBConnection db, Sensor sensor) throws SQLException { + return getAggregateDataForPeriod(db, sensor, TimeUtility.DAY_IN_MS, TimeUtility.INFINITY); + } + + public static List getWeekAggregateData(DBConnection db, Sensor sensor) throws SQLException { + return getAggregateDataForPeriod(db, sensor, TimeUtility.WEEK_IN_MS, TimeUtility.INFINITY); + } + + private static List getAggregateDataForPeriod(DBConnection db, Sensor sensor, long periodLengthInMs, long ageLimitInMs) throws SQLException { + PreparedStatement stmt = db.getPreparedStatement( "SELECT user.username as username," + " sensor_data_aggr.timestamp_start as timestamp_start," + " sensor_data_aggr.timestamp_end as timestamp_end," + " sensor_data_aggr.data as data," + " sensor_data_aggr.confidence as confidence," - + TimeUtility.HOUR_IN_MS + " as period_length" + + periodLengthInMs + " as period_length" + " FROM sensor_data_aggr, user, sensor" + " WHERE sensor.id = sensor_data_aggr.sensor_id" + " AND sensor.id = ?" @@ -66,30 +59,9 @@ public class AggregateDataListSqlResult implements SQLResultHandler getDayAggregateData(DBConnection db, Sensor sensor) throws SQLException { - PreparedStatement stmt = db.getPreparedStatement( - "SELECT user.username as username," - + " sensor_data_aggr.timestamp_start as timestamp_start," - + " sensor_data_aggr.timestamp_end as timestamp_end," - + " sensor_data_aggr.data as data," - + " sensor_data_aggr.confidence as confidence," - + TimeUtility.DAY_IN_MS + " as period_length" - + " FROM sensor_data_aggr, user, sensor" - + " WHERE sensor.id = sensor_data_aggr.sensor_id" - + " AND sensor.id = ?" - + " AND user.id = sensor.user_id" - + " AND user.id = ?" - + " AND timestamp_end-timestamp_start == ?" - + " ORDER BY timestamp_start ASC"); - stmt.setLong(1, sensor.getId()); - stmt.setLong(2, sensor.getUser().getId()); - stmt.setLong(3, TimeUtility.DAY_IN_MS-1); - return DBConnection.exec(stmt, new AggregateDataListSqlResult()); + stmt.setLong(3, periodLengthInMs-1); + stmt.setLong(4, (System.currentTimeMillis() - ageLimitInMs) ); + return DBConnection.exec(stmt , new AggregateDataListSqlResult()); } @@ -102,17 +74,20 @@ public class AggregateDataListSqlResult implements SQLResultHandler 0.5 ? estimatedData : null); //only present data with a confidence over 50% + //add null data point to list if one or more periods of data is missing before this if(previousTimestampEnd != -1 && timestampStart-previousTimestampEnd > periodLength){ list.add(new AggregateData(previousTimestampEnd+1, "null", username)); } - //add this data point to list - list.add(new AggregateData(timestampStart, ""+ (data/1000.0), username)); + list.add(new AggregateData(timestampStart, ""+ (data/1000.0), username)); //add this data point to list //update previous end timestamp previousTimestampEnd = timestampEnd; diff --git a/web-resource/pc_overview.tmpl b/web-resource/pc_overview.tmpl index cb9cf6ff..24fe0c19 100755 --- a/web-resource/pc_overview.tmpl +++ b/web-resource/pc_overview.tmpl @@ -12,6 +12,10 @@

All History (kWh/day)

+
+

All History (kWh/week)

+
+