diff --git a/.idea/workspace.xml b/.idea/workspace.xml
index ce70d94..698898f 100644
--- a/.idea/workspace.xml
+++ b/.idea/workspace.xml
@@ -3,7 +3,9 @@
-
+
+
+
@@ -109,8 +111,8 @@
-
-
+
+
@@ -119,8 +121,8 @@
-
-
+
+
@@ -156,11 +158,11 @@
-
+
-
-
+
+
@@ -198,56 +200,49 @@
-
+
-
-
+
+
-
-
-
+
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
+
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
@@ -272,6 +267,7 @@
fluidGasRatio
setupFluidRatio
startupStrokes
+ updat
@@ -746,16 +742,16 @@
-
-
-
+
+
+
@@ -770,9 +766,8 @@
-
-
-
+
+
@@ -792,12 +787,11 @@
-
-
+
@@ -807,7 +801,7 @@
-
+
@@ -821,7 +815,7 @@
-
+
@@ -847,6 +841,7 @@
+
@@ -856,6 +851,7 @@
+
-
+
@@ -1153,20 +1149,20 @@
-
+
-
+
-
+
@@ -1256,9 +1252,7 @@
-
-
-
+
@@ -1299,9 +1293,7 @@
-
-
-
+
@@ -1470,13 +1462,6 @@
-
-
-
-
-
-
-
@@ -1508,6 +1493,16 @@
+
+
+
+
+
+
+
+
+
+
@@ -1538,18 +1533,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
@@ -1572,16 +1555,6 @@
-
-
-
-
-
-
-
-
-
-
@@ -1590,27 +1563,66 @@
+
+
+
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
-
+
-
-
-
+
+
+
+
+
diff --git a/src/main/java/com/henrypump/poc/Database.java b/src/main/java/com/henrypump/poc/Database.java
index 11647a9..1e63d9c 100644
--- a/src/main/java/com/henrypump/poc/Database.java
+++ b/src/main/java/com/henrypump/poc/Database.java
@@ -23,14 +23,13 @@ import com.mongodb.client.MongoCursor;
import static com.mongodb.client.model.Filters.*;
import javax.print.Doc;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
+
public class Database {
private String pocDatabase = "poc";
private MongoClient mongoClient;
private MongoDatabase database;
+ private MongoCredential credential = MongoCredential.createCredential("poc_java", pocDatabase, "HenryPump@1903".toCharArray());
private MongoCollection cardCollection, wellDataCollection, gaugeOffCollection, wellTestCollection,
fluidShotsCollection, runStatusCollection, wellConfigCollection, setpointCollection;
@@ -38,8 +37,8 @@ public class Database {
cardCollection = database.getCollection("cards");
cardCollection.createIndex(Indexes.ascending("timestamp", "strokeNumber"));
- wellDataCollection = database.getCollection("wellData");
- wellDataCollection.createIndex(Indexes.ascending("timestamp", "tagName"));
+ wellDataCollection = database.getCollection("measurements");
+ wellDataCollection.createIndex(Indexes.ascending("dateStored", "tagName"));
gaugeOffCollection = database.getCollection("gaugeOff");
gaugeOffCollection.createIndex(Indexes.ascending("timestamp", "tagName"));
@@ -63,7 +62,9 @@ public class Database {
Database(){
- mongoClient = new MongoClient();
+ ServerAddress server = new ServerAddress("localhost", 27017);
+ List credentials = Arrays.asList(credential);
+ mongoClient = new MongoClient(server, credentials);
database = mongoClient.getDatabase(pocDatabase);
initCollections();
@@ -72,7 +73,9 @@ public class Database {
}
Database(String dbHostname){
- mongoClient = new MongoClient(dbHostname);
+ ServerAddress server = new ServerAddress(dbHostname, 27017);
+ List credentials = Arrays.asList(credential);
+ mongoClient = new MongoClient(server, credentials);
database = mongoClient.getDatabase(pocDatabase);
initCollections();
@@ -136,21 +139,31 @@ public class Database {
public long newMeasurement(Measurement inpMeasurement){
- Document doc = new Document("tagname", inpMeasurement.getTagName())
- .append("currentValue", inpMeasurement.getCurrentValue())
- .append("maxDailyValue", inpMeasurement.getDailyMax())
- .append("minDailyValue", inpMeasurement.getDailyMin())
- .append("dailyAverage", inpMeasurement.getAverage())
- .append("dailyTotal", inpMeasurement.getTotal())
+ ZonedDateTime nowDate = ZonedDateTime.now();
+ ZonedDateTime todayDate = ZonedDateTime.of(nowDate.getYear(), nowDate.getMonthValue(), nowDate.getDayOfMonth(), 0, 0, 0, 0, nowDate.getZone());
+ Date storeDate = Date.from(todayDate.toInstant());
+ Document nowMeasurement = new Document("values." + nowDate.getHour() + "." + nowDate.getMinute(), inpMeasurement.getCurrentValue())
+ .append("maxValue", inpMeasurement.getDailyMax())
+ .append("minValue", inpMeasurement.getDailyMin())
+ .append("averageValue", inpMeasurement.getAverage())
+ .append("totalValue", inpMeasurement.getTotal())
.append("numMeasurements", inpMeasurement.getNumMeasurements())
- .append("timestamp", Date.from(ZonedDateTime.now().toInstant()));
- wellDataCollection.insertOne(doc);
+ .append("units", inpMeasurement.getUnits())
+ .append("storeDelta", inpMeasurement.getSendDelta())
+ .append("storeTime", inpMeasurement.getSendTimeDelta())
+ .append("useTotal", inpMeasurement.isUseTotal())
+ .append("useAverage", inpMeasurement.isUseAverage())
+ .append("dateStored", storeDate);
+
+ wellDataCollection.updateOne(and(eq("tagname", inpMeasurement.getTagName()), eq("dateStored", storeDate)), new Document("$set", nowMeasurement), (new UpdateOptions()).upsert(true));
+// wellDataCollection.updateOne(and(eq("tagname", inpMeasurement.getTagName()), eq("dateStored", todayDate)), new Document("$set", aggregateData), (new UpdateOptions()).upsert(true));
+
System.out.println("Stored " + inpMeasurement.getCurrentValue() + " for " + inpMeasurement.getTagName());
return wellDataCollection.count();
}
public Document getLastStoredMeasurement(String tagName){
- MongoCursor cursor = wellDataCollection.find(eq("tagname", tagName)).sort(Sorts.descending("timestamp")).limit(1).iterator();
+ MongoCursor cursor = wellDataCollection.find(eq("tagname", tagName)).sort(Sorts.descending("dateStored")).limit(1).iterator();
Document lastStoredDoc = new Document();
try {
while (cursor.hasNext()) {
diff --git a/src/main/java/com/henrypump/poc/Measurement.java b/src/main/java/com/henrypump/poc/Measurement.java
index 438951e..f5ed971 100644
--- a/src/main/java/com/henrypump/poc/Measurement.java
+++ b/src/main/java/com/henrypump/poc/Measurement.java
@@ -5,6 +5,7 @@ import org.bson.Document;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.Date;
+import java.util.Set;
import static java.lang.Math.abs;
@@ -27,8 +28,11 @@ public class Measurement {
private Database db;
private long lastSentTimestamp;
private long sendTimeDelta;
+ private String units = null;
+ private boolean useTotal;
+ private boolean useAverage;
- Measurement(String tagName, Database db, double sendDelta, long sendTimeDelta){
+ Measurement(String tagName, Database db){
this.tagName = tagName;
average = 0;
total = 0;
@@ -38,24 +42,36 @@ public class Measurement {
// Database code
this.db = db;
- this.sendDelta = sendDelta;
this.lastSentValue = 0.0;
- this.sendTimeDelta = sendTimeDelta;
Document lastStored = this.db.getLastStoredMeasurement(this.tagName);
try {
- Date lastStoredTimestamp = (Date) lastStored.get("timestamp");
+ Date lastStoredTimestamp = (Date) lastStored.get("dateStored");
ZonedDateTime timestamp = ZonedDateTime.ofInstant(lastStoredTimestamp.toInstant(),
ZoneId.systemDefault());
if (isToday(timestamp)){
- this.average = lastStored.getDouble("dailyAverage");
- this.total = lastStored.getDouble("dailyTotal");
- this.lastSentValue = lastStored.getDouble("currentValue");
- this.dailyMax = lastStored.getDouble("maxDailyValue");
- this.dailyMin = lastStored.getDouble("minDailyValue");
- this.lastSentTimestamp = timestamp.toEpochSecond();
+ this.average = lastStored.getDouble("averageValue");
+ this.total = lastStored.getDouble("totalValue");
+// this.lastSentValue = lastStored.getDouble("currentValue");
+ this.dailyMax = lastStored.getDouble("maxValue");
+ this.dailyMin = lastStored.getDouble("minValue");
+ this.sendDelta = lastStored.getDouble("storeDelta");
+ this.sendTimeDelta = lastStored.getLong("storeTime");
+ this.units = lastStored.getString("units");
+// this.lastSentTimestamp = timestamp.toEpochSecond();
+ Document values = (Document) lastStored.get("values");
+ Object[] hours = values.keySet().toArray();
+ String maxHour = (String) hours[hours.length - 1];
+ Document maxHourDoc = (Document) values.get(maxHour);
+ Object[] minutes = maxHourDoc.keySet().toArray();
+ String maxMinute = (String) minutes[minutes.length - 1];
+ this.lastSentValue = maxHourDoc.getDouble(maxMinute);
this.numMeasurements = lastStored.getLong("numMeasurements");
- System.out.println("Using stored value from " + timestamp.toString() + " for " + this.tagName);
+
+
+ System.out.println("Using stored value from " + ZonedDateTime.of(timestamp.getYear(),
+ timestamp.getMonthValue(), timestamp.getDayOfMonth(), Integer.parseInt(maxHour),
+ Integer.parseInt(maxMinute), 0, 0, timestamp.getZone()).toString() + " for " + this.tagName);
} else {
System.out.println("Cannot use stored value from " + timestamp.toString() + " for " + this.tagName);
}
@@ -65,17 +81,6 @@ public class Measurement {
}
-// Measurement(String tagName, boolean storeInDatabase){
-// this.tagName = tagName;
-// average = 0;
-// total = 0;
-// numMeasurements = 0;
-// dailyMax = Double.MIN_VALUE;
-// dailyMin = Double.MAX_VALUE;
-//
-// // Database code
-// this.storeInDatabase = storeInDatabase;
-// }
public double getCurrentValue() {
return currentValue;
@@ -109,6 +114,50 @@ public class Measurement {
return dailyMin;
}
+ public double getSendDelta() {
+ return sendDelta;
+ }
+
+ public void setSendDelta(double sendDelta) {
+ this.sendDelta = sendDelta;
+ }
+
+ public long getSendTimeDelta() {
+ return sendTimeDelta;
+ }
+
+ public void setSendTimeDelta(long sendTimeDelta) {
+ this.sendTimeDelta = sendTimeDelta;
+ }
+
+ public String getUnits() {
+ return units;
+ }
+
+ public void setUnits(String units) {
+ this.units = units;
+ }
+
+ public boolean isUseTotal() {
+ return useTotal;
+ }
+
+ public void setUseTotal(boolean useTotal) {
+ this.useTotal = useTotal;
+ }
+
+ public boolean isUseAverage() {
+ return useAverage;
+ }
+
+ public void setUseAverage(boolean useAverage) {
+ this.useAverage = useAverage;
+ }
+
+
+
+
+
private static boolean isToday(ZonedDateTime inpZDT){
ZonedDateTime now = ZonedDateTime.now();
if (now.toLocalDate().equals(inpZDT.toLocalDate())){
diff --git a/src/main/java/com/henrypump/poc/Well.java b/src/main/java/com/henrypump/poc/Well.java
index cfe4d0d..5bab135 100644
--- a/src/main/java/com/henrypump/poc/Well.java
+++ b/src/main/java/com/henrypump/poc/Well.java
@@ -318,26 +318,167 @@ public class Well {
}
private void initializeMeasurements(){
- strokeSpeed = new Measurement("Stroke Speed", db, 0.5, 600);
- downholeGrossStroke = new Measurement("Downhole Gross Stroke", db, 0.5, 600);
- downholeNetStroke = new Measurement("Downhole Net Stroke", db, 0.5, 600);
- fluidLevel = new Measurement("Fluid Level", db, 10, 600);
- fluidLoad = new Measurement("Fluid Load", db, 20, 600);
- inflowRate = new Measurement("Inflow Rate", db, 0.5, 600);
- peakPolishedRodLoad = new Measurement("Peak PRL", db, 50, 600);
- minPolishedRodLoad = new Measurement("Min PRL", db, 50, 600);
- percentRun = new Measurement("Percent Run", db, 1.0, 600);
- polishedRodHP = new Measurement("Polished Rod HP", db, 0.25, 600);
- pumpHP = new Measurement("Pump HP", db, 0.25, 600);
- fluidProduced = new Measurement("Fluid Produced", db, 1.0, 600);
- fluidProducedAdjusted = new Measurement("Fluid Produced (adjusted)", db, 1.0, 600);
- oilProduced = new Measurement("Oil Produced", db, 1.0, 600);
- waterProduced = new Measurement("Water Produced", db, 1.0, 600);
- gasProduced = new Measurement("Gas Produced", db, 1.0, 600);
- pumpIntakePressure = new Measurement("Pump Intake Pressure", db, 5.0, 600);
- surfaceStrokeLength = new Measurement("Surface Stroke", db, 0.5, 1800);
- tubingMovement = new Measurement("Tubing Movement", db, 0.5, 600);
- pumpFillPercent = new Measurement("Pump Fill Percent", db, 0.5, 600);
+ strokeSpeed = new Measurement("Stroke Speed", db);
+ if (strokeSpeed.getUnits() == null) {
+ strokeSpeed.setUnits("SPM");
+ strokeSpeed.setSendDelta(0.5);
+ strokeSpeed.setSendTimeDelta(600);
+ strokeSpeed.setUseAverage(true);
+ strokeSpeed.setUseTotal(false);
+ }
+
+ downholeGrossStroke = new Measurement("Downhole Gross Stroke", db);
+ if (downholeGrossStroke.getUnits() == null) {
+ downholeGrossStroke.setUnits("in.");
+ downholeGrossStroke.setSendDelta(0.5);
+ downholeGrossStroke.setSendTimeDelta(600);
+ downholeGrossStroke.setUseAverage(true);
+ downholeGrossStroke.setUseTotal(false);
+ }
+ downholeNetStroke = new Measurement("Downhole Net Stroke", db);
+ if (downholeNetStroke.getUnits() == null) {
+ downholeNetStroke.setUnits("in.");
+ downholeNetStroke.setSendDelta(0.5);
+ downholeNetStroke.setSendTimeDelta(600);
+ downholeNetStroke.setUseAverage(true);
+ downholeNetStroke.setUseTotal(false);
+ }
+ fluidLevel = new Measurement("Fluid Level", db);
+ if (fluidLevel.getUnits() == null) {
+ fluidLevel.setUnits("ft.");
+ fluidLevel.setSendDelta(10.0);
+ fluidLevel.setSendTimeDelta(600);
+ fluidLevel.setUseAverage(true);
+ fluidLevel.setUseTotal(false);
+ }
+ fluidLoad = new Measurement("Fluid Load", db);
+ if (fluidLoad.getUnits() == null) {
+ fluidLoad.setUnits("lbs.");
+ fluidLoad.setSendDelta(20.0);
+ fluidLoad.setSendTimeDelta(600);
+ fluidLoad.setUseAverage(true);
+ fluidLoad.setUseTotal(false);
+ }
+ inflowRate = new Measurement("Inflow Rate", db);
+ if (inflowRate.getUnits() == null) {
+ inflowRate.setUnits("BBL/day");
+ inflowRate.setSendDelta(0.5);
+ inflowRate.setSendTimeDelta(600);
+ inflowRate.setUseAverage(true);
+ inflowRate.setUseTotal(false);
+ }
+ peakPolishedRodLoad = new Measurement("Peak PRL", db);
+ if (peakPolishedRodLoad.getUnits() == null) {
+ peakPolishedRodLoad.setUnits("lbs.");
+ peakPolishedRodLoad.setSendDelta(50);
+ peakPolishedRodLoad.setSendTimeDelta(600);
+ peakPolishedRodLoad.setUseAverage(true);
+ peakPolishedRodLoad.setUseTotal(false);
+ }
+ minPolishedRodLoad = new Measurement("Min PRL", db);
+ if (minPolishedRodLoad.getUnits() == null) {
+ minPolishedRodLoad.setUnits("lbs.");
+ minPolishedRodLoad.setSendDelta(50.0);
+ minPolishedRodLoad.setSendTimeDelta(600);
+ minPolishedRodLoad.setUseAverage(true);
+ minPolishedRodLoad.setUseTotal(false);
+ }
+ percentRun = new Measurement("Percent Run", db);
+ if (percentRun.getUnits() == null) {
+ percentRun.setUnits("%");
+ percentRun.setSendDelta(0.5);
+ percentRun.setSendTimeDelta(600);
+ percentRun.setUseAverage(false);
+ percentRun.setUseTotal(false);
+ }
+ polishedRodHP = new Measurement("Polished Rod HP", db);
+ if (polishedRodHP.getUnits() == null) {
+ polishedRodHP.setUnits("HP");
+ polishedRodHP.setSendDelta(0.25);
+ polishedRodHP.setSendTimeDelta(600);
+ polishedRodHP.setUseAverage(true);
+ polishedRodHP.setUseTotal(false);
+ }
+ pumpHP = new Measurement("Pump HP", db);
+ if (pumpHP.getUnits() == null) {
+ pumpHP.setUnits("HP");
+ pumpHP.setSendDelta(0.25);
+ pumpHP.setSendTimeDelta(600);
+ pumpHP.setUseAverage(true);
+ pumpHP.setUseTotal(false);
+ }
+ fluidProduced = new Measurement("Fluid Produced", db);
+ if (fluidProduced.getUnits() == null) {
+ fluidProduced.setUnits("BBL");
+ fluidProduced.setSendDelta(1.0);
+ fluidProduced.setSendTimeDelta(600);
+ fluidProduced.setUseAverage(true);
+ fluidProduced.setUseTotal(true);
+ }
+ fluidProducedAdjusted = new Measurement("Fluid Produced (adjusted)", db);
+ if (fluidProducedAdjusted.getUnits() == null) {
+ fluidProducedAdjusted.setUnits("BBL");
+ fluidProducedAdjusted.setSendDelta(1.0);
+ fluidProducedAdjusted.setSendTimeDelta(600);
+ fluidProducedAdjusted.setUseAverage(true);
+ fluidProducedAdjusted.setUseTotal(true);
+ }
+ oilProduced = new Measurement("Oil Produced", db);
+ if (oilProduced.getUnits() == null) {
+ oilProduced.setUnits("BBL");
+ oilProduced.setSendDelta(0.5);
+ oilProduced.setSendTimeDelta(600);
+ oilProduced.setUseAverage(true);
+ oilProduced.setUseTotal(true);
+ }
+ waterProduced = new Measurement("Water Produced", db);
+ if (waterProduced.getUnits() == null) {
+ waterProduced.setUnits("BBL");
+ waterProduced.setSendDelta(1.0);
+ waterProduced.setSendTimeDelta(600);
+ waterProduced.setUseAverage(true);
+ waterProduced.setUseTotal(true);
+ }
+ gasProduced = new Measurement("Gas Produced", db);
+ if (gasProduced.getUnits() == null) {
+ gasProduced.setUnits("MCF");
+ gasProduced.setSendDelta(1.0);
+ gasProduced.setSendTimeDelta(600);
+ gasProduced.setUseAverage(true);
+ gasProduced.setUseTotal(true);
+ }
+ pumpIntakePressure = new Measurement("Pump Intake Pressure", db);
+ if (pumpIntakePressure.getUnits() == null) {
+ pumpIntakePressure.setUnits("PSI");
+ pumpIntakePressure.setSendDelta(5.0);
+ pumpIntakePressure.setSendTimeDelta(600);
+ pumpIntakePressure.setUseAverage(true);
+ pumpIntakePressure.setUseTotal(false);
+ }
+ surfaceStrokeLength = new Measurement("Surface Stroke", db);
+ if (surfaceStrokeLength.getUnits() == null) {
+ surfaceStrokeLength.setUnits("in.");
+ surfaceStrokeLength.setSendDelta(0.5);
+ surfaceStrokeLength.setSendTimeDelta(600);
+ surfaceStrokeLength.setUseAverage(true);
+ surfaceStrokeLength.setUseTotal(false);
+ }
+ tubingMovement = new Measurement("Tubing Movement", db);
+ if (tubingMovement.getUnits() == null) {
+ tubingMovement.setUnits("in.");
+ tubingMovement.setSendDelta(0.5);
+ tubingMovement.setSendTimeDelta(600);
+ tubingMovement.setUseAverage(true);
+ tubingMovement.setUseTotal(false);
+ }
+ pumpFillPercent = new Measurement("Pump Fill Percent", db);
+ if (pumpFillPercent.getUnits() == null) {
+ pumpFillPercent.setUnits("%");
+ pumpFillPercent.setSendDelta(1.0);
+ pumpFillPercent.setSendTimeDelta(600);
+ pumpFillPercent.setUseAverage(true);
+ pumpFillPercent.setUseTotal(false);
+ }
}
public double getDt() {