nRF5 SDK for Thread and Zigbee v1.0.0
Window covering

Window Covering device has 5 clusters (see spec 7.6.3):

Window Covering 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);
/* 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);
/* Scenes cluster attribute data */
zb_uint8_t g_attr_scenes_scene_count;
zb_uint8_t g_attr_scenes_current_scene;
zb_uint16_t g_attr_scenes_current_group;
zb_uint8_t g_attr_scenes_scene_valid;
zb_uint8_t g_attr_scenes_name_support;
ZB_ZCL_DECLARE_SCENES_ATTRIB_LIST(scenes_attr_list, &g_attr_scenes_scene_count,
&g_attr_scenes_current_scene, &g_attr_scenes_current_group,
&g_attr_scenes_scene_valid, &g_attr_scenes_name_support);
/* Window covering attribute variables */
zb_uint8_t g_attr_window_covering_type = ZB_ZCL_WINDOW_COVERING_WINDOW_COVERING_TYPE_DEFAULT_VALUE;
zb_uint8_t g_attr_config_status = ZB_ZCL_WINDOW_COVERING_CONFIG_STATUS_DEFAULT_VALUE;
zb_uint8_t g_attr_current_position_lift_percentage =
ZB_ZCL_WINDOW_COVERING_CURRENT_POSITION_LIFT_PERCENTAGE_DEFAULT_VALUE;
zb_uint8_t g_attr_current_position_tilt_percentage =
ZB_ZCL_WINDOW_COVERING_CURRENT_POSITION_TILT_PERCENTAGE_DEFAULT_VALUE;
zb_uint16_t g_attr_installed_open_limit_lift =
ZB_ZCL_WINDOW_COVERING_INSTALLED_OPEN_LIMIT_LIFT_DEFAULT_VALUE;
zb_uint16_t g_attr_installed_closed_limit_lift =
ZB_ZCL_WINDOW_COVERING_INSTALLED_CLOSED_LIMIT_LIFT_DEFAULT_VALUE;
zb_uint16_t g_attr_installed_open_limit_tilt =
ZB_ZCL_WINDOW_COVERING_INSTALLED_OPEN_LIMIT_TILT_DEFAULT_VALUE;
zb_uint16_t g_attr_installed_closed_limit_tilt =
ZB_ZCL_WINDOW_COVERING_INSTALLED_CLOSED_LIMIT_TILT_DEFAULT_VALUE;
zb_uint8_t g_attr_mode = ZB_ZCL_WINDOW_COVERING_MODE_DEFAULT_VALUE;
ZB_ZCL_DECLARE_WINDOW_COVERING_CLUSTER_ATTRIB_LIST(window_covering_attr_list,
&g_attr_window_covering_type,
&g_attr_config_status,
&g_attr_current_position_lift_percentage,
&g_attr_current_position_tilt_percentage,
&g_attr_installed_open_limit_lift,
&g_attr_installed_closed_limit_lift,
&g_attr_installed_open_limit_tilt,
&g_attr_installed_closed_limit_tilt,
&g_attr_mode);
/********************* Declare device **************************/
ZB_HA_DECLARE_WINDOW_COVERING_CLUSTER_LIST(window_covering_clusters,
basic_attr_list,
identify_attr_list,
groups_attr_list,
scenes_attr_list,
window_covering_attr_list);
ZB_HA_DECLARE_WINDOW_COVERING_EP(
window_covering_ep, HA_WINDOW_COVERING_ENDPOINT, window_covering_clusters);
ZB_HA_DECLARE_WINDOW_COVERING_CTX(window_covering_ctx, window_covering_ep);
Registering device list
ZB_AF_REGISTER_DEVICE_CTX(&window_covering_ctx);
ZB_AF_SET_ENDPOINT_HANDLER(HA_WINDOW_COVERING_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;
/* Command from client to server ZB_ZCL_FRAME_DIRECTION_TO_SRV */
switch (cmd_info->cluster_id)
{
if (cmd_info->is_common_command)
{
switch (cmd_info->cmd_id)
{
default:
TRACE_MSG(TRACE_ZCL2, "Skip general command %hd", (FMT__H, cmd_info->cmd_id));
break;
}
}
else
{
switch (cmd_info->cmd_id)
{
TRACE_MSG(TRACE_ZCL3, "Got cluster command 0x%04x", (FMT__D, cmd_info->cluster_id));
/* Process cluster command */
cmd_processed = ZB_TRUE;
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