diff --git a/.idea/workspace.xml b/.idea/workspace.xml index ce70d94..dc0ff23 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -2,8 +2,7 @@ - - + @@ -109,8 +108,8 @@ - - + + @@ -119,8 +118,8 @@ - - + + @@ -156,11 +155,11 @@ - + - - + + @@ -198,56 +197,49 @@ - + - - + + - - - + - - + + - - - - - - - - - - - - + + - - - - - + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - @@ -272,6 +264,7 @@ fluidGasRatio setupFluidRatio startupStrokes + updat @@ -746,16 +739,16 @@ @@ -770,9 +763,8 @@ - @@ -792,12 +784,11 @@ - - @@ -807,7 +798,7 @@ - @@ -821,7 +812,7 @@ - @@ -847,6 +838,7 @@ + @@ -856,6 +848,7 @@ + - + @@ -1153,20 +1146,20 @@ - + - + - + @@ -1256,9 +1249,7 @@ - - - + @@ -1299,9 +1290,7 @@ - - - + @@ -1470,13 +1459,6 @@ - - - - - - - @@ -1508,6 +1490,16 @@ + + + + + + + + + + @@ -1538,18 +1530,6 @@ - - - - - - - - - - - - @@ -1572,16 +1552,6 @@ - - - - - - - - - - @@ -1590,27 +1560,66 @@ + + + + + + + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + - + - - - + + + + + diff --git a/src/main/java/com/henrypump/poc/Database.java b/src/main/java/com/henrypump/poc/Database.java index 11647a9..66f5c3d 100644 --- a/src/main/java/com/henrypump/poc/Database.java +++ b/src/main/java/com/henrypump/poc/Database.java @@ -17,20 +17,20 @@ import org.bson.Document; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; +import java.time.ZoneId; import java.time.ZonedDateTime; 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 +38,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 +63,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 +74,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 +140,32 @@ public class Database { public long newMeasurement(Measurement inpMeasurement){ - Document doc = new Document("tagname", inpMeasurement.getTagName()) + ZonedDateTime nowDate = ZonedDateTime.now(ZoneId.of("UTC")); + ZonedDateTime todayDate = ZonedDateTime.of(nowDate.getYear(), nowDate.getMonthValue(), nowDate.getDayOfMonth(), 0, 0, 0, 0, ZoneId.of("UTC")); + Date storeDate = Date.from(todayDate.toInstant()); + Document nowMeasurement = new Document("values." + nowDate.getHour() + "." + nowDate.getMinute(), inpMeasurement.getCurrentValue()) .append("currentValue", inpMeasurement.getCurrentValue()) - .append("maxDailyValue", inpMeasurement.getDailyMax()) - .append("minDailyValue", inpMeasurement.getDailyMin()) - .append("dailyAverage", inpMeasurement.getAverage()) - .append("dailyTotal", inpMeasurement.getTotal()) + .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() {