Coordinator endpoint

Hello, I developed for my customer, a ZigBee coordinator in last 2019, using nRF5 SDK for Thread and Zigbee v3.2.0.
I has installed many sistems on field, equipped witn several battery powered sensors (door, motion, occupancy ...) and mains powered actuators (bulbs and smart plug).
I have only one endpoint # 64 configured on my coordinator, and now I need to add a second endpoint to receive the info from some end-node that sends to fixed endpoint #255
How can I add it?
Thanks for help

Abele

Parents
  • abe said:
    and on _agent_ep_handler_255 I can process all data received on endpoint 255, that's right?

    Yes, if my understanding is correct then, if the correct clusters are configured, you should receive it on that endpoint handler.

    abe said:
    ZB_AF_SET_ENDPOINT_HANDLER (ZIGBEE_ADRI_ENDPOINT_255, _agent_ep_handler_255);

    Are you using 255 as the actual endpoint number here? Maybe that is the issue. You have to use between 1 and 240.

    Regards,

    Elfving

  • I apologize for the long delay ... I was busy with other works ..
    To sumarize ... I have a Sonoff Zigbee 3.0 end node that sends IAS Alarm info to coordinator using endpoint #255 It even sends all other infos (battery level and voltage, ...) to coordinator endpoint #64 (as configured by my code)
    Here below the declaration to configure the two endpoints:

    I also tried to add this to declare macro

    But I have error!

    How can I add this endpoint to my coordinator?
    I need to make it able to receive from Sonoff end node!

    Many thanks for help!

    Abele

  • Hi Elfving
    have any news for me?

    Thanks

    Abele

Reply Children
  • Nobody can answer me?
    Please let me know ...

    Thanks

    Abele

  • Hello Abele and sorry about the wait,

    First of all, I see I failed to mention earlier that the nRF5 Zigbee SDK is deprecated and you should preferably upgrade to NCS. Though if you are in the middle of development with nRF5 SDK I would understand if you do not do this now. But one thing I've overlooked and definitely should mention is that you are using 3.2 of the old Zigbee SDK, and not the newest one, v4.2. v3.2 conforms to Zigbee PRO R21, and not R22. You need to conform to R22 in order to get your Zigbee product certified.

    Is there any particular reason why you are using v3.2?

    I am not sure if this fixes your issue, but I see here that there are some issues that were solved in v4.2. I didn't use to think they were relevant for you, but now might be what you have been facing. Eg. KRKNWK-5826

    Regards,

    Elfving

  • Hi Elfving
    I used SDK 3.2 because I have developed this product for my customer in 2018. Then we are on production since 2019 ad we have several thousand of pieces on the field.
    Now we need to add the sensor here above quoted, and we need to solve the issue and add at least a second endpoint to our Coordinator
    We know about the new 4.2 solution, but unfortunatly there are no chanche tu update directly from 3.2 (we used IAR EWARM) to 4.2.
    It needs probably to remake full project, and this is too much expensive and is not accettable.
    In adition, there is the field that ask for this update.
    Coould you help me for this solution?
    Thanks
    Abele

  • I see. 

    abe said:
    Coould you help me for this solution?

    Yes, I will of course try. It's just a few hurdles in the way. 

    So your problem might be related to KRKNWK-5826. It is solved in newer versions of the SDK, but here is the workaround for KRKNWK-5826 for older versions:

    Try to call init_multi_ep_fixers() from the attached files, in your initialization steps, just after the CTX and ZCL device callbacks are registered.

    Another thing that was mentioned is this: 

    "In case in which application uses write attribute hooks or endpoints handlers, small modification in workaround is required. If this is true for customer's application I will explain what should be changed."

    Could you try implementing this workaround and see if it changed anything?

    EDIT: for some reason file uploading doesn't work right now, so I'll simply add the code instead. Here is multi_ep_fixer.c and multi_ep_fixer.c

    #include "multi_ep_fixer.h"
    
    /* Store previous write attr hook for the Identify cluster. */
    zb_zcl_cluster_write_attr_hook_t m_p_identify_write_hook;
    
    static zb_void_t sort_ep_desc_list(zb_uint8_t dst_ep)
    {
        zb_uint8_t          dst_ep_desc_index   = 0;
        zb_af_device_ctx_t  *p_dev_ctx          = zb_zcl_get_ctx()->device_ctx;
    
        /* Find index of dest_ep desc in ep_desc list. */
        while ((p_dev_ctx->ep_desc_list)[dst_ep_desc_index]->ep_id != dst_ep)
        {
            dst_ep_desc_index++;
        }
    
        /* Check if desc of dest_ep is stored as last element of the ep desc list. */
        if (dst_ep_desc_index < (p_dev_ctx->ep_count - 1))
        {
            /* Store last ep_desc as temp ep_desc  */
            zb_af_endpoint_desc_t *p_temp_ep_desc = (p_dev_ctx->ep_desc_list)[(p_dev_ctx->ep_count - 1)];
            /* Put desired ep_desc as last */
            (p_dev_ctx->ep_desc_list)[(p_dev_ctx->ep_count - 1)] = (p_dev_ctx->ep_desc_list)[dst_ep_desc_index];
            /* Restore temp ep_desc in new place */
            (p_dev_ctx->ep_desc_list)[dst_ep_desc_index] = p_temp_ep_desc;
        }
    }
    
    static zb_uint8_t multi_ep_handler(zb_bufid_t bufid)
    {
        zb_zcl_parsed_hdr_t *cmd_info = ZB_BUF_GET_PARAM(bufid, zb_zcl_parsed_hdr_t);
        /* Nbr of endpoint to which frame is to be delivered. */
        zb_uint8_t          dst_ep    = cmd_info->addr_data.common_data.dst_endpoint;
    
        if ((cmd_info->cmd_id == ZB_ZCL_CMD_CONFIG_REPORT)
            || (cmd_info->cmd_id == ZB_ZCL_CMD_REPORT_ATTRIB)
            || (cmd_info->cmd_id == ZB_ZCL_CMD_READ_REPORT_CFG))
        {
            sort_ep_desc_list(dst_ep);
        }
        return ZB_FALSE;
    }
    
    static void multi_ep_identify_cluster_write_attr_hook(zb_uint8_t endpoint, zb_uint16_t attr_id, zb_uint8_t *new_value)
    {
        sort_ep_desc_list(endpoint);
        m_p_identify_write_hook(endpoint, attr_id, new_value);
    }
    
    static void multi_ep_generic_cluster_write_attr_hook(zb_uint8_t endpoint, zb_uint16_t attr_id, zb_uint8_t *new_value)
    {
        ZVUNUSED(attr_id);
        ZVUNUSED(new_value);
    
        sort_ep_desc_list(endpoint);
    }
    
    /* Function which initializes fixer methods and hooks. */
    void init_multi_ep_fixers(void)
    {
        zb_zcl_globals_t * p_zcl_ctx = zb_zcl_get_ctx();
        zb_uint8_t endpoint = 0;
        zb_uint8_t index = 0;
    
        ZB_ASSERT(p_zcl_ctx);
    
        /* Find Identify attr hook, store previous value if exist and assing new identify cluster wrtie attr hook. */
        while (index < p_zcl_ctx->zcl_handlers_cnt)
        {
            if ((p_zcl_ctx->zcl_handlers[index].cluster_id == ZB_ZCL_CLUSTER_ID_IDENTIFY)
                && (p_zcl_ctx->zcl_handlers[index].cluster_write_attr_hook != NULL))
            {
                m_p_identify_write_hook = p_zcl_ctx->zcl_handlers[index].cluster_write_attr_hook;
                p_zcl_ctx->zcl_handlers[index].cluster_write_attr_hook = multi_ep_identify_cluster_write_attr_hook;
            }
            /* For clusters with ID >= 0x03, if there is no attr hook assigned, assign generic one. If already exists, assert. */
            else if (p_zcl_ctx->zcl_handlers[index].cluster_id >= ZB_ZCL_CLUSTER_ID_IDENTIFY)
            {
                ZB_ASSERT(p_zcl_ctx->zcl_handlers[index].cluster_write_attr_hook == NULL);
    
                p_zcl_ctx->zcl_handlers[index].cluster_write_attr_hook = multi_ep_generic_cluster_write_attr_hook;
            }
            index++;
        }
    
        /* For each endpoint register device callback. Make sure that there is no endpoint handler set already. */
        for (index = 0; index < p_zcl_ctx->device_ctx->ep_count; index++)
        {
            endpoint = p_zcl_ctx->device_ctx->ep_desc_list[index]->ep_id;
    
            ZB_ASSERT(zb_af_get_endpoint_desc((endpoint))->device_handler == NULL);
            ZB_AF_SET_ENDPOINT_HANDLER(endpoint, multi_ep_handler);
        }
    }

    #ifndef MULTI_EP_FIXER_H__
    #define MULTI_EP_FIXER_H__
    
    #include "zboss_api.h"
    
    /**@brief Function which initializes fixer methods and hooks.
     *
     * Call just this function after the Device context is registered
     * and fixer is initialised.
     * It overrides write attribute cluster hooks and endpoint handlers.
     * If application uses mentioned hooks or endpoint handlers,
     * generic method should be changed for given cluster/endpoint.
     */
    void init_multi_ep_fixers(void)
    
    #endif /* MULTI_EP_FIXER_H__ */

    Regards,

    Elfving

  • Many thanks Elfving!
    I dont well understand where I must add the init function you suggest ...

    Here?

    Because as I already said I have the compiler error here ... 

    and also with this second solution

    Then, I think that before it's needed also solve the compiler issues ...

    Abele

Related