mirror of
https://github.com/zyphlar/LanternPowerMonitor.git
synced 2024-03-08 14:07:47 +00:00
Forgot that I still had everything hard-coded to central time. Changed it to be configurable per account.
This commit is contained in:
@@ -10,6 +10,7 @@ public class Account {
|
||||
@PrimaryKey private int id;
|
||||
private String username;
|
||||
private String password;
|
||||
private String timezone;
|
||||
private List<Integer> auxiliaryAccountIds;
|
||||
|
||||
public int getId() {
|
||||
@@ -36,6 +37,14 @@ public class Account {
|
||||
password = _password;
|
||||
}
|
||||
|
||||
public String getTimezone() {
|
||||
return timezone;
|
||||
}
|
||||
|
||||
public void setTimezone(String _timezone) {
|
||||
timezone = _timezone;
|
||||
}
|
||||
|
||||
public List<Integer> getAuxiliaryAccountIds() {
|
||||
return auxiliaryAccountIds;
|
||||
}
|
||||
|
||||
@@ -28,38 +28,41 @@ public class BreakerGroupEnergy {
|
||||
private List<EnergyBlock> energyBlocks;
|
||||
private double toGrid;
|
||||
private double fromGrid;
|
||||
private TimeZone timezone;
|
||||
|
||||
public BreakerGroupEnergy() {
|
||||
}
|
||||
|
||||
public BreakerGroupEnergy(BreakerGroup _group, Map<String, List<BreakerPower>> _powerReadings, EnergyBlockViewMode _viewMode, Date _start, TimeZone _tz) {
|
||||
public BreakerGroupEnergy(BreakerGroup _group, Map<String, List<BreakerPower>> _powerReadings, EnergyBlockViewMode _viewMode, Date _start, TimeZone _timezone) {
|
||||
groupId = _group.getId();
|
||||
groupName = _group.getName();
|
||||
viewMode = _viewMode;
|
||||
start = _start;
|
||||
accountId = _group.getAccountId();
|
||||
subGroups = CollectionUtils.transform(_group.getSubGroups(), _g -> new BreakerGroupEnergy(_g, _powerReadings, _viewMode, _start, _tz));
|
||||
timezone = _timezone;
|
||||
subGroups = CollectionUtils.transform(_group.getSubGroups(), _g -> new BreakerGroupEnergy(_g, _powerReadings, _viewMode, _start, timezone));
|
||||
energyBlocks = new ArrayList<>();
|
||||
List<String> breakerKeys = CollectionUtils.transform(_group.getBreakers(), Breaker::getKey);
|
||||
if (!breakerKeys.isEmpty()) {
|
||||
for (BreakerPower power : CollectionUtils.aggregate(breakerKeys, _powerReadings::get)) {
|
||||
addEnergy(groupId, power.getReadTime(), power.getPower(), _tz);
|
||||
addEnergy(groupId, power.getReadTime(), power.getPower());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public BreakerGroupEnergy(BreakerGroup _group, List<HubPowerMinute> _power, EnergyBlockViewMode _viewMode, Date _start, TimeZone _tz) {
|
||||
public BreakerGroupEnergy(BreakerGroup _group, List<HubPowerMinute> _power, EnergyBlockViewMode _viewMode, Date _start, TimeZone _timezone) {
|
||||
groupId = _group.getId();
|
||||
groupName = _group.getName();
|
||||
viewMode = _viewMode;
|
||||
start = _start;
|
||||
accountId = _group.getAccountId();
|
||||
subGroups = CollectionUtils.transform(_group.getSubGroups(), _g -> new BreakerGroupEnergy(_g, (List<HubPowerMinute>)null, _viewMode, _start, _tz));
|
||||
timezone = _timezone;
|
||||
subGroups = CollectionUtils.transform(_group.getSubGroups(), _g -> new BreakerGroupEnergy(_g, (List<HubPowerMinute>)null, _viewMode, _start, timezone));
|
||||
energyBlocks = new ArrayList<>();
|
||||
addEnergy(_group, _power, _tz);
|
||||
addEnergy(_group, _power);
|
||||
}
|
||||
|
||||
public void addEnergy(BreakerGroup _group, List<HubPowerMinute> _hubPower, TimeZone _tz) {
|
||||
public void addEnergy(BreakerGroup _group, List<HubPowerMinute> _hubPower) {
|
||||
Map<String, Breaker> breakers = CollectionUtils.transformToMap(_group.getAllBreakers(), Breaker::getKey);
|
||||
Map<String, BreakerGroup> breakerKeyToGroup = new HashMap<>();
|
||||
for (BreakerGroup group : _group.getAllBreakerGroups()) {
|
||||
@@ -67,14 +70,14 @@ public class BreakerGroupEnergy {
|
||||
breakerKeyToGroup.put(b.getKey(), group);
|
||||
}
|
||||
}
|
||||
addEnergy(breakers, breakerKeyToGroup, _hubPower, _tz);
|
||||
addEnergy(breakers, breakerKeyToGroup, _hubPower);
|
||||
}
|
||||
|
||||
public void addEnergy(Map<String, Breaker> _breakers, Map<String, BreakerGroup> _breakerKeyToGroup, List<HubPowerMinute> _hubPower, TimeZone _tz) {
|
||||
public void addEnergy(Map<String, Breaker> _breakers, Map<String, BreakerGroup> _breakerKeyToGroup, List<HubPowerMinute> _hubPower) {
|
||||
if (CollectionUtils.isEmpty(_hubPower) || CollectionUtils.anyQualify(_hubPower, _p->_p.getAccountId() != accountId))
|
||||
return;
|
||||
Date minute = CollectionUtils.getFirst(_hubPower).getMinuteAsDate();
|
||||
resetEnergy(minute, _tz);
|
||||
resetEnergy(minute);
|
||||
Map<Integer, MeterMinute> meters = new HashMap<>();
|
||||
for (HubPowerMinute hubPower : _hubPower) {
|
||||
for (BreakerPowerMinute breaker : CollectionUtils.makeNotNull(hubPower.getBreakers())) {
|
||||
@@ -92,7 +95,7 @@ public class BreakerGroupEnergy {
|
||||
else
|
||||
meter.solar[idx] += -power;
|
||||
if (power != 0.0)
|
||||
addEnergy(group.getId(), minute, power, _tz);
|
||||
addEnergy(group.getId(), minute, power);
|
||||
idx++;
|
||||
}
|
||||
}
|
||||
@@ -108,21 +111,21 @@ public class BreakerGroupEnergy {
|
||||
}
|
||||
}
|
||||
|
||||
public void resetEnergy(Date _readTime, TimeZone _tz) {
|
||||
EnergyBlock block = getBlock(_readTime, _tz, false);
|
||||
public void resetEnergy(Date _readTime) {
|
||||
EnergyBlock block = getBlock(_readTime, false);
|
||||
if (block != null)
|
||||
block.setJoules(0);
|
||||
for (BreakerGroupEnergy subGroup : CollectionUtils.makeNotNull(subGroups)) {
|
||||
subGroup.resetEnergy(_readTime, _tz);
|
||||
subGroup.resetEnergy(_readTime);
|
||||
}
|
||||
}
|
||||
|
||||
public void addEnergy(String _groupId, Date _readTime, double _joules, TimeZone _tz) {
|
||||
public void addEnergy(String _groupId, Date _readTime, double _joules) {
|
||||
if (NullUtils.isEqual(groupId, _groupId))
|
||||
getBlock(_readTime, _tz).addJoules(_joules);
|
||||
getBlock(_readTime).addJoules(_joules);
|
||||
else {
|
||||
for (BreakerGroupEnergy subGroup : CollectionUtils.makeNotNull(subGroups)) {
|
||||
subGroup.addEnergy(_groupId, _readTime, _joules, _tz);
|
||||
subGroup.addEnergy(_groupId, _readTime, _joules);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -134,9 +137,10 @@ public class BreakerGroupEnergy {
|
||||
energy.setAccountId(_group.getAccountId());
|
||||
energy.setViewMode(_viewMode);
|
||||
energy.setStart(_start);
|
||||
energy.setTimeZone(_tz);
|
||||
energy.setSubGroups(CollectionUtils.transform(_group.getSubGroups(), _g -> BreakerGroupEnergy.summary(_g, _energies, _viewMode, _start, _tz)));
|
||||
for (BreakerGroupSummary curEnergy : CollectionUtils.makeNotNull(_energies.get(_group.getId()))) {
|
||||
EnergyBlock block = energy.getBlock(curEnergy.getStart(), _tz);
|
||||
EnergyBlock block = energy.getBlock(curEnergy.getStart());
|
||||
block.addJoules(curEnergy.getJoules());
|
||||
energy.setToGrid(energy.getToGrid()+curEnergy.getToGrid());
|
||||
energy.setFromGrid(energy.getFromGrid()+curEnergy.getFromGrid());
|
||||
@@ -144,20 +148,20 @@ public class BreakerGroupEnergy {
|
||||
return energy;
|
||||
}
|
||||
|
||||
private EnergyBlock getBlock(Date _readTime, TimeZone _tz) {
|
||||
return getBlock(_readTime, _tz, true);
|
||||
private EnergyBlock getBlock(Date _readTime) {
|
||||
return getBlock(_readTime, true);
|
||||
}
|
||||
|
||||
private EnergyBlock getBlock(Date _readTime, TimeZone _tz, boolean _add) {
|
||||
private EnergyBlock getBlock(Date _readTime, boolean _add) {
|
||||
int size = CollectionUtils.size(energyBlocks);
|
||||
int idx = viewMode.blockIndex(_readTime, _tz);
|
||||
int idx = viewMode.blockIndex(_readTime, timezone);
|
||||
if (_add && (idx >= size)) {
|
||||
if (energyBlocks == null)
|
||||
energyBlocks = new ArrayList<>();
|
||||
LinkedList<EnergyBlock> newBlocks = new LinkedList<>();
|
||||
Date end = viewMode.toBlockEnd(_readTime, _tz);
|
||||
Date end = viewMode.toBlockEnd(_readTime, timezone);
|
||||
while (idx >= size) {
|
||||
Date start = viewMode.decrementBlock(end, _tz);
|
||||
Date start = viewMode.decrementBlock(end, timezone);
|
||||
newBlocks.add(new EnergyBlock(start, end, 0));
|
||||
end = start;
|
||||
size++;
|
||||
@@ -254,6 +258,14 @@ public class BreakerGroupEnergy {
|
||||
fromGrid = _fromGrid;
|
||||
}
|
||||
|
||||
public TimeZone getTimeZone() {
|
||||
return timezone;
|
||||
}
|
||||
|
||||
public void setTimeZone(TimeZone _timezone) {
|
||||
timezone = _timezone;
|
||||
}
|
||||
|
||||
public double wattHours() {
|
||||
return joules() / 3600;
|
||||
}
|
||||
|
||||
@@ -32,6 +32,7 @@ public class AccountSerializer extends AbstractDaoSerializer<Account>
|
||||
d.put("_id", String.valueOf(_o.getId()));
|
||||
d.put("username", _o.getUsername());
|
||||
d.put("password", _o.getPassword());
|
||||
d.put("timezone", _o.getTimezone());
|
||||
if (CollectionUtils.isNotEmpty(_o.getAuxiliaryAccountIds()))
|
||||
d.put("aux_account_ids", CollectionUtils.toByteArray(_o.getAuxiliaryAccountIds()));
|
||||
return d;
|
||||
@@ -44,6 +45,7 @@ public class AccountSerializer extends AbstractDaoSerializer<Account>
|
||||
o.setId(DaoSerializer.getInteger(_d, "_id"));
|
||||
o.setUsername(DaoSerializer.getString(_d, "username"));
|
||||
o.setPassword(DaoSerializer.getString(_d, "password"));
|
||||
o.setTimezone(DaoSerializer.getString(_d, "timezone"));
|
||||
o.setAuxiliaryAccountIds(CollectionUtils.fromByteArrayOfIntegers(DaoSerializer.getByteArray(_d, "aux_account_ids")));
|
||||
return o;
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@ import com.lanternsoftware.datamodel.currentmonitor.BreakerGroupEnergy;
|
||||
import com.lanternsoftware.datamodel.currentmonitor.EnergyBlock;
|
||||
import com.lanternsoftware.datamodel.currentmonitor.EnergyBlockViewMode;
|
||||
import com.lanternsoftware.util.CollectionUtils;
|
||||
import com.lanternsoftware.util.DateUtils;
|
||||
import com.lanternsoftware.util.dao.AbstractDaoSerializer;
|
||||
import com.lanternsoftware.util.dao.DaoEntity;
|
||||
import com.lanternsoftware.util.dao.DaoProxyType;
|
||||
@@ -41,10 +42,11 @@ public class BreakerGroupEnergySerializer extends AbstractDaoSerializer<BreakerG
|
||||
d.put("view_mode", DaoSerializer.toEnumName(_o.getViewMode()));
|
||||
d.put("start", DaoSerializer.toLong(_o.getStart()));
|
||||
d.put("sub_groups", DaoSerializer.toDaoEntities(_o.getSubGroups(), DaoProxyType.MONGO));
|
||||
TimeZone tz = DateUtils.defaultTimeZone(_o.getTimeZone());
|
||||
d.put("timezone", tz.getID());
|
||||
if (CollectionUtils.size(_o.getEnergyBlocks()) > 0) {
|
||||
Date start = _o.getStart();
|
||||
Date now = new Date();
|
||||
TimeZone tz = TimeZone.getTimeZone("America/Chicago");
|
||||
ByteBuffer bb = ByteBuffer.allocate(_o.getViewMode().blockCount(start, tz) * 4);
|
||||
for (EnergyBlock b : _o.getEnergyBlocks()) {
|
||||
if (b.getStart().before(start))
|
||||
@@ -71,7 +73,6 @@ public class BreakerGroupEnergySerializer extends AbstractDaoSerializer<BreakerG
|
||||
@Override
|
||||
public BreakerGroupEnergy fromDaoEntity(DaoEntity _d)
|
||||
{
|
||||
TimeZone tz = TimeZone.getTimeZone("America/Chicago");
|
||||
BreakerGroupEnergy o = new BreakerGroupEnergy();
|
||||
o.setGroupId(DaoSerializer.getString(_d, "group_id"));
|
||||
o.setAccountId(DaoSerializer.getInteger(_d, "account_id"));
|
||||
@@ -79,13 +80,14 @@ public class BreakerGroupEnergySerializer extends AbstractDaoSerializer<BreakerG
|
||||
o.setViewMode(DaoSerializer.getEnum(_d, "view_mode", EnergyBlockViewMode.class));
|
||||
o.setStart(DaoSerializer.getDate(_d, "start"));
|
||||
o.setSubGroups(DaoSerializer.getList(_d, "sub_groups", BreakerGroupEnergy.class));
|
||||
o.setTimeZone(DateUtils.fromTimeZoneId(DaoSerializer.getString(_d, "timezone")));
|
||||
List<EnergyBlock> blocks = new ArrayList<>();
|
||||
byte[] blockData = DaoSerializer.getByteArray(_d, "blocks");
|
||||
if (CollectionUtils.length(blockData) > 0) {
|
||||
ByteBuffer bb = ByteBuffer.wrap(blockData);
|
||||
Date start = o.getStart();
|
||||
while (bb.hasRemaining()) {
|
||||
EnergyBlock block = new EnergyBlock(start, o.getViewMode().toBlockEnd(start, tz), bb.getFloat());
|
||||
EnergyBlock block = new EnergyBlock(start, o.getViewMode().toBlockEnd(start, o.getTimeZone()), bb.getFloat());
|
||||
blocks.add(block);
|
||||
start = block.getEnd();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user