diff --git a/hal-core/src/se/hal/intf/HalScannableController.java b/hal-core/src/se/hal/intf/HalScannableController.java new file mode 100644 index 00000000..42959c62 --- /dev/null +++ b/hal-core/src/se/hal/intf/HalScannableController.java @@ -0,0 +1,18 @@ +package se.hal.intf; + +/** + * Controllers that implement this interface support manual scanning of devices. + */ +public interface HalScannableController { + + /** + * Calling this method will start the scanning or pairing + * mode of the controller to find new devices. + */ + void startScan(); + + /** + * @return a boolean indication if a scan is still ongoing. + */ + boolean isScanning(); +} diff --git a/hal-core/src/se/hal/util/ConfigEventValueProvider.java b/hal-core/src/se/hal/util/ConfigEventValueProvider.java index 4b15882b..a09b6d06 100644 --- a/hal-core/src/se/hal/util/ConfigEventValueProvider.java +++ b/hal-core/src/se/hal/util/ConfigEventValueProvider.java @@ -33,14 +33,9 @@ public class ConfigEventValueProvider implements Configurator.ConfigValueProvide } } - - private String getValue(Event event) { - return event.getName() + " (id: " + event.getId() + ")"; - } - @Override - public String getCurrentValue() { - return getValue(currentValue); + public String getValue(Event event) { + return event.getName() + " (id: " + event.getId() + ")"; } @Override diff --git a/hal-core/src/se/hal/util/ConfigSensorValueProvider.java b/hal-core/src/se/hal/util/ConfigSensorValueProvider.java index 13f1f749..6711aca2 100644 --- a/hal-core/src/se/hal/util/ConfigSensorValueProvider.java +++ b/hal-core/src/se/hal/util/ConfigSensorValueProvider.java @@ -33,14 +33,9 @@ public class ConfigSensorValueProvider implements Configurator.ConfigValueProvid } } - - private String getValue(Sensor sensor) { - return sensor.getName() + " (id: " + sensor.getId() + ")"; - } - @Override - public String getCurrentValue() { - return getValue(currentValue); + public String getValue(Sensor sensor) { + return sensor.getName() + " (id: " + sensor.getId() + ")"; } @Override diff --git a/logging.properties b/logging.properties index bfd8c297..e9ea412c 100644 --- a/logging.properties +++ b/logging.properties @@ -25,6 +25,6 @@ se.hal.level = ALL # Plugins # ------------------------------------- -#com.zsmartsystems.zigbee.level = FINE -com.zsmartsystems.zigbee.dongle.cc2531.zigbee.util.ByteUtils.level = INFO -com.zsmartsystems.zigbee.dongle.cc2531.network.packet.ZToolPacketStream.level = INFO \ No newline at end of file +com.zsmartsystems.zigbee.level = INFO +#com.zsmartsystems.zigbee.dongle.cc2531.zigbee.util.ByteUtils.level = INFO +#com.zsmartsystems.zigbee.dongle.cc2531.network.packet.ZToolPacketStream.level = INFO \ No newline at end of file diff --git a/plugins/hal-zigbee/build.gradle b/plugins/hal-zigbee/build.gradle index 730d5d09..772e0b1e 100644 --- a/plugins/hal-zigbee/build.gradle +++ b/plugins/hal-zigbee/build.gradle @@ -1,5 +1,5 @@ dependencies { - def ZIGBEE_LIB_VERSION = "1.3.11" + def ZIGBEE_LIB_VERSION = "1.3.8" implementation project(':hal-core') diff --git a/plugins/hal-zigbee/src/se/hal/plugin/zigbee/HalZigbeeController.java b/plugins/hal-zigbee/src/se/hal/plugin/zigbee/HalZigbeeController.java index f352d950..11e1fa42 100644 --- a/plugins/hal-zigbee/src/se/hal/plugin/zigbee/HalZigbeeController.java +++ b/plugins/hal-zigbee/src/se/hal/plugin/zigbee/HalZigbeeController.java @@ -19,6 +19,7 @@ import com.zsmartsystems.zigbee.zcl.clusters.*; import com.zsmartsystems.zigbee.zdo.field.NodeDescriptor; import se.hal.HalContext; import se.hal.intf.*; +import zutil.Timer; import zutil.log.LogUtil; import java.util.HashSet; @@ -32,7 +33,8 @@ public class HalZigbeeController implements HalSensorController, HalEventController, HalAutoScannableController, ZigBeeAnnounceListener, - ZigBeeNetworkNodeListener { + ZigBeeNetworkNodeListener, + HalScannableController { private static final Logger logger = LogUtil.getLogger(); @@ -47,6 +49,7 @@ public class HalZigbeeController implements HalSensorController, private ZigBeeDataStore dataStore; protected ZigBeeNetworkManager networkManager; + private Timer permitJoinTimer; private HalDeviceReportListener deviceListener; private List registeredDevices; @@ -92,23 +95,17 @@ public class HalZigbeeController implements HalSensorController, // Startup Network // ------------------------ - networkManager.setDefaultProfileId(ZigBeeProfileType.ZIGBEE_HOME_AUTOMATION.getKey()); - networkManager.setZigBeeLinkKey(new ZigBeeKey(new int[] { // Add the default ZigBeeAlliance09 HA link key - 0x5A, 0x69, 0x67, 0x42, 0x65, 0x65, 0x41, 0x6C, 0x6C, 0x69, 0x61, 0x6E, 0x63, 0x65, 0x30, 0x39 })); - networkManager.setZigBeeNetworkKey(new ZigBeeKey("552FAAF9B5F49E75F1ADDA12215C2CA1")); // ZigBeeKey.createRandom(); - networkManager.setZigBeeChannel(ZigBeeChannel.create(11)); - networkManager.setZigBeePanId(65534); // (int) Math.floor((Math.random() * 65534)); - networkManager.setZigBeeExtendedPanId(new ExtendedPanId("00124B001CCE1B5F")); // ExtendedPanId.createRandom(); - - //transportOptions.addOption(TransportConfigOption.TRUST_CENTRE_JOIN_MODE, TrustCentreJoinMode.TC_JOIN_INSECURE); // TC_JOIN_SECURE - dongle.updateTransportConfig(transportOptions); - // Register extensions + ZigBeeDiscoveryExtension discoveryExtension = new ZigBeeDiscoveryExtension(); + discoveryExtension.setUpdatePeriod(86400); // in seconds, 24h + + networkManager.addExtension(discoveryExtension); networkManager.addExtension(new ZigBeeOtaUpgradeExtension()); - networkManager.addExtension(new ZigBeeDiscoveryExtension()); networkManager.addExtension(new ZigBeeIasCieExtension()); + // Register clusters + networkManager.addSupportedClientCluster(ZclBasicCluster.CLUSTER_ID); networkManager.addSupportedClientCluster(ZclIdentifyCluster.CLUSTER_ID); networkManager.addSupportedClientCluster(ZclGroupsCluster.CLUSTER_ID); @@ -136,6 +133,19 @@ public class HalZigbeeController implements HalSensorController, networkManager.addSupportedServerCluster(ZclWindowCoveringCluster.CLUSTER_ID); networkManager.addSupportedServerCluster(ZclBinaryInputBasicCluster.CLUSTER_ID); + // Configure network + + networkManager.setDefaultProfileId(ZigBeeProfileType.ZIGBEE_HOME_AUTOMATION.getKey()); + networkManager.setZigBeeNetworkKey(ZigBeeKey.createRandom());//new ZigBeeKey("552FAAF9B5F49E75F1ADDA12215C2CA1")); // ZigBeeKey.createRandom(); + networkManager.setZigBeeLinkKey(new ZigBeeKey(new int[] { // Add the default ZigBeeAlliance09 HA link key + 0x5A, 0x69, 0x67, 0x42, 0x65, 0x65, 0x41, 0x6C, 0x6C, 0x69, 0x61, 0x6E, 0x63, 0x65, 0x30, 0x39 })); + networkManager.setZigBeeChannel(ZigBeeChannel.create(11)); + networkManager.setZigBeePanId(65534); // (int) Math.floor((Math.random() * 65534)); + networkManager.setZigBeeExtendedPanId(new ExtendedPanId("00124B001CCE1B5F")); // ExtendedPanId.createRandom(); + + //transportOptions.addOption(TransportConfigOption.TRUST_CENTRE_JOIN_MODE, TrustCentreJoinMode.TC_JOIN_INSECURE); // TC_JOIN_SECURE + dongle.updateTransportConfig(transportOptions); + // Startup Network logger.info("Starting up ZigBee Network..."); @@ -148,9 +158,7 @@ public class HalZigbeeController implements HalSensorController, case ZIGBEE_DONGLE_CC2531: HashSet clusters = new HashSet<>(); clusters.add(ZclIasZoneCluster.CLUSTER_ID); - transportOptions.addOption(TransportConfigOption.SUPPORTED_OUTPUT_CLUSTERS, clusters); - transportOptions.addOption(TransportConfigOption.RADIO_TX_POWER, 3); return new ZigBeeDongleTiCc2531(serialPort); case ZIGBEE_DONGLE_CONBEE: @@ -244,4 +252,16 @@ public class HalZigbeeController implements HalSensorController, public void setListener(HalDeviceReportListener listener) { deviceListener = listener; } + + @Override + public void startScan() { + networkManager.permitJoin(120); + permitJoinTimer = new Timer(120_000); + permitJoinTimer.start(); + } + + @Override + public boolean isScanning() { + return permitJoinTimer != null && !permitJoinTimer.hasTimedOut(); + } } diff --git a/plugins/hal-zigbee/src/se/hal/plugin/zigbee/ZigBeeDataStore.java b/plugins/hal-zigbee/src/se/hal/plugin/zigbee/ZigBeeDataStore.java index 48b40f50..e833175a 100644 --- a/plugins/hal-zigbee/src/se/hal/plugin/zigbee/ZigBeeDataStore.java +++ b/plugins/hal-zigbee/src/se/hal/plugin/zigbee/ZigBeeDataStore.java @@ -27,9 +27,14 @@ package se.hal.plugin.zigbee; import com.zsmartsystems.zigbee.IeeeAddress; import com.zsmartsystems.zigbee.database.ZigBeeNetworkDataStore; import com.zsmartsystems.zigbee.database.ZigBeeNodeDao; +import com.zsmartsystems.zigbee.zdo.field.BindingTable; +import zutil.StringUtil; +import zutil.converter.Converter; import zutil.log.LogUtil; +import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; import java.util.Set; import java.util.logging.Logger; @@ -40,6 +45,36 @@ public class ZigBeeDataStore implements ZigBeeNetworkDataStore { private HashMap devices = new HashMap<>(); + public ZigBeeDataStore() { + /*ZigBeeNodeDao controller = new ZigBeeNodeDao(); + controller.setIeeeAddress(new IeeeAddress("00124B001CCE1B5F")); + controller.setNetworkAddress(0); + controller.setBindingTable(new HashSet<>()); + controller.setEndpoints(Collections.EMPTY_LIST); + controller.setNodeDescriptor(null); + controller.setPowerDescriptor(null); + writeNode(controller); + + ZigBeeNodeDao ikeaOutlet = new ZigBeeNodeDao(); + ikeaOutlet.setIeeeAddress(new IeeeAddress("00158D000488A47F")); + ikeaOutlet.setNetworkAddress(10697); + ikeaOutlet.setBindingTable(new HashSet<>()); + ikeaOutlet.setEndpoints(Collections.EMPTY_LIST); + ikeaOutlet.setNodeDescriptor(null); + ikeaOutlet.setPowerDescriptor(null); + writeNode(ikeaOutlet); + + ZigBeeNodeDao aquaraTemp = new ZigBeeNodeDao(); + aquaraTemp.setIeeeAddress(new IeeeAddress("842E14FFFE63AE4B")); + aquaraTemp.setNetworkAddress(52953); + aquaraTemp.setBindingTable(new HashSet<>()); + aquaraTemp.setEndpoints(Collections.EMPTY_LIST); + aquaraTemp.setNodeDescriptor(null); + aquaraTemp.setPowerDescriptor(null); + writeNode(aquaraTemp);*/ + } + + @Override public Set readNetworkNodes() { return devices.keySet(); @@ -56,11 +91,11 @@ public class ZigBeeDataStore implements ZigBeeNetworkDataStore { public void writeNode(ZigBeeNodeDao node) { System.out.println("ZigBeeDataStore.writeNode(" + "IeeAddr: " + node.getIeeeAddress() + ", " + - "binding: "+node.getBindingTable()+", " + - "description: "+node.getNodeDescriptor()+", " + - "endpoints: "+node.getEndpoints()+", " + - "NetAddr: "+node.getNetworkAddress()+", " + - "Power: "+node.getPowerDescriptor()+", " + + "NetAddr: " + node.getNetworkAddress() + ", " + + "binding: " + node.getBindingTable() + ", " + + "description: " + node.getNodeDescriptor() + ", " + + "endpoints: " + node.getEndpoints() + ", " + + "Power: " + node.getPowerDescriptor() + ", " + ")"); devices.put(node.getIeeeAddress(), node); diff --git a/plugins/hal-zigbee/src/se/hal/plugin/zigbee/ZigBeeJSerialCommPort.java b/plugins/hal-zigbee/src/se/hal/plugin/zigbee/ZigBeeJSerialCommPort.java index 05822bb1..dfceb8c0 100644 --- a/plugins/hal-zigbee/src/se/hal/plugin/zigbee/ZigBeeJSerialCommPort.java +++ b/plugins/hal-zigbee/src/se/hal/plugin/zigbee/ZigBeeJSerialCommPort.java @@ -132,8 +132,11 @@ public class ZigBeeJSerialCommPort implements ZigBeePort { serialPort = SerialPort.getCommPort(portName); serialPort.setBaudRate(baudRate); + serialPort.setNumDataBits(8); + serialPort.setNumStopBits(SerialPort.ONE_STOP_BIT); + serialPort.setParity(SerialPort.NO_PARITY); serialPort.setComPortTimeouts( - SerialPort.TIMEOUT_READ_BLOCKING, 0, 0); + SerialPort.TIMEOUT_READ_SEMI_BLOCKING, 0, 0); if (!serialPort.openPort()) { throw new RuntimeException("Error opening serial port: " + portName); diff --git a/plugins/hal-zigbee/test/se/hal/plugin/zigbee/HalZigbeeControllerTest.java b/plugins/hal-zigbee/test/se/hal/plugin/zigbee/HalZigbeeControllerTest.java index 54946f52..a4d6693d 100644 --- a/plugins/hal-zigbee/test/se/hal/plugin/zigbee/HalZigbeeControllerTest.java +++ b/plugins/hal-zigbee/test/se/hal/plugin/zigbee/HalZigbeeControllerTest.java @@ -42,7 +42,7 @@ public class HalZigbeeControllerTest { LogUtil.setGlobalLevel(Level.ALL); HalZigbeeController controller = new HalZigbeeController(); - controller.initialize("COM5", HalZigbeeController.ZIGBEE_DONGLE_CC2531); + controller.initialize("COM3", HalZigbeeController.ZIGBEE_DONGLE_CC2531); handleConsoleInput('h', controller.networkManager); @@ -67,7 +67,7 @@ public class HalZigbeeControllerTest { case 'l': for (ZigBeeNode node : networkManager.getNodes()) { - System.out.println(node); + System.out.println(node + " (" + node.getNodeState() + ")"); for (ZigBeeEndpoint endpoint : node.getEndpoints()) { System.out.println(" - " + endpoint);