Search in sources :

Example 1 with AssociationGroup

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));
        }
    }
}
Also used : ZWaveNetworkEvent(org.openhab.binding.zwave.internal.protocol.event.ZWaveNetworkEvent) AssociationGroup(org.openhab.binding.zwave.internal.protocol.AssociationGroup) SerialMessage(org.openhab.binding.zwave.internal.protocol.SerialMessage) ZWaveEndpoint(org.openhab.binding.zwave.internal.protocol.ZWaveEndpoint)

Aggregations

AssociationGroup (org.openhab.binding.zwave.internal.protocol.AssociationGroup)1 SerialMessage (org.openhab.binding.zwave.internal.protocol.SerialMessage)1 ZWaveEndpoint (org.openhab.binding.zwave.internal.protocol.ZWaveEndpoint)1 ZWaveNetworkEvent (org.openhab.binding.zwave.internal.protocol.event.ZWaveNetworkEvent)1