nRF5 SDK for Thread and Zigbee v1.0.0
Door lock

Door Lock device has 5 clusters (see spec 7.4.11):

Door Lock device sample

Example
Declaring clusters
/******************* Declare attributes ************************/
/* Basic cluster attributes data */
zb_uint8_t g_attr_zcl_version = ZB_ZCL_VERSION;
ZB_ZCL_DECLARE_BASIC_ATTRIB_LIST(basic_attr_list, &g_attr_zcl_version, &g_attr_power_source);
/* Identify cluster attributes data */
zb_uint16_t g_attr_identify_time = 0;
ZB_ZCL_DECLARE_IDENTIFY_ATTRIB_LIST(identify_attr_list, &g_attr_identify_time);
/* Door Lock cluster attributes data */
zb_uint8_t g_lock_state = ZB_ZCL_ATTR_DOOR_LOCK_LOCK_STATE_DEFAULT_VALUE;
zb_uint8_t g_lock_type = ZB_ZCL_ATTR_DOOR_LOCK_LOCK_TYPE_DEFAULT_VALUE;
zb_uint8_t g_actuator_enabled = ZB_ZCL_ATTR_DOOR_LOCK_ACTUATOR_ENABLED_DEFAULT_VALUE;
ZB_ZCL_DECLARE_DOOR_LOCK_CLUSTER_ATTRIB_LIST(door_lock_attr_list,
&g_lock_state,
&g_lock_type,
&g_actuator_enabled);
/* Groups cluster attributes data */
zb_uint8_t g_attr_name_support = 0;
ZB_ZCL_DECLARE_GROUPS_ATTRIB_LIST(groups_attr_list, &g_attr_name_support);
/********************* Declare device **************************/
ZB_HA_DECLARE_DOOR_LOCK_CLUSTER_LIST(door_lock_cluster,
door_lock_attr_list,
basic_attr_list,
identify_attr_list,
groups_attr_list);
ZB_HA_DECLARE_DOOR_LOCK_EP(door_lock_ep, HA_DOOR_LOCK_ENDPOINT, door_lock_cluster);
ZB_HA_DECLARE_DOOR_LOCK_CTX(door_lock_ctx, door_lock_ep);
Registering device list
ZB_AF_REGISTER_DEVICE_CTX(&door_lock_ctx);
ZB_AF_SET_ENDPOINT_HANDLER(HA_DOOR_LOCK_ENDPOINT, zcl_specific_cluster_cmd_handler);
Example of command handler
zb_uint8_t zcl_specific_cluster_cmd_handler(zb_uint8_t param)
{
zb_buf_t *zcl_cmd_buf = (zb_buf_t *)ZB_BUF_FROM_REF(param);
zb_bool_t cmd_processed = ZB_FALSE;
zb_zcl_attr_t* attr_desc;
switch( cmd_info -> cluster_id )
{
if( cmd_info->is_common_command )
{
TRACE_MSG(TRACE_ZCL2, "Skip general command %hd", (FMT__H, cmd_info->cmd_id));
}
else
{
attr_desc = zb_zcl_get_attr_desc_a(ZB_ZCL_PARSED_HDR_SHORT_DATA(cmd_info).dst_endpoint,
switch( cmd_info->cmd_id )
{
case ZB_ZCL_CMD_DOOR_LOCK_LOCK_DOOR:
TRACE_MSG(TRACE_ZCL3, "Got cluster command 0x%04x", (FMT__D, cmd_info->cmd_id));
TRACE_MSG(TRACE_ZCL1, "Cmd: ZB_ZCL_CMD_DOOR_LOCK_LOCK_DOOR", (FMT__0));
/* Process cluster command */
cmd_processed = ZB_TRUE;
/* For user: --- Command for door lock put here --- */
/* For user: --- Check and change attribute value --- */
ZB_ZCL_SET_DIRECTLY_ATTR_VAL8(attr_desc, ZB_ZCL_ATTR_DOOR_LOCK_LOCK_STATE_LOCKED);
/** [Send Door Lock response] */
ZB_ZCL_DOOR_LOCK_SEND_LOCK_DOOR_RES(zcl_cmd_buf,
ZB_ZCL_PARSED_HDR_SHORT_DATA(cmd_info).src_addr,
ZB_ZCL_PARSED_HDR_SHORT_DATA(cmd_info).src_endpoint,
ZB_ZCL_PARSED_HDR_SHORT_DATA(cmd_info).dst_endpoint,
cmd_info->profile_id,
cmd_info->seq_number,
status);
/** [Send Door Lock response] */
break;
case ZB_ZCL_CMD_DOOR_LOCK_UNLOCK_DOOR:
TRACE_MSG(TRACE_ZCL1, "Cmd: ZB_ZCL_CMD_DOOR_LOCK_UNLOCK_DOOR", (FMT__0));
/* Process cluster command */
cmd_processed = ZB_TRUE;
/* For user: --- Command for door unlock put here --- */
/* For user: --- Check and change attribute value --- */
ZB_ZCL_SET_DIRECTLY_ATTR_VAL8(attr_desc, ZB_ZCL_ATTR_DOOR_LOCK_LOCK_STATE_UNLOCKED);
/** [Send Door Unlock response] */
ZB_ZCL_DOOR_LOCK_SEND_UNLOCK_DOOR_RES(zcl_cmd_buf,
ZB_ZCL_PARSED_HDR_SHORT_DATA(cmd_info).src_addr,
ZB_ZCL_PARSED_HDR_SHORT_DATA(cmd_info).src_endpoint,
ZB_ZCL_PARSED_HDR_SHORT_DATA(cmd_info).dst_endpoint,
cmd_info->profile_id,
cmd_info->seq_number,
status);
/** [Send Door Unlock response] */
break;
default:
TRACE_MSG(TRACE_ZCL2, "Cluster command %hd, skip it", (FMT__H, cmd_info->cmd_id));
break;
}
}
break;
default:
TRACE_MSG(TRACE_ZCL1, "SRV role, cluster 0x%d is not supported", (FMT__D, cmd_info->cluster_id));
break;
}
}

See ha/devices_closures sample


Documentation feedback | Developer Zone | Subscribe | Updated