This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

Parse PAYLOAD from Zigbee comman

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.

https://devzone.nordicsemi.com/f/nordic-q-a/53351/parsing-values-from-coordinator-to-router

https://devzone.nordicsemi.com/f/nordic-q-a/70222/reading-command-payload-in-zigbee-callback/292460#292460

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

Parents Reply Children
  • Hello Simon

    I have got it working today, I had to implement the custom zcl_ep_handler like this:

        zb_zcl_parsed_hdr_t *p_cmd_info = ZB_BUF_GET_PARAM(bufid, zb_zcl_parsed_hdr_t);
    
        if (p_cmd_info -> cmd_id == ZB_ZCL_CMD_WINDOW_COVERING_GO_TO_TILT_PERCENTAGE)
        {
          zb_uint8_t cmd_len = zb_buf_len(bufid);
          zb_uint8_t *pin_payload = (zb_uint8_t*) zb_buf_begin(bufid);
          uint8_t new_tilt_percentage = pin_payload[0];

    Thank you very much for help!

    Best regards,

    Krystof Vydra

Related