From a75231dc437cc4e1e5b87e6aec084bac215a0ebe Mon Sep 17 00:00:00 2001 From: MarkBryanMilligan Date: Fri, 26 Feb 2021 10:56:05 -0600 Subject: [PATCH] Support using one CT to monitor a double breaker by only monitoring one pole and doubling its power. --- .../lanternsoftware/currentmonitor/CurrentMonitor.java | 5 ++++- .../currentmonitor/MongoCurrentMonitorDao.java | 2 +- .../datamodel/currentmonitor/Breaker.java | 9 +++++++++ .../datamodel/currentmonitor/BreakerType.java | 9 +++++++-- .../datamodel/currentmonitor/dao/BreakerSerializer.java | 2 ++ 5 files changed, 23 insertions(+), 4 deletions(-) diff --git a/currentmonitor/lantern-currentmonitor/src/main/java/com/lanternsoftware/currentmonitor/CurrentMonitor.java b/currentmonitor/lantern-currentmonitor/src/main/java/com/lanternsoftware/currentmonitor/CurrentMonitor.java index 1c85fc8..f69d1a4 100644 --- a/currentmonitor/lantern-currentmonitor/src/main/java/com/lanternsoftware/currentmonitor/CurrentMonitor.java +++ b/currentmonitor/lantern-currentmonitor/src/main/java/com/lanternsoftware/currentmonitor/CurrentMonitor.java @@ -99,7 +99,8 @@ public class CurrentMonitor { public void monitorPower(BreakerHub _hub, List _breakers, int _intervalMs, PowerListener _listener) { stopMonitoring(); listener = _listener; - sampler = new Sampler(_hub, _breakers, _intervalMs, 2); + List validBreakers = CollectionUtils.filter(_breakers, _b->_b.getPort() > 0 && _b.getPort() < 16); + sampler = new Sampler(_hub, validBreakers, _intervalMs, 2); LOG.info("Starting to monitor ports {}", CollectionUtils.transformToCommaSeparated(_breakers, _b->String.valueOf(_b.getPort()))); executor.submit(sampler); } @@ -241,6 +242,8 @@ public class CurrentMonitor { realPower = 0.0; if (samples.getBreaker().getPolarity() == BreakerPolarity.SOLAR) realPower = -realPower; + if (samples.getBreaker().isDoublePower()) + realPower *= 2.0; if (debug) { synchronized (CurrentMonitor.this) { LOG.info("===========================Start Port {}", samples.getBreaker().getPort()); diff --git a/currentmonitor/lantern-dataaccess-currentmonitor/src/main/java/com/lanternsoftware/dataaccess/currentmonitor/MongoCurrentMonitorDao.java b/currentmonitor/lantern-dataaccess-currentmonitor/src/main/java/com/lanternsoftware/dataaccess/currentmonitor/MongoCurrentMonitorDao.java index 0fd4ec5..582178b 100644 --- a/currentmonitor/lantern-dataaccess-currentmonitor/src/main/java/com/lanternsoftware/dataaccess/currentmonitor/MongoCurrentMonitorDao.java +++ b/currentmonitor/lantern-dataaccess-currentmonitor/src/main/java/com/lanternsoftware/dataaccess/currentmonitor/MongoCurrentMonitorDao.java @@ -110,7 +110,7 @@ public class MongoCurrentMonitorDao implements CurrentMonitorDao { @Override public List getBreakerPowerForAccount(int _accountId) { - return proxy.query(BreakerPower.class, new DaoQuery("account_id", _accountId)); + return proxy.query(BreakerPower.class, new DaoQuery("account_id", _accountId).andGt("read_time", DateUtils.minutesFromNow(-1).getTime())); } @Override diff --git a/currentmonitor/lantern-datamodel-currentmonitor/src/main/java/com/lanternsoftware/datamodel/currentmonitor/Breaker.java b/currentmonitor/lantern-datamodel-currentmonitor/src/main/java/com/lanternsoftware/datamodel/currentmonitor/Breaker.java index 5f1bf00..430cb41 100644 --- a/currentmonitor/lantern-datamodel-currentmonitor/src/main/java/com/lanternsoftware/datamodel/currentmonitor/Breaker.java +++ b/currentmonitor/lantern-datamodel-currentmonitor/src/main/java/com/lanternsoftware/datamodel/currentmonitor/Breaker.java @@ -21,6 +21,7 @@ public class Breaker { private double calibrationFactor; private double lowPassFilter; private BreakerPolarity polarity; + private boolean doublePower; private BreakerType type; private transient String key; @@ -151,6 +152,14 @@ public class Breaker { polarity = _polarity; } + public boolean isDoublePower() { + return doublePower; + } + + public void setDoublePower(boolean _doublePower) { + doublePower = _doublePower; + } + public double getCalibrationFactor() { return calibrationFactor == 0.0?1.0:calibrationFactor; } diff --git a/currentmonitor/lantern-datamodel-currentmonitor/src/main/java/com/lanternsoftware/datamodel/currentmonitor/BreakerType.java b/currentmonitor/lantern-datamodel-currentmonitor/src/main/java/com/lanternsoftware/datamodel/currentmonitor/BreakerType.java index c07b03a..0f67537 100644 --- a/currentmonitor/lantern-datamodel-currentmonitor/src/main/java/com/lanternsoftware/datamodel/currentmonitor/BreakerType.java +++ b/currentmonitor/lantern-datamodel-currentmonitor/src/main/java/com/lanternsoftware/datamodel/currentmonitor/BreakerType.java @@ -9,7 +9,8 @@ public enum BreakerType { EMPTY("Empty"), SINGLE_POLE("Single Pole"), SINGLE_POLE_TANDEM("Single Pole Tandem (Two Breakers in One)"), - DOUBLE_POLE_TOP("Double Pole (240V)"), + DOUBLE_POLE_TOP("Double Pole (240V) Two CTs"), + DOUBLE_POLE_TOP_ONE_CT("Double Pole (240V) One CT Doubled"), DOUBLE_POLE_BOTTOM("Double Pole (240V)"); private final String display; @@ -23,7 +24,7 @@ public enum BreakerType { } public static List selectable() { - return CollectionUtils.asArrayList(EMPTY, SINGLE_POLE, SINGLE_POLE_TANDEM, DOUBLE_POLE_TOP); + return CollectionUtils.asArrayList(EMPTY, SINGLE_POLE, SINGLE_POLE_TANDEM, DOUBLE_POLE_TOP, DOUBLE_POLE_TOP_ONE_CT); } public static BreakerType fromDisplay(String _display) { @@ -33,4 +34,8 @@ public enum BreakerType { } return null; } + + public static boolean isDoublePoleTop(BreakerType _type) { + return NullUtils.isOneOf(_type, DOUBLE_POLE_TOP, DOUBLE_POLE_TOP_ONE_CT); + } } diff --git a/currentmonitor/lantern-datamodel-currentmonitor/src/main/java/com/lanternsoftware/datamodel/currentmonitor/dao/BreakerSerializer.java b/currentmonitor/lantern-datamodel-currentmonitor/src/main/java/com/lanternsoftware/datamodel/currentmonitor/dao/BreakerSerializer.java index 9c3635e..52dda87 100644 --- a/currentmonitor/lantern-datamodel-currentmonitor/src/main/java/com/lanternsoftware/datamodel/currentmonitor/dao/BreakerSerializer.java +++ b/currentmonitor/lantern-datamodel-currentmonitor/src/main/java/com/lanternsoftware/datamodel/currentmonitor/dao/BreakerSerializer.java @@ -38,6 +38,7 @@ public class BreakerSerializer extends AbstractDaoSerializer d.put("calibration_factor", _o.getCalibrationFactor()); d.put("low_pass_filter", _o.getLowPassFilter()); d.put("polarity", DaoSerializer.toEnumName(_o.getPolarity())); + d.put("double_power", _o.isDoublePower()); d.put("type", DaoSerializer.toEnumName(_o.getType())); return d; } @@ -57,6 +58,7 @@ public class BreakerSerializer extends AbstractDaoSerializer o.setCalibrationFactor(DaoSerializer.getDouble(_d, "calibration_factor")); o.setLowPassFilter(DaoSerializer.getDouble(_d, "low_pass_filter")); o.setPolarity(DaoSerializer.getEnum(_d, "polarity", BreakerPolarity.class)); + o.setDoublePower(DaoSerializer.getBoolean(_d, "double_power")); o.setType(DaoSerializer.getEnum(_d, "type", BreakerType.class)); return o; }