Refactored Zigbee attribute listener

This commit is contained in:
Ziver Koc 2021-06-25 20:43:54 +02:00
parent 3a49b15dea
commit 8d9896f8b4
2 changed files with 22 additions and 34 deletions

View file

@ -42,8 +42,7 @@ public class HalZigbeeController implements HalSensorController,
HalScannableController,
ZigBeeAnnounceListener,
ZigBeeNetworkNodeListener,
ZigBeeNetworkEndpointListener,
ZclAttributeListener {
ZigBeeNetworkEndpointListener {
private static final Logger logger = LogUtil.getLogger();
@ -226,7 +225,7 @@ public class HalZigbeeController implements HalSensorController,
node.addNetworkEndpointListener(this);
logger.fine("[Node: " + node.getIeeeAddress() + "]: Node has been registered: " +
"Manufacturer=" + node.getNodeDescriptor().getManufacturerCode() +
"Type=" + node.getNodeDescriptor().getLogicalType());
", Type=" + node.getNodeDescriptor().getLogicalType());
}
@Override
@ -251,8 +250,11 @@ public class HalZigbeeController implements HalSensorController,
for (int inputClusterId : endpoint.getInputClusterIds()) {
ZigbeeHalDeviceConfig config = createDeviceConfig(inputClusterId);
if (config != null)
if (config != null) {
registerCluster(endpoint, config);
} else {
logger.finest("[Node: " + endpoint.getIeeeAddress() + "] Cluster ID '" + inputClusterId + "' is not supported.");
}
}
}
@ -267,11 +269,20 @@ public class HalZigbeeController implements HalSensorController,
return null;
}
private void registerCluster(ZigBeeEndpoint endpoint, ZigbeeHalDeviceConfig config) {
ZclCluster cluster = endpoint.getInputCluster(config.getZigbeeClusterId());
private void registerCluster(final ZigBeeEndpoint endpoint, ZigbeeHalDeviceConfig config) {
final ZclCluster cluster = endpoint.getInputCluster(config.getZigbeeClusterId());
if (cluster != null) {
config.setZigbeeNodeAddress(endpoint.getIeeeAddress());
cluster.addAttributeListener(this);
cluster.addAttributeListener(new ZclAttributeListener() {
@Override
public void attributeUpdated(ZclAttribute attribute, Object value) {
if (deviceListener != null) {
logger.finer("[Node: " + endpoint.getIeeeAddress() + ", Endpoint: " + endpoint.getEndpointId() + ", Cluster: " + attribute.getCluster().getId() + "] Attribute updated: attribute_name=" + attribute.getName() + ", value=" + attribute.getLastValue());
deviceListener.reportReceived(config, config.getDeviceData(attribute));
}
}
});
// // TODO: Notify listener that a device is online
if (deviceListener != null)
@ -284,22 +295,6 @@ public class HalZigbeeController implements HalSensorController,
logger.fine("[Node: " + endpoint.getIeeeAddress() + ", Endpoint: " + endpoint.getEndpointId() + "]: Endpoint removed: " + endpoint);
}
// ------------------------------------------
// Zigbee Cluster Attribute Methods
// ------------------------------------------
@Override
public void attributeUpdated(ZclAttribute attribute, Object value) {
if (deviceListener != null) {
ZigbeeHalDeviceConfig config = createDeviceConfig(attribute.getCluster().getId());
if (config != null)
deviceListener.reportReceived(config, config.getDeviceData(attribute));
else
logger.severe("Cluster ID (" + attribute.getCluster().getId() + ") is not supported but a listener was added.");
}
}
// ------------------------------------------
// Hal Overrides
// ------------------------------------------

View file

@ -27,14 +27,9 @@ 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;
@ -52,28 +47,26 @@ public class ZigBeeDataStore implements ZigBeeNetworkDataStore {
@Override
public ZigBeeNodeDao readNode(IeeeAddress address) {
System.out.println("ZigBeeDataStore.readNetworkNodes(" + address + ")");
return devices.get(address);
}
@Override
public void writeNode(ZigBeeNodeDao node) {
System.out.println("ZigBeeDataStore.writeNode(" +
logger.fine("[Node: " + node.getIeeeAddress() + "] Storing Zigbee Node in DB: " +
"IeeAddr: " + node.getIeeeAddress() + ", " +
"NetAddr: " + node.getNetworkAddress() + ", " +
"binding: " + node.getBindingTable() + ", " +
"description: " + node.getNodeDescriptor() + ", " +
"endpoints: " + node.getEndpoints() + ", " +
"Power: " + node.getPowerDescriptor() + ", " +
")");
"Power: " + node.getPowerDescriptor()
);
devices.put(node.getIeeeAddress(), node);
}
@Override
public void removeNode(IeeeAddress address) {
System.out.println("ZigBeeDataStore.removeNode(" + address + ")");
logger.fine("[Node: " + address + "] Removing Node from DB.");
devices.remove(address);
}