use of org.openhab.binding.zwave.internal.protocol.AssociationGroup in project openhab1-addons by openhab.
the class ZWaveAssociationCommandClass method processAssociationReport.
/**
* Processes a CONFIGURATIONCMD_REPORT / CONFIGURATIONCMD_SET message.
*
* @param serialMessage
* the incoming message to process.
* @param offset
* the offset position from which to start message processing.
*/
protected void processAssociationReport(SerialMessage serialMessage, int offset) {
// Extract the group index
int group = serialMessage.getMessagePayloadByte(offset + 1);
// The max associations supported (0 if the requested group is not supported)
int maxAssociations = serialMessage.getMessagePayloadByte(offset + 2);
// Number of outstanding requests (if the group is large, it may come in multiple frames)
int following = serialMessage.getMessagePayloadByte(offset + 3);
if (maxAssociations == 0) {
// Unsupported association group. Nothing to do!
if (updateAssociationsNode == group) {
logger.debug("NODE {}: All association groups acquired.", this.getNode().getNodeId());
updateAssociationsNode = 0;
// This is used for network management, so send a network event
this.getController().notifyEventListeners(new ZWaveNetworkEvent(ZWaveNetworkEvent.Type.AssociationUpdate, this.getNode().getNodeId(), ZWaveNetworkEvent.State.Success));
}
return;
}
logger.debug("NODE {}: association group {} has max associations " + maxAssociations, this.getNode().getNodeId(), group);
// Are we waiting to synchronise the start of a new group?
if (pendingAssociation == null) {
pendingAssociation = new AssociationGroup(group);
}
if (serialMessage.getMessagePayload().length > (offset + 4)) {
logger.debug("NODE {}: association group {} includes the following nodes:", this.getNode().getNodeId(), group);
int numAssociations = serialMessage.getMessagePayload().length - (offset + 4);
for (int cnt = 0; cnt < numAssociations; cnt++) {
int node = serialMessage.getMessagePayloadByte(offset + 4 + cnt);
logger.debug("Node {}", node);
// Add the node to the group
pendingAssociation.addNode(node);
}
}
// If this is the end of the group, update the list then let the listeners know
if (following == 0) {
// Clear the current information for this group
configAssociations.remove(group);
// Update the group in the list
configAssociations.put(group, pendingAssociation);
pendingAssociation = null;
// Send an event to the users
ZWaveAssociationEvent zEvent = new ZWaveAssociationEvent(this.getNode().getNodeId(), group);
List<Integer> members = getGroupMembers(group);
if (members != null) {
for (int node : members) {
zEvent.addMember(node);
}
}
this.getController().notifyEventListeners(zEvent);
}
// Is this the end of the list
if (following == 0 && group == updateAssociationsNode) {
// so we need to request the next group
if (updateAssociationsNode < maxGroups) {
updateAssociationsNode++;
SerialMessage outputMessage = getAssociationMessage(updateAssociationsNode);
if (outputMessage != null) {
this.getController().sendData(outputMessage);
}
} else {
logger.debug("NODE {}: All association groups acquired.", this.getNode().getNodeId());
// we have reached our maxNodes, notify listeners we are done.
updateAssociationsNode = 0;
// This is used for network management, so send a network event
this.getController().notifyEventListeners(new ZWaveNetworkEvent(ZWaveNetworkEvent.Type.AssociationUpdate, this.getNode().getNodeId(), ZWaveNetworkEvent.State.Success));
}
}
}
Aggregations