Hello!
I add an attribute array (0x48) for the user cluster.
Having problems using the "array" attribute:
1. If you select the data type of 16 or 32 bits, then an alignment is added in the transmission, since the frame structure is: 8 bits for the type of array variables, then 16 bits for the length. Alignment is added after the 8 bit field for the variable type.
I use an array of 8-bit variables in the declaration, then a pointer to the desired structure and this is not a problem.
2. For some reason, 32 bytes are always transferred, regardless of the size of the specified array. Is this hardcoded or is it possible to specify the size?

#ifndef ZB_ZCL_ANALOG_SIGNAL_H__
#define ZB_ZCL_ANALOG_SIGNAL_H__
#include "zcl/zb_zcl_common.h"
/* Cluster ZB_ZCL_CLUSTER_ID_ANALOG_VALUE */
#define ANALOG_NUMBER_OF_ARRAY_ELEMENTS 18
#define ANALOG_DATA_TYPE ZB_ZCL_ATTR_TYPE_U8
typedef struct struct_analog_data
{
zb_uint8_t Element_Type;
zb_uint8_t Number_Of_Elements1;
zb_uint8_t Number_Of_Elements2;
zb_uint8_t allign;
zb_int16_t Analog_Signal_Array[ANALOG_NUMBER_OF_ARRAY_ELEMENTS];
} analog_data_t;
enum analog_array_element_t
{
ANALOG_T1 = 0,
ANALOG_T2,
ANALOG_T3,
ANALOG_T4,
ANALOG_T5,
ANALOG_T6,
ANALOG_T7,
ANALOG_T8,
ANALOG_T9,
ANALOG_T10,
ANALOG_T11,
ANALOG_T12,
ANALOG_T13,
ANALOG_T14,
ANALOG_T15,
ANALOG_T16,
ANALOG_DI,
ANALOG_DO,
};
typedef struct
{
zb_bool_t OutOfService;
float PresentValue;
zb_uint8_t StatusFlags;
analog_data_t AnalogData;
} zb_zcl_analog_attrs_t;
enum zb_zcl_analog_measurement_attr_e
{
ZB_ZCL_ATTR_ANALOG_SERVICE_ID = 0x0051,
ZB_ZCL_ATTR_ANALOG_VALUE_ID = 0x0055,
ZB_ZCL_ATTR_ANALOG_STATUS_ID = 0x006F,
ZB_ZCL_ATTR_ANALOG_ARRAY_ID = 0x0080,
};
/**@brief MeasuredValue attribute unknown value. */
#define ZB_ZCL_ATTR_ANALOG_VALUE_UNKNOWN ((zb_int16_t)0x8000)
/**@brief MinMeasuredValue attribute minimum value. */
#define ZB_ZCL_ATTR_ANALOG_MIN_VALUE_MIN_VALUE ((zb_int16_t)0x8001)
/**@brief MinMeasuredValue attribute maximum value. */
#define ZB_ZCL_ATTR_ANALOG_MIN_VALUE_MAX_VALUE 0x7FFE
/**@brief MinMeasuredValue attribute invalid value. */
#define ZB_ZCL_ATTR_ANALOG_MIN_VALUE_INVALID ((zb_int16_t)0x8000)
/**@brief MaxMeasuredValue attribute minimum value. */
#define ZB_ZCL_ATTR_ANALOG_MAX_VALUE_MIN_VALUE ((zb_int16_t)0x8002)
/**@brief MaxMeasuredValue attribute maximum value. */
#define ZB_ZCL_ATTR_ANALOG_MAX_VALUE_MAX_VALUE 0x7FFF
/**@brief MaxMeasuredValue attribute invalid value. */
#define ZB_ZCL_ATTR_ANALOG_MAX_VALUE_INVALID ((zb_int16_t)0x8000)
/**@brief MeasuredValue attribute unknown value. */
#define ZB_ZCL_ATTR_ANALOG_DEFAULT_STATUS_FLAG ((zb_uint8_t)0x00)
/**@brief Default value for Value attribute. */
#define ZB_ZCL_ANALOG_VALUE_DEFAULT_VALUE ((zb_int16_t)0x0)
#define ZB_SET_ATTR_DESCR_WITH_ZB_ZCL_ATTR_ANALOG_VALUE_ID(data_ptr) \
{ \
ZB_ZCL_ATTR_ANALOG_VALUE_ID, \
ZB_ZCL_ATTR_TYPE_SINGLE, \
ZB_ZCL_ATTR_ACCESS_READ_ONLY | ZB_ZCL_ATTR_ACCESS_WRITE_OPTIONAL, \
(zb_voidp_t) data_ptr \
}
#define ZB_SET_ATTR_DESCR_WITH_ZB_ZCL_ATTR_ANALOG_SERVICE_ID(data_ptr) \
{ \
ZB_ZCL_ATTR_ANALOG_SERVICE_ID, \
ZB_ZCL_ATTR_TYPE_BOOL, \
ZB_ZCL_ATTR_ACCESS_READ_ONLY | ZB_ZCL_ATTR_ACCESS_WRITE_OPTIONAL, \
(zb_voidp_t) data_ptr \
}
#define ZB_SET_ATTR_DESCR_WITH_ZB_ZCL_ATTR_ANALOG_STATUS_ID(data_ptr) \
{ \
ZB_ZCL_ATTR_ANALOG_STATUS_ID, \
ZB_ZCL_ATTR_TYPE_8BITMAP, \
ZB_ZCL_ATTR_ACCESS_READ_ONLY, \
(zb_voidp_t) data_ptr \
}
#define ZB_SET_ATTR_DESCR_WITH_ZB_ZCL_ATTR_ANALOG_ARRAY_ID(data_ptr) \
{ \
ZB_ZCL_ATTR_ANALOG_ARRAY_ID, \
ZB_ZCL_ATTR_TYPE_ARRAY, \
ZB_ZCL_ATTR_ACCESS_READ_ONLY, \
(zb_voidp_t) data_ptr \
}
/**@brief Declares attribute list for the cluster on the server side.
*/
#define ZB_ZCL_DECLARE_ANALOG_ATTRIB_LIST(attr_list, \
service, value, status, array) \
ZB_ZCL_START_DECLARE_ATTRIB_LIST(attr_list) \
ZB_ZCL_SET_ATTR_DESC(ZB_ZCL_ATTR_ANALOG_SERVICE_ID, (service)) \
ZB_ZCL_SET_ATTR_DESC(ZB_ZCL_ATTR_ANALOG_VALUE_ID, (value)) \
ZB_ZCL_SET_ATTR_DESC(ZB_ZCL_ATTR_ANALOG_STATUS_ID, (status)) \
ZB_ZCL_SET_ATTR_DESC(ZB_ZCL_ATTR_ANALOG_ARRAY_ID, (array)) \
ZB_ZCL_FINISH_DECLARE_ATTRIB_LIST
/**@brief Function initialising the server side of Cluster. */
zb_void_t zb_zcl_analog_init_server(void);
/**@brief Function initialising the client side of Cluster. */
zb_void_t zb_zcl_analog_init_client(void);
/**@brief Defines needed for the stack to initialise the cluster correctly. */
#define ZB_ZCL_CLUSTER_ID_CUSTOM_ATTR_SERVER_ROLE_INIT zb_zcl_analog_init_server
#define ZB_ZCL_CLUSTER_ID_CUSTOM_ATTR_CLIENT_ROLE_INIT zb_zcl_analog_init_client
#endif /* ZB_ZCL_ANALOG_SIGNAL_H__ */