From ce024942f554857100ff4722da8e0afb27a5b5bb Mon Sep 17 00:00:00 2001 From: Poundex Date: Wed, 4 Apr 2018 21:13:36 +0100 Subject: [PATCH 1/2] Add basic device --- .../wzwave/node/ZWaveNodeFactory.java | 7 +++ .../node/generic/PortableSceneController.java | 47 +++++++++++++++++++ .../wzwave/node/ZWaveNodeFactoryTest.java | 7 ++- 3 files changed, 57 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/whizzosoftware/wzwave/node/generic/PortableSceneController.java diff --git a/src/main/java/com/whizzosoftware/wzwave/node/ZWaveNodeFactory.java b/src/main/java/com/whizzosoftware/wzwave/node/ZWaveNodeFactory.java index 4c6bea4..02d308f 100644 --- a/src/main/java/com/whizzosoftware/wzwave/node/ZWaveNodeFactory.java +++ b/src/main/java/com/whizzosoftware/wzwave/node/ZWaveNodeFactory.java @@ -106,6 +106,13 @@ public static ZWaveNode createNode(NodeInfo info, boolean listening, NodeListene } } + case PortableSceneController.ID: { + switch (info.getSpecificDeviceClass()) { + default: + return new PortableSceneController(info, listening, listener); + } + } + default: throw new NodeCreationException("Unable to create node " + info.getNodeId() + " due to unknown generic device class: " + ByteUtil.createString(info.getGenericDeviceClass())); } diff --git a/src/main/java/com/whizzosoftware/wzwave/node/generic/PortableSceneController.java b/src/main/java/com/whizzosoftware/wzwave/node/generic/PortableSceneController.java new file mode 100644 index 0000000..07f6511 --- /dev/null +++ b/src/main/java/com/whizzosoftware/wzwave/node/generic/PortableSceneController.java @@ -0,0 +1,47 @@ +/* + ******************************************************************************* + * 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.node.generic; + +import com.whizzosoftware.wzwave.commandclass.BasicCommandClass; +import com.whizzosoftware.wzwave.commandclass.CommandClass; +import com.whizzosoftware.wzwave.commandclass.VersionCommandClass; +import com.whizzosoftware.wzwave.node.NodeInfo; +import com.whizzosoftware.wzwave.node.NodeListener; +import com.whizzosoftware.wzwave.node.ZWaveNode; +import com.whizzosoftware.wzwave.persist.PersistenceContext; + + +public class PortableSceneController extends ZWaveNode { + public static final byte ID = 0x01; + + private Byte value = null; + + public PortableSceneController(NodeInfo info, boolean listening, NodeListener listener) { + super(info, listening, listener); + + addCommandClass(BasicCommandClass.ID, new BasicCommandClass()); + addCommandClass(VersionCommandClass.ID, new VersionCommandClass()); + } + + public PortableSceneController(PersistenceContext pctx, Byte nodeId, NodeListener listener) { + super(pctx, nodeId, listener); + } + + public Byte getValue() { + return value; + } + + public CommandClass getCommandClass(byte commandClassId) { + return super.getCommandClass(commandClassId); + } + + @Override + protected void refresh(boolean deferIfNotListening) { } +} diff --git a/src/test/java/com/whizzosoftware/wzwave/node/ZWaveNodeFactoryTest.java b/src/test/java/com/whizzosoftware/wzwave/node/ZWaveNodeFactoryTest.java index 4cf4f30..8258005 100644 --- a/src/test/java/com/whizzosoftware/wzwave/node/ZWaveNodeFactoryTest.java +++ b/src/test/java/com/whizzosoftware/wzwave/node/ZWaveNodeFactoryTest.java @@ -4,10 +4,7 @@ import com.whizzosoftware.wzwave.commandclass.BinarySwitchCommandClass; import com.whizzosoftware.wzwave.commandclass.CommandClass; import com.whizzosoftware.wzwave.commandclass.NoOperationCommandClass; -import com.whizzosoftware.wzwave.node.generic.BinarySensor; -import com.whizzosoftware.wzwave.node.generic.BinarySwitch; -import com.whizzosoftware.wzwave.node.generic.MultilevelSwitch; -import com.whizzosoftware.wzwave.node.generic.StaticController; +import com.whizzosoftware.wzwave.node.generic.*; import com.whizzosoftware.wzwave.node.specific.BinaryPowerSwitch; import com.whizzosoftware.wzwave.node.specific.MultilevelPowerSwitch; import com.whizzosoftware.wzwave.node.specific.PCController; @@ -31,6 +28,8 @@ public void testCreateDiscoveredNode() throws Exception { assertTrue(ZWaveNodeFactory.createNode(new NodeInfo((byte)0x01, (byte) 0x00, MultilevelSwitch.ID, (byte)0x00), false, null) instanceof MultilevelSwitch); assertTrue(ZWaveNodeFactory.createNode(new NodeInfo((byte)0x01, (byte) 0x00, MultilevelSwitch.ID, MultilevelPowerSwitch.ID), false, null) instanceof MultilevelPowerSwitch); + + assertTrue(ZWaveNodeFactory.createNode(new NodeInfo((byte)0x01, (byte)0x00, PortableSceneController.ID, (byte)0x02), false, null) instanceof PortableSceneController); } @Test From cfc124d532e00d6fac997bb1bfd6924570d7ecf3 Mon Sep 17 00:00:00 2001 From: Poundex Date: Wed, 4 Apr 2018 23:22:37 +0100 Subject: [PATCH 2/2] Add command class for scene controller --- .../CentralSceneCommandClass.java | 89 +++++++++++++++++++ .../node/generic/PortableSceneController.java | 12 +-- .../CentralSceneCommandClassTest.java | 38 ++++++++ 3 files changed, 130 insertions(+), 9 deletions(-) create mode 100644 src/main/java/com/whizzosoftware/wzwave/commandclass/CentralSceneCommandClass.java create mode 100644 src/test/java/com/whizzosoftware/wzwave/commandclass/CentralSceneCommandClassTest.java diff --git a/src/main/java/com/whizzosoftware/wzwave/commandclass/CentralSceneCommandClass.java b/src/main/java/com/whizzosoftware/wzwave/commandclass/CentralSceneCommandClass.java new file mode 100644 index 0000000..8907f6d --- /dev/null +++ b/src/main/java/com/whizzosoftware/wzwave/commandclass/CentralSceneCommandClass.java @@ -0,0 +1,89 @@ +package com.whizzosoftware.wzwave.commandclass; + +import com.whizzosoftware.wzwave.node.NodeContext; +import com.whizzosoftware.wzwave.util.ByteUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class CentralSceneCommandClass extends CommandClass { + private final Logger logger = LoggerFactory.getLogger(getClass()); + + public static final byte ID = 0x5B; + public static final byte CENTRAL_SCENE_NOTIFICATION = 0x03; + + private Integer sequenceNumber; + private Integer sceneNumber; + private SceneCommand sceneCommand; + private Integer pushCount; + private Boolean slowRefresh; + + @Override + public byte getId() { + return ID; + } + + @Override + public String getName() { + return "COMMAND_CLASS_CENTRAL_SCENE"; + } + + @Override + public void onApplicationCommand(NodeContext context, byte[] ccb, int startIndex) { + if(ccb[startIndex + 1] != CENTRAL_SCENE_NOTIFICATION) { + logger.warn("Ignoring unsupported command: {}", ByteUtil.createString(ccb[startIndex + 1])); + return; + } + switch(getVersion()) { + case 3: + slowRefresh = (ccb[startIndex + 3] & 0x80) == 0x80; + case 1: + case 2: + sequenceNumber = (int) ccb[startIndex + 2]; + sceneNumber = (int) ccb[startIndex + 4]; + int attributes = ccb[3] & 0x07; + switch(attributes) { + case 0x01: + sceneCommand = SceneCommand.RELEASED_AFTER_HOLD; + pushCount = null; + break; + case 0x02: + sceneCommand = SceneCommand.BEING_HELD; + pushCount = null; + break; + default: + sceneCommand = SceneCommand.PUSHED; + pushCount = attributes == 0x00 ? 1 : attributes - 1; + break; + } + } + } + + @Override + public int queueStartupMessages(NodeContext context, byte nodeId) { + return 0; + } + + public Integer getSequenceNumber() { + return sequenceNumber; + } + + public Integer getSceneNumber() { + return sceneNumber; + } + + public SceneCommand getSceneCommand() { + return sceneCommand; + } + + public Integer getPushCount() { + return pushCount; + } + + public Boolean getSlowRefresh() { + return slowRefresh; + } + + public enum SceneCommand { + PUSHED, BEING_HELD, RELEASED_AFTER_HOLD + } +} diff --git a/src/main/java/com/whizzosoftware/wzwave/node/generic/PortableSceneController.java b/src/main/java/com/whizzosoftware/wzwave/node/generic/PortableSceneController.java index 07f6511..80099b1 100644 --- a/src/main/java/com/whizzosoftware/wzwave/node/generic/PortableSceneController.java +++ b/src/main/java/com/whizzosoftware/wzwave/node/generic/PortableSceneController.java @@ -9,9 +9,7 @@ */ package com.whizzosoftware.wzwave.node.generic; -import com.whizzosoftware.wzwave.commandclass.BasicCommandClass; -import com.whizzosoftware.wzwave.commandclass.CommandClass; -import com.whizzosoftware.wzwave.commandclass.VersionCommandClass; +import com.whizzosoftware.wzwave.commandclass.*; import com.whizzosoftware.wzwave.node.NodeInfo; import com.whizzosoftware.wzwave.node.NodeListener; import com.whizzosoftware.wzwave.node.ZWaveNode; @@ -21,23 +19,19 @@ public class PortableSceneController extends ZWaveNode { public static final byte ID = 0x01; - private Byte value = null; - public PortableSceneController(NodeInfo info, boolean listening, NodeListener listener) { super(info, listening, listener); addCommandClass(BasicCommandClass.ID, new BasicCommandClass()); addCommandClass(VersionCommandClass.ID, new VersionCommandClass()); + addCommandClass(BatteryCommandClass.ID, new BatteryCommandClass()); + addCommandClass(CentralSceneCommandClass.ID, new CentralSceneCommandClass()); } public PortableSceneController(PersistenceContext pctx, Byte nodeId, NodeListener listener) { super(pctx, nodeId, listener); } - public Byte getValue() { - return value; - } - public CommandClass getCommandClass(byte commandClassId) { return super.getCommandClass(commandClassId); } diff --git a/src/test/java/com/whizzosoftware/wzwave/commandclass/CentralSceneCommandClassTest.java b/src/test/java/com/whizzosoftware/wzwave/commandclass/CentralSceneCommandClassTest.java new file mode 100644 index 0000000..ca16ede --- /dev/null +++ b/src/test/java/com/whizzosoftware/wzwave/commandclass/CentralSceneCommandClassTest.java @@ -0,0 +1,38 @@ +package com.whizzosoftware.wzwave.commandclass; + +import org.junit.Test; + +import static com.whizzosoftware.wzwave.commandclass.CentralSceneCommandClass.SceneCommand.BEING_HELD; +import static com.whizzosoftware.wzwave.commandclass.CentralSceneCommandClass.SceneCommand.PUSHED; +import static com.whizzosoftware.wzwave.commandclass.CentralSceneCommandClass.SceneCommand.RELEASED_AFTER_HOLD; +import static org.junit.Assert.*; + +public class CentralSceneCommandClassTest { + @Test + public void testReport() { + CentralSceneCommandClass cc = new CentralSceneCommandClass(); + + cc.onApplicationCommand(null, new byte[] { 0x5B, 0x03, 0x01, 0x00, 0x01 }, 0); + assertEquals((Integer) 1, cc.getSceneNumber()); + assertEquals(PUSHED, cc.getSceneCommand()); + assertEquals((Integer) 1, cc.getPushCount()); + + cc.onApplicationCommand(null, new byte[] { 0x5B, 0x03, 0x02, 0x03, 0x02 }, 0); + assertEquals((Integer) 2, cc.getSceneNumber()); + assertEquals(PUSHED, cc.getSceneCommand()); + assertEquals((Integer) 2, cc.getPushCount()); + + cc.onApplicationCommand(null, new byte[] { 0x5B, 0x03, 0x03, 0x02, 0x03 }, 0); + assertEquals(BEING_HELD, cc.getSceneCommand()); + + cc.onApplicationCommand(null, new byte[] { 0x5B, 0x03, 0x04, 0x01, 0x03 }, 0); + assertEquals(RELEASED_AFTER_HOLD, cc.getSceneCommand()); + + cc.setVersion(3); + cc.onApplicationCommand(null, new byte[] { 0x5B, 0x03, 0x05, (byte) 0x83, 0x04 }, 0); + assertEquals((Integer) 4, cc.getSceneNumber()); + assertEquals(PUSHED, cc.getSceneCommand()); + assertEquals((Integer) 2, cc.getPushCount()); + assertEquals(true, cc.getSlowRefresh()); + } +}