diff --git a/zwave/lantern-datamodel-zwave/src/main/java/com/lanternsoftware/datamodel/zwave/Switch.java b/zwave/lantern-datamodel-zwave/src/main/java/com/lanternsoftware/datamodel/zwave/Switch.java index 426911e..8cd6dd6 100644 --- a/zwave/lantern-datamodel-zwave/src/main/java/com/lanternsoftware/datamodel/zwave/Switch.java +++ b/zwave/lantern-datamodel-zwave/src/main/java/com/lanternsoftware/datamodel/zwave/Switch.java @@ -14,6 +14,7 @@ public class Switch { private String room; private String name; private int nodeId; + private int parentNodeId; private int level; private int gpioPin; private boolean primary; @@ -82,6 +83,14 @@ public class Switch { nodeId = _nodeId; } + public int getParentNodeId() { + return parentNodeId; + } + + public void setParentNodeId(int _parentNodeId) { + parentNodeId = _parentNodeId; + } + public int getLevel() { return level; } diff --git a/zwave/lantern-datamodel-zwave/src/main/java/com/lanternsoftware/datamodel/zwave/dao/SwitchSerializer.java b/zwave/lantern-datamodel-zwave/src/main/java/com/lanternsoftware/datamodel/zwave/dao/SwitchSerializer.java index e7075ab..3b197dd 100644 --- a/zwave/lantern-datamodel-zwave/src/main/java/com/lanternsoftware/datamodel/zwave/dao/SwitchSerializer.java +++ b/zwave/lantern-datamodel-zwave/src/main/java/com/lanternsoftware/datamodel/zwave/dao/SwitchSerializer.java @@ -32,6 +32,7 @@ public class SwitchSerializer extends AbstractDaoSerializer d.put("room", _o.getRoom()); d.put("name", _o.getName()); d.put("node_id", _o.getNodeId()); + d.put("parent_node_id", _o.getParentNodeId()); d.put("level", _o.getLevel()); d.put("gpio_pin", _o.getGpioPin()); d.put("primary", _o.isPrimary()); @@ -53,6 +54,7 @@ public class SwitchSerializer extends AbstractDaoSerializer o.setRoom(DaoSerializer.getString(_d, "room")); o.setName(DaoSerializer.getString(_d, "name")); o.setNodeId(DaoSerializer.getInteger(_d, "node_id")); + o.setParentNodeId(DaoSerializer.getInteger(_d, "parent_node_id")); o.setLevel(DaoSerializer.getInteger(_d, "level")); o.setGpioPin(DaoSerializer.getInteger(_d, "gpio_pin")); o.setPrimary(DaoSerializer.getBoolean(_d, "primary")); diff --git a/zwave/lantern-service-zwave/src/main/java/com/lanternsoftware/zwave/context/ZWaveApp.java b/zwave/lantern-service-zwave/src/main/java/com/lanternsoftware/zwave/context/ZWaveApp.java index bd76c8f..46f0c1d 100644 --- a/zwave/lantern-service-zwave/src/main/java/com/lanternsoftware/zwave/context/ZWaveApp.java +++ b/zwave/lantern-service-zwave/src/main/java/com/lanternsoftware/zwave/context/ZWaveApp.java @@ -129,7 +129,7 @@ public class ZWaveApp { if (CollectionUtils.anyQualify(mySwitches.values(), Switch::isThermometerUrlValid)) { timer.scheduleAtFixedRate(new ThermostatTask(), 0, 30000); } - if (CollectionUtils.anyQualify(mySwitches.values(), Switch::isRelay)) { + if (CollectionUtils.anyQualify(mySwitches.values(), _s->_s.isRelay() || _s.isRelayButton())) { relayController = new RelayController(); } List securitySwitches = CollectionUtils.filter(mySwitches.values(), Switch::isSecurity); @@ -314,13 +314,15 @@ public class ZWaveApp { } else if (sw.isZWaveThermostat()) { controller.send(new ThermostatSetPointSetRequest((byte) sw.getNodeId(), sw.getThermostatMode() == ThermostatMode.COOL ? ThermostatSetPointIndex.COOLING : ThermostatSetPointIndex.HEATING, _level)); } else if (sw.isRelay()) { - relayController.setRelay(sw.getGpioPin(), sw.getLevel() > 0); + relayController.setRelay(sw.getGpioPin(), sw.getLowLevel() > 0 ? sw.getLevel() == 0 : sw.getLevel() > 0); } else if (sw.isRelayButton()) { - relayController.setRelay(sw.getGpioPin(), true); + logger.info("Toggling relay " + sw.getFullDisplay() + " on"); + relayController.setRelay(sw.getGpioPin(), sw.getLowLevel() == 0); timer.schedule(new TimerTask() { @Override public void run() { - relayController.setRelay(sw.getGpioPin(), false); + logger.info("Toggling relay " + sw.getFullDisplay() + " off"); + relayController.setRelay(sw.getGpioPin(), sw.getLowLevel() > 0); } }, 250); } else { @@ -349,8 +351,12 @@ public class ZWaveApp { } public void updateSwitch(Switch _sw) { - switches.put(_sw.getNodeId(), _sw); - mySwitches.put(_sw.getNodeId(), _sw); + logger.info("Received update for switch {} level {}", _sw.getFullDisplay(), _sw.getLevel()); + Switch sw = CollectionUtils.filterOne(config.getSwitches(), _s->_s.getNodeId() == _sw.getNodeId()); + if (sw != null) { + sw.setLevel( _sw.getLevel()); + sw.setHold( _sw.isHold()); + } setSwitchLevel(_sw.getNodeId(), _sw.getLevel(), false); } @@ -435,7 +441,7 @@ public class ZWaveApp { } private void setGroupSwitchLevel(Switch _primary, int _level) { - if ((_primary == null) || !config.isMySwitch(_primary)) + if ((_primary == null) || !config.isMySwitch(_primary) || (controller == null)) return; List nodes = CollectionUtils.asArrayList(_primary); nodes.addAll(CollectionUtils.filter(peers.get(_primary.getNodeId()), _p->!_p.isPrimary()));