diff --git a/Hal.iml b/Hal.iml index feac8bfb..fafa66f7 100755 --- a/Hal.iml +++ b/Hal.iml @@ -15,6 +15,24 @@ + + + + + + + + + + + + + + + + + + @@ -25,15 +43,12 @@ - - - @@ -44,18 +59,5 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/external/Z-Stick_Gen5_Drivers.zip b/external/Z-Stick_Gen5_Drivers.zip new file mode 100644 index 00000000..c5b3356e Binary files /dev/null and b/external/Z-Stick_Gen5_Drivers.zip differ diff --git a/plugins/zwave/lib/netty-all-4.0.21.Final.jar b/plugins/zwave/lib/netty-all-4.0.21.Final.jar new file mode 100644 index 00000000..2c744616 Binary files /dev/null and b/plugins/zwave/lib/netty-all-4.0.21.Final.jar differ diff --git a/plugins/zwave/lib/netty-all-4.0.46.Final.jar b/plugins/zwave/lib/netty-all-4.0.46.Final.jar deleted file mode 100755 index f64cf415..00000000 Binary files a/plugins/zwave/lib/netty-all-4.0.46.Final.jar and /dev/null differ diff --git a/plugins/zwave/lib/wzwave-0.0.3.jar b/plugins/zwave/lib/wzwave-0.0.3.jar deleted file mode 100755 index 14a08703..00000000 Binary files a/plugins/zwave/lib/wzwave-0.0.3.jar and /dev/null differ diff --git a/plugins/zwave/src/com/whizzosoftware/wzwave/controller/netty/AbstractNettyChannelInitializer.java b/plugins/zwave/src/com/whizzosoftware/wzwave/controller/netty/AbstractNettyChannelInitializer.java index 7eafe4e2..11f17bee 100755 --- a/plugins/zwave/src/com/whizzosoftware/wzwave/controller/netty/AbstractNettyChannelInitializer.java +++ b/plugins/zwave/src/com/whizzosoftware/wzwave/controller/netty/AbstractNettyChannelInitializer.java @@ -50,11 +50,11 @@ abstract class AbstractNettyChannelInitializer extends Channe // Setup general channel handlers and coders channel.pipeline().addLast("decoder", new ZWaveFrameDecoder()); - channel.pipeline().addLast("ack", new AcknowledgementInboundHandler()); - channel.pipeline().addLast("transaction", new ZWaveDataFrameTransactionInboundHandler()); - channel.pipeline().addLast("handler", inboundHandler); + channel.pipeline().addLast("ack", new ACKInboundHandler()); channel.pipeline().addLast("encoder", new ZWaveFrameEncoder()); - channel.pipeline().addLast("writeQueue", new ZWaveQueuedOutboundHandler()); + channel.pipeline().addLast("writeQueue", new FrameQueueHandler()); + channel.pipeline().addLast("transaction", new TransactionInboundHandler()); + channel.pipeline().addLast("handler", inboundHandler); } diff --git a/plugins/zwave/src/com/whizzosoftware/wzwave/controller/netty/NettyZWaveController.java b/plugins/zwave/src/com/whizzosoftware/wzwave/controller/netty/NettyZWaveController.java index 66a96f1d..8305be1d 100755 --- a/plugins/zwave/src/com/whizzosoftware/wzwave/controller/netty/NettyZWaveController.java +++ b/plugins/zwave/src/com/whizzosoftware/wzwave/controller/netty/NettyZWaveController.java @@ -1,58 +1,111 @@ -/******************************************************************************* +/* + ******************************************************************************* * Copyright (c) 2013 Whizzo Software, LLC. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html - *******************************************************************************/ + ******************************************************************************* +*/ package com.whizzosoftware.wzwave.controller.netty; import com.whizzosoftware.wzwave.channel.*; -import com.whizzosoftware.wzwave.codec.ZWaveFrameDecoder; -import com.whizzosoftware.wzwave.codec.ZWaveFrameEncoder; +import com.whizzosoftware.wzwave.channel.event.*; +import com.whizzosoftware.wzwave.commandclass.WakeUpCommandClass; import com.whizzosoftware.wzwave.controller.ZWaveController; import com.whizzosoftware.wzwave.controller.ZWaveControllerContext; import com.whizzosoftware.wzwave.controller.ZWaveControllerListener; import com.whizzosoftware.wzwave.frame.*; import com.whizzosoftware.wzwave.node.*; +import com.whizzosoftware.wzwave.persist.PersistentStore; +import com.whizzosoftware.wzwave.persist.mapdb.MapDbPersistentStore; +import com.whizzosoftware.wzwave.util.ByteUtil; +import io.netty.bootstrap.Bootstrap; import io.netty.channel.ChannelFuture; import io.netty.channel.ChannelFutureListener; +import io.netty.channel.oio.OioEventLoopGroup; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.io.File; import java.util.*; /** * A Netty implementation of a ZWaveController. * + * The pipeline looks like this: + * + * I/O Request via Channel or + * ChannelHandlerContext + * | + * +----------------------------------------------------------------+-------------------+ + * | ChannelPipeline | | + * | | | + * | +--------------------------------+ | | + * | | ZWaveChannelInboundHandler | | | + * | +---------------+----------------+ | | + * | /|\ | | + * | | | | + * | +---------------+----------------+ | | + * | | TransactionInboundHandler | | | + * | +---------------+----------------+ | | + * | /|\ | | + * | | \|/ | + * | +---------------+-------------------------------------------+--------------+ | + * | | FrameQueueHandler | | + * | +---------------+-------------------------------------------+--------------+ | + * | /|\ | | + * | | | | + * | +---------------+----------------+ | | + * | | ACKInboundHandler | | | + * | +---------------+----------------+ | | + * | /|\ | | + * | | | | + * | +---------------+----------------+ +-------------+--------------+ | + * | | ZWaveFrameDecoder | | ZWaveFrameEncoder | | + * | +---------------+----------------+ +-------------+--------------+ | + * | /|\ | | + * +--------------------+-------------------------------------------+-------------------+ + * | | \|/ | + * +--------------------+-------------------------------------------+-------------------+ + * | | | | + * | [ Socket.read() ] [ Socket.write() ] | + * +------------------------------------------------------------------------------------+ + * * @author Dan Noguerol */ public class NettyZWaveController implements ZWaveController, ZWaveControllerContext, ZWaveControllerListener, ZWaveChannelListener, NodeListener { private static final Logger logger = LoggerFactory.getLogger(NettyZWaveController.class); + private String serialPort; + private PersistentStore store; private AbstractNettyChannelInitializer serial; private String libraryVersion; - private int homeId; - private byte nodeId; + private Integer homeId; + private Byte nodeId; private ZWaveControllerListener listener; - private final List nodes = new ArrayList(); - private final Map nodeMap = new HashMap(); + private final List nodes = new ArrayList<>(); + private final Map nodeMap = new HashMap<>(); - public NettyZWaveController(String serialPort) { - // Choose a available library - try{ - Class.forName("gnu.io.SerialPort"); // check if RxTx is available - logger.info("RxTx is available, using it as Serial port Com port library"); - serial = new NettyRxtxChannelInitializer(serialPort, this); - } catch (ClassNotFoundException e) { - try { - Class.forName("com.fazecast.jSerialComm.SerialPort"); // check if jSerialComm is available - logger.info("jSerialComm is available, using it as Serial port library"); - serial = new NettyJSCChannelInitializer(serialPort, this); - } catch (ClassNotFoundException e1) { - throw new RuntimeException("Unable to find Rxtx or jSerialComm lib in classpath", e); - } - } + /** + * Constructor. + * + * @param serialPort the serial port the Z-Wave controller is accessible from + * @param dataDirectory a directory in which to store persistent data + */ + public NettyZWaveController(String serialPort, File dataDirectory) { + this(serialPort, new MapDbPersistentStore(dataDirectory)); + } + + /** + * Constructor. + * + * @param serialPort the serial port for Z-Wave controller is accessible from + * @param store the persistent store to use for storing/retrieving node information + */ + public NettyZWaveController(String serialPort, PersistentStore store) { + this.serialPort = serialPort; + this.store = store; } /* @@ -65,18 +118,37 @@ public class NettyZWaveController implements ZWaveController, ZWaveControllerCon } public void start() { - serial.getBootstrap().connect(serial.getSocketAddress()).addListener(new ChannelFutureListener() { - @Override - public void operationComplete(ChannelFuture future) throws Exception { - if (future.isSuccess()) { - serial.getChannel().write(new Version()); - serial.getChannel().write(new MemoryGetId()); - serial.getChannel().write(new InitData()); - } else { - listener.onZWaveConnectionFailure(future.cause()); + if (serial == null) { + // Choose a available library + try{ + Class.forName("gnu.io.SerialPort"); // check if RxTx is available + logger.info("RxTx is available, using it as Serial port library"); + serial = new NettyRxtxChannelInitializer(serialPort, this); + } catch (ClassNotFoundException e) { + try { + Class.forName("com.fazecast.jSerialComm.SerialPort"); // check if jSerialComm is available + logger.info("jSerialComm is available, using it as Serial port library"); + serial = new NettyJSCChannelInitializer(serialPort, this); + } catch (ClassNotFoundException e1) { + throw new RuntimeException("Unable to find Rxtx or jSerialComm lib in classpath", e); } } - }); + + // set up Netty bootstrap + Bootstrap bootstrap = serial.getBootstrap(); + bootstrap.connect(serial.getSocketAddress()).addListener(new ChannelFutureListener() { + @Override + public void operationComplete(ChannelFuture future) throws Exception { + if (future.isSuccess()) { + sendDataFrame(new Version()); + sendDataFrame(new MemoryGetId()); + sendDataFrame(new InitData()); + } else { + onZWaveConnectionFailure(future.cause()); + } + } + }); + } } @Override @@ -105,8 +177,21 @@ public class NettyZWaveController implements ZWaveController, ZWaveControllerCon } @Override - public void sendDataFrame(DataFrame dataFrame) { - serial.getChannel().write(dataFrame); + public ZWaveNode getNode(byte nodeId) { + return nodeMap.get(nodeId); + } + + public void sendDataFrame(DataFrame frame) { + serial.getChannel().write(new OutboundDataFrame(frame, true)); + } + + public void sendDataFrame(DataFrame frame, boolean isListeningNode) { + serial.getChannel().write(new OutboundDataFrame(frame, isListeningNode)); + } + + @Override + public void sendEvent(Object e) { + serial.getChannel().write(e); } /* @@ -131,6 +216,65 @@ public class NettyZWaveController implements ZWaveController, ZWaveControllerCon public void onZWaveConnectionFailure(Throwable t) { if (listener != null) { listener.onZWaveConnectionFailure(t); + } else { + logger.error("Connection failure and no listener was set", t); + } + } + + @Override + public void onZWaveControllerInfo(String libraryVersion, Integer homeId, Byte nodeId) { + if (listener != null && libraryVersion != null && homeId != null && nodeId != null) { + listener.onZWaveControllerInfo(libraryVersion, homeId, nodeId); + } + } + + @Override + public void onZWaveInclusionStarted() { + if (listener != null) { + listener.onZWaveInclusionStarted(); + } + } + + @Override + public void onZWaveInclusion(NodeInfo nodeInfo, boolean success) { + try { + logger.trace("Inclusion of new node {}", ByteUtil.createString(nodeInfo.getNodeId())); + ZWaveNode node = ZWaveNodeFactory.createNode(nodeInfo, !nodeInfo.hasCommandClass(WakeUpCommandClass.ID), this); + logger.trace("Created new node [{}]: {}", node.getNodeId(), node); + addNode(node); + if (listener != null) { + listener.onZWaveInclusion(nodeInfo, success); + } + } catch (NodeCreationException e) { + logger.error("Unable to create node", e); + } + } + + @Override + public void onZWaveInclusionStopped() { + if (listener != null) { + listener.onZWaveInclusionStopped(); + } + } + + @Override + public void onZWaveExclusionStarted() { + if (listener != null) { + listener.onZWaveExclusionStarted(); + } + } + + @Override + public void onZWaveExclusion(NodeInfo nodeInfo, boolean success) { + if (listener != null) { + listener.onZWaveExclusion(nodeInfo, success); + } + } + + @Override + public void onZWaveExclusionStopped() { + if (listener != null) { + listener.onZWaveExclusionStopped(); } } @@ -141,48 +285,58 @@ public class NettyZWaveController implements ZWaveController, ZWaveControllerCon @Override public void onLibraryInfo(String libraryVersion) { this.libraryVersion = libraryVersion; + onZWaveControllerInfo(libraryVersion, homeId, nodeId); } @Override public void onControllerInfo(int homeId, byte nodeId) { this.homeId = homeId; this.nodeId = nodeId; + onZWaveControllerInfo(libraryVersion, homeId, nodeId); } @Override - public void onNodeProtocolInfo(byte nodeId, NodeProtocolInfo nodeProtocolInfo) { + public void onNodeProtocolInfo(byte nodeId, NodeProtocolInfo npi) { try { - logger.trace("Received protocol info for node " + nodeId); - ZWaveNode node = ZWaveNodeFactory.createNode(this, nodeId, nodeProtocolInfo, this); - logger.trace("Created node [" + node.getNodeId() + "]: " + node); - nodes.add(node); - nodeMap.put(node.getNodeId(), node); + logger.trace("Received protocol info for node {}", nodeId); + ZWaveNode node = store.getNode(nodeId, this); + if (node == null || !node.matchesNodeProtocolInfo(npi)) { + node = ZWaveNodeFactory.createNode( + new NodeInfo(nodeId, npi.getBasicDeviceClass(), npi.getGenericDeviceClass(), npi.getSpecificDeviceClass()), + npi.isListening(), + this + ); + logger.trace("Created new node: {}: {}", nodeId, node); + } else { + logger.debug("Node[{}] matches persistent node information; no need to interview", nodeId); + } + addNode(node); } catch (NodeCreationException e) { logger.error("Unable to create node", e); } } - @Override - public void onSendData(SendData sendData) { - byte nodeId = sendData.getNodeId(); - ZWaveNode node = nodeMap.get(nodeId); - if (node != null) { - node.onDataFrameReceived(this, sendData); - } else { - logger.error("Unable to find node " + nodeId); + private void addNode(ZWaveNode node) { + ZWaveNode n = nodeMap.get(node.getNodeId()); + if (n != null) { + nodes.remove(n); + nodeMap.remove(node.getNodeId()); } + nodes.add(node); + nodeMap.put(node.getNodeId(), node); + node.startInterview(this); } @Override public void onApplicationCommand(ApplicationCommand applicationCommand) { ZWaveNode node = nodeMap.get(applicationCommand.getNodeId()); if (node != null) { - node.onDataFrameReceived(this, applicationCommand); - if (listener != null && node.isStarted()) { - listener.onZWaveNodeUpdated(node); + node.onApplicationCommand(this, applicationCommand); + if (node.isStarted()) { + onZWaveNodeUpdated(node); } } else { - logger.error("Unable to find node " + applicationCommand.getNodeId()); + logger.error("Unable to find node: {}", nodeId); } } @@ -197,55 +351,117 @@ public class NettyZWaveController implements ZWaveController, ZWaveControllerCon if (nodeId != null) { ZWaveNode node = nodeMap.get(nodeId); if (node != null) { - node.onDataFrameReceived(this, applicationUpdate); - if (listener != null && node.isStarted()) { - listener.onZWaveNodeUpdated(node); + node.onApplicationUpdate(this, applicationUpdate); + if (node.isStarted()) { + onZWaveNodeUpdated(node); } } else { - logger.error("Unable to find node " + applicationUpdate.getNodeId()); + logger.error("Unable to find node: {}", nodeId); } } else { logger.error("Unable to determine node to route ApplicationUpdate to"); } } + @Override + public void onTransactionStarted(TransactionStartedEvent evt) { + logger.trace("Detected start of new transaction: {}", evt.getId()); + serial.getChannel().write(evt); + } + + @Override + public void onTransactionComplete(TransactionCompletedEvent evt) { + logger.trace("Detected end of transaction: {}", evt.getId()); + if (evt instanceof SendDataTransactionCompletedEvent) { + ZWaveNode node = nodeMap.get(evt.getNodeId()); + if (node != null) { + node.onSendDataCallback(this, true); + } else { + logger.error("Unable to find node: {}", evt.getNodeId()); + } + } + serial.getChannel().write(evt); + } + + @Override + public void onTransactionFailed(TransactionFailedEvent evt) { + logger.trace("Detected transaction failure: {}", evt.getId()); + if (evt instanceof SendDataTransactionFailedEvent) { + ZWaveNode node = nodeMap.get(evt.getNodeId()); + if (node != null) { + node.onSendDataCallback(this, ((SendDataTransactionFailedEvent)evt).isTargetNodeACKReceived()); + } else { + logger.error("Unable to find node: {}", evt.getNodeId()); + } + } + serial.getChannel().write(evt); + } + + @Override + public void onAddNodeToNetwork(AddNodeToNetwork update) { + if (listener != null) { + switch (update.getStatus()) { + case AddNodeToNetwork.ADD_NODE_STATUS_LEARN_READY: + onZWaveInclusionStarted(); + break; + case AddNodeToNetwork.ADD_NODE_STATUS_DONE: + onZWaveInclusionStopped(); + break; + case AddNodeToNetwork.ADD_NODE_STATUS_ADDING_CONTROLLER: + case AddNodeToNetwork.ADD_NODE_STATUS_ADDING_SLAVE: + onZWaveInclusion(update.getNodeInfo(), true); + break; + case AddNodeToNetwork.ADD_NODE_STATUS_FAILED: + onZWaveInclusion(update.getNodeInfo(), false); + break; + default: + logger.debug("Received unexpected status from AddNodeToNetwork frame: {}", update.getStatus()); + } + } + } + + @Override + public void onRemoveNodeFromNetwork(RemoveNodeFromNetwork update) { + if (listener != null) { + switch (update.getStatus()) { + case RemoveNodeFromNetwork.REMOVE_NODE_STATUS_LEARN_READY: + onZWaveExclusionStarted(); + break; + case RemoveNodeFromNetwork.REMOVE_NODE_STATUS_DONE: + onZWaveExclusionStopped(); + break; + case RemoveNodeFromNetwork.REMOVE_NODE_STATUS_NODE_FOUND: + logger.debug("A node has been found that wants to be excluded: {}", ByteUtil.createString(update.getSource())); + break; + case RemoveNodeFromNetwork.REMOVE_NODE_STATUS_REMOVING_CONTROLLER: + case RemoveNodeFromNetwork.REMOVE_NODE_STATUS_REMOVING_SLAVE: + onZWaveExclusion(update.getNodeInfo(), true); + break; + case RemoveNodeFromNetwork.REMOVE_NODE_STATUS_FAILED: + onZWaveExclusion(update.getNodeInfo(), false); + break; + default: + logger.debug("Received unexpected status from RemoveNodeFromNetwork frame: {}", update.getStatus()); + } + } + } + + @Override + public void onSetDefault() { + logger.info("Z-Wave controller has been reset to factory default"); + } + /* * NodeListener methods */ @Override public void onNodeStarted(ZWaveNode node) { + // save the newly started node + logger.debug("Saving information for node {}", node.getNodeId()); + store.saveNode(node); + // when a node moves to the "started" state, alert listeners that it's ready to be added - if (listener != null) { - listener.onZWaveNodeAdded(node); - } - } - - /* - * Test main - */ - - public static void main(String[] args) throws Exception { - NettyZWaveController c = new NettyZWaveController("/dev/cu.SLAB_USBtoUART"); - ZWaveControllerListener listener = new ZWaveControllerListener() { - @Override - public void onZWaveNodeAdded(ZWaveEndpoint node) { - System.out.println("onZWaveNodeAdded: " + node); - } - - @Override - public void onZWaveNodeUpdated(ZWaveEndpoint node) { - System.out.println("onZWaveNodeUpdated: " + node); - } - - @Override - public void onZWaveConnectionFailure(Throwable t) { - System.out.println("A connection error occurred: " + t.getLocalizedMessage()); - } - }; - c.setListener(listener); - c.start(); - - Thread.sleep(10000); + onZWaveNodeAdded(node); } } diff --git a/plugins/zwave/src/io/netty/channel/jsc/DefaultJSCChannelConfig.java b/plugins/zwave/src/io/netty/channel/jsc/DefaultJSCChannelConfig.java index 8f3680b8..acc5693f 100755 --- a/plugins/zwave/src/io/netty/channel/jsc/DefaultJSCChannelConfig.java +++ b/plugins/zwave/src/io/netty/channel/jsc/DefaultJSCChannelConfig.java @@ -24,7 +24,6 @@ import io.netty.channel.RecvByteBufAllocator; import java.util.Map; import static io.netty.channel.jsc.JSCChannelOption.*; -import static io.netty.channel.rxtx.RxtxChannelOption.WAIT_TIME; /** * Default configuration class for jSerialComm device connections. @@ -52,24 +51,18 @@ final class DefaultJSCChannelConfig extends DefaultChannelConfig implements JSCC @SuppressWarnings("unchecked") @Override public T getOption(ChannelOption option) { - if (option == BAUD_RATE) { + if (option == BAUD_RATE) return (T) Integer.valueOf(getBaudrate()); - } - if (option == STOP_BITS) { + else if (option == STOP_BITS) return (T) getStopbits(); - } - if (option == DATA_BITS) { + else if (option == DATA_BITS) return (T) Integer.valueOf(getDatabits()); - } - if (option == PARITY_BIT) { + else if (option == PARITY_BIT) return (T) getParitybit(); - } - if (option == WAIT_TIME) { + else if (option == WAIT_TIME) return (T) Integer.valueOf(getWaitTimeMillis()); - } - if (option == READ_TIMEOUT) { + else if (option == READ_TIMEOUT) return (T) Integer.valueOf(getReadTimeout()); - } return super.getOption(option); } diff --git a/plugins/zwave/src/io/netty/channel/jsc/JSCChannelOption.java b/plugins/zwave/src/io/netty/channel/jsc/JSCChannelOption.java index e31f5fb6..547dc91f 100755 --- a/plugins/zwave/src/io/netty/channel/jsc/JSCChannelOption.java +++ b/plugins/zwave/src/io/netty/channel/jsc/JSCChannelOption.java @@ -30,7 +30,7 @@ public final class JSCChannelOption extends ChannelOption { public static final ChannelOption STOP_BITS = valueOf("STOP_BITS"); public static final ChannelOption DATA_BITS = valueOf("DATA_BITS"); public static final ChannelOption PARITY_BIT = valueOf("PARITY_BIT"); - public static final ChannelOption WAIT_TIME = valueOf("WITE_TIMEOUT"); + public static final ChannelOption WAIT_TIME = valueOf("WAIT_TIME"); public static final ChannelOption READ_TIMEOUT = valueOf("READ_TIMEOUT"); @SuppressWarnings({ "unused", "deprecation" }) diff --git a/plugins/zwave/src/se/hal/plugin/zwave/HalZWaveController.java b/plugins/zwave/src/se/hal/plugin/zwave/HalZWaveController.java index fab16c43..cb2a4eef 100755 --- a/plugins/zwave/src/se/hal/plugin/zwave/HalZWaveController.java +++ b/plugins/zwave/src/se/hal/plugin/zwave/HalZWaveController.java @@ -3,26 +3,87 @@ package se.hal.plugin.zwave; import com.whizzosoftware.wzwave.controller.ZWaveController; import com.whizzosoftware.wzwave.controller.ZWaveControllerListener; import com.whizzosoftware.wzwave.controller.netty.NettyZWaveController; +import com.whizzosoftware.wzwave.node.NodeInfo; import com.whizzosoftware.wzwave.node.ZWaveEndpoint; +import com.whizzosoftware.wzwave.persist.HashMapPersistentStore; import se.hal.HalContext; import se.hal.intf.*; +import java.io.IOException; + /** * */ -public class HalZWaveController implements HalSensorController, HalEventController, HalAutoScannableController, ZWaveControllerListener { +public class HalZWaveController implements HalSensorController, HalEventController, HalAutoScannableController { private ZWaveController controller; + public static void main(String[] args) throws IOException { + NettyZWaveController zwave = new NettyZWaveController("COM5", new HashMapPersistentStore()); + zwave.setListener(new ZWaveControllerListener(){ + @Override + public void onZWaveNodeAdded(ZWaveEndpoint node) { + System.out.println("onZWaveNodeAdded: "+ node); + } + + @Override + public void onZWaveNodeUpdated(ZWaveEndpoint node) { + System.out.println("onZWaveNodeUpdated: "+ node); + } + + @Override + public void onZWaveConnectionFailure(Throwable t) { + System.out.println("onZWaveConnectionFailure: "+ t); + } + + @Override + public void onZWaveControllerInfo(String libraryVersion, Integer homeId, Byte nodeId) { + System.out.println("onZWaveControllerInfo: "+ libraryVersion+" "+homeId+" "+nodeId); + } + + @Override + public void onZWaveInclusionStarted() { + System.out.println("onZWaveInclusionStarted"); + } + + @Override + public void onZWaveInclusion(NodeInfo nodeInfo, boolean success) { + System.out.println("onZWaveInclusion: "+ nodeInfo + " "+success); + } + + @Override + public void onZWaveInclusionStopped() { + System.out.println("onZWaveInclusionStopped"); + } + + @Override + public void onZWaveExclusionStarted() { + System.out.println("onZWaveExclusionStarted"); + } + + @Override + public void onZWaveExclusion(NodeInfo nodeInfo, boolean success) { + System.out.println("onZWaveExclusion: "+ nodeInfo + " "+success); + } + + @Override + public void onZWaveExclusionStopped() { + System.out.println("onZWaveExclusionStopped"); + } + }); + zwave.start(); + } + + @Override public boolean isAvailable() { return HalContext.getStringProperty("zwave.com_port") != null; } @Override public void initialize() throws Exception { - controller = new NettyZWaveController(HalContext.getStringProperty("zwave.com_port")); - controller.setListener(this); + //controller = new NettyZWaveController(HalContext.getStringProperty("zwave.com_port")); + //controller.setListener(this); controller.start(); } @@ -34,20 +95,6 @@ public class HalZWaveController implements HalSensorController, HalEventControll ////////////// Z-WAVE CODE //////////////////////// - @Override - public void onZWaveNodeAdded(ZWaveEndpoint zWaveEndpoint) { - - } - - @Override - public void onZWaveNodeUpdated(ZWaveEndpoint zWaveEndpoint) { - - } - - @Override - public void onZWaveConnectionFailure(Throwable throwable) { - - } ////////////// HAL CODE ////////////////////////