SDK: nRF5_SDK_for_Thread_and_Zigbee_v4.1.0
Board: nRF52840
Hi, I'm a newbie in zigbee stack. I have been get started with the door lock example.
I want to make custom cluster adding some attributes.
so, I declare like this.
ZB_ZCL_DECLARE_BASIC_ATTRIB_LIST_EXT(basic_attr_list,
&m_dev_ctx.basic_attr.zcl_version,
&m_dev_ctx.basic_attr.app_version,
&m_dev_ctx.basic_attr.stack_version,
&m_dev_ctx.basic_attr.hw_version,
m_dev_ctx.basic_attr.mf_name,
m_dev_ctx.basic_attr.model_id,
m_dev_ctx.basic_attr.date_code,
&m_dev_ctx.basic_attr.power_source,
m_dev_ctx.basic_attr.location_id,
&m_dev_ctx.basic_attr.ph_env,
m_dev_ctx.basic_attr.sw_ver);
ZB_ZCL_DECLARE_IDENTIFY_ATTRIB_LIST(identify_attr_list, &m_dev_ctx.identify_attr.identify_time);
ZB_ZCL_DECLARE_GROUPS_ATTRIB_LIST(groups_attr_list, &m_dev_ctx.groups_attr.name_support);
MY_ZB_ZCL_DECLARE_DOOR_LOCK_ATTRIB_LIST(door_lock_attr_list,
&m_dev_ctx.door_lock_attr.lock_state,
&m_dev_ctx.door_lock_attr.lock_type,
&m_dev_ctx.door_lock_attr.actuator_enabled,
&m_dev_ctx.door_lock_attr.door_state,
&m_dev_ctx.door_lock_attr.operating_mode,
&m_dev_ctx.door_lock_attr.auto_relock_time,
&m_dev_ctx.door_lock_attr.sound_volume);
ZB_ZCL_DECLARE_IAS_ZONE_ATTRIB_LIST(ias_zone_attr_list,
&m_dev_ctx.ias_zone_attr.zone_state,
&m_dev_ctx.ias_zone_attr.zone_type,
&m_dev_ctx.ias_zone_attr.zone_status,
&m_dev_ctx.ias_zone_attr.ias_cie_address,
&m_dev_ctx.ias_zone_attr.cie_short_addr,
&m_dev_ctx.ias_zone_attr.cie_ep);
/* OTA cluster attributes data */
ZB_ZCL_DECLARE_OTA_UPGRADE_ATTRIB_LIST(ota_upgrade_attr_list,
m_dev_ctx.ota_attr.upgrade_server,
&m_dev_ctx.ota_attr.file_offset,
&m_dev_ctx.ota_attr.file_version,
&m_dev_ctx.ota_attr.stack_version,
&m_dev_ctx.ota_attr.downloaded_file_ver,
&m_dev_ctx.ota_attr.downloaded_stack_ver,
&m_dev_ctx.ota_attr.image_status,
&m_dev_ctx.ota_attr.manufacturer,
&m_dev_ctx.ota_attr.image_type,
&m_dev_ctx.ota_attr.min_block_reque,
&m_dev_ctx.ota_attr.image_stamp,
&m_dev_ctx.ota_attr.server_addr,
&m_dev_ctx.ota_attr.server_ep,
(uint16_t)NRF_DFU_HW_VERSION,
OTA_UPGRADE_TEST_DATA_SIZE,
ZB_ZCL_OTA_UPGRADE_QUERY_TIMER_COUNT_DEF);
MY_ZB_HA_DECLARE_DOOR_LOCK_CLUSTER_LIST(door_lock_clusters,
door_lock_attr_list,
basic_attr_list,
identify_attr_list,
groups_attr_list,
ias_zone_attr_list,
ota_upgrade_attr_list);
ZB_HA_DECLARE_DOOR_LOCK_EP(door_lock_ep, DOOR_LOCK_ENDPOINT, door_lock_clusters);
ZB_HA_DECLARE_DOOR_LOCK_CTX(door_lock_ctx, door_lock_ep);
I have added some attributes to the existing door lock attribute list.
typedef enum {
DOOR_STATE_OPEN = 0x00,
DOOR_STATE_CLOSE = 0x01,
} zb_door_lock_door_state_t;
typedef struct
{
zb_uint8_t lock_state;
zb_uint8_t lock_type;
zb_bool_t actuator_enabled;
zb_uint8_t door_state;
zb_uint8_t operating_mode;
zb_uint8_t auto_relock_time;
zb_uint8_t sound_volume;
} zb_zcl_door_lock_custom_attrs_t;
#define ZB_SET_ATTR_DESCR_WITH_ZB_ZCL_ATTR_DOOR_LOCK_DOOR_STATE_ID(data_ptr) \
{ \
ZB_ZCL_ATTR_DOOR_LOCK_DOOR_STATE_ID, \
ZB_ZCL_ATTR_TYPE_8BIT, \
ZB_ZCL_ATTR_ACCESS_READ_ONLY, \
(zb_voidp_t) data_ptr \
}
#define ZB_SET_ATTR_DESCR_WITH_ZB_ZCL_ATTR_DOOR_LOCK_OPERATING_MODE_ID(data_ptr) \
{ \
ZB_ZCL_ATTR_DOOR_LOCK_OPERATING_MODE_ID, \
ZB_ZCL_ATTR_TYPE_8BIT, \
ZB_ZCL_ATTR_ACCESS_READ_WRITE, \
(zb_voidp_t) data_ptr \
}
#define ZB_SET_ATTR_DESCR_WITH_ZB_ZCL_ATTR_DOOR_LOCK_AUTO_RELOCK_TIME_ID(data_ptr) \
{ \
ZB_ZCL_ATTR_DOOR_LOCK_AUTO_RELOCK_TIME_ID, \
ZB_ZCL_ATTR_TYPE_8BIT, \
ZB_ZCL_ATTR_ACCESS_READ_WRITE, \
(zb_voidp_t) data_ptr \
}
#define ZB_SET_ATTR_DESCR_WITH_ZB_ZCL_ATTR_DOOR_LOCK_SOUND_VOLUME_ID(data_ptr) \
{ \
ZB_ZCL_ATTR_DOOR_LOCK_SOUND_VOLUME_ID, \
ZB_ZCL_ATTR_TYPE_8BIT, \
ZB_ZCL_ATTR_ACCESS_READ_WRITE, \
(zb_voidp_t) data_ptr \
}
/** @brief Declare attribute list for DoorLock cluster
@param attr_list - attribute list name
@param lock_state
@param lock_type
@param actuator_enabled
@param door_state
*/
#define MY_ZB_ZCL_DECLARE_DOOR_LOCK_ATTRIB_LIST(attr_list, \
lock_state, \
lock_type, \
actuator_enabled, \
door_state, \
operating_mode, \
auto_relock_time, \
sound_volume) \
ZB_ZCL_START_DECLARE_ATTRIB_LIST(attr_list) \
ZB_ZCL_SET_ATTR_DESC(ZB_ZCL_ATTR_DOOR_LOCK_LOCK_STATE_ID, (lock_state)) \
ZB_ZCL_SET_ATTR_DESC(ZB_ZCL_ATTR_DOOR_LOCK_LOCK_TYPE_ID, (lock_type)) \
ZB_ZCL_SET_ATTR_DESC(ZB_ZCL_ATTR_DOOR_LOCK_ACTUATOR_ENABLED_ID, (actuator_enabled)) \
ZB_ZCL_SET_ATTR_DESC(ZB_ZCL_ATTR_DOOR_LOCK_DOOR_STATE_ID, (door_state)) \
ZB_ZCL_SET_ATTR_DESC(ZB_ZCL_ATTR_DOOR_LOCK_OPERATING_MODE_ID, (operating_mode)) \
ZB_ZCL_SET_ATTR_DESC(ZB_ZCL_ATTR_DOOR_LOCK_AUTO_RELOCK_TIME_ID, (auto_relock_time)) \
ZB_ZCL_SET_ATTR_DESC(ZB_ZCL_ATTR_DOOR_LOCK_SOUND_VOLUME_ID, (sound_volume)) \
ZB_ZCL_FINISH_DECLARE_ATTRIB_LIST
and I want to add ias zone attributes to the cluster.
typedef enum {
DOORLOCK_LOW_BATTERY_BIT = 0x0008,
DOORLOCK_DEADBOLT_BIT = 0x0100,
DOORLOCK_AWAY_BIT = 0x0200,
DOORLOCK_DOUBLELOCK_BIT = 0x0400,
DOORLOCK_INTRUSION_BIT = 0x0800,
DOORLOCK_FIRE_BIT = 0x1000,
DOORLOCK_OPEN_ERROR_BIT = 0x2000,
DOORLOCK_CLOSE_ERROR_BIT = 0x4000,
DOORLOCK_PRANK_ALARM_BIT = 0x8000,
} zb_door_lock_ias_zone_status_bits_t;
typedef struct
{
zb_uint8_t zone_state;
zb_uint16_t zone_type;
zb_uint16_t zone_status;
zb_uint64_t ias_cie_address;
zb_uint16_t cie_short_addr;
zb_uint8_t cie_ep;
} zb_zcl_ias_zone_attrs_t;
It is successfully compiled and I send report ias zone attribute.
I added report code like this.
zb_uint16_t ias_zone_state = DOORLOCK_PRANK_ALARM_BIT | DOORLOCK_LOW_BATTERY_BIT;
zb_zcl_status_t ret = zb_zcl_set_attr_val(DOOR_LOCK_ENDPOINT,
ZB_ZCL_CLUSTER_ID_IAS_ZONE,
ZB_ZCL_CLUSTER_SERVER_ROLE,
ZB_ZCL_ATTR_IAS_ZONE_ZONESTATUS_ID,
(zb_uint8_t*) &ias_zone_state,
ZB_FALSE);
But, I called this code. The board always was freezing.
ZBOSS SIG: ZB_ZDO_SIGNAL_PRODUCTION_CONFIG_READY Production config is not present or invalid <info> zboss: DE AD 1E 02 CA 00 10 00|........ <info> zboss: AA 01 A0 01 02 00 00 00|........ <info> zboss: 01 00 00 00 01 00 00 00|........ <info> zboss: 01 00 00 00 00 00 00 00|........ <info> zboss: DE AD 1A 02 11 01 11 00|........ <info> zboss: 2B 08 04 07 00 00 00 00|+....... <info> zboss: EB 99 00 00 10 00 00 00|........ <info> zboss: 01 00 00 00 DE AD 12 02|........ <info> zboss: 11 01 12 00 2B 08 05 07|....+... <info> zboss: BA D5 DC FD D9 F0 1A 2B|.......+ <info> zboss: DE AD 16 02 11 01 13 00|........ <info> zboss: 2B 08 F7 03 04 00 00 00|+....... <info> zboss: 00 00 00 00 06 00 00 00|........ ZBOSS SIG: ZB_BDB_SIGNAL_DEVICE_REBOOT Joined network successfully DOORLOCK STATUS: AB <info> zboss: DE AD 12 02 12 01 14 00|........ <info> zboss: 1A 08 62 01 00 05 00 00|..b..... <info> zboss: 01 00 00 00 DE AD 12 02|........ <info> zboss: 12 01 15 00 1A 08 77 01|......w. <info> zboss: 00 05 00 00 01 00 00 00|........ <info> zboss: DE AD 12 02 12 01 16 00|........ <info> zboss: 60 08 5B 00 16 08 00 00|`.[..... <info> zboss: 3D 03 00 00 |=...
with above printing logs.
And I tried to "ZB_ZCL_IAS_ZONE_SEND_STATUS_CHANGE_NOTIFICATION_REQ" macro.
zb_buf_t buf = {0};
ZB_ZCL_IAS_ZONE_SEND_STATUS_CHANGE_NOTIFICATION_REQ(
&buf, ZB_PIBCACHE_NETWORK_ADDRESS(), 0x02, DOOR_LOCK_ENDPOINT, DOOR_LOCK_ENDPOINT, ZB_AF_HA_PROFILE_ID,
NULL, ZB_ZCL_IAS_ZONE_ZONE_STATUS_BATTERY, 0, ZB_ZCL_ATTR_IAS_ZONE_ZONESTATUS_ID, 0);
but, The result is similar with zb_zcl_set_attr_val function.
<info> zboss: DE AD 12 02 D5 03 1C 00|........ <info> zboss: 60 08 5B 00 71 00 00 00|`.[.q... <info> zboss: 1D 02 00 00 |....
debugging trace with gdb.
Program received signal SIGTRAP, Trace/breakpoint trap. 0x000275ca in zb_osif_serial_flush () at ../../../../../../sdk/Thread_and_Zigbee/external/zboss/osif/zb_nrf52_nrf_logger.c:141 141 if (buffered) (gdb) where full #0 0x000275ca in zb_osif_serial_flush () at ../../../../../../sdk/Thread_and_Zigbee/external/zboss/osif/zb_nrf52_nrf_logger.c:141 No locals. #1 0x000273ce in zb_nrf52_abort () at ../../../../../../sdk/Thread_and_Zigbee/external/zboss/osif/zb_nrf52_common.c:179 No locals. #2 0x00054554 in zb_zcl_ias_zone_write_attr_hook_server () No symbol table info available. #3 0x0005219c in zb_zcl_set_attr_val () No symbol table info available.
called "zb_nrf52_abort" without any logs.
Is this correct way to add the attributes of the cluster?
Why the board is stuck after calling 'zb_zcl_set_attr_val' function?
Is this "zb_zcl_set_attr_va" function does send data to coordinator? What purpose is this function?
how can I send updated attribute data to coordinator?