mirror of
https://github.com/zyphlar/LanternPowerMonitor.git
synced 2024-03-08 14:07:47 +00:00
Add billing rates and track cost for all energy readings.
This commit is contained in:
@@ -20,6 +20,7 @@ public class Switch {
|
||||
private boolean primary;
|
||||
private boolean hold;
|
||||
private boolean hidden;
|
||||
private boolean suppressEvents;
|
||||
private String thermometerUrl;
|
||||
private String controllerUrl;
|
||||
private ThermostatMode thermostatMode;
|
||||
@@ -199,6 +200,14 @@ public class Switch {
|
||||
hidden = _hidden;
|
||||
}
|
||||
|
||||
public boolean isSuppressEvents() {
|
||||
return suppressEvents;
|
||||
}
|
||||
|
||||
public void setSuppressEvents(boolean _suppressEvents) {
|
||||
suppressEvents = _suppressEvents;
|
||||
}
|
||||
|
||||
public List<SwitchSchedule> getSchedule() {
|
||||
return schedule;
|
||||
}
|
||||
|
||||
@@ -38,6 +38,7 @@ public class SwitchSerializer extends AbstractDaoSerializer<Switch>
|
||||
d.put("primary", _o.isPrimary());
|
||||
d.put("hold", _o.isHold());
|
||||
d.put("hidden", _o.isHidden());
|
||||
d.put("suppress_events", _o.isSuppressEvents());
|
||||
d.put("thermometer_url", _o.getThermometerUrl());
|
||||
d.put("controller_url", _o.getControllerUrl());
|
||||
d.put("thermostat_mode", DaoSerializer.toEnumName(_o.getThermostatMode()));
|
||||
@@ -60,6 +61,7 @@ public class SwitchSerializer extends AbstractDaoSerializer<Switch>
|
||||
o.setPrimary(DaoSerializer.getBoolean(_d, "primary"));
|
||||
o.setHold(DaoSerializer.getBoolean(_d, "hold"));
|
||||
o.setHidden(DaoSerializer.getBoolean(_d, "hidden"));
|
||||
o.setSuppressEvents(DaoSerializer.getBoolean(_d, "suppress_events"));
|
||||
o.setThermometerUrl(DaoSerializer.getString(_d, "thermometer_url"));
|
||||
o.setControllerUrl(DaoSerializer.getString(_d, "controller_url"));
|
||||
o.setThermostatMode(DaoSerializer.getEnum(_d, "thermostat_mode", ThermostatMode.class));
|
||||
|
||||
@@ -286,7 +286,7 @@ public class ZWaveApp {
|
||||
}
|
||||
|
||||
public void fireSwitchLevelEvent(Switch _sw) {
|
||||
if (NullUtils.isEmpty(config.getRulesUrl()))
|
||||
if (NullUtils.isEmpty(config.getRulesUrl()) || _sw.isSuppressEvents())
|
||||
return;
|
||||
Event event = new Event();
|
||||
event.setEventDescription(_sw.getFullDisplay() + " set to " + _sw.getLevel());
|
||||
@@ -325,7 +325,7 @@ public class ZWaveApp {
|
||||
relayController.setRelay(sw.getGpioPin(), sw.getLowLevel() > 0);
|
||||
}
|
||||
}, 250);
|
||||
} else {
|
||||
} else if (!sw.isSecurity()){
|
||||
setGroupSwitchLevel(sw, _level);
|
||||
}
|
||||
}
|
||||
@@ -351,7 +351,7 @@ public class ZWaveApp {
|
||||
}
|
||||
|
||||
public void updateSwitch(Switch _sw) {
|
||||
logger.info("Received update for switch {} level {}", _sw.getFullDisplay(), _sw.getLevel());
|
||||
logger.info("Received update for switch {} {} level {}", _sw.getNodeId(), _sw.getFullDisplay(), _sw.getLevel());
|
||||
Switch sw = CollectionUtils.filterOne(config.getSwitches(), _s->_s.getNodeId() == _sw.getNodeId());
|
||||
if (sw != null) {
|
||||
sw.setLevel( _sw.getLevel());
|
||||
@@ -395,6 +395,7 @@ public class ZWaveApp {
|
||||
peers.remove(config.getUrl());
|
||||
for (String peer : peers) {
|
||||
for (Switch sw : modified) {
|
||||
logger.info("Sending update for switch {} {} level {} to {}", sw.getNodeId(), sw.getFullDisplay(), sw.getLevel(), peer);
|
||||
HttpPost post = new HttpPost(peer + "/switch/" + sw.getNodeId());
|
||||
post.setHeader("auth_code", authCode);
|
||||
post.setEntity(new ByteArrayEntity(DaoSerializer.toZipBson(sw)));
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package com.lanternsoftware.zwave.security;
|
||||
|
||||
import com.lanternsoftware.datamodel.zwave.Switch;
|
||||
import com.lanternsoftware.util.concurrency.ConcurrencyUtils;
|
||||
import com.pi4j.io.gpio.GpioFactory;
|
||||
import com.pi4j.io.gpio.GpioPinDigitalInput;
|
||||
import com.pi4j.io.gpio.PinPullResistance;
|
||||
@@ -11,11 +12,16 @@ import org.slf4j.LoggerFactory;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
|
||||
public class SecurityController {
|
||||
protected static final Logger LOG = LoggerFactory.getLogger(SecurityController.class);
|
||||
|
||||
private final Map<Integer, GpioPinDigitalInput> pins = new HashMap<>();
|
||||
private final Map<Integer, Boolean> pinEvents = new HashMap<>();
|
||||
private final ExecutorService executor = Executors.newFixedThreadPool(2);
|
||||
private int eventIdx = 0;
|
||||
|
||||
public boolean isOpen(int _pin) {
|
||||
GpioPinDigitalInput pin = getPin(_pin);
|
||||
@@ -25,7 +31,24 @@ public class SecurityController {
|
||||
public void listen(Switch _sw, SecurityListener _listener) {
|
||||
GpioPinDigitalInput pin = getPin(_sw.getGpioPin());
|
||||
if (pin != null)
|
||||
pin.addListener((GpioPinListenerDigital) _event -> _listener.onStateChanged(_sw.getNodeId(), _event.getState().isHigh()));
|
||||
pin.addListener((GpioPinListenerDigital) _event -> {
|
||||
synchronized (pinEvents) {
|
||||
eventIdx++;
|
||||
LOG.info("state change from gpio, event {} pin {} to {}", eventIdx, _sw.getGpioPin(), _event.getState().isHigh());
|
||||
pinEvents.put(_sw.getGpioPin(), _event.getState().isHigh());
|
||||
}
|
||||
executor.submit(()->{
|
||||
ConcurrencyUtils.sleep(500);
|
||||
Boolean high;
|
||||
synchronized (pinEvents) {
|
||||
high = pinEvents.remove(_sw.getGpioPin());
|
||||
}
|
||||
LOG.info("handling event {} pin {} most recent event is {}", eventIdx, _sw.getGpioPin(), high);
|
||||
if (high == null)
|
||||
return;
|
||||
_listener.onStateChanged(_sw.getNodeId(), high);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
private GpioPinDigitalInput getPin(int _pin) {
|
||||
@@ -47,6 +70,7 @@ public class SecurityController {
|
||||
pin.removeAllListeners();
|
||||
}
|
||||
pins.clear();
|
||||
executor.shutdownNow();
|
||||
GpioFactory.getInstance().shutdown();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user