Hello,
I am working with Window Covering cluster.
I receive command ZB_ZCL_WINDOW_COVERING_GO_TO_TILT_PERCENTAGE_CB_ID from my coordinator successfully, but I can't get the value from the payload.
I tried the following, but it is not working:
case ZB_ZCL_WINDOW_COVERING_GO_TO_TILT_PERCENTAGE_CB_ID:
NRF_LOG_INFO("GO TO TILT PERCENTAGE, value: %hd", p_device_cb_param->cb_param.set_attr_value_param.values.data8);
NRF_LOG_FLUSH();
//function go to tilt
break;
I tried to copy it from the light_bulb example, but it seems that thing are different for Window Covering application somehow.
I am completely stuck here. I must be missing something crucial.
Here is my whole zcl_device_cb callback:
zb_void_t zcl_device_cb(zb_bufid_t bufid)
{
zb_uint8_t cluster_id;
zb_uint8_t attr_id;
zb_zcl_device_callback_param_t * p_device_cb_param = ZB_BUF_GET_PARAM(bufid, zb_zcl_device_callback_param_t);
zb_uint8_t battery_percentage;
zb_zcl_status_t zcl_status;
NRF_LOG_INFO("zcl_device_cb id %hd", p_device_cb_param->device_cb_id);
p_device_cb_param->status = RET_OK;
switch (p_device_cb_param->device_cb_id)
{
case ZB_ZCL_WINDOW_COVERING_UP_OPEN_CB_ID:
NRF_LOG_INFO("OPEN UP");
NRF_LOG_FLUSH();
//function open
if (LimitIsSet)
{
Stepper_Spin(OPEN, StepsRange - CurrentStep);
}
NRF_LOG_INFO("CurrentStep: %d StepsRange: %d", CurrentStep, StepsRange);
NRF_LOG_FLUSH();
break;
case ZB_ZCL_WINDOW_COVERING_DOWN_CLOSE_CB_ID:
NRF_LOG_INFO("CLOSE DOWN");
NRF_LOG_FLUSH();
//m_dev_ctx.power_config_attr.remaining = m_dev_ctx.power_config_attr.remaining + 1;
//UNUSED_RETURN_VALUE(zb_zcl_set_attr_val(HA_WINDOW_COVERING_ENDPOINT, ZB_ZCL_CLUSTER_ID_POWER_CONFIG, ZB_ZCL_CLUSTER_SERVER_ROLE, ZB_ZCL_ATTR_POWER_CONFIG_BATTERY_PERCENTAGE_REMAINING_ID, &m_dev_ctx.power_config_attr.remaining, ZB_FALSE));
//fuction close
Stepper_Spin(CLOSE, MaxStep);
CurrentStep = 0;
NRF_LOG_INFO("CurrentStep: %d StepsRange: %d", CurrentStep, StepsRange);
NRF_LOG_FLUSH();
break;
case ZB_ZCL_WINDOW_COVERING_GO_TO_TILT_PERCENTAGE_CB_ID:
NRF_LOG_INFO("GO TO TILT PERCENTAGE, value: %hd", p_device_cb_param->cb_param.set_attr_value_param.values.data8);
NRF_LOG_FLUSH();
//function go to tilt
break;
default:
p_device_cb_param->status = RET_ERROR;
break;
}
battery_percentage = Voltage_Read();
zcl_status = zb_zcl_set_attr_val(HA_WINDOW_COVERING_ENDPOINT,
ZB_ZCL_CLUSTER_ID_POWER_CONFIG,
ZB_ZCL_CLUSTER_SERVER_ROLE,
ZB_ZCL_ATTR_POWER_CONFIG_BATTERY_PERCENTAGE_REMAINING_ID,
(zb_uint8_t *)&battery_percentage,
ZB_FALSE);
if(zcl_status != ZB_ZCL_STATUS_SUCCESS)
{
NRF_LOG_INFO("Set battery remaining percentage value fail. zcl_status: %d,", zcl_status);
}
}
I also found some similar posts, but I couldn't get it to work. One of them seems outdated (1) and the second one seems to be using endpoint handler (2) which I am not sure if is needed.
1 https://devzone.nordicsemi.com/f/nordic-q-a/53351/parsing-values-from-coordinator-to-router
I am still fairly new to Zigbee development, but I have already got the Window Covering cluster with Battery reporting running. But now I am stuck here.
Thanks in advance!
Best regards,
Krystof Vydra