From d83331845d43e3a66f24c429dee956de5d9d5fe9 Mon Sep 17 00:00:00 2001 From: emtunhei <emtunhei@stud.ntnu.no> Date: Fri, 11 Mar 2022 15:37:17 +0100 Subject: [PATCH] Added full functionality to gathering kWh! Retireves seperate drying periods. --- src/main/java/com/application/DB/DB.java | 108 +++++++++++++-------- src/main/java/com/application/Main.java | 2 +- target/classes/com/application/DB/DB.class | Bin 10720 -> 11373 bytes target/classes/com/application/Main.class | Bin 8129 -> 7985 bytes 4 files changed, 67 insertions(+), 43 deletions(-) diff --git a/src/main/java/com/application/DB/DB.java b/src/main/java/com/application/DB/DB.java index 7e81652..a2fbb8f 100644 --- a/src/main/java/com/application/DB/DB.java +++ b/src/main/java/com/application/DB/DB.java @@ -22,7 +22,7 @@ public class DB { private static Job queryJob; - private static SimpleDateFormat getDateFormat(){ + private static SimpleDateFormat getDateFormat() { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); dateFormat.setTimeZone(TimeZone.getTimeZone("UTC")); return dateFormat; @@ -100,68 +100,91 @@ public class DB { /** - * Retrieves information about kwh and the corresponding date + * Retrieves information about kWh and the corresponding date * * @return the results * @throws Exception returns potential error */ - public static Map<String, Number> getKwh() throws Exception { - - /* - for (Map.Entry<String, String> entry : getZeroPointDate().entrySet()) { - //System.out.printf("Intid: \t%s\t\t\tOuttid: \t%s\n",entry.getKey(),entry.getValue()); - - // Preparing a query statement - final String sqlStatement = "SELECT TimeStamp, VariantValue " + - "FROM sf-drying-optimization.124.int_sd_winccsensordata " + - "WHERE TimeStamp BETWEEN " + entry.getKey() + " AND " + entry.getValue() + - "ORDER BY TimeStamp ASC";// Preparing a query statement - - } - - */ + public static Map<Integer, Map> getKwh() throws Exception { // Initializing the data map to store the results - Map<String, Number> data = new HashMap<>(); - + Map<Integer, Map> finalResults = new HashMap<>(); + int index = 0; + /* final String sqlStatement = "SELECT TimeStamp, VariantValue " + "FROM sf-drying-optimization.124.int_sd_winccsensordata " + "WHERE TimeStamp BETWEEN \"2021-01-30 08:51:03\" " + "AND \"2021-02-15 11:10:09\" ORDER BY TimeStamp ASC"; + */ + for (Map.Entry<String, String> entry : getZeroPointDate().entrySet()) { + //System.out.printf("Intid: \t%s\t\t\tOuttid: \t%s\n",entry.getKey(),entry.getValue()); + // Initializing the data map to store the results + Map<String, Number> data = new HashMap<>(); - // Creates a job configuration - queryJob = getJob(QueryJobConfiguration.newBuilder(sqlStatement).build()); + // Preparing a query statement + final String sqlStatement = "SELECT DISTINCT TimeStamp, VariantValue " + + "FROM sf-drying-optimization.124.int_sd_winccsensordata " + + "WHERE TimeStamp BETWEEN " + '"'+ entry.getKey() + '"' + + " AND " + '"' + entry.getValue() + '"' + + " ORDER BY TimeStamp ASC";// Preparing a query statement - // Iterating through the results - TableResult result = queryJob.getQueryResults(); - System.out.println("Timestamp \t KWh"); - for (FieldValueList row : result.iterateAll()) { + //System.out.println(sqlStatement); - // Kwh - int variantValue = row.get("VariantValue").getNumericValue().intValue(); + // Creates a job configuration + queryJob = getJob(QueryJobConfiguration.newBuilder(sqlStatement).build()); - // Retrieving the wanted data - long timeStamp = row.get("TimeStamp").getTimestampValue()/1000; - // Riktig format, men i string - String formatedTimeStamp = getDateFormat().format(timeStamp); + // Iterating through the results + TableResult result = queryJob.getQueryResults(); + //System.out.println("Timestamp \t kWh"); - // Adding the data to a list in order to sort through later - data.put(formatedTimeStamp, variantValue); - } + int baseline = 0; + for (FieldValueList row : result.iterateAll()) { + + // Sets the baseline in order to reset the kWh counter + if (baseline == 0){ + baseline = row.get("VariantValue").getNumericValue().intValue(); + } + //System.out.println("baseline: "+baseline); + + // kWh value + int variantValue = row.get("VariantValue").getNumericValue().intValue()-baseline; - for (Map.Entry<String, Number> entry : data.entrySet()) { - System.out.printf("Timestamp: \t%s\t\t\tKWh: \t%s\n",entry.getKey(),entry.getValue()); + // Retrieving the wanted data + long timeStamp = row.get("TimeStamp").getTimestampValue() / 1000; + // Riktig format, men i string + String formatedTimeStamp = getDateFormat().format(timeStamp); + + // Checks for negative values, + if(variantValue > 0){ + // Adding the data to a list in order to sort through later + data.put(formatedTimeStamp, variantValue); + } + //System.out.printf("Timestamp: \t%s\t\t\tkWh: \t%s\t\t\tBaseline: %s\n",formatedTimeStamp,variantValue,baseline); + // Checks if the data is empty + } + if(!data.isEmpty()) { + finalResults.put(index,data); + index += 1; + } } + // Defining a treemap to sort through the data + NavigableMap<Integer, Map> sortedFinalResults = new TreeMap<>(finalResults); - return data; +/* + for (Map.Entry<Integer, Map> entry : sortedFinalResults.entrySet()) { + System.out.printf("Timestamp: \t%s\t\t\tkWh: \t%s\n",entry.getKey(),entry.getValue()); + } + */ + return sortedFinalResults; } + /** - * Retrieves information about kwh and the corresponding date + * Retrieves information about kWh and the corresponding date * * @throws Exception returns potential error */ @@ -207,7 +230,7 @@ public class DB { * This function retrieves the intidtork and uttidtork dates from the database. * This variables are not sorted and thus this function iterates through the data in order to * find the last intidtork date and the corresponding uttidtork data. - * These values will be used to reset the kwh. + * These values will be used to reset the kWh. * * A possible extention of this function could be to limit the number of dring periodes. * This could be done with counting the number of entries in @@ -297,9 +320,9 @@ public class DB { // Checks if the next date is longer than 1 day, // if so the current date is the last intidtork date and - // is the one we will use in order to reset the kwh. + // is the one we will use in order to reset the kWh. if(next.compareTo(formatedDateNowPlus) > 0){ - // Storing the dates that will be used for resetting kwh. + // Storing the dates that will be used for resetting kWh. sortedDates.put(inTid,utTid); } } catch (NullPointerException e){ @@ -307,6 +330,7 @@ public class DB { break; } } - return sortedDates; + // Defining a treemap to sort through the data + return new TreeMap<>(sortedDates); } } \ No newline at end of file diff --git a/src/main/java/com/application/Main.java b/src/main/java/com/application/Main.java index 1413fe7..ae1c2ea 100644 --- a/src/main/java/com/application/Main.java +++ b/src/main/java/com/application/Main.java @@ -271,7 +271,7 @@ public class Main extends Application { lineChart.setTitle("Drying Process"); - Map<String, Number> kwh = DB.getKwh(); + Map<String, Number> kwh = null;// = DB.getKwh(); Map<String, Number> sortedKwh = new TreeMap<>(kwh); XYChart.Series series1 = new XYChart.Series(); diff --git a/target/classes/com/application/DB/DB.class b/target/classes/com/application/DB/DB.class index ec31148fa1f578a2ce3c089cb84d90f4678287d5..b744148f8c96704565f96a5c617d656f3f84964e 100644 GIT binary patch delta 4584 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 delta 3894 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 LFtRbcVUPp>cvL`L diff --git a/target/classes/com/application/Main.class b/target/classes/com/application/Main.class index fd2fd756630461a11db07cc7f98d510688c791c2..176a777b3e7297135d46851c11538e0bf6703743 100644 GIT binary patch delta 3047 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 delta 3224 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 -- GitLab