diff --git a/hal.db b/hal.db index 6d03a93c..357481c9 100755 Binary files a/hal.db and b/hal.db differ diff --git a/src/se/koc/hal/PowerChallenge.java b/src/se/koc/hal/PowerChallenge.java index 5ccfd139..74afb573 100755 --- a/src/se/koc/hal/PowerChallenge.java +++ b/src/se/koc/hal/PowerChallenge.java @@ -2,6 +2,7 @@ package se.koc.hal; import se.koc.hal.deamon.DataAggregatorDaemon; +import se.koc.hal.deamon.DataSynchronizationDaemon; import se.koc.hal.deamon.HalDaemon; import se.koc.hal.page.PCConfigureHttpPage; import se.koc.hal.page.PCHeatMapHttpPage; @@ -20,21 +21,20 @@ import java.util.logging.Level; * Created by Ziver on 2015-12-03. */ public class PowerChallenge { - - public static DBConnection db; + private static HalDaemon[] daemons = new HalDaemon[]{ - new DataAggregatorDaemon() + new DataAggregatorDaemon(), + new DataSynchronizationDaemon() }; public static void main(String[] args) throws Exception { + HalContext.initialize(); + // init logging LogUtil.setGlobalLevel(Level.ALL); LogUtil.setGlobalFormatter(new CompactLogFormatter()); - - // init Database - db = new DBConnection(DBConnection.DBMS.SQLite, "hal.db"); // init daemons Timer daemonTimer = new Timer(); diff --git a/src/se/koc/hal/deamon/DataAggregatorDaemon.java b/src/se/koc/hal/deamon/DataAggregatorDaemon.java index 483a4400..02c38255 100755 --- a/src/se/koc/hal/deamon/DataAggregatorDaemon.java +++ b/src/se/koc/hal/deamon/DataAggregatorDaemon.java @@ -11,7 +11,7 @@ import java.util.Timer; import java.util.TimerTask; import java.util.logging.Logger; -import se.koc.hal.PowerChallenge; +import se.koc.hal.HalContext; import zutil.db.DBConnection; import zutil.db.SQLResultHandler; import zutil.db.handler.SimpleSQLHandler; @@ -31,14 +31,13 @@ public class DataAggregatorDaemon extends TimerTask implements HalDaemon { public void initiate(Timer timer){ - timer.schedule(this, FIVE_MINUTES_IN_MS); - run(); + timer.schedule(this, 0, FIVE_MINUTES_IN_MS); } @Override public void run(){ try { - List sensorIdList = PowerChallenge.db.exec("SELECT id FROM sensor", new SQLResultHandler>(){ + List sensorIdList = HalContext.db.exec("SELECT id FROM sensor", new SQLResultHandler>(){ @Override public List handleQueryResult(Statement stmt, ResultSet result) throws SQLException { ArrayList list = new ArrayList<>(); @@ -58,7 +57,7 @@ public class DataAggregatorDaemon extends TimerTask implements HalDaemon { } public void aggregateSensor(int sensorId) { - DBConnection db = PowerChallenge.db; + DBConnection db = HalContext.db; try { Long maxDBTimestamp = db.exec("SELECT MAX(timestamp_end) FROM sensor_data_aggr WHERE sensor_id == "+sensorId, new SimpleSQLHandler()); if(maxDBTimestamp == null) @@ -122,7 +121,7 @@ public class DataAggregatorDaemon extends TimerTask implements HalDaemon { } public static Integer getNextSequenceId(long sensorId) throws SQLException{ - Integer id = PowerChallenge.db.exec("SELECT MAX(sequence_id) FROM sensor_data_aggr WHERE sensor_id == "+ sensorId, new SimpleSQLHandler()); + Integer id = HalContext.db.exec("SELECT MAX(sequence_id) FROM sensor_data_aggr WHERE sensor_id == "+ sensorId, new SimpleSQLHandler()); return (id != null ? id+1 : 1); } @@ -138,7 +137,7 @@ public class DataAggregatorDaemon extends TimerTask implements HalDaemon { if(currentPeriodTimestamp != 0 && periodTimestamp != currentPeriodTimestamp){ float confidence = Math.min(count / 5f, 1.0f); logger.finer("Calculated minute period: "+ currentPeriodTimestamp +" sum: "+ sum +" confidence: "+ confidence); - PowerChallenge.db.exec(String.format(Locale.US, "INSERT INTO sensor_data_aggr(sensor_id, sequence_id, timestamp_start, timestamp_end, data, confidence) VALUES(%d, %d, %d, %d, %d, %f)", + HalContext.db.exec(String.format(Locale.US, "INSERT INTO sensor_data_aggr(sensor_id, sequence_id, timestamp_start, timestamp_end, data, confidence) VALUES(%d, %d, %d, %d, %d, %f)", result.getInt("sensor_id"), getNextSequenceId(result.getInt("sensor_id")), currentPeriodTimestamp, @@ -170,7 +169,7 @@ public class DataAggregatorDaemon extends TimerTask implements HalDaemon { if(currentPeriodTimestamp != 0 && periodTimestamp != currentPeriodTimestamp){ float aggrConfidence = confidenceSum / 12f; logger.finer("Calculated hour period: "+ currentPeriodTimestamp +" sum: "+ sum +" confidence: "+ aggrConfidence); - PowerChallenge.db.exec(String.format(Locale.US, "INSERT INTO sensor_data_aggr(sensor_id, sequence_id, timestamp_start, timestamp_end, data, confidence) VALUES(%d, %d, %d, %d, %d, %f)", + HalContext.db.exec(String.format(Locale.US, "INSERT INTO sensor_data_aggr(sensor_id, sequence_id, timestamp_start, timestamp_end, data, confidence) VALUES(%d, %d, %d, %d, %d, %f)", result.getInt("sensor_id"), getNextSequenceId(result.getInt("sensor_id")), currentPeriodTimestamp, @@ -187,7 +186,7 @@ public class DataAggregatorDaemon extends TimerTask implements HalDaemon { confidenceSum += result.getFloat("confidence"); //TODO: SHould not be here! - PowerChallenge.db.exec("DELETE FROM sensor_data_aggr " + HalContext.db.exec("DELETE FROM sensor_data_aggr " + "WHERE sensor_id == "+ result.getInt("sensor_id") +" AND sequence_id == "+ result.getInt("sequence_id")); } return null; @@ -207,7 +206,7 @@ public class DataAggregatorDaemon extends TimerTask implements HalDaemon { if(currentPeriodTimestamp != 0 && periodTimestamp != currentPeriodTimestamp){ float aggrConfidence = confidenceSum / 24f; logger.finer("Calculated day period: "+ currentPeriodTimestamp +" sum: "+ sum +" confidence: "+ aggrConfidence+ " samples: " + samples); - PowerChallenge.db.exec(String.format(Locale.US, "INSERT INTO sensor_data_aggr(sensor_id, sequence_id, timestamp_start, timestamp_end, data, confidence) VALUES(%d, %d, %d, %d, %d, %f)", + HalContext.db.exec(String.format(Locale.US, "INSERT INTO sensor_data_aggr(sensor_id, sequence_id, timestamp_start, timestamp_end, data, confidence) VALUES(%d, %d, %d, %d, %d, %f)", result.getInt("sensor_id"), getNextSequenceId(result.getInt("sensor_id")), currentPeriodTimestamp, @@ -226,7 +225,7 @@ public class DataAggregatorDaemon extends TimerTask implements HalDaemon { samples++; //TODO: SHould not be here! - PowerChallenge.db.exec("DELETE FROM sensor_data_aggr " + HalContext.db.exec("DELETE FROM sensor_data_aggr " + "WHERE sensor_id == "+ result.getInt("sensor_id") +" AND sequence_id == "+ result.getInt("sequence_id")); } return null; diff --git a/src/se/koc/hal/page/PCConfigureHttpPage.java b/src/se/koc/hal/page/PCConfigureHttpPage.java index f5ae2e5c..95cc150a 100644 --- a/src/se/koc/hal/page/PCConfigureHttpPage.java +++ b/src/se/koc/hal/page/PCConfigureHttpPage.java @@ -4,7 +4,7 @@ import java.io.IOException; import java.sql.SQLException; import java.util.Map; -import se.koc.hal.PowerChallenge; +import se.koc.hal.HalContext; import se.koc.hal.struct.Sensor; import se.koc.hal.struct.User; import zutil.db.DBConnection; @@ -22,7 +22,7 @@ public class PCConfigureHttpPage implements HttpPage { Map request) throws IOException { try { - DBConnection db = PowerChallenge.db; + DBConnection db = HalContext.db; Templator tmpl = new Templator(FileUtil.find("web-resource/configure.html")); tmpl.set("user", User.getLocalUser(db)); diff --git a/src/se/koc/hal/page/PCOverviewHttpPage.java b/src/se/koc/hal/page/PCOverviewHttpPage.java index 5ee536e2..7b231c78 100644 --- a/src/se/koc/hal/page/PCOverviewHttpPage.java +++ b/src/se/koc/hal/page/PCOverviewHttpPage.java @@ -7,7 +7,7 @@ import java.sql.Statement; import java.util.ArrayList; import java.util.Map; -import se.koc.hal.PowerChallenge; +import se.koc.hal.HalContext; import se.koc.hal.deamon.DataAggregatorDaemon; import zutil.db.SQLResultHandler; import zutil.io.file.FileUtil; @@ -22,21 +22,21 @@ public class PCOverviewHttpPage implements HttpPage { public void respond(HttpPrintStream out, HttpHeaderParser client_info, Map session, Map cookie, Map request) throws IOException { try { - ArrayList minDataList = PowerChallenge.db.exec( + ArrayList minDataList = HalContext.db.exec( "SELECT user.username as username, sensor_data_aggr.timestamp_start as timestamp, sensor_data_aggr.data as data " + "FROM sensor_data_aggr, user, sensor " + "WHERE sensor.id = sensor_data_aggr.sensor_id " + "AND user.id = sensor.user_id " + "AND timestamp_end-timestamp_start == " + (DataAggregatorDaemon.FIVE_MINUTES_IN_MS-1), new SQLPowerDataBuilder()); - ArrayList hourDataList = PowerChallenge.db.exec( + ArrayList hourDataList = HalContext.db.exec( "SELECT user.username as username, sensor_data_aggr.timestamp_start as timestamp, sensor_data_aggr.data as data " + "FROM sensor_data_aggr, user, sensor " + "WHERE sensor.id = sensor_data_aggr.sensor_id " + "AND user.id = sensor.user_id " + "AND timestamp_end-timestamp_start == " + (DataAggregatorDaemon.HOUR_IN_MS-1), new SQLPowerDataBuilder()); - ArrayList dayDataList = PowerChallenge.db.exec( + ArrayList dayDataList = HalContext.db.exec( "SELECT user.username as username, sensor_data_aggr.timestamp_start as timestamp, sensor_data_aggr.data as data " + "FROM sensor_data_aggr, user, sensor " + "WHERE sensor.id = sensor_data_aggr.sensor_id " diff --git a/web-resource/configure.html b/web-resource/configure.html index ba03427b..6a3101ce 100644 --- a/web-resource/configure.html +++ b/web-resource/configure.html @@ -12,7 +12,7 @@ - + @@ -49,6 +49,7 @@
Profile Information
+
diff --git a/web-resource/index.html b/web-resource/index.html index 05e4a65e..5abbc6f9 100644 --- a/web-resource/index.html +++ b/web-resource/index.html @@ -13,16 +13,19 @@ - +