From 902d87a9c517ef2e6c0ceb69f93b230b53f82071 Mon Sep 17 00:00:00 2001 From: Ziver Koc Date: Sat, 3 Jul 2021 00:03:18 +0200 Subject: [PATCH] Added overview Zigbee Node page for troubleshooting --- .../resource/web/zigbee_node_overview.tmpl | 129 ++++++++++++++++++ .../plugin/zigbee/HalZigbeeController.java | 11 +- .../se/hal/plugin/zigbee/ZigBeeDataStore.java | 11 ++ .../zigbee/page/ZigbeeNodeOverviewPage.java | 42 ++++++ .../src/se/hal/plugin/zigbee/plugin.json | 4 +- 5 files changed, 191 insertions(+), 6 deletions(-) create mode 100644 plugins/hal-zigbee/resource/resource/web/zigbee_node_overview.tmpl create mode 100644 plugins/hal-zigbee/src/se/hal/plugin/zigbee/page/ZigbeeNodeOverviewPage.java diff --git a/plugins/hal-zigbee/resource/resource/web/zigbee_node_overview.tmpl b/plugins/hal-zigbee/resource/resource/web/zigbee_node_overview.tmpl new file mode 100644 index 00000000..275e76e7 --- /dev/null +++ b/plugins/hal-zigbee/resource/resource/web/zigbee_node_overview.tmpl @@ -0,0 +1,129 @@ +

Zigbee Node Overview

+ +{{#nodes}} +
+
+
Node: {{.getIeeeAddress()}}
+
+
+
+
Node Description
+
+ + + + + + + + + + + + + + + + + + + +
Manufacturer Code:{{.getNodeDescriptor().getManufacturerCode()}}
Logical Type:{{.getNodeDescriptor().getLogicalType()}}
Frequency Bands:{{.getNodeDescriptor().getFrequencyBands()}}
Mac Capabilities:{{.getNodeDescriptor().getMacCapabilities()}}
+
+
+
+
+
+
Power Descriptor
+
+ + + + + + + + + + + + + + + + + + + +
Current Power Mode:{{.getPowerDescriptor().getCurrentPowerMode()}}
Available Power Sources:{{.getPowerDescriptor().getAvailablePowerSources()}}
Current Power Source:{{.getPowerDescriptor().getCurrentPowerSource()}}
Power Level:{{.getPowerDescriptor().getPowerLevel()}}
+
+
+
+ +
+ {{#.getEndpoints()}} +
+
Endpoint: {{.getDeviceId()}}
+
+ +

Input Clusters:

+ + {{#.inputClusters.values()}} +
+
Cluster: {{.getClusterId()}}
+
+ + + + + + + + + {{#.getAttributes()}} + + + + + + + {{/.getAttributes()}} +
IDNameLast ValueLast Report Time
{{.getId()}}{{.getName()}}{{.getLastValue()}}{{.getLastReportTime().getTimeInMillis()}}
+
+
+ {{/.inputClusters.values()}} + +

Output Clusters:

+ + {{#.outputClusters.values()}} +
+
Cluster: {{.getClusterId()}}
+
+ + + + + + + + + {{#.getAttributes()}} + + + + + + + {{/.getAttributes()}} +
IDNameLast ValueLast Report Time
{{.getId()}}{{.getName()}}{{.getLastValue()}}{{.getLastReportTime().getTimeInMillis()}}
+
+
+ {{/.outputClusters.values()}} +
+
+ {{/.getEndpoints()}} +
+
+
+
+{{/nodes}} \ No newline at end of file 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 a05b8b12..91919d0c 100644 --- a/plugins/hal-zigbee/src/se/hal/plugin/zigbee/HalZigbeeController.java +++ b/plugins/hal-zigbee/src/se/hal/plugin/zigbee/HalZigbeeController.java @@ -26,12 +26,11 @@ import se.hal.plugin.zigbee.device.*; import zutil.Timer; import zutil.log.LogUtil; -import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.HashSet; import java.util.List; +import java.util.Set; import java.util.concurrent.CopyOnWriteArrayList; -import java.util.logging.Level; import java.util.logging.Logger; /** @@ -55,7 +54,6 @@ public class HalZigbeeController implements HalSensorController, private static final String CONFIG_ZIGBEE_DONGLE = "zigbee.dongle"; private ZigBeePort serialPort; - private ZigBeeDataStore dataStore; protected ZigBeeNetworkManager networkManager; private Timer permitJoinTimer; @@ -80,7 +78,6 @@ public class HalZigbeeController implements HalSensorController, } public void initialize(String comPort, String dongleName) { serialPort = new ZigBeeJSerialCommPort(comPort, ZigBeeJSerialCommPort.DEFAULT_BAUD_RATE, ZigBeePort.FlowControl.FLOWCONTROL_OUT_RTSCTS); - dataStore = new ZigBeeDataStore(); TransportConfig transportOptions = new TransportConfig(); // ---------------------------- @@ -89,7 +86,7 @@ public class HalZigbeeController implements HalSensorController, ZigBeeTransportTransmit dongle = getDongle(dongleName, serialPort, transportOptions); networkManager = new ZigBeeNetworkManager(dongle); - networkManager.setNetworkDataStore(dataStore); + networkManager.setNetworkDataStore(ZigBeeDataStore.getInstance()); networkManager.setSerializer(DefaultSerializer.class, DefaultDeserializer.class); networkManager.addAnnounceListener(this); networkManager.addNetworkNodeListener(this); @@ -235,6 +232,10 @@ public class HalZigbeeController implements HalSensorController, logger.fine("[Node: " + node.getIeeeAddress() + "]: Node registration has been removed."); } + public Set getNodes() { + return networkManager.getNodes(); + } + // ------------------------------------------ // Zigbee Endpoint Methods // ------------------------------------------ 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 e88e882d..bfdd5215 100644 --- a/plugins/hal-zigbee/src/se/hal/plugin/zigbee/ZigBeeDataStore.java +++ b/plugins/hal-zigbee/src/se/hal/plugin/zigbee/ZigBeeDataStore.java @@ -36,10 +36,14 @@ import java.util.logging.Logger; public class ZigBeeDataStore implements ZigBeeNetworkDataStore { private static final Logger logger = LogUtil.getLogger(); + private static ZigBeeDataStore instance; private HashMap devices = new HashMap<>(); + private ZigBeeDataStore() {} + + @Override public Set readNetworkNodes() { return devices.keySet(); @@ -69,4 +73,11 @@ public class ZigBeeDataStore implements ZigBeeNetworkDataStore { devices.remove(address); } + + + public static ZigBeeDataStore getInstance() { + if (instance == null) + instance = new ZigBeeDataStore(); + return instance; + } } diff --git a/plugins/hal-zigbee/src/se/hal/plugin/zigbee/page/ZigbeeNodeOverviewPage.java b/plugins/hal-zigbee/src/se/hal/plugin/zigbee/page/ZigbeeNodeOverviewPage.java new file mode 100644 index 00000000..6c0875ac --- /dev/null +++ b/plugins/hal-zigbee/src/se/hal/plugin/zigbee/page/ZigbeeNodeOverviewPage.java @@ -0,0 +1,42 @@ +package se.hal.plugin.zigbee.page; + +import com.zsmartsystems.zigbee.ZigBeeNode; +import se.hal.HalContext; +import se.hal.intf.HalAbstractController; +import se.hal.intf.HalAbstractControllerManager; +import se.hal.intf.HalWebPage; +import se.hal.plugin.zigbee.HalZigbeeController; +import zutil.io.file.FileUtil; +import zutil.parser.Templator; + +import java.util.Map; +import java.util.Set; + +public class ZigbeeNodeOverviewPage extends HalWebPage { + private static final String TEMPLATE = HalContext.RESOURCE_WEB_ROOT + "/zigbee_node_overview.tmpl"; + + public ZigbeeNodeOverviewPage() { + super("zigbee_overview"); + super.getRootNav().createSubNav("Settings").createSubNav(this.getId(), "Zigbee Overview").setWeight(10_000); + } + + @Override + public Templator httpRespond( + Map session, + Map cookie, + Map request) + throws Exception { + + Set nodes = null; + for (HalAbstractController controller : HalAbstractControllerManager.getControllers()) { + if (controller instanceof HalZigbeeController) { + nodes = ((HalZigbeeController) controller).getNodes(); + break; + } + } + + Templator tmpl = new Templator(FileUtil.find(TEMPLATE)); + tmpl.set("nodes", nodes); + return tmpl; + } +} diff --git a/plugins/hal-zigbee/src/se/hal/plugin/zigbee/plugin.json b/plugins/hal-zigbee/src/se/hal/plugin/zigbee/plugin.json index aca8ed61..778f79b0 100644 --- a/plugins/hal-zigbee/src/se/hal/plugin/zigbee/plugin.json +++ b/plugins/hal-zigbee/src/se/hal/plugin/zigbee/plugin.json @@ -3,6 +3,8 @@ "name": "Hal-Zigbee", "description": "A Zigbee plugin for directly connecting to a CC2531 device over serial port.", "interfaces": [ - {"se.hal.intf.HalAutostartController": "se.hal.plugin.zigbee.HalZigbeeController"} + {"se.hal.intf.HalAutostartController": "se.hal.plugin.zigbee.HalZigbeeController"}, + + {"se.hal.intf.HalWebPage": "se.hal.plugin.zigbee.page.ZigbeeNodeOverviewPage"} ] } \ No newline at end of file