From f05d1f8e3b26055be61dc623180e22958bc6a588 Mon Sep 17 00:00:00 2001 From: rbaron Date: Sat, 3 Dec 2022 18:59:10 +0100 Subject: [PATCH 01/36] Zigbee sample works with nRF52840dk + zigbee2mqtt --- code/nrf-connect/samples/zigbee/.gitignore | 2 + .../nrf-connect/samples/zigbee/CMakeLists.txt | 19 ++ .../zigbee/include/zb_range_extender.h | 113 ++++++++ code/nrf-connect/samples/zigbee/prj.conf | 43 +++ code/nrf-connect/samples/zigbee/src/main.c | 245 ++++++++++++++++++ 5 files changed, 422 insertions(+) create mode 100644 code/nrf-connect/samples/zigbee/.gitignore create mode 100644 code/nrf-connect/samples/zigbee/CMakeLists.txt create mode 100644 code/nrf-connect/samples/zigbee/include/zb_range_extender.h create mode 100644 code/nrf-connect/samples/zigbee/prj.conf create mode 100644 code/nrf-connect/samples/zigbee/src/main.c diff --git a/code/nrf-connect/samples/zigbee/.gitignore b/code/nrf-connect/samples/zigbee/.gitignore new file mode 100644 index 0000000..2286ab6 --- /dev/null +++ b/code/nrf-connect/samples/zigbee/.gitignore @@ -0,0 +1,2 @@ +build +build_* diff --git a/code/nrf-connect/samples/zigbee/CMakeLists.txt b/code/nrf-connect/samples/zigbee/CMakeLists.txt new file mode 100644 index 0000000..90d0e20 --- /dev/null +++ b/code/nrf-connect/samples/zigbee/CMakeLists.txt @@ -0,0 +1,19 @@ +# +# Copyright (c) 2021 Nordic Semiconductor ASA +# +# SPDX-License-Identifier: LicenseRef-Nordic-5-Clause +# + +cmake_minimum_required(VERSION 3.20.0) + +find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE}) + +project("Zigbee application template") + +# NORDIC SDK APP START +target_sources(app PRIVATE + src/main.c +) + +target_include_directories(app PRIVATE include) +# NORDIC SDK APP END diff --git a/code/nrf-connect/samples/zigbee/include/zb_range_extender.h b/code/nrf-connect/samples/zigbee/include/zb_range_extender.h new file mode 100644 index 0000000..a359452 --- /dev/null +++ b/code/nrf-connect/samples/zigbee/include/zb_range_extender.h @@ -0,0 +1,113 @@ +/* + * Copyright (c) 2022 Nordic Semiconductor ASA + * + * SPDX-License-Identifier: LicenseRef-Nordic-5-Clause + */ + +#ifndef ZB_RANGE_EXTENDER_H +#define ZB_RANGE_EXTENDER_H 1 + +/** + * @defgroup ZB_DEFINE_DEVICE_RANGE_EXTENDER Range Extender + * @{ + * @details + * - @ref ZB_ZCL_IDENTIFY \n + * - @ref ZB_ZCL_BASIC + */ + +/** Range Extender Device ID*/ +#define ZB_RANGE_EXTENDER_DEVICE_ID 0x0008 + +/** Range extender device version */ +#define ZB_DEVICE_VER_RANGE_EXTENDER 0 + +/** @cond internals_doc */ + +/** Range extender IN (server) clusters number */ +#define ZB_RANGE_EXTENDER_IN_CLUSTER_NUM 2 + +/** Range extender OUT (client) clusters number */ +#define ZB_RANGE_EXTENDER_OUT_CLUSTER_NUM 0 + +#define ZB_RANGE_EXTENDER_CLUSTER_NUM \ + (ZB_RANGE_EXTENDER_IN_CLUSTER_NUM + ZB_RANGE_EXTENDER_OUT_CLUSTER_NUM) + +/** Number of attribute for reporting on Range extender device */ +#define ZB_RANGE_EXTENDER_REPORT_ATTR_COUNT 0 + +/** @endcond */ /* internals_doc */ + +/** + * @brief Declare cluster list for Range extender device + * @param cluster_list_name - cluster list variable name + * @param basic_attr_list - attribute list for Basic cluster + * @param identify_attr_list - attribute list for Identify cluster + */ +#define ZB_DECLARE_RANGE_EXTENDER_CLUSTER_LIST( \ + cluster_list_name, \ + basic_attr_list, \ + identify_attr_list) \ +zb_zcl_cluster_desc_t cluster_list_name[] = \ +{ \ + ZB_ZCL_CLUSTER_DESC( \ + ZB_ZCL_CLUSTER_ID_IDENTIFY, \ + ZB_ZCL_ARRAY_SIZE(identify_attr_list, zb_zcl_attr_t), \ + (identify_attr_list), \ + ZB_ZCL_CLUSTER_SERVER_ROLE, \ + ZB_ZCL_MANUF_CODE_INVALID \ + ), \ + ZB_ZCL_CLUSTER_DESC( \ + ZB_ZCL_CLUSTER_ID_BASIC, \ + ZB_ZCL_ARRAY_SIZE(basic_attr_list, zb_zcl_attr_t), \ + (basic_attr_list), \ + ZB_ZCL_CLUSTER_SERVER_ROLE, \ + ZB_ZCL_MANUF_CODE_INVALID \ + ) \ +} + +/** @cond internals_doc */ + +/** + * @brief Declare simple descriptor for Range extender device + * @param ep_name - endpoint variable name + * @param ep_id - endpoint ID + * @param in_clust_num - number of supported input clusters + * @param out_clust_num - number of supported output clusters + */ +#define ZB_ZCL_DECLARE_RANGE_EXTENDER_SIMPLE_DESC(ep_name, ep_id, in_clust_num, out_clust_num) \ + ZB_DECLARE_SIMPLE_DESC(in_clust_num, out_clust_num); \ + ZB_AF_SIMPLE_DESC_TYPE(in_clust_num, out_clust_num) simple_desc_##ep_name = \ + { \ + ep_id, \ + ZB_AF_HA_PROFILE_ID, \ + ZB_RANGE_EXTENDER_DEVICE_ID, \ + ZB_DEVICE_VER_RANGE_EXTENDER, \ + 0, \ + in_clust_num, \ + out_clust_num, \ + { \ + ZB_ZCL_CLUSTER_ID_BASIC, \ + ZB_ZCL_CLUSTER_ID_IDENTIFY \ + } \ + } + +/** @endcond */ /* internals_doc */ + +/** + * @brief Declare endpoint for Range extender device + * @param ep_name - endpoint variable name + * @param ep_id - endpoint ID + * @param cluster_list - endpoint cluster list + */ +#define ZB_DECLARE_RANGE_EXTENDER_EP(ep_name, ep_id, cluster_list) \ + ZB_ZCL_DECLARE_RANGE_EXTENDER_SIMPLE_DESC(ep_name, ep_id, \ + ZB_RANGE_EXTENDER_IN_CLUSTER_NUM, ZB_RANGE_EXTENDER_OUT_CLUSTER_NUM); \ + ZB_AF_DECLARE_ENDPOINT_DESC(ep_name, ep_id, ZB_AF_HA_PROFILE_ID, 0, NULL, \ + ZB_ZCL_ARRAY_SIZE(cluster_list, zb_zcl_cluster_desc_t), cluster_list, \ + (zb_af_simple_desc_1_1_t *)&simple_desc_##ep_name, \ + 0, NULL, /* No reporting ctx */ \ + 0, NULL) /* No CVC ctx */ + +/*! @} */ + +#endif /* ZB_RANGE_EXTENDER_H */ diff --git a/code/nrf-connect/samples/zigbee/prj.conf b/code/nrf-connect/samples/zigbee/prj.conf new file mode 100644 index 0000000..15a1e3f --- /dev/null +++ b/code/nrf-connect/samples/zigbee/prj.conf @@ -0,0 +1,43 @@ +# +# Copyright (c) 2021 Nordic Semiconductor ASA +# +# SPDX-License-Identifier: LicenseRef-Nordic-5-Clause +# + +CONFIG_NCS_SAMPLES_DEFAULTS=y + +CONFIG_UART_INTERRUPT_DRIVEN=y +CONFIG_SERIAL=y +CONFIG_GPIO=y + +# Make sure printk is not printing to the UART console +CONFIG_CONSOLE=y +CONFIG_UART_CONSOLE=y + +CONFIG_HEAP_MEM_POOL_SIZE=2048 +CONFIG_MAIN_THREAD_PRIORITY=7 + +CONFIG_ZIGBEE=y +CONFIG_ZIGBEE_APP_UTILS=y +CONFIG_ZIGBEE_ROLE_ROUTER=y + +# Enable DK LED and Buttons library +CONFIG_DK_LIBRARY=y + +# This example requires more workqueue stack +CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=2048 + +# Enable nRF ECB driver +CONFIG_CRYPTO=y +CONFIG_CRYPTO_NRF_ECB=y +CONFIG_CRYPTO_INIT_PRIORITY=80 + +# Networking +CONFIG_NET_IPV6_MLD=n +CONFIG_NET_IPV6_NBR_CACHE=n +CONFIG_NET_IPV6_RA_RDNSS=n +CONFIG_NET_IP_ADDR_CHECK=n +CONFIG_NET_UDP=n + +# Get Zigbee to scan every channel. +CONFIG_ZIGBEE_CHANNEL_SELECTION_MODE_MULTI=y \ No newline at end of file diff --git a/code/nrf-connect/samples/zigbee/src/main.c b/code/nrf-connect/samples/zigbee/src/main.c new file mode 100644 index 0000000..4669832 --- /dev/null +++ b/code/nrf-connect/samples/zigbee/src/main.c @@ -0,0 +1,245 @@ +/* + * Copyright (c) 2021 Nordic Semiconductor ASA + * + * SPDX-License-Identifier: LicenseRef-Nordic-5-Clause + */ + +/** @file + * + * @brief Zigbee application template. + */ + +#include +#include +#include + +#include +#include +#include +#include +#include "zb_range_extender.h" + + +/* Device endpoint, used to receive ZCL commands. */ +#define APP_TEMPLATE_ENDPOINT 10 + +/* Type of power sources available for the device. + * For possible values see section 3.2.2.2.8 of ZCL specification. + */ +#define TEMPLATE_INIT_BASIC_POWER_SOURCE ZB_ZCL_BASIC_POWER_SOURCE_DC_SOURCE + +/* LED indicating that device successfully joined Zigbee network. */ +#define ZIGBEE_NETWORK_STATE_LED DK_LED3 + +/* LED used for device identification. */ +#define IDENTIFY_LED DK_LED4 + +/* Button used to enter the Identify mode. */ +#define IDENTIFY_MODE_BUTTON DK_BTN4_MSK + +/* Button to start Factory Reset */ +#define FACTORY_RESET_BUTTON IDENTIFY_MODE_BUTTON + +LOG_MODULE_REGISTER(app, LOG_LEVEL_INF); + +/* Main application customizable context. + * Stores all settings and static values. + */ +struct zb_device_ctx { + zb_zcl_basic_attrs_t basic_attr; + zb_zcl_identify_attrs_t identify_attr; +}; + +/* Zigbee device application context storage. */ +static struct zb_device_ctx dev_ctx; + +ZB_ZCL_DECLARE_IDENTIFY_ATTRIB_LIST( + identify_attr_list, + &dev_ctx.identify_attr.identify_time); + +ZB_ZCL_DECLARE_BASIC_ATTRIB_LIST( + basic_attr_list, + &dev_ctx.basic_attr.zcl_version, + &dev_ctx.basic_attr.power_source); + +ZB_DECLARE_RANGE_EXTENDER_CLUSTER_LIST( + app_template_clusters, + basic_attr_list, + identify_attr_list); + +ZB_DECLARE_RANGE_EXTENDER_EP( + app_template_ep, + APP_TEMPLATE_ENDPOINT, + app_template_clusters); + +ZBOSS_DECLARE_DEVICE_CTX_1_EP( + app_template_ctx, + app_template_ep); + + +/**@brief Function for initializing all clusters attributes. */ +static void app_clusters_attr_init(void) +{ + /* Basic cluster attributes data */ + dev_ctx.basic_attr.zcl_version = ZB_ZCL_VERSION; + dev_ctx.basic_attr.power_source = TEMPLATE_INIT_BASIC_POWER_SOURCE; + + /* Identify cluster attributes data. */ + dev_ctx.identify_attr.identify_time = + ZB_ZCL_IDENTIFY_IDENTIFY_TIME_DEFAULT_VALUE; +} + +/**@brief Function to toggle the identify LED + * + * @param bufid Unused parameter, required by ZBOSS scheduler API. + */ +static void toggle_identify_led(zb_bufid_t bufid) +{ + static int blink_status; + + dk_set_led(IDENTIFY_LED, (++blink_status) % 2); + ZB_SCHEDULE_APP_ALARM(toggle_identify_led, bufid, ZB_MILLISECONDS_TO_BEACON_INTERVAL(100)); +} + +/**@brief Function to handle identify notification events on the first endpoint. + * + * @param bufid Unused parameter, required by ZBOSS scheduler API. + */ +static void identify_cb(zb_bufid_t bufid) +{ + zb_ret_t zb_err_code; + + if (bufid) { + /* Schedule a self-scheduling function that will toggle the LED */ + ZB_SCHEDULE_APP_CALLBACK(toggle_identify_led, bufid); + } else { + /* Cancel the toggling function alarm and turn off LED */ + zb_err_code = ZB_SCHEDULE_APP_ALARM_CANCEL(toggle_identify_led, ZB_ALARM_ANY_PARAM); + ZVUNUSED(zb_err_code); + + dk_set_led(IDENTIFY_LED, 0); + } +} + +/**@brief Starts identifying the device. + * + * @param bufid Unused parameter, required by ZBOSS scheduler API. + */ +static void start_identifying(zb_bufid_t bufid) +{ + ZVUNUSED(bufid); + + if (ZB_JOINED()) { + /* Check if endpoint is in identifying mode, + * if not put desired endpoint in identifying mode. + */ + if (dev_ctx.identify_attr.identify_time == + ZB_ZCL_IDENTIFY_IDENTIFY_TIME_DEFAULT_VALUE) { + + zb_ret_t zb_err_code = zb_bdb_finding_binding_target( + APP_TEMPLATE_ENDPOINT); + + if (zb_err_code == RET_OK) { + LOG_INF("Enter identify mode"); + } else if (zb_err_code == RET_INVALID_STATE) { + LOG_WRN("RET_INVALID_STATE - Cannot enter identify mode"); + } else { + ZB_ERROR_CHECK(zb_err_code); + } + } else { + LOG_INF("Cancel identify mode"); + zb_bdb_finding_binding_target_cancel(); + } + } else { + LOG_WRN("Device not in a network - cannot enter identify mode"); + } +} + +/**@brief Callback for button events. + * + * @param[in] button_state Bitmask containing buttons state. + * @param[in] has_changed Bitmask containing buttons + * that have changed their state. + */ +static void button_changed(uint32_t button_state, uint32_t has_changed) +{ + if (IDENTIFY_MODE_BUTTON & has_changed) { + if (IDENTIFY_MODE_BUTTON & button_state) { + /* Button changed its state to pressed */ + } else { + /* Button changed its state to released */ + if (was_factory_reset_done()) { + /* The long press was for Factory Reset */ + LOG_DBG("After Factory Reset - ignore button release"); + } else { + /* Button released before Factory Reset */ + + /* Start identification mode */ + ZB_SCHEDULE_APP_CALLBACK(start_identifying, 0); + } + } + } + + check_factory_reset_button(button_state, has_changed); +} + +/**@brief Function for initializing LEDs and Buttons. */ +static void configure_gpio(void) +{ + int err; + + err = dk_buttons_init(button_changed); + if (err) { + LOG_ERR("Cannot init buttons (err: %d)", err); + } + + err = dk_leds_init(); + if (err) { + LOG_ERR("Cannot init LEDs (err: %d)", err); + } +} + +/**@brief Zigbee stack event handler. + * + * @param[in] bufid Reference to the Zigbee stack buffer + * used to pass signal. + */ +void zboss_signal_handler(zb_bufid_t bufid) +{ + /* Update network status LED. */ + zigbee_led_status_update(bufid, ZIGBEE_NETWORK_STATE_LED); + + /* No application-specific behavior is required. + * Call default signal handler. + */ + ZB_ERROR_CHECK(zigbee_default_signal_handler(bufid)); + + /* All callbacks should either reuse or free passed buffers. + * If bufid == 0, the buffer is invalid (not passed). + */ + if (bufid) { + zb_buf_free(bufid); + } +} + +void main(void) +{ + LOG_INF("Starting Zigbee application template example"); + + /* Initialize */ + configure_gpio(); + register_factory_reset_button(FACTORY_RESET_BUTTON); + + /* Register device context (endpoints). */ + ZB_AF_REGISTER_DEVICE_CTX(&app_template_ctx); + + app_clusters_attr_init(); + + /* Register handlers to identify notifications */ + ZB_AF_SET_IDENTIFY_NOTIFICATION_HANDLER(APP_TEMPLATE_ENDPOINT, identify_cb); + + /* Start Zigbee default thread */ + zigbee_enable(); + + LOG_INF("Zigbee application template started"); +} From f090b25a2cacec6334ff755ce72ea5e40dd56af6 Mon Sep 17 00:00:00 2001 From: rbaron Date: Sun, 4 Dec 2022 14:30:54 +0100 Subject: [PATCH 02/36] Got manufacturer data to show as "b-parasite" in zigbee2mqtt --- code/nrf-connect/samples/zigbee/prj.conf | 2 +- code/nrf-connect/samples/zigbee/src/main.c | 288 +++++++++++---------- 2 files changed, 152 insertions(+), 138 deletions(-) diff --git a/code/nrf-connect/samples/zigbee/prj.conf b/code/nrf-connect/samples/zigbee/prj.conf index 15a1e3f..ba1d7ba 100644 --- a/code/nrf-connect/samples/zigbee/prj.conf +++ b/code/nrf-connect/samples/zigbee/prj.conf @@ -19,7 +19,7 @@ CONFIG_MAIN_THREAD_PRIORITY=7 CONFIG_ZIGBEE=y CONFIG_ZIGBEE_APP_UTILS=y -CONFIG_ZIGBEE_ROLE_ROUTER=y +CONFIG_ZIGBEE_ROLE_END_DEVICE=y # Enable DK LED and Buttons library CONFIG_DK_LIBRARY=y diff --git a/code/nrf-connect/samples/zigbee/src/main.c b/code/nrf-connect/samples/zigbee/src/main.c index 4669832..899655a 100644 --- a/code/nrf-connect/samples/zigbee/src/main.c +++ b/code/nrf-connect/samples/zigbee/src/main.c @@ -9,36 +9,41 @@ * @brief Zigbee application template. */ +#include +#include +#include +#include #include #include -#include - -#include -#include #include -#include +#include + #include "zb_range_extender.h" - /* Device endpoint, used to receive ZCL commands. */ -#define APP_TEMPLATE_ENDPOINT 10 +#define APP_TEMPLATE_ENDPOINT 10 /* Type of power sources available for the device. * For possible values see section 3.2.2.2.8 of ZCL specification. */ -#define TEMPLATE_INIT_BASIC_POWER_SOURCE ZB_ZCL_BASIC_POWER_SOURCE_DC_SOURCE +// #define TEMPLATE_INIT_BASIC_POWER_SOURCE ZB_ZCL_BASIC_POWER_SOURCE_DC_SOURCE +#define TEMPLATE_INIT_BASIC_POWER_SOURCE ZB_ZCL_BASIC_POWER_SOURCE_BATTERY /* LED indicating that device successfully joined Zigbee network. */ -#define ZIGBEE_NETWORK_STATE_LED DK_LED3 +#define ZIGBEE_NETWORK_STATE_LED DK_LED3 /* LED used for device identification. */ -#define IDENTIFY_LED DK_LED4 +#define IDENTIFY_LED DK_LED4 /* Button used to enter the Identify mode. */ -#define IDENTIFY_MODE_BUTTON DK_BTN4_MSK +#define IDENTIFY_MODE_BUTTON DK_BTN4_MSK /* Button to start Factory Reset */ -#define FACTORY_RESET_BUTTON IDENTIFY_MODE_BUTTON +#define FACTORY_RESET_BUTTON IDENTIFY_MODE_BUTTON + +#define PRST_BASIC_MANUF_NAME "b-parasite" + +#define PRST_BASIC_MODEL_ID "b-parasite 1.2.0" LOG_MODULE_REGISTER(app, LOG_LEVEL_INF); @@ -46,113 +51,126 @@ LOG_MODULE_REGISTER(app, LOG_LEVEL_INF); * Stores all settings and static values. */ struct zb_device_ctx { - zb_zcl_basic_attrs_t basic_attr; - zb_zcl_identify_attrs_t identify_attr; + zb_zcl_basic_attrs_ext_t basic_attr; + zb_zcl_identify_attrs_t identify_attr; }; /* Zigbee device application context storage. */ static struct zb_device_ctx dev_ctx; ZB_ZCL_DECLARE_IDENTIFY_ATTRIB_LIST( - identify_attr_list, - &dev_ctx.identify_attr.identify_time); + identify_attr_list, + &dev_ctx.identify_attr.identify_time); -ZB_ZCL_DECLARE_BASIC_ATTRIB_LIST( - basic_attr_list, - &dev_ctx.basic_attr.zcl_version, - &dev_ctx.basic_attr.power_source); +ZB_ZCL_DECLARE_BASIC_ATTRIB_LIST_EXT( + basic_attr_list, + &dev_ctx.basic_attr.zcl_version, + &dev_ctx.basic_attr.app_version, + &dev_ctx.basic_attr.stack_version, + &dev_ctx.basic_attr.hw_version, + dev_ctx.basic_attr.mf_name, + dev_ctx.basic_attr.model_id, + dev_ctx.basic_attr.date_code, + &dev_ctx.basic_attr.power_source, + dev_ctx.basic_attr.location_id, + &dev_ctx.basic_attr.ph_env, + dev_ctx.basic_attr.sw_ver); ZB_DECLARE_RANGE_EXTENDER_CLUSTER_LIST( - app_template_clusters, - basic_attr_list, - identify_attr_list); + app_template_clusters, + basic_attr_list, + identify_attr_list); ZB_DECLARE_RANGE_EXTENDER_EP( - app_template_ep, - APP_TEMPLATE_ENDPOINT, - app_template_clusters); + app_template_ep, + APP_TEMPLATE_ENDPOINT, + app_template_clusters); ZBOSS_DECLARE_DEVICE_CTX_1_EP( - app_template_ctx, - app_template_ep); - + app_template_ctx, + app_template_ep); /**@brief Function for initializing all clusters attributes. */ -static void app_clusters_attr_init(void) -{ - /* Basic cluster attributes data */ - dev_ctx.basic_attr.zcl_version = ZB_ZCL_VERSION; - dev_ctx.basic_attr.power_source = TEMPLATE_INIT_BASIC_POWER_SOURCE; +static void app_clusters_attr_init(void) { + /* Basic cluster attributes data */ + dev_ctx.basic_attr.zcl_version = ZB_ZCL_VERSION; + dev_ctx.basic_attr.power_source = TEMPLATE_INIT_BASIC_POWER_SOURCE; + // dev_ctx.basic_attr.mf_name + ZB_ZCL_SET_STRING_VAL( + dev_ctx.basic_attr.mf_name, + PRST_BASIC_MANUF_NAME, + ZB_ZCL_STRING_CONST_SIZE(PRST_BASIC_MANUF_NAME)); - /* Identify cluster attributes data. */ - dev_ctx.identify_attr.identify_time = - ZB_ZCL_IDENTIFY_IDENTIFY_TIME_DEFAULT_VALUE; + ZB_ZCL_SET_STRING_VAL( + dev_ctx.basic_attr.model_id, + PRST_BASIC_MODEL_ID, + ZB_ZCL_STRING_CONST_SIZE(PRST_BASIC_MODEL_ID)); + + /* Identify cluster attributes data. */ + dev_ctx.identify_attr.identify_time = + ZB_ZCL_IDENTIFY_IDENTIFY_TIME_DEFAULT_VALUE; } /**@brief Function to toggle the identify LED * * @param bufid Unused parameter, required by ZBOSS scheduler API. */ -static void toggle_identify_led(zb_bufid_t bufid) -{ - static int blink_status; +static void toggle_identify_led(zb_bufid_t bufid) { + static int blink_status; - dk_set_led(IDENTIFY_LED, (++blink_status) % 2); - ZB_SCHEDULE_APP_ALARM(toggle_identify_led, bufid, ZB_MILLISECONDS_TO_BEACON_INTERVAL(100)); + dk_set_led(IDENTIFY_LED, (++blink_status) % 2); + ZB_SCHEDULE_APP_ALARM(toggle_identify_led, bufid, ZB_MILLISECONDS_TO_BEACON_INTERVAL(100)); } /**@brief Function to handle identify notification events on the first endpoint. * * @param bufid Unused parameter, required by ZBOSS scheduler API. */ -static void identify_cb(zb_bufid_t bufid) -{ - zb_ret_t zb_err_code; +static void identify_cb(zb_bufid_t bufid) { + zb_ret_t zb_err_code; - if (bufid) { - /* Schedule a self-scheduling function that will toggle the LED */ - ZB_SCHEDULE_APP_CALLBACK(toggle_identify_led, bufid); - } else { - /* Cancel the toggling function alarm and turn off LED */ - zb_err_code = ZB_SCHEDULE_APP_ALARM_CANCEL(toggle_identify_led, ZB_ALARM_ANY_PARAM); - ZVUNUSED(zb_err_code); + if (bufid) { + /* Schedule a self-scheduling function that will toggle the LED */ + ZB_SCHEDULE_APP_CALLBACK(toggle_identify_led, bufid); + } else { + /* Cancel the toggling function alarm and turn off LED */ + zb_err_code = ZB_SCHEDULE_APP_ALARM_CANCEL(toggle_identify_led, ZB_ALARM_ANY_PARAM); + ZVUNUSED(zb_err_code); - dk_set_led(IDENTIFY_LED, 0); - } + dk_set_led(IDENTIFY_LED, 0); + } } /**@brief Starts identifying the device. * * @param bufid Unused parameter, required by ZBOSS scheduler API. */ -static void start_identifying(zb_bufid_t bufid) -{ - ZVUNUSED(bufid); +static void start_identifying(zb_bufid_t bufid) { + ZVUNUSED(bufid); - if (ZB_JOINED()) { - /* Check if endpoint is in identifying mode, - * if not put desired endpoint in identifying mode. - */ - if (dev_ctx.identify_attr.identify_time == - ZB_ZCL_IDENTIFY_IDENTIFY_TIME_DEFAULT_VALUE) { + if (ZB_JOINED()) { + /* Check if endpoint is in identifying mode, + * if not put desired endpoint in identifying mode. + */ + if (dev_ctx.identify_attr.identify_time == + ZB_ZCL_IDENTIFY_IDENTIFY_TIME_DEFAULT_VALUE) { + zb_ret_t zb_err_code = zb_bdb_finding_binding_target( + APP_TEMPLATE_ENDPOINT); - zb_ret_t zb_err_code = zb_bdb_finding_binding_target( - APP_TEMPLATE_ENDPOINT); - - if (zb_err_code == RET_OK) { - LOG_INF("Enter identify mode"); - } else if (zb_err_code == RET_INVALID_STATE) { - LOG_WRN("RET_INVALID_STATE - Cannot enter identify mode"); - } else { - ZB_ERROR_CHECK(zb_err_code); - } - } else { - LOG_INF("Cancel identify mode"); - zb_bdb_finding_binding_target_cancel(); - } - } else { - LOG_WRN("Device not in a network - cannot enter identify mode"); - } + if (zb_err_code == RET_OK) { + LOG_INF("Enter identify mode"); + } else if (zb_err_code == RET_INVALID_STATE) { + LOG_WRN("RET_INVALID_STATE - Cannot enter identify mode"); + } else { + ZB_ERROR_CHECK(zb_err_code); + } + } else { + LOG_INF("Cancel identify mode"); + zb_bdb_finding_binding_target_cancel(); + } + } else { + LOG_WRN("Device not in a network - cannot enter identify mode"); + } } /**@brief Callback for button events. @@ -161,42 +179,40 @@ static void start_identifying(zb_bufid_t bufid) * @param[in] has_changed Bitmask containing buttons * that have changed their state. */ -static void button_changed(uint32_t button_state, uint32_t has_changed) -{ - if (IDENTIFY_MODE_BUTTON & has_changed) { - if (IDENTIFY_MODE_BUTTON & button_state) { - /* Button changed its state to pressed */ - } else { - /* Button changed its state to released */ - if (was_factory_reset_done()) { - /* The long press was for Factory Reset */ - LOG_DBG("After Factory Reset - ignore button release"); - } else { - /* Button released before Factory Reset */ +static void button_changed(uint32_t button_state, uint32_t has_changed) { + if (IDENTIFY_MODE_BUTTON & has_changed) { + if (IDENTIFY_MODE_BUTTON & button_state) { + /* Button changed its state to pressed */ + } else { + /* Button changed its state to released */ + if (was_factory_reset_done()) { + /* The long press was for Factory Reset */ + LOG_DBG("After Factory Reset - ignore button release"); + } else { + /* Button released before Factory Reset */ - /* Start identification mode */ - ZB_SCHEDULE_APP_CALLBACK(start_identifying, 0); - } - } - } + /* Start identification mode */ + ZB_SCHEDULE_APP_CALLBACK(start_identifying, 0); + } + } + } - check_factory_reset_button(button_state, has_changed); + check_factory_reset_button(button_state, has_changed); } /**@brief Function for initializing LEDs and Buttons. */ -static void configure_gpio(void) -{ - int err; +static void configure_gpio(void) { + int err; - err = dk_buttons_init(button_changed); - if (err) { - LOG_ERR("Cannot init buttons (err: %d)", err); - } + err = dk_buttons_init(button_changed); + if (err) { + LOG_ERR("Cannot init buttons (err: %d)", err); + } - err = dk_leds_init(); - if (err) { - LOG_ERR("Cannot init LEDs (err: %d)", err); - } + err = dk_leds_init(); + if (err) { + LOG_ERR("Cannot init LEDs (err: %d)", err); + } } /**@brief Zigbee stack event handler. @@ -204,42 +220,40 @@ static void configure_gpio(void) * @param[in] bufid Reference to the Zigbee stack buffer * used to pass signal. */ -void zboss_signal_handler(zb_bufid_t bufid) -{ - /* Update network status LED. */ - zigbee_led_status_update(bufid, ZIGBEE_NETWORK_STATE_LED); +void zboss_signal_handler(zb_bufid_t bufid) { + /* Update network status LED. */ + zigbee_led_status_update(bufid, ZIGBEE_NETWORK_STATE_LED); - /* No application-specific behavior is required. - * Call default signal handler. - */ - ZB_ERROR_CHECK(zigbee_default_signal_handler(bufid)); + /* No application-specific behavior is required. + * Call default signal handler. + */ + ZB_ERROR_CHECK(zigbee_default_signal_handler(bufid)); - /* All callbacks should either reuse or free passed buffers. - * If bufid == 0, the buffer is invalid (not passed). - */ - if (bufid) { - zb_buf_free(bufid); - } + /* All callbacks should either reuse or free passed buffers. + * If bufid == 0, the buffer is invalid (not passed). + */ + if (bufid) { + zb_buf_free(bufid); + } } -void main(void) -{ - LOG_INF("Starting Zigbee application template example"); +void main(void) { + LOG_INF("Starting Zigbee application template example"); - /* Initialize */ - configure_gpio(); - register_factory_reset_button(FACTORY_RESET_BUTTON); + /* Initialize */ + configure_gpio(); + register_factory_reset_button(FACTORY_RESET_BUTTON); - /* Register device context (endpoints). */ - ZB_AF_REGISTER_DEVICE_CTX(&app_template_ctx); + /* Register device context (endpoints). */ + ZB_AF_REGISTER_DEVICE_CTX(&app_template_ctx); - app_clusters_attr_init(); + app_clusters_attr_init(); - /* Register handlers to identify notifications */ - ZB_AF_SET_IDENTIFY_NOTIFICATION_HANDLER(APP_TEMPLATE_ENDPOINT, identify_cb); + /* Register handlers to identify notifications */ + ZB_AF_SET_IDENTIFY_NOTIFICATION_HANDLER(APP_TEMPLATE_ENDPOINT, identify_cb); - /* Start Zigbee default thread */ - zigbee_enable(); + /* Start Zigbee default thread */ + zigbee_enable(); - LOG_INF("Zigbee application template started"); + LOG_INF("Zigbee application template started"); } From d8322c9162bb710f1b48150b6ec5a072250d1182 Mon Sep 17 00:00:00 2001 From: rbaron Date: Sun, 4 Dec 2022 17:49:22 +0100 Subject: [PATCH 03/36] Modified the zigbee template with added temperature cluster According to https://developer.nordicsemi.com/nRF_Connect_SDK/doc/2.1.2/nrf/ug_zigbee_adding_clusters.html. --- .../zigbee/include/zb_range_extender.h | 102 +++++++++--------- code/nrf-connect/samples/zigbee/src/main.c | 15 ++- 2 files changed, 62 insertions(+), 55 deletions(-) diff --git a/code/nrf-connect/samples/zigbee/include/zb_range_extender.h b/code/nrf-connect/samples/zigbee/include/zb_range_extender.h index a359452..3165db4 100644 --- a/code/nrf-connect/samples/zigbee/include/zb_range_extender.h +++ b/code/nrf-connect/samples/zigbee/include/zb_range_extender.h @@ -24,46 +24,42 @@ /** @cond internals_doc */ /** Range extender IN (server) clusters number */ -#define ZB_RANGE_EXTENDER_IN_CLUSTER_NUM 2 +#define ZB_RANGE_EXTENDER_IN_CLUSTER_NUM 3 /** Range extender OUT (client) clusters number */ #define ZB_RANGE_EXTENDER_OUT_CLUSTER_NUM 0 #define ZB_RANGE_EXTENDER_CLUSTER_NUM \ - (ZB_RANGE_EXTENDER_IN_CLUSTER_NUM + ZB_RANGE_EXTENDER_OUT_CLUSTER_NUM) + (ZB_RANGE_EXTENDER_IN_CLUSTER_NUM + ZB_RANGE_EXTENDER_OUT_CLUSTER_NUM) /** Number of attribute for reporting on Range extender device */ #define ZB_RANGE_EXTENDER_REPORT_ATTR_COUNT 0 -/** @endcond */ /* internals_doc */ - -/** - * @brief Declare cluster list for Range extender device - * @param cluster_list_name - cluster list variable name - * @param basic_attr_list - attribute list for Basic cluster - * @param identify_attr_list - attribute list for Identify cluster - */ -#define ZB_DECLARE_RANGE_EXTENDER_CLUSTER_LIST( \ - cluster_list_name, \ - basic_attr_list, \ - identify_attr_list) \ -zb_zcl_cluster_desc_t cluster_list_name[] = \ -{ \ - ZB_ZCL_CLUSTER_DESC( \ - ZB_ZCL_CLUSTER_ID_IDENTIFY, \ - ZB_ZCL_ARRAY_SIZE(identify_attr_list, zb_zcl_attr_t), \ - (identify_attr_list), \ - ZB_ZCL_CLUSTER_SERVER_ROLE, \ - ZB_ZCL_MANUF_CODE_INVALID \ - ), \ - ZB_ZCL_CLUSTER_DESC( \ - ZB_ZCL_CLUSTER_ID_BASIC, \ - ZB_ZCL_ARRAY_SIZE(basic_attr_list, zb_zcl_attr_t), \ - (basic_attr_list), \ - ZB_ZCL_CLUSTER_SERVER_ROLE, \ - ZB_ZCL_MANUF_CODE_INVALID \ - ) \ -} +#define ZB_DECLARE_RANGE_EXTENDER_CLUSTER_LIST( \ + cluster_list_name, \ + basic_attr_list, \ + identify_attr_list, \ + temp_measurement_attr_list) \ + zb_zcl_cluster_desc_t cluster_list_name[] = \ + { \ + ZB_ZCL_CLUSTER_DESC( \ + ZB_ZCL_CLUSTER_ID_IDENTIFY, \ + ZB_ZCL_ARRAY_SIZE(identify_attr_list, zb_zcl_attr_t), \ + (identify_attr_list), \ + ZB_ZCL_CLUSTER_SERVER_ROLE, \ + ZB_ZCL_MANUF_CODE_INVALID), \ + ZB_ZCL_CLUSTER_DESC( \ + ZB_ZCL_CLUSTER_ID_BASIC, \ + ZB_ZCL_ARRAY_SIZE(basic_attr_list, zb_zcl_attr_t), \ + (basic_attr_list), \ + ZB_ZCL_CLUSTER_SERVER_ROLE, \ + ZB_ZCL_MANUF_CODE_INVALID), \ + ZB_ZCL_CLUSTER_DESC( \ + ZB_ZCL_CLUSTER_ID_TEMP_MEASUREMENT, \ + ZB_ZCL_ARRAY_SIZE(temp_measurement_attr_list, zb_zcl_attr_t), \ + (temp_measurement_attr_list), \ + ZB_ZCL_CLUSTER_SERVER_ROLE, \ + ZB_ZCL_MANUF_CODE_INVALID)} /** @cond internals_doc */ @@ -75,21 +71,19 @@ zb_zcl_cluster_desc_t cluster_list_name[] = \ * @param out_clust_num - number of supported output clusters */ #define ZB_ZCL_DECLARE_RANGE_EXTENDER_SIMPLE_DESC(ep_name, ep_id, in_clust_num, out_clust_num) \ - ZB_DECLARE_SIMPLE_DESC(in_clust_num, out_clust_num); \ - ZB_AF_SIMPLE_DESC_TYPE(in_clust_num, out_clust_num) simple_desc_##ep_name = \ - { \ - ep_id, \ - ZB_AF_HA_PROFILE_ID, \ - ZB_RANGE_EXTENDER_DEVICE_ID, \ - ZB_DEVICE_VER_RANGE_EXTENDER, \ - 0, \ - in_clust_num, \ - out_clust_num, \ - { \ - ZB_ZCL_CLUSTER_ID_BASIC, \ - ZB_ZCL_CLUSTER_ID_IDENTIFY \ - } \ - } + ZB_DECLARE_SIMPLE_DESC(in_clust_num, out_clust_num); \ + ZB_AF_SIMPLE_DESC_TYPE(in_clust_num, out_clust_num) \ + simple_desc_##ep_name = \ + { \ + ep_id, \ + ZB_AF_HA_PROFILE_ID, \ + ZB_RANGE_EXTENDER_DEVICE_ID, \ + ZB_DEVICE_VER_RANGE_EXTENDER, \ + 0, \ + in_clust_num, \ + out_clust_num, \ + {ZB_ZCL_CLUSTER_ID_BASIC, \ + ZB_ZCL_CLUSTER_ID_IDENTIFY, ZB_ZCL_CLUSTER_ID_TEMP_MEASUREMENT}} /** @endcond */ /* internals_doc */ @@ -99,14 +93,14 @@ zb_zcl_cluster_desc_t cluster_list_name[] = \ * @param ep_id - endpoint ID * @param cluster_list - endpoint cluster list */ -#define ZB_DECLARE_RANGE_EXTENDER_EP(ep_name, ep_id, cluster_list) \ - ZB_ZCL_DECLARE_RANGE_EXTENDER_SIMPLE_DESC(ep_name, ep_id, \ - ZB_RANGE_EXTENDER_IN_CLUSTER_NUM, ZB_RANGE_EXTENDER_OUT_CLUSTER_NUM); \ - ZB_AF_DECLARE_ENDPOINT_DESC(ep_name, ep_id, ZB_AF_HA_PROFILE_ID, 0, NULL, \ - ZB_ZCL_ARRAY_SIZE(cluster_list, zb_zcl_cluster_desc_t), cluster_list, \ - (zb_af_simple_desc_1_1_t *)&simple_desc_##ep_name, \ - 0, NULL, /* No reporting ctx */ \ - 0, NULL) /* No CVC ctx */ +#define ZB_DECLARE_RANGE_EXTENDER_EP(ep_name, ep_id, cluster_list) \ + ZB_ZCL_DECLARE_RANGE_EXTENDER_SIMPLE_DESC(ep_name, ep_id, \ + ZB_RANGE_EXTENDER_IN_CLUSTER_NUM, ZB_RANGE_EXTENDER_OUT_CLUSTER_NUM); \ + ZB_AF_DECLARE_ENDPOINT_DESC(ep_name, ep_id, ZB_AF_HA_PROFILE_ID, 0, NULL, \ + ZB_ZCL_ARRAY_SIZE(cluster_list, zb_zcl_cluster_desc_t), cluster_list, \ + (zb_af_simple_desc_1_1_t *)&simple_desc_##ep_name, \ + 0, NULL, /* No reporting ctx */ \ + 0, NULL) /* No CVC ctx */ /*! @} */ diff --git a/code/nrf-connect/samples/zigbee/src/main.c b/code/nrf-connect/samples/zigbee/src/main.c index 899655a..20af136 100644 --- a/code/nrf-connect/samples/zigbee/src/main.c +++ b/code/nrf-connect/samples/zigbee/src/main.c @@ -53,6 +53,7 @@ LOG_MODULE_REGISTER(app, LOG_LEVEL_INF); struct zb_device_ctx { zb_zcl_basic_attrs_ext_t basic_attr; zb_zcl_identify_attrs_t identify_attr; + zb_zcl_temp_measurement_attrs_t temp_measure_attrs; }; /* Zigbee device application context storage. */ @@ -76,10 +77,17 @@ ZB_ZCL_DECLARE_BASIC_ATTRIB_LIST_EXT( &dev_ctx.basic_attr.ph_env, dev_ctx.basic_attr.sw_ver); +ZB_ZCL_DECLARE_TEMP_MEASUREMENT_ATTRIB_LIST(temp_measurement_attr_list, + &dev_ctx.temp_measure_attrs.measure_value, + &dev_ctx.temp_measure_attrs.min_measure_value, + &dev_ctx.temp_measure_attrs.max_measure_value, + &dev_ctx.temp_measure_attrs.tolerance); + ZB_DECLARE_RANGE_EXTENDER_CLUSTER_LIST( app_template_clusters, basic_attr_list, - identify_attr_list); + identify_attr_list, + temp_measurement_attr_list); ZB_DECLARE_RANGE_EXTENDER_EP( app_template_ep, @@ -106,6 +114,11 @@ static void app_clusters_attr_init(void) { PRST_BASIC_MODEL_ID, ZB_ZCL_STRING_CONST_SIZE(PRST_BASIC_MODEL_ID)); + static zb_int16_t temperature_value = 27; + zb_zcl_set_attr_val(APP_TEMPLATE_ENDPOINT, ZB_ZCL_CLUSTER_ID_TEMP_MEASUREMENT, + ZB_ZCL_CLUSTER_SERVER_ROLE, ZB_ZCL_ATTR_TEMP_MEASUREMENT_VALUE_ID, + (zb_uint8_t*)&temperature_value, ZB_FALSE); + /* Identify cluster attributes data. */ dev_ctx.identify_attr.identify_time = ZB_ZCL_IDENTIFY_IDENTIFY_TIME_DEFAULT_VALUE; From 55808ed7e1799946d697f05d410b85134fd5f13f Mon Sep 17 00:00:00 2001 From: rbaron Date: Sun, 4 Dec 2022 18:05:07 +0100 Subject: [PATCH 04/36] Links prstlib and restructures project to match other samples --- .../nrf-connect/samples/zigbee/CMakeLists.txt | 20 +++++++++---------- code/nrf-connect/samples/zigbee/src/main.c | 1 + .../{include => src}/zb_range_extender.h | 4 ++++ .../samples/zigbee/zigbee.code-workspace | 16 +++++++++++++++ 4 files changed, 31 insertions(+), 10 deletions(-) rename code/nrf-connect/samples/zigbee/{include => src}/zb_range_extender.h (98%) create mode 100644 code/nrf-connect/samples/zigbee/zigbee.code-workspace diff --git a/code/nrf-connect/samples/zigbee/CMakeLists.txt b/code/nrf-connect/samples/zigbee/CMakeLists.txt index 90d0e20..a1bef91 100644 --- a/code/nrf-connect/samples/zigbee/CMakeLists.txt +++ b/code/nrf-connect/samples/zigbee/CMakeLists.txt @@ -1,19 +1,19 @@ -# -# Copyright (c) 2021 Nordic Semiconductor ASA -# -# SPDX-License-Identifier: LicenseRef-Nordic-5-Clause -# - cmake_minimum_required(VERSION 3.20.0) +# Pull in the dts/ and boards/ from prstlib. +set(DTS_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/../../prstlib) +set(BOARD_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/../../prstlib) + find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE}) -project("Zigbee application template") +project("b-parasite Zigbee sample") + +include_directories(src) -# NORDIC SDK APP START target_sources(app PRIVATE src/main.c ) -target_include_directories(app PRIVATE include) -# NORDIC SDK APP END +add_subdirectory(../../prstlib prstlib) +target_include_directories(app PRIVATE ../../prstlib/include) +target_link_libraries(app PUBLIC prstlib) \ No newline at end of file diff --git a/code/nrf-connect/samples/zigbee/src/main.c b/code/nrf-connect/samples/zigbee/src/main.c index 20af136..1b6b06d 100644 --- a/code/nrf-connect/samples/zigbee/src/main.c +++ b/code/nrf-connect/samples/zigbee/src/main.c @@ -10,6 +10,7 @@ */ #include +#include #include #include #include diff --git a/code/nrf-connect/samples/zigbee/include/zb_range_extender.h b/code/nrf-connect/samples/zigbee/src/zb_range_extender.h similarity index 98% rename from code/nrf-connect/samples/zigbee/include/zb_range_extender.h rename to code/nrf-connect/samples/zigbee/src/zb_range_extender.h index 3165db4..58b9013 100644 --- a/code/nrf-connect/samples/zigbee/include/zb_range_extender.h +++ b/code/nrf-connect/samples/zigbee/src/zb_range_extender.h @@ -35,6 +35,10 @@ /** Number of attribute for reporting on Range extender device */ #define ZB_RANGE_EXTENDER_REPORT_ATTR_COUNT 0 +typedef struct { + zb_uint16_t rel_humidity; +} prst_rel_humidity_t; + #define ZB_DECLARE_RANGE_EXTENDER_CLUSTER_LIST( \ cluster_list_name, \ basic_attr_list, \ diff --git a/code/nrf-connect/samples/zigbee/zigbee.code-workspace b/code/nrf-connect/samples/zigbee/zigbee.code-workspace new file mode 100644 index 0000000..44c0e47 --- /dev/null +++ b/code/nrf-connect/samples/zigbee/zigbee.code-workspace @@ -0,0 +1,16 @@ +{ + "folders": [ + { + "path": "." + }, + { + "path": "../../prstlib" + } + ], + "settings": { + "C_Cpp.autoAddFileAssociations": false, + "nrf-connect.applications": [ + "${workspaceFolder}" + ] + } +} \ No newline at end of file From d857448df8902f066fde19cee14e0d4b88f3025c Mon Sep 17 00:00:00 2001 From: rbaron Date: Sun, 4 Dec 2022 19:11:30 +0100 Subject: [PATCH 05/36] Added a humidity cluster --- code/nrf-connect/samples/zigbee/src/main.c | 17 ++++++++++++++++- .../samples/zigbee/src/zb_range_extender.h | 19 +++++++++++++++---- 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/code/nrf-connect/samples/zigbee/src/main.c b/code/nrf-connect/samples/zigbee/src/main.c index 1b6b06d..2c06d60 100644 --- a/code/nrf-connect/samples/zigbee/src/main.c +++ b/code/nrf-connect/samples/zigbee/src/main.c @@ -11,6 +11,7 @@ #include #include +#include #include #include #include @@ -51,10 +52,12 @@ LOG_MODULE_REGISTER(app, LOG_LEVEL_INF); /* Main application customizable context. * Stores all settings and static values. */ + struct zb_device_ctx { zb_zcl_basic_attrs_ext_t basic_attr; zb_zcl_identify_attrs_t identify_attr; zb_zcl_temp_measurement_attrs_t temp_measure_attrs; + prst_rel_humidity_attrs_t rel_humidity_attrs; }; /* Zigbee device application context storage. */ @@ -84,11 +87,18 @@ ZB_ZCL_DECLARE_TEMP_MEASUREMENT_ATTRIB_LIST(temp_measurement_attr_list, &dev_ctx.temp_measure_attrs.max_measure_value, &dev_ctx.temp_measure_attrs.tolerance); +ZB_ZCL_DECLARE_REL_HUMIDITY_MEASUREMENT_ATTRIB_LIST( + rel_humi_attr_list, + &dev_ctx.rel_humidity_attrs.rel_humidity, + &dev_ctx.rel_humidity_attrs.min_val, + &dev_ctx.rel_humidity_attrs.max_val); + ZB_DECLARE_RANGE_EXTENDER_CLUSTER_LIST( app_template_clusters, basic_attr_list, identify_attr_list, - temp_measurement_attr_list); + temp_measurement_attr_list, + rel_humi_attr_list); ZB_DECLARE_RANGE_EXTENDER_EP( app_template_ep, @@ -120,6 +130,11 @@ static void app_clusters_attr_init(void) { ZB_ZCL_CLUSTER_SERVER_ROLE, ZB_ZCL_ATTR_TEMP_MEASUREMENT_VALUE_ID, (zb_uint8_t*)&temperature_value, ZB_FALSE); + static zb_int16_t rel_humidity = 3 * (UINT16_MAX / 4); + zb_zcl_set_attr_val(APP_TEMPLATE_ENDPOINT, ZB_ZCL_CLUSTER_ID_REL_HUMIDITY_MEASUREMENT, + ZB_ZCL_CLUSTER_SERVER_ROLE, ZB_ZCL_ATTR_REL_HUMIDITY_MEASUREMENT_VALUE_ID, + (zb_uint8_t*)&rel_humidity, ZB_FALSE); + /* Identify cluster attributes data. */ dev_ctx.identify_attr.identify_time = ZB_ZCL_IDENTIFY_IDENTIFY_TIME_DEFAULT_VALUE; diff --git a/code/nrf-connect/samples/zigbee/src/zb_range_extender.h b/code/nrf-connect/samples/zigbee/src/zb_range_extender.h index 58b9013..6ebf33e 100644 --- a/code/nrf-connect/samples/zigbee/src/zb_range_extender.h +++ b/code/nrf-connect/samples/zigbee/src/zb_range_extender.h @@ -24,7 +24,7 @@ /** @cond internals_doc */ /** Range extender IN (server) clusters number */ -#define ZB_RANGE_EXTENDER_IN_CLUSTER_NUM 3 +#define ZB_RANGE_EXTENDER_IN_CLUSTER_NUM 4 /** Range extender OUT (client) clusters number */ #define ZB_RANGE_EXTENDER_OUT_CLUSTER_NUM 0 @@ -37,13 +37,16 @@ typedef struct { zb_uint16_t rel_humidity; -} prst_rel_humidity_t; + zb_uint16_t min_val; + zb_uint16_t max_val; +} prst_rel_humidity_attrs_t; #define ZB_DECLARE_RANGE_EXTENDER_CLUSTER_LIST( \ cluster_list_name, \ basic_attr_list, \ identify_attr_list, \ - temp_measurement_attr_list) \ + temp_measurement_attr_list, \ + rel_humidity_attr_list) \ zb_zcl_cluster_desc_t cluster_list_name[] = \ { \ ZB_ZCL_CLUSTER_DESC( \ @@ -63,6 +66,12 @@ typedef struct { ZB_ZCL_ARRAY_SIZE(temp_measurement_attr_list, zb_zcl_attr_t), \ (temp_measurement_attr_list), \ ZB_ZCL_CLUSTER_SERVER_ROLE, \ + ZB_ZCL_MANUF_CODE_INVALID), \ + ZB_ZCL_CLUSTER_DESC( \ + ZB_ZCL_CLUSTER_ID_REL_HUMIDITY_MEASUREMENT, \ + ZB_ZCL_ARRAY_SIZE(rel_humidity_attr_list, zb_zcl_attr_t), \ + (rel_humi_attr_list), \ + ZB_ZCL_CLUSTER_SERVER_ROLE, \ ZB_ZCL_MANUF_CODE_INVALID)} /** @cond internals_doc */ @@ -87,7 +96,9 @@ typedef struct { in_clust_num, \ out_clust_num, \ {ZB_ZCL_CLUSTER_ID_BASIC, \ - ZB_ZCL_CLUSTER_ID_IDENTIFY, ZB_ZCL_CLUSTER_ID_TEMP_MEASUREMENT}} + ZB_ZCL_CLUSTER_ID_IDENTIFY, \ + ZB_ZCL_CLUSTER_ID_TEMP_MEASUREMENT, \ + ZB_ZCL_CLUSTER_ID_REL_HUMIDITY_MEASUREMENT}} /** @endcond */ /* internals_doc */ From 9b1efb7f82d1a705de0195f9e5abdca7336ef0ec Mon Sep 17 00:00:00 2001 From: rbaron Date: Sun, 4 Dec 2022 21:33:16 +0100 Subject: [PATCH 06/36] Quick and dirty commenting out all LEDs --- code/nrf-connect/samples/zigbee/src/main.c | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/code/nrf-connect/samples/zigbee/src/main.c b/code/nrf-connect/samples/zigbee/src/main.c index 2c06d60..65d6fe3 100644 --- a/code/nrf-connect/samples/zigbee/src/main.c +++ b/code/nrf-connect/samples/zigbee/src/main.c @@ -32,10 +32,10 @@ #define TEMPLATE_INIT_BASIC_POWER_SOURCE ZB_ZCL_BASIC_POWER_SOURCE_BATTERY /* LED indicating that device successfully joined Zigbee network. */ -#define ZIGBEE_NETWORK_STATE_LED DK_LED3 +// #define ZIGBEE_NETWORK_STATE_LED DK_LED3 /* LED used for device identification. */ -#define IDENTIFY_LED DK_LED4 +// #define IDENTIFY_LED DK_LED4 /* Button used to enter the Identify mode. */ #define IDENTIFY_MODE_BUTTON DK_BTN4_MSK @@ -45,7 +45,7 @@ #define PRST_BASIC_MANUF_NAME "b-parasite" -#define PRST_BASIC_MODEL_ID "b-parasite 1.2.0" +#define PRST_BASIC_MODEL_ID "b-parasite" LOG_MODULE_REGISTER(app, LOG_LEVEL_INF); @@ -147,7 +147,7 @@ static void app_clusters_attr_init(void) { static void toggle_identify_led(zb_bufid_t bufid) { static int blink_status; - dk_set_led(IDENTIFY_LED, (++blink_status) % 2); + // dk_set_led(IDENTIFY_LED, (++blink_status) % 2); ZB_SCHEDULE_APP_ALARM(toggle_identify_led, bufid, ZB_MILLISECONDS_TO_BEACON_INTERVAL(100)); } @@ -166,7 +166,7 @@ static void identify_cb(zb_bufid_t bufid) { zb_err_code = ZB_SCHEDULE_APP_ALARM_CANCEL(toggle_identify_led, ZB_ALARM_ANY_PARAM); ZVUNUSED(zb_err_code); - dk_set_led(IDENTIFY_LED, 0); + // dk_set_led(IDENTIFY_LED, 0); } } @@ -238,10 +238,10 @@ static void configure_gpio(void) { LOG_ERR("Cannot init buttons (err: %d)", err); } - err = dk_leds_init(); - if (err) { - LOG_ERR("Cannot init LEDs (err: %d)", err); - } + // err = dk_leds_init(); + // if (err) { + // LOG_ERR("Cannot init LEDs (err: %d)", err); + // } } /**@brief Zigbee stack event handler. @@ -251,7 +251,7 @@ static void configure_gpio(void) { */ void zboss_signal_handler(zb_bufid_t bufid) { /* Update network status LED. */ - zigbee_led_status_update(bufid, ZIGBEE_NETWORK_STATE_LED); + // zigbee_led_status_update(bufid, ZIGBEE_NETWORK_STATE_LED); /* No application-specific behavior is required. * Call default signal handler. @@ -281,8 +281,10 @@ void main(void) { /* Register handlers to identify notifications */ ZB_AF_SET_IDENTIFY_NOTIFICATION_HANDLER(APP_TEMPLATE_ENDPOINT, identify_cb); + zb_bdb_set_legacy_device_support(1); /* Start Zigbee default thread */ zigbee_enable(); + zb_bdb_set_legacy_device_support(1); LOG_INF("Zigbee application template started"); } From 15b1d9d2a8848f073a7b63f20ea05d4815f27124 Mon Sep 17 00:00:00 2001 From: rbaron Date: Mon, 5 Dec 2022 18:50:26 +0100 Subject: [PATCH 07/36] Batt, temp and humi show up (with reporting!) on HA with zigbee2mqtt :)) --- code/nrf-connect/samples/zigbee/b-parasite.js | 30 +++++++ code/nrf-connect/samples/zigbee/src/main.c | 85 ++++++++++++++++++- .../samples/zigbee/src/zb_range_extender.h | 44 ++++++++-- 3 files changed, 150 insertions(+), 9 deletions(-) create mode 100644 code/nrf-connect/samples/zigbee/b-parasite.js diff --git a/code/nrf-connect/samples/zigbee/b-parasite.js b/code/nrf-connect/samples/zigbee/b-parasite.js new file mode 100644 index 0000000..262e9a2 --- /dev/null +++ b/code/nrf-connect/samples/zigbee/b-parasite.js @@ -0,0 +1,30 @@ +// This is a zigbee2mqtt zigbee2mqtt.io converter for this sample. +const fz = require('zigbee-herdsman-converters/converters/fromZigbee'); +const tz = require('zigbee-herdsman-converters/converters/toZigbee'); +const exposes = require('zigbee-herdsman-converters/lib/exposes'); +const reporting = require('zigbee-herdsman-converters/lib/reporting'); +const extend = require('zigbee-herdsman-converters/lib/extend'); +const e = exposes.presets; +const ea = exposes.access; + +const definition = { + zigbeeModel: ['b-parasite'], + model: 'b-parasite', + vendor: 'b-parasite', + description: 'IoT development board - Zigbee sample', + fromZigbee: [fz.temperature, fz.humidity, fz.battery], + toZigbee: [], + exposes: [e.temperature(), e.humidity(), e.battery()], + configure: async (device, coordinatorEndpoint, logger) => { + const endpoint = device.getEndpoint(10); + await reporting.bind( + endpoint, + coordinatorEndpoint, + ['genPowerCfg', 'msTemperatureMeasurement', 'msRelativeHumidity']); + await reporting.batteryPercentageRemaining(endpoint); + await reporting.temperature(endpoint); + await reporting.humidity(endpoint); + } +}; + +module.exports = definition; \ No newline at end of file diff --git a/code/nrf-connect/samples/zigbee/src/main.c b/code/nrf-connect/samples/zigbee/src/main.c index 65d6fe3..d6a210f 100644 --- a/code/nrf-connect/samples/zigbee/src/main.c +++ b/code/nrf-connect/samples/zigbee/src/main.c @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -56,8 +57,11 @@ LOG_MODULE_REGISTER(app, LOG_LEVEL_INF); struct zb_device_ctx { zb_zcl_basic_attrs_ext_t basic_attr; zb_zcl_identify_attrs_t identify_attr; + // In units of 0.01 C. zb_zcl_temp_measurement_attrs_t temp_measure_attrs; prst_rel_humidity_attrs_t rel_humidity_attrs; + // In units of 100 mV. + prst_batt_attrs_t batt_attrs; }; /* Zigbee device application context storage. */ @@ -93,12 +97,42 @@ ZB_ZCL_DECLARE_REL_HUMIDITY_MEASUREMENT_ATTRIB_LIST( &dev_ctx.rel_humidity_attrs.min_val, &dev_ctx.rel_humidity_attrs.max_val); +// ZB_ZCL_DECLARE_POWER_CONFIG_ATTRIB_LIST( +// batt_attr_list, +// &dev_ctx.batt_voltage, +// NULL, +// NULL, +// NULL, +// NULL, +// NULL); + +// https://devzone.nordicsemi.com/f/nordic-q-a/85315/zboss-declare-power-config-attribute-list-for-battery-bat_num +#define bat_num +ZB_ZCL_DECLARE_POWER_CONFIG_BATTERY_ATTRIB_LIST_EXT( + batt_attr_list, + &dev_ctx.batt_attrs.voltage, + /*battery_size=*/NULL, + /*battery_quantity=*/&dev_ctx.batt_attrs.quantity, + /*battery_rated_voltage=*/&dev_ctx.batt_attrs.size, + /*battery_alarm_mask=*/NULL, + /*battery_voltage_min_threshold=*/&dev_ctx.batt_attrs.voltage_min_thres, + /*battery_percentage_remaining=*/&dev_ctx.batt_attrs.percentage, + /*battery_voltage_threshold1=*/NULL, + /*battery_voltage_threshold2=*/NULL, + /*battery_voltage_threshold3=*/NULL, + /*battery_percentage_min_threshold=*/&dev_ctx.batt_attrs.percentage_min_thres, + /*battery_percentage_threshold1=*/NULL, + /*battery_percentage_threshold2=*/NULL, + /*battery_percentage_threshold3=*/NULL, + /*battery_alarm_state=*/NULL); + ZB_DECLARE_RANGE_EXTENDER_CLUSTER_LIST( app_template_clusters, basic_attr_list, identify_attr_list, temp_measurement_attr_list, - rel_humi_attr_list); + rel_humi_attr_list, + basic_attr_list); ZB_DECLARE_RANGE_EXTENDER_EP( app_template_ep, @@ -135,6 +169,21 @@ static void app_clusters_attr_init(void) { ZB_ZCL_CLUSTER_SERVER_ROLE, ZB_ZCL_ATTR_REL_HUMIDITY_MEASUREMENT_VALUE_ID, (zb_uint8_t*)&rel_humidity, ZB_FALSE); + static zb_uint8_t batt_voltage = 33; + zb_zcl_set_attr_val(APP_TEMPLATE_ENDPOINT, ZB_ZCL_CLUSTER_ID_POWER_CONFIG, + ZB_ZCL_CLUSTER_SERVER_ROLE, ZB_ZCL_ATTR_POWER_CONFIG_BATTERY_VOLTAGE_ID, + (zb_uint8_t*)&batt_voltage, ZB_FALSE); + + static zb_uint8_t batt_percentage = 33; + zb_zcl_set_attr_val(APP_TEMPLATE_ENDPOINT, ZB_ZCL_CLUSTER_ID_POWER_CONFIG, + ZB_ZCL_CLUSTER_SERVER_ROLE, ZB_ZCL_ATTR_POWER_CONFIG_BATTERY_PERCENTAGE_REMAINING_ID, + (zb_uint8_t*)&batt_percentage, ZB_FALSE); + + static zb_uint8_t batt_quantity = 31; + zb_zcl_set_attr_val(APP_TEMPLATE_ENDPOINT, ZB_ZCL_CLUSTER_ID_POWER_CONFIG, + ZB_ZCL_CLUSTER_SERVER_ROLE, ZB_ZCL_ATTR_POWER_CONFIG_BATTERY_QUANTITY_ID, + (zb_uint8_t*)&batt_quantity, ZB_FALSE); + /* Identify cluster attributes data. */ dev_ctx.identify_attr.identify_time = ZB_ZCL_IDENTIFY_IDENTIFY_TIME_DEFAULT_VALUE; @@ -266,6 +315,36 @@ void zboss_signal_handler(zb_bufid_t bufid) { } } +void update_sensors_cb(zb_uint8_t arg) { + static zb_uint8_t batt = 10; + batt += 1; + + LOG_INF("Updating sensonrs"); + zb_zcl_set_attr_val(APP_TEMPLATE_ENDPOINT, ZB_ZCL_CLUSTER_ID_POWER_CONFIG, + ZB_ZCL_CLUSTER_SERVER_ROLE, ZB_ZCL_ATTR_POWER_CONFIG_BATTERY_VOLTAGE_ID, + (zb_uint8_t*)&batt, ZB_FALSE); + + static zb_uint8_t batt_percentage = 10; + batt_percentage += 1; + zb_zcl_set_attr_val(APP_TEMPLATE_ENDPOINT, ZB_ZCL_CLUSTER_ID_POWER_CONFIG, + ZB_ZCL_CLUSTER_SERVER_ROLE, ZB_ZCL_ATTR_POWER_CONFIG_BATTERY_PERCENTAGE_REMAINING_ID, + (zb_uint8_t*)&batt_percentage, ZB_FALSE); + + static zb_int16_t temperature_value = 27; + temperature_value += 1; + zb_zcl_set_attr_val(APP_TEMPLATE_ENDPOINT, ZB_ZCL_CLUSTER_ID_TEMP_MEASUREMENT, + ZB_ZCL_CLUSTER_SERVER_ROLE, ZB_ZCL_ATTR_TEMP_MEASUREMENT_VALUE_ID, + (zb_uint8_t*)&temperature_value, ZB_FALSE); + + static zb_int16_t rel_humi = 12; + rel_humi += 1; + zb_zcl_set_attr_val(APP_TEMPLATE_ENDPOINT, ZB_ZCL_CLUSTER_ID_REL_HUMIDITY_MEASUREMENT, + ZB_ZCL_CLUSTER_SERVER_ROLE, ZB_ZCL_ATTR_REL_HUMIDITY_MEASUREMENT_VALUE_ID, + (zb_uint8_t*)&rel_humi, ZB_FALSE); + + ZB_SCHEDULE_APP_ALARM(update_sensors_cb, NULL, ZB_TIME_ONE_SECOND * 1); +} + void main(void) { LOG_INF("Starting Zigbee application template example"); @@ -281,10 +360,14 @@ void main(void) { /* Register handlers to identify notifications */ ZB_AF_SET_IDENTIFY_NOTIFICATION_HANDLER(APP_TEMPLATE_ENDPOINT, identify_cb); + update_sensors_cb(/*arg=*/0); + zb_bdb_set_legacy_device_support(1); /* Start Zigbee default thread */ zigbee_enable(); zb_bdb_set_legacy_device_support(1); + // zigbee_configure_sleepy_behavior(/*enable=*/true); + LOG_INF("Zigbee application template started"); } diff --git a/code/nrf-connect/samples/zigbee/src/zb_range_extender.h b/code/nrf-connect/samples/zigbee/src/zb_range_extender.h index 6ebf33e..728a7fa 100644 --- a/code/nrf-connect/samples/zigbee/src/zb_range_extender.h +++ b/code/nrf-connect/samples/zigbee/src/zb_range_extender.h @@ -24,7 +24,7 @@ /** @cond internals_doc */ /** Range extender IN (server) clusters number */ -#define ZB_RANGE_EXTENDER_IN_CLUSTER_NUM 4 +#define ZB_RANGE_EXTENDER_IN_CLUSTER_NUM 5 /** Range extender OUT (client) clusters number */ #define ZB_RANGE_EXTENDER_OUT_CLUSTER_NUM 0 @@ -33,7 +33,7 @@ (ZB_RANGE_EXTENDER_IN_CLUSTER_NUM + ZB_RANGE_EXTENDER_OUT_CLUSTER_NUM) /** Number of attribute for reporting on Range extender device */ -#define ZB_RANGE_EXTENDER_REPORT_ATTR_COUNT 0 +#define ZB_RANGE_EXTENDER_REPORT_ATTR_COUNT 3 typedef struct { zb_uint16_t rel_humidity; @@ -41,12 +41,30 @@ typedef struct { zb_uint16_t max_val; } prst_rel_humidity_attrs_t; +// Power configuration cluster - section 3.3. +typedef struct { + zb_uint8_t voltage; + zb_uint8_t percentage; + zb_uint8_t quantity; + zb_uint8_t size; + zb_uint8_t rated_voltage; + zb_uint8_t voltage_min_thres; + zb_uint8_t percentage_min_thres; +} prst_batt_attrs_t; +// ZB_SET_ATTR_DESCR_WITH_ZB_ZCL_ATTR_POWER_CONFIG_BATTERY_VOLTAGE_ID(voltage, ), \ + // ZB_SET_ATTR_DESCR_WITH_ZB_ZCL_ATTR_POWER_CONFIG_BATTERY_SIZE_ID(size, ), \ + // ZB_SET_ATTR_DESCR_WITH_ZB_ZCL_ATTR_POWER_CONFIG_BATTERY_QUANTITY_ID(quantity, ), \ + // ZB_SET_ATTR_DESCR_WITH_ZB_ZCL_ATTR_POWER_CONFIG_BATTERY_RATED_VOLTAGE_ID(rated_voltage, ), \ + // ZB_SET_ATTR_DESCR_WITH_ZB_ZCL_ATTR_POWER_CONFIG_BATTERY_ALARM_MASK_ID(alarm_mask, ), \ + // ZB_SET_ATTR_DESCR_WITH_ZB_ZCL_ATTR_POWER_CONFIG_BATTERY_VOLTAGE_MIN_THRESHOLD_ID(voltage_min_threshold, ), \ + #define ZB_DECLARE_RANGE_EXTENDER_CLUSTER_LIST( \ cluster_list_name, \ basic_attr_list, \ identify_attr_list, \ temp_measurement_attr_list, \ - rel_humidity_attr_list) \ + rel_humidity_attr_list, \ + batt_att_list) \ zb_zcl_cluster_desc_t cluster_list_name[] = \ { \ ZB_ZCL_CLUSTER_DESC( \ @@ -72,6 +90,12 @@ typedef struct { ZB_ZCL_ARRAY_SIZE(rel_humidity_attr_list, zb_zcl_attr_t), \ (rel_humi_attr_list), \ ZB_ZCL_CLUSTER_SERVER_ROLE, \ + ZB_ZCL_MANUF_CODE_INVALID), \ + ZB_ZCL_CLUSTER_DESC( \ + ZB_ZCL_CLUSTER_ID_POWER_CONFIG, \ + ZB_ZCL_ARRAY_SIZE(batt_attr_list, zb_zcl_attr_t), \ + (batt_attr_list), \ + ZB_ZCL_CLUSTER_SERVER_ROLE, \ ZB_ZCL_MANUF_CODE_INVALID)} /** @cond internals_doc */ @@ -95,10 +119,13 @@ typedef struct { 0, \ in_clust_num, \ out_clust_num, \ - {ZB_ZCL_CLUSTER_ID_BASIC, \ - ZB_ZCL_CLUSTER_ID_IDENTIFY, \ - ZB_ZCL_CLUSTER_ID_TEMP_MEASUREMENT, \ - ZB_ZCL_CLUSTER_ID_REL_HUMIDITY_MEASUREMENT}} + { \ + ZB_ZCL_CLUSTER_ID_BASIC, \ + ZB_ZCL_CLUSTER_ID_IDENTIFY, \ + ZB_ZCL_CLUSTER_ID_TEMP_MEASUREMENT, \ + ZB_ZCL_CLUSTER_ID_REL_HUMIDITY_MEASUREMENT, \ + ZB_ZCL_CLUSTER_ID_POWER_CONFIG, \ + }} /** @endcond */ /* internals_doc */ @@ -109,12 +136,13 @@ typedef struct { * @param cluster_list - endpoint cluster list */ #define ZB_DECLARE_RANGE_EXTENDER_EP(ep_name, ep_id, cluster_list) \ + ZBOSS_DEVICE_DECLARE_REPORTING_CTX(reporting_ctx_##ep_name, ZB_RANGE_EXTENDER_REPORT_ATTR_COUNT); \ ZB_ZCL_DECLARE_RANGE_EXTENDER_SIMPLE_DESC(ep_name, ep_id, \ ZB_RANGE_EXTENDER_IN_CLUSTER_NUM, ZB_RANGE_EXTENDER_OUT_CLUSTER_NUM); \ ZB_AF_DECLARE_ENDPOINT_DESC(ep_name, ep_id, ZB_AF_HA_PROFILE_ID, 0, NULL, \ ZB_ZCL_ARRAY_SIZE(cluster_list, zb_zcl_cluster_desc_t), cluster_list, \ (zb_af_simple_desc_1_1_t *)&simple_desc_##ep_name, \ - 0, NULL, /* No reporting ctx */ \ + ZB_RANGE_EXTENDER_REPORT_ATTR_COUNT, reporting_ctx_##ep_name, \ 0, NULL) /* No CVC ctx */ /*! @} */ From f7373cc6daafe12e31f47a30aa5b2700e2765df4 Mon Sep 17 00:00:00 2001 From: rbaron Date: Tue, 6 Dec 2022 19:14:47 +0100 Subject: [PATCH 08/36] Custom Soil Moisture cluster works! :) This commits adds a Soil Moisture cluster according to the one that exists in https://github.com/Koenkk/zigbee-herdsman/blob/master/src/zcl/definition/cluster.ts#L2570. The cluster Id is 1032 (I didn't find it in the official specs). --- code/nrf-connect/samples/zigbee/src/attrs.h | 34 +++ code/nrf-connect/samples/zigbee/src/main.c | 198 +++++------------- .../zigbee/src/prst_zb_soil_moisture_defs.h | 38 ++++ .../samples/zigbee/src/zb_range_extender.h | 120 +++-------- 4 files changed, 151 insertions(+), 239 deletions(-) create mode 100644 code/nrf-connect/samples/zigbee/src/attrs.h create mode 100644 code/nrf-connect/samples/zigbee/src/prst_zb_soil_moisture_defs.h diff --git a/code/nrf-connect/samples/zigbee/src/attrs.h b/code/nrf-connect/samples/zigbee/src/attrs.h new file mode 100644 index 0000000..ba0ed14 --- /dev/null +++ b/code/nrf-connect/samples/zigbee/src/attrs.h @@ -0,0 +1,34 @@ +#ifndef _PRST_ZB_ATTRS_H_ +#define _PRST_ZB_ATTRS_H_ + +#include + +// Relative humimdity cluster - section 4.7.2.2.1. +typedef struct { + // 100x relative humidity (mandatory). + zb_uint16_t rel_humidity; + // 0x0000 – 0x270f (mandatory). + zb_uint16_t min_val; + // 0x0001 – 0x2710 (mandatory). + zb_uint16_t max_val; +} prst_rel_humidity_attrs_t; + +// Power configuration cluster - section 3.3.2.2.3 +typedef struct { + // Units of 100 mV. 0x00 - 0xff (optional, not reportable :()). + zb_uint8_t voltage; + // Units of 0.5%. 0x00 (0%) - 0xc8 (100%) (optional, reportable). + zb_uint8_t percentage; + // zb_uint8_t quantity; + // zb_uint8_t size; + // zb_uint8_t rated_voltage; + // zb_uint8_t voltage_min_thres; + // zb_uint8_t percentage_min_thres; +} prst_batt_attrs_t; + +// Soil moisture cluster. +typedef struct { + zb_uint16_t percentage; +} prst_soil_moisture_attrs_t; + +#endif // _PRST_ZB_ATTRS_H_ diff --git a/code/nrf-connect/samples/zigbee/src/main.c b/code/nrf-connect/samples/zigbee/src/main.c index d6a210f..0f0441f 100644 --- a/code/nrf-connect/samples/zigbee/src/main.c +++ b/code/nrf-connect/samples/zigbee/src/main.c @@ -21,39 +21,18 @@ #include #include +#include "attrs.h" +#include "prst_zb_soil_moisture_defs.h" #include "zb_range_extender.h" -/* Device endpoint, used to receive ZCL commands. */ -#define APP_TEMPLATE_ENDPOINT 10 - -/* Type of power sources available for the device. - * For possible values see section 3.2.2.2.8 of ZCL specification. - */ -// #define TEMPLATE_INIT_BASIC_POWER_SOURCE ZB_ZCL_BASIC_POWER_SOURCE_DC_SOURCE -#define TEMPLATE_INIT_BASIC_POWER_SOURCE ZB_ZCL_BASIC_POWER_SOURCE_BATTERY - -/* LED indicating that device successfully joined Zigbee network. */ -// #define ZIGBEE_NETWORK_STATE_LED DK_LED3 - -/* LED used for device identification. */ -// #define IDENTIFY_LED DK_LED4 - -/* Button used to enter the Identify mode. */ +#define PRST_ZIGBEE_ENDPOINT 10 #define IDENTIFY_MODE_BUTTON DK_BTN4_MSK - -/* Button to start Factory Reset */ #define FACTORY_RESET_BUTTON IDENTIFY_MODE_BUTTON - #define PRST_BASIC_MANUF_NAME "b-parasite" - #define PRST_BASIC_MODEL_ID "b-parasite" LOG_MODULE_REGISTER(app, LOG_LEVEL_INF); -/* Main application customizable context. - * Stores all settings and static values. - */ - struct zb_device_ctx { zb_zcl_basic_attrs_ext_t basic_attr; zb_zcl_identify_attrs_t identify_attr; @@ -62,9 +41,9 @@ struct zb_device_ctx { prst_rel_humidity_attrs_t rel_humidity_attrs; // In units of 100 mV. prst_batt_attrs_t batt_attrs; + prst_soil_moisture_attrs_t soil_moisture_attrs; }; -/* Zigbee device application context storage. */ static struct zb_device_ctx dev_ctx; ZB_ZCL_DECLARE_IDENTIFY_ATTRIB_LIST( @@ -97,58 +76,67 @@ ZB_ZCL_DECLARE_REL_HUMIDITY_MEASUREMENT_ATTRIB_LIST( &dev_ctx.rel_humidity_attrs.min_val, &dev_ctx.rel_humidity_attrs.max_val); -// ZB_ZCL_DECLARE_POWER_CONFIG_ATTRIB_LIST( -// batt_attr_list, -// &dev_ctx.batt_voltage, -// NULL, -// NULL, -// NULL, -// NULL, -// NULL); - // https://devzone.nordicsemi.com/f/nordic-q-a/85315/zboss-declare-power-config-attribute-list-for-battery-bat_num #define bat_num ZB_ZCL_DECLARE_POWER_CONFIG_BATTERY_ATTRIB_LIST_EXT( batt_attr_list, &dev_ctx.batt_attrs.voltage, /*battery_size=*/NULL, - /*battery_quantity=*/&dev_ctx.batt_attrs.quantity, - /*battery_rated_voltage=*/&dev_ctx.batt_attrs.size, + /*battery_quantity=*/NULL, + /*battery_rated_voltage=*/NULL, /*battery_alarm_mask=*/NULL, - /*battery_voltage_min_threshold=*/&dev_ctx.batt_attrs.voltage_min_thres, + /*battery_voltage_min_threshold=*/NULL, /*battery_percentage_remaining=*/&dev_ctx.batt_attrs.percentage, /*battery_voltage_threshold1=*/NULL, /*battery_voltage_threshold2=*/NULL, /*battery_voltage_threshold3=*/NULL, - /*battery_percentage_min_threshold=*/&dev_ctx.batt_attrs.percentage_min_thres, + /*battery_percentage_min_threshold=*/NULL, /*battery_percentage_threshold1=*/NULL, /*battery_percentage_threshold2=*/NULL, /*battery_percentage_threshold3=*/NULL, /*battery_alarm_state=*/NULL); +PRST_ZB_ZCL_DECLARE_SOIL_MOISTURE_ATTRIB_LIST( + soil_moisture_attr_list, + &dev_ctx.soil_moisture_attrs.percentage); + +// ZB_ZCL_DECLARE_TEMP_MEASUREMENT_ATTRIB_LIST2( +// soil_moisture_attr_list2, +// &dev_ctx.soil_moisture_attrs.percentage); + +void prst_zcl_soil_moisture_init_server(void) { + zb_zcl_add_cluster_handlers(PRST_ZB_ZCL_ATTR_SOIL_MOISTURE_CLUSTER_ID, + ZB_ZCL_CLUSTER_SERVER_ROLE, + /*cluster_check_value=*/NULL, + /*cluster_write_attr_hook=*/NULL, + /*cluster_handler=*/NULL); +} + +void prst_zcl_soil_moisture_init_client(void) { + // Nothing. +} + ZB_DECLARE_RANGE_EXTENDER_CLUSTER_LIST( app_template_clusters, basic_attr_list, identify_attr_list, temp_measurement_attr_list, rel_humi_attr_list, - basic_attr_list); + basic_attr_list, + soil_moisture_attr_list); ZB_DECLARE_RANGE_EXTENDER_EP( app_template_ep, - APP_TEMPLATE_ENDPOINT, + PRST_ZIGBEE_ENDPOINT, app_template_clusters); ZBOSS_DECLARE_DEVICE_CTX_1_EP( app_template_ctx, app_template_ep); -/**@brief Function for initializing all clusters attributes. */ static void app_clusters_attr_init(void) { - /* Basic cluster attributes data */ dev_ctx.basic_attr.zcl_version = ZB_ZCL_VERSION; - dev_ctx.basic_attr.power_source = TEMPLATE_INIT_BASIC_POWER_SOURCE; - // dev_ctx.basic_attr.mf_name + dev_ctx.basic_attr.power_source = ZB_ZCL_BASIC_POWER_SOURCE_BATTERY; ZB_ZCL_SET_STRING_VAL( dev_ctx.basic_attr.mf_name, PRST_BASIC_MANUF_NAME, @@ -159,81 +147,34 @@ static void app_clusters_attr_init(void) { PRST_BASIC_MODEL_ID, ZB_ZCL_STRING_CONST_SIZE(PRST_BASIC_MODEL_ID)); - static zb_int16_t temperature_value = 27; - zb_zcl_set_attr_val(APP_TEMPLATE_ENDPOINT, ZB_ZCL_CLUSTER_ID_TEMP_MEASUREMENT, - ZB_ZCL_CLUSTER_SERVER_ROLE, ZB_ZCL_ATTR_TEMP_MEASUREMENT_VALUE_ID, - (zb_uint8_t*)&temperature_value, ZB_FALSE); - - static zb_int16_t rel_humidity = 3 * (UINT16_MAX / 4); - zb_zcl_set_attr_val(APP_TEMPLATE_ENDPOINT, ZB_ZCL_CLUSTER_ID_REL_HUMIDITY_MEASUREMENT, - ZB_ZCL_CLUSTER_SERVER_ROLE, ZB_ZCL_ATTR_REL_HUMIDITY_MEASUREMENT_VALUE_ID, - (zb_uint8_t*)&rel_humidity, ZB_FALSE); - - static zb_uint8_t batt_voltage = 33; - zb_zcl_set_attr_val(APP_TEMPLATE_ENDPOINT, ZB_ZCL_CLUSTER_ID_POWER_CONFIG, - ZB_ZCL_CLUSTER_SERVER_ROLE, ZB_ZCL_ATTR_POWER_CONFIG_BATTERY_VOLTAGE_ID, - (zb_uint8_t*)&batt_voltage, ZB_FALSE); - - static zb_uint8_t batt_percentage = 33; - zb_zcl_set_attr_val(APP_TEMPLATE_ENDPOINT, ZB_ZCL_CLUSTER_ID_POWER_CONFIG, - ZB_ZCL_CLUSTER_SERVER_ROLE, ZB_ZCL_ATTR_POWER_CONFIG_BATTERY_PERCENTAGE_REMAINING_ID, - (zb_uint8_t*)&batt_percentage, ZB_FALSE); - - static zb_uint8_t batt_quantity = 31; - zb_zcl_set_attr_val(APP_TEMPLATE_ENDPOINT, ZB_ZCL_CLUSTER_ID_POWER_CONFIG, - ZB_ZCL_CLUSTER_SERVER_ROLE, ZB_ZCL_ATTR_POWER_CONFIG_BATTERY_QUANTITY_ID, - (zb_uint8_t*)&batt_quantity, ZB_FALSE); - - /* Identify cluster attributes data. */ dev_ctx.identify_attr.identify_time = ZB_ZCL_IDENTIFY_IDENTIFY_TIME_DEFAULT_VALUE; } -/**@brief Function to toggle the identify LED - * - * @param bufid Unused parameter, required by ZBOSS scheduler API. - */ static void toggle_identify_led(zb_bufid_t bufid) { static int blink_status; - - // dk_set_led(IDENTIFY_LED, (++blink_status) % 2); ZB_SCHEDULE_APP_ALARM(toggle_identify_led, bufid, ZB_MILLISECONDS_TO_BEACON_INTERVAL(100)); } -/**@brief Function to handle identify notification events on the first endpoint. - * - * @param bufid Unused parameter, required by ZBOSS scheduler API. - */ static void identify_cb(zb_bufid_t bufid) { zb_ret_t zb_err_code; if (bufid) { - /* Schedule a self-scheduling function that will toggle the LED */ ZB_SCHEDULE_APP_CALLBACK(toggle_identify_led, bufid); } else { - /* Cancel the toggling function alarm and turn off LED */ zb_err_code = ZB_SCHEDULE_APP_ALARM_CANCEL(toggle_identify_led, ZB_ALARM_ANY_PARAM); ZVUNUSED(zb_err_code); - - // dk_set_led(IDENTIFY_LED, 0); } } -/**@brief Starts identifying the device. - * - * @param bufid Unused parameter, required by ZBOSS scheduler API. - */ static void start_identifying(zb_bufid_t bufid) { ZVUNUSED(bufid); if (ZB_JOINED()) { - /* Check if endpoint is in identifying mode, - * if not put desired endpoint in identifying mode. - */ if (dev_ctx.identify_attr.identify_time == ZB_ZCL_IDENTIFY_IDENTIFY_TIME_DEFAULT_VALUE) { zb_ret_t zb_err_code = zb_bdb_finding_binding_target( - APP_TEMPLATE_ENDPOINT); + PRST_ZIGBEE_ENDPOINT); if (zb_err_code == RET_OK) { LOG_INF("Enter identify mode"); @@ -251,25 +192,13 @@ static void start_identifying(zb_bufid_t bufid) { } } -/**@brief Callback for button events. - * - * @param[in] button_state Bitmask containing buttons state. - * @param[in] has_changed Bitmask containing buttons - * that have changed their state. - */ static void button_changed(uint32_t button_state, uint32_t has_changed) { if (IDENTIFY_MODE_BUTTON & has_changed) { if (IDENTIFY_MODE_BUTTON & button_state) { - /* Button changed its state to pressed */ } else { - /* Button changed its state to released */ if (was_factory_reset_done()) { - /* The long press was for Factory Reset */ LOG_DBG("After Factory Reset - ignore button release"); } else { - /* Button released before Factory Reset */ - - /* Start identification mode */ ZB_SCHEDULE_APP_CALLBACK(start_identifying, 0); } } @@ -278,92 +207,61 @@ static void button_changed(uint32_t button_state, uint32_t has_changed) { check_factory_reset_button(button_state, has_changed); } -/**@brief Function for initializing LEDs and Buttons. */ -static void configure_gpio(void) { - int err; - - err = dk_buttons_init(button_changed); - if (err) { - LOG_ERR("Cannot init buttons (err: %d)", err); - } - - // err = dk_leds_init(); - // if (err) { - // LOG_ERR("Cannot init LEDs (err: %d)", err); - // } -} - -/**@brief Zigbee stack event handler. - * - * @param[in] bufid Reference to the Zigbee stack buffer - * used to pass signal. - */ void zboss_signal_handler(zb_bufid_t bufid) { - /* Update network status LED. */ - // zigbee_led_status_update(bufid, ZIGBEE_NETWORK_STATE_LED); - - /* No application-specific behavior is required. - * Call default signal handler. - */ ZB_ERROR_CHECK(zigbee_default_signal_handler(bufid)); - - /* All callbacks should either reuse or free passed buffers. - * If bufid == 0, the buffer is invalid (not passed). - */ if (bufid) { zb_buf_free(bufid); } } void update_sensors_cb(zb_uint8_t arg) { + LOG_INF("Updating sensors"); + static zb_uint8_t batt = 10; batt += 1; - - LOG_INF("Updating sensonrs"); - zb_zcl_set_attr_val(APP_TEMPLATE_ENDPOINT, ZB_ZCL_CLUSTER_ID_POWER_CONFIG, + zb_zcl_set_attr_val(PRST_ZIGBEE_ENDPOINT, ZB_ZCL_CLUSTER_ID_POWER_CONFIG, ZB_ZCL_CLUSTER_SERVER_ROLE, ZB_ZCL_ATTR_POWER_CONFIG_BATTERY_VOLTAGE_ID, (zb_uint8_t*)&batt, ZB_FALSE); static zb_uint8_t batt_percentage = 10; batt_percentage += 1; - zb_zcl_set_attr_val(APP_TEMPLATE_ENDPOINT, ZB_ZCL_CLUSTER_ID_POWER_CONFIG, + zb_zcl_set_attr_val(PRST_ZIGBEE_ENDPOINT, ZB_ZCL_CLUSTER_ID_POWER_CONFIG, ZB_ZCL_CLUSTER_SERVER_ROLE, ZB_ZCL_ATTR_POWER_CONFIG_BATTERY_PERCENTAGE_REMAINING_ID, (zb_uint8_t*)&batt_percentage, ZB_FALSE); static zb_int16_t temperature_value = 27; temperature_value += 1; - zb_zcl_set_attr_val(APP_TEMPLATE_ENDPOINT, ZB_ZCL_CLUSTER_ID_TEMP_MEASUREMENT, + zb_zcl_set_attr_val(PRST_ZIGBEE_ENDPOINT, ZB_ZCL_CLUSTER_ID_TEMP_MEASUREMENT, ZB_ZCL_CLUSTER_SERVER_ROLE, ZB_ZCL_ATTR_TEMP_MEASUREMENT_VALUE_ID, (zb_uint8_t*)&temperature_value, ZB_FALSE); static zb_int16_t rel_humi = 12; rel_humi += 1; - zb_zcl_set_attr_val(APP_TEMPLATE_ENDPOINT, ZB_ZCL_CLUSTER_ID_REL_HUMIDITY_MEASUREMENT, + zb_zcl_set_attr_val(PRST_ZIGBEE_ENDPOINT, ZB_ZCL_CLUSTER_ID_REL_HUMIDITY_MEASUREMENT, ZB_ZCL_CLUSTER_SERVER_ROLE, ZB_ZCL_ATTR_REL_HUMIDITY_MEASUREMENT_VALUE_ID, (zb_uint8_t*)&rel_humi, ZB_FALSE); + static zb_int16_t soil_moisture = 69; + soil_moisture += 1; + zb_zcl_set_attr_val(PRST_ZIGBEE_ENDPOINT, PRST_ZB_ZCL_ATTR_SOIL_MOISTURE_CLUSTER_ID, + ZB_ZCL_CLUSTER_SERVER_ROLE, PRST_ZB_ZCL_ATTR_SOIL_MOISTURE_VALUE_ID, + (zb_uint8_t*)&soil_moisture, ZB_FALSE); + ZB_SCHEDULE_APP_ALARM(update_sensors_cb, NULL, ZB_TIME_ONE_SECOND * 1); } void main(void) { - LOG_INF("Starting Zigbee application template example"); - - /* Initialize */ - configure_gpio(); register_factory_reset_button(FACTORY_RESET_BUTTON); - /* Register device context (endpoints). */ - ZB_AF_REGISTER_DEVICE_CTX(&app_template_ctx); - app_clusters_attr_init(); - /* Register handlers to identify notifications */ - ZB_AF_SET_IDENTIFY_NOTIFICATION_HANDLER(APP_TEMPLATE_ENDPOINT, identify_cb); + ZB_AF_REGISTER_DEVICE_CTX(&app_template_ctx); + + ZB_AF_SET_IDENTIFY_NOTIFICATION_HANDLER(PRST_ZIGBEE_ENDPOINT, identify_cb); update_sensors_cb(/*arg=*/0); zb_bdb_set_legacy_device_support(1); - /* Start Zigbee default thread */ zigbee_enable(); zb_bdb_set_legacy_device_support(1); diff --git a/code/nrf-connect/samples/zigbee/src/prst_zb_soil_moisture_defs.h b/code/nrf-connect/samples/zigbee/src/prst_zb_soil_moisture_defs.h new file mode 100644 index 0000000..5c61029 --- /dev/null +++ b/code/nrf-connect/samples/zigbee/src/prst_zb_soil_moisture_defs.h @@ -0,0 +1,38 @@ +#ifndef _PRST_ZB_SOIL_MOISTURE_DEFS_ +#define _PRST_ZB_SOIL_MOISTURE_DEFS_ + +#include + +// Most defines in this file are updated from the ZB_ZCL_DECLARE_TEMP_MEASUREMENT_ATTRIB_LIST, +// adapting attributes and IDs to match the mSoilMoisture cluster spec. +// Values from https://github.com/Koenkk/zigbee-herdsman/blob/master/src/zcl/definition/cluster.ts#L2570 +// (msSoilMoisture). + +#define PRST_ZB_ZCL_ATTR_SOIL_MOISTURE_CLUSTER_ID 1032 + +// Soil moisture value represented as an uint16. +#define PRST_ZB_ZCL_ATTR_SOIL_MOISTURE_VALUE_ID 0x00 + +// Required callbacks. ZBOSS will call these. +void prst_zcl_soil_moisture_init_server(void); +void prst_zcl_soil_moisture_init_client(void); + +#define PRST_ZB_ZCL_ATTR_SOIL_MOISTURE_CLUSTER_ID_SERVER_ROLE_INIT prst_zcl_soil_moisture_init_server +#define PRST_ZB_ZCL_ATTR_SOIL_MOISTURE_CLUSTER_ID_CLIENT_ROLE_INIT prst_zcl_soil_moisture_init_client + +#define PRST_ZB_ZCL_SOIL_MOISTURE_CLUSTER_REVISION_DEFAULT ((zb_uint16_t)0x42) + +#define ZB_SET_ATTR_DESCR_WITH_PRST_ZB_ZCL_ATTR_SOIL_MOISTURE_VALUE_ID(data_ptr) \ + { \ + PRST_ZB_ZCL_ATTR_SOIL_MOISTURE_VALUE_ID, \ + ZB_ZCL_ATTR_TYPE_U16, \ + ZB_ZCL_ATTR_ACCESS_READ_ONLY | ZB_ZCL_ATTR_ACCESS_REPORTING, \ + (void*)data_ptr \ + } + +#define PRST_ZB_ZCL_DECLARE_SOIL_MOISTURE_ATTRIB_LIST(attr_list, value) \ + ZB_ZCL_START_DECLARE_ATTRIB_LIST_CLUSTER_REVISION(attr_list, PRST_ZB_ZCL_SOIL_MOISTURE) \ + ZB_ZCL_SET_ATTR_DESC(PRST_ZB_ZCL_ATTR_SOIL_MOISTURE_VALUE_ID, (value)) \ + ZB_ZCL_FINISH_DECLARE_ATTRIB_LIST + +#endif // _PRST_ZB_SOIL_MOISTURE_DEFS_ \ No newline at end of file diff --git a/code/nrf-connect/samples/zigbee/src/zb_range_extender.h b/code/nrf-connect/samples/zigbee/src/zb_range_extender.h index 728a7fa..ca9b7c3 100644 --- a/code/nrf-connect/samples/zigbee/src/zb_range_extender.h +++ b/code/nrf-connect/samples/zigbee/src/zb_range_extender.h @@ -1,62 +1,14 @@ -/* - * Copyright (c) 2022 Nordic Semiconductor ASA - * - * SPDX-License-Identifier: LicenseRef-Nordic-5-Clause - */ +#ifndef _PRST_ZB_H_ +#define _PRST_ZB_H_ -#ifndef ZB_RANGE_EXTENDER_H -#define ZB_RANGE_EXTENDER_H 1 +#include "prst_zb_soil_moisture_defs.h" -/** - * @defgroup ZB_DEFINE_DEVICE_RANGE_EXTENDER Range Extender - * @{ - * @details - * - @ref ZB_ZCL_IDENTIFY \n - * - @ref ZB_ZCL_BASIC - */ - -/** Range Extender Device ID*/ -#define ZB_RANGE_EXTENDER_DEVICE_ID 0x0008 - -/** Range extender device version */ -#define ZB_DEVICE_VER_RANGE_EXTENDER 0 - -/** @cond internals_doc */ - -/** Range extender IN (server) clusters number */ -#define ZB_RANGE_EXTENDER_IN_CLUSTER_NUM 5 - -/** Range extender OUT (client) clusters number */ -#define ZB_RANGE_EXTENDER_OUT_CLUSTER_NUM 0 - -#define ZB_RANGE_EXTENDER_CLUSTER_NUM \ - (ZB_RANGE_EXTENDER_IN_CLUSTER_NUM + ZB_RANGE_EXTENDER_OUT_CLUSTER_NUM) - -/** Number of attribute for reporting on Range extender device */ -#define ZB_RANGE_EXTENDER_REPORT_ATTR_COUNT 3 - -typedef struct { - zb_uint16_t rel_humidity; - zb_uint16_t min_val; - zb_uint16_t max_val; -} prst_rel_humidity_attrs_t; - -// Power configuration cluster - section 3.3. -typedef struct { - zb_uint8_t voltage; - zb_uint8_t percentage; - zb_uint8_t quantity; - zb_uint8_t size; - zb_uint8_t rated_voltage; - zb_uint8_t voltage_min_thres; - zb_uint8_t percentage_min_thres; -} prst_batt_attrs_t; -// ZB_SET_ATTR_DESCR_WITH_ZB_ZCL_ATTR_POWER_CONFIG_BATTERY_VOLTAGE_ID(voltage, ), \ - // ZB_SET_ATTR_DESCR_WITH_ZB_ZCL_ATTR_POWER_CONFIG_BATTERY_SIZE_ID(size, ), \ - // ZB_SET_ATTR_DESCR_WITH_ZB_ZCL_ATTR_POWER_CONFIG_BATTERY_QUANTITY_ID(quantity, ), \ - // ZB_SET_ATTR_DESCR_WITH_ZB_ZCL_ATTR_POWER_CONFIG_BATTERY_RATED_VOLTAGE_ID(rated_voltage, ), \ - // ZB_SET_ATTR_DESCR_WITH_ZB_ZCL_ATTR_POWER_CONFIG_BATTERY_ALARM_MASK_ID(alarm_mask, ), \ - // ZB_SET_ATTR_DESCR_WITH_ZB_ZCL_ATTR_POWER_CONFIG_BATTERY_VOLTAGE_MIN_THRESHOLD_ID(voltage_min_threshold, ), \ +#define PRST_ZB_DEVICE_ID 0x0008 +#define PRST_ZB_DEVICE_VERSION 0 +#define PRST_ZB_IN_CLUSTER_NUM 6 +#define PRST_ZB_OUT_CLUSTER_NUM 0 +#define PRST_ZB_CLUSTER_NUM (PRST_ZB_IN_CLUSTER_NUM + PRST_ZB_OUT_CLUSTER_NUM) +#define PRST_ZB_ATTR_REPORTING_COUNT 4 #define ZB_DECLARE_RANGE_EXTENDER_CLUSTER_LIST( \ cluster_list_name, \ @@ -64,7 +16,8 @@ typedef struct { identify_attr_list, \ temp_measurement_attr_list, \ rel_humidity_attr_list, \ - batt_att_list) \ + batt_att_list, \ + soil_moisture_attr_list) \ zb_zcl_cluster_desc_t cluster_list_name[] = \ { \ ZB_ZCL_CLUSTER_DESC( \ @@ -91,6 +44,12 @@ typedef struct { (rel_humi_attr_list), \ ZB_ZCL_CLUSTER_SERVER_ROLE, \ ZB_ZCL_MANUF_CODE_INVALID), \ + ZB_ZCL_CLUSTER_DESC( \ + PRST_ZB_ZCL_ATTR_SOIL_MOISTURE_CLUSTER_ID, \ + ZB_ZCL_ARRAY_SIZE(soil_moisture_attr_list, zb_zcl_attr_t), \ + (soil_moisture_attr_list), \ + ZB_ZCL_CLUSTER_SERVER_ROLE, \ + ZB_ZCL_MANUF_CODE_INVALID), \ ZB_ZCL_CLUSTER_DESC( \ ZB_ZCL_CLUSTER_ID_POWER_CONFIG, \ ZB_ZCL_ARRAY_SIZE(batt_attr_list, zb_zcl_attr_t), \ @@ -98,15 +57,6 @@ typedef struct { ZB_ZCL_CLUSTER_SERVER_ROLE, \ ZB_ZCL_MANUF_CODE_INVALID)} -/** @cond internals_doc */ - -/** - * @brief Declare simple descriptor for Range extender device - * @param ep_name - endpoint variable name - * @param ep_id - endpoint ID - * @param in_clust_num - number of supported input clusters - * @param out_clust_num - number of supported output clusters - */ #define ZB_ZCL_DECLARE_RANGE_EXTENDER_SIMPLE_DESC(ep_name, ep_id, in_clust_num, out_clust_num) \ ZB_DECLARE_SIMPLE_DESC(in_clust_num, out_clust_num); \ ZB_AF_SIMPLE_DESC_TYPE(in_clust_num, out_clust_num) \ @@ -114,8 +64,8 @@ typedef struct { { \ ep_id, \ ZB_AF_HA_PROFILE_ID, \ - ZB_RANGE_EXTENDER_DEVICE_ID, \ - ZB_DEVICE_VER_RANGE_EXTENDER, \ + PRST_ZB_DEVICE_ID, \ + PRST_ZB_DEVICE_VERSION, \ 0, \ in_clust_num, \ out_clust_num, \ @@ -124,27 +74,19 @@ typedef struct { ZB_ZCL_CLUSTER_ID_IDENTIFY, \ ZB_ZCL_CLUSTER_ID_TEMP_MEASUREMENT, \ ZB_ZCL_CLUSTER_ID_REL_HUMIDITY_MEASUREMENT, \ + PRST_ZB_ZCL_ATTR_SOIL_MOISTURE_CLUSTER_ID, \ ZB_ZCL_CLUSTER_ID_POWER_CONFIG, \ }} -/** @endcond */ /* internals_doc */ +#define ZB_DECLARE_RANGE_EXTENDER_EP(ep_name, ep_id, cluster_list) \ + ZBOSS_DEVICE_DECLARE_REPORTING_CTX(reporting_ctx_##ep_name, PRST_ZB_ATTR_REPORTING_COUNT); \ + ZB_ZCL_DECLARE_RANGE_EXTENDER_SIMPLE_DESC(ep_name, ep_id, \ + PRST_ZB_IN_CLUSTER_NUM, PRST_ZB_OUT_CLUSTER_NUM); \ + ZB_AF_DECLARE_ENDPOINT_DESC(ep_name, ep_id, ZB_AF_HA_PROFILE_ID, \ + /*reserved_length=*/0, /*reserved_ptr=*/NULL, \ + ZB_ZCL_ARRAY_SIZE(cluster_list, zb_zcl_cluster_desc_t), cluster_list, \ + (zb_af_simple_desc_1_1_t *)&simple_desc_##ep_name, \ + PRST_ZB_ATTR_REPORTING_COUNT, reporting_ctx_##ep_name, \ + /*lev_ctrl_count=*/0, /*lev_ctrl_ctx=*/NULL) -/** - * @brief Declare endpoint for Range extender device - * @param ep_name - endpoint variable name - * @param ep_id - endpoint ID - * @param cluster_list - endpoint cluster list - */ -#define ZB_DECLARE_RANGE_EXTENDER_EP(ep_name, ep_id, cluster_list) \ - ZBOSS_DEVICE_DECLARE_REPORTING_CTX(reporting_ctx_##ep_name, ZB_RANGE_EXTENDER_REPORT_ATTR_COUNT); \ - ZB_ZCL_DECLARE_RANGE_EXTENDER_SIMPLE_DESC(ep_name, ep_id, \ - ZB_RANGE_EXTENDER_IN_CLUSTER_NUM, ZB_RANGE_EXTENDER_OUT_CLUSTER_NUM); \ - ZB_AF_DECLARE_ENDPOINT_DESC(ep_name, ep_id, ZB_AF_HA_PROFILE_ID, 0, NULL, \ - ZB_ZCL_ARRAY_SIZE(cluster_list, zb_zcl_cluster_desc_t), cluster_list, \ - (zb_af_simple_desc_1_1_t *)&simple_desc_##ep_name, \ - ZB_RANGE_EXTENDER_REPORT_ATTR_COUNT, reporting_ctx_##ep_name, \ - 0, NULL) /* No CVC ctx */ - -/*! @} */ - -#endif /* ZB_RANGE_EXTENDER_H */ +#endif // _PRST_ZB_H_ From 01bb9da2a4338f3b270e3444954d06d2c5079a21 Mon Sep 17 00:00:00 2001 From: rbaron Date: Wed, 7 Dec 2022 21:43:30 +0100 Subject: [PATCH 09/36] Cleanups --- code/nrf-connect/samples/zigbee/src/main.c | 12 ++++-------- .../samples/zigbee/src/{attrs.h => prst_zb_attrs.h} | 0 .../{zb_range_extender.h => prst_zb_endpoint_defs.h} | 0 3 files changed, 4 insertions(+), 8 deletions(-) rename code/nrf-connect/samples/zigbee/src/{attrs.h => prst_zb_attrs.h} (100%) rename code/nrf-connect/samples/zigbee/src/{zb_range_extender.h => prst_zb_endpoint_defs.h} (100%) diff --git a/code/nrf-connect/samples/zigbee/src/main.c b/code/nrf-connect/samples/zigbee/src/main.c index 0f0441f..ca62941 100644 --- a/code/nrf-connect/samples/zigbee/src/main.c +++ b/code/nrf-connect/samples/zigbee/src/main.c @@ -21,9 +21,9 @@ #include #include -#include "attrs.h" +#include "prst_zb_attrs.h" +#include "prst_zb_endpoint_defs.h" #include "prst_zb_soil_moisture_defs.h" -#include "zb_range_extender.h" #define PRST_ZIGBEE_ENDPOINT 10 #define IDENTIFY_MODE_BUTTON DK_BTN4_MSK @@ -100,10 +100,6 @@ PRST_ZB_ZCL_DECLARE_SOIL_MOISTURE_ATTRIB_LIST( soil_moisture_attr_list, &dev_ctx.soil_moisture_attrs.percentage); -// ZB_ZCL_DECLARE_TEMP_MEASUREMENT_ATTRIB_LIST2( -// soil_moisture_attr_list2, -// &dev_ctx.soil_moisture_attrs.percentage); - void prst_zcl_soil_moisture_init_server(void) { zb_zcl_add_cluster_handlers(PRST_ZB_ZCL_ATTR_SOIL_MOISTURE_CLUSTER_ID, ZB_ZCL_CLUSTER_SERVER_ROLE, @@ -261,9 +257,9 @@ void main(void) { update_sensors_cb(/*arg=*/0); - zb_bdb_set_legacy_device_support(1); + // zb_bdb_set_legacy_device_support(1); zigbee_enable(); - zb_bdb_set_legacy_device_support(1); + // zb_bdb_set_legacy_device_support(1); // zigbee_configure_sleepy_behavior(/*enable=*/true); diff --git a/code/nrf-connect/samples/zigbee/src/attrs.h b/code/nrf-connect/samples/zigbee/src/prst_zb_attrs.h similarity index 100% rename from code/nrf-connect/samples/zigbee/src/attrs.h rename to code/nrf-connect/samples/zigbee/src/prst_zb_attrs.h diff --git a/code/nrf-connect/samples/zigbee/src/zb_range_extender.h b/code/nrf-connect/samples/zigbee/src/prst_zb_endpoint_defs.h similarity index 100% rename from code/nrf-connect/samples/zigbee/src/zb_range_extender.h rename to code/nrf-connect/samples/zigbee/src/prst_zb_endpoint_defs.h From 676b525bd9a775ef9f3253606e72d993bb4b8c09 Mon Sep 17 00:00:00 2001 From: rbaron Date: Wed, 7 Dec 2022 22:22:41 +0100 Subject: [PATCH 10/36] Reading and sending real soil moisture works! --- .../nrf-connect/samples/zigbee/CMakeLists.txt | 1 + code/nrf-connect/samples/zigbee/prj.conf | 13 ++++- code/nrf-connect/samples/zigbee/src/main.c | 56 ++++++++----------- .../samples/zigbee/src/prst_zb_attrs.h | 17 ++++-- .../zigbee/src/prst_zb_endpoint_defs.h | 4 ++ .../zigbee/src/prst_zb_soil_moisture_defs.c | 15 +++++ .../zigbee/src/prst_zb_soil_moisture_defs.h | 2 + 7 files changed, 69 insertions(+), 39 deletions(-) create mode 100644 code/nrf-connect/samples/zigbee/src/prst_zb_soil_moisture_defs.c diff --git a/code/nrf-connect/samples/zigbee/CMakeLists.txt b/code/nrf-connect/samples/zigbee/CMakeLists.txt index a1bef91..ca8d2e3 100644 --- a/code/nrf-connect/samples/zigbee/CMakeLists.txt +++ b/code/nrf-connect/samples/zigbee/CMakeLists.txt @@ -12,6 +12,7 @@ include_directories(src) target_sources(app PRIVATE src/main.c + src/prst_zb_soil_moisture_defs.c ) add_subdirectory(../../prstlib prstlib) diff --git a/code/nrf-connect/samples/zigbee/prj.conf b/code/nrf-connect/samples/zigbee/prj.conf index ba1d7ba..b1a522a 100644 --- a/code/nrf-connect/samples/zigbee/prj.conf +++ b/code/nrf-connect/samples/zigbee/prj.conf @@ -6,9 +6,20 @@ CONFIG_NCS_SAMPLES_DEFAULTS=y +CONFIG_CBPRINTF_FP_SUPPORT=y +CONFIG_PWM=y +CONFIG_I2C=y +CONFIG_ADC=y +CONFIG_GPIO=y + +CONFIG_PM=y +CONFIG_PM_DEVICE=y + +CONFIG_NEWLIB_LIBC=y +CONFIG_NEWLIB_LIBC_FLOAT_PRINTF=y + CONFIG_UART_INTERRUPT_DRIVEN=y CONFIG_SERIAL=y -CONFIG_GPIO=y # Make sure printk is not printing to the UART console CONFIG_CONSOLE=y diff --git a/code/nrf-connect/samples/zigbee/src/main.c b/code/nrf-connect/samples/zigbee/src/main.c index ca62941..e0625fb 100644 --- a/code/nrf-connect/samples/zigbee/src/main.c +++ b/code/nrf-connect/samples/zigbee/src/main.c @@ -11,6 +11,10 @@ #include #include +#include +#include +#include +#include #include #include #include @@ -25,27 +29,15 @@ #include "prst_zb_endpoint_defs.h" #include "prst_zb_soil_moisture_defs.h" -#define PRST_ZIGBEE_ENDPOINT 10 #define IDENTIFY_MODE_BUTTON DK_BTN4_MSK #define FACTORY_RESET_BUTTON IDENTIFY_MODE_BUTTON -#define PRST_BASIC_MANUF_NAME "b-parasite" -#define PRST_BASIC_MODEL_ID "b-parasite" LOG_MODULE_REGISTER(app, LOG_LEVEL_INF); -struct zb_device_ctx { - zb_zcl_basic_attrs_ext_t basic_attr; - zb_zcl_identify_attrs_t identify_attr; - // In units of 0.01 C. - zb_zcl_temp_measurement_attrs_t temp_measure_attrs; - prst_rel_humidity_attrs_t rel_humidity_attrs; - // In units of 100 mV. - prst_batt_attrs_t batt_attrs; - prst_soil_moisture_attrs_t soil_moisture_attrs; -}; - static struct zb_device_ctx dev_ctx; +static prst_sensors_t sensors; + ZB_ZCL_DECLARE_IDENTIFY_ATTRIB_LIST( identify_attr_list, &dev_ctx.identify_attr.identify_time); @@ -100,18 +92,6 @@ PRST_ZB_ZCL_DECLARE_SOIL_MOISTURE_ATTRIB_LIST( soil_moisture_attr_list, &dev_ctx.soil_moisture_attrs.percentage); -void prst_zcl_soil_moisture_init_server(void) { - zb_zcl_add_cluster_handlers(PRST_ZB_ZCL_ATTR_SOIL_MOISTURE_CLUSTER_ID, - ZB_ZCL_CLUSTER_SERVER_ROLE, - /*cluster_check_value=*/NULL, - /*cluster_write_attr_hook=*/NULL, - /*cluster_handler=*/NULL); -} - -void prst_zcl_soil_moisture_init_client(void) { - // Nothing. -} - ZB_DECLARE_RANGE_EXTENDER_CLUSTER_LIST( app_template_clusters, basic_attr_list, @@ -213,6 +193,11 @@ void zboss_signal_handler(zb_bufid_t bufid) { void update_sensors_cb(zb_uint8_t arg) { LOG_INF("Updating sensors"); + if (prst_sensors_read_all(&sensors)) { + LOG_ERR("Unable to read sensors"); + return; + } + static zb_uint8_t batt = 10; batt += 1; zb_zcl_set_attr_val(PRST_ZIGBEE_ENDPOINT, ZB_ZCL_CLUSTER_ID_POWER_CONFIG, @@ -237,8 +222,7 @@ void update_sensors_cb(zb_uint8_t arg) { ZB_ZCL_CLUSTER_SERVER_ROLE, ZB_ZCL_ATTR_REL_HUMIDITY_MEASUREMENT_VALUE_ID, (zb_uint8_t*)&rel_humi, ZB_FALSE); - static zb_int16_t soil_moisture = 69; - soil_moisture += 1; + zb_int16_t soil_moisture = 100 * 100 * sensors.soil.percentage; zb_zcl_set_attr_val(PRST_ZIGBEE_ENDPOINT, PRST_ZB_ZCL_ATTR_SOIL_MOISTURE_CLUSTER_ID, ZB_ZCL_CLUSTER_SERVER_ROLE, PRST_ZB_ZCL_ATTR_SOIL_MOISTURE_VALUE_ID, (zb_uint8_t*)&soil_moisture, ZB_FALSE); @@ -246,7 +230,11 @@ void update_sensors_cb(zb_uint8_t arg) { ZB_SCHEDULE_APP_ALARM(update_sensors_cb, NULL, ZB_TIME_ONE_SECOND * 1); } -void main(void) { +int main(void) { + RET_IF_ERR(prst_adc_init()); + RET_IF_ERR(prst_led_init()); + RET_IF_ERR(prst_button_init()); + register_factory_reset_button(FACTORY_RESET_BUTTON); app_clusters_attr_init(); @@ -257,11 +245,13 @@ void main(void) { update_sensors_cb(/*arg=*/0); - // zb_bdb_set_legacy_device_support(1); - zigbee_enable(); - // zb_bdb_set_legacy_device_support(1); - // zigbee_configure_sleepy_behavior(/*enable=*/true); + RET_IF_ERR(prst_led_flash(2)); + + zigbee_enable(); + LOG_INF("Zigbee application template started"); + + return 0; } diff --git a/code/nrf-connect/samples/zigbee/src/prst_zb_attrs.h b/code/nrf-connect/samples/zigbee/src/prst_zb_attrs.h index ba0ed14..e996962 100644 --- a/code/nrf-connect/samples/zigbee/src/prst_zb_attrs.h +++ b/code/nrf-connect/samples/zigbee/src/prst_zb_attrs.h @@ -19,16 +19,23 @@ typedef struct { zb_uint8_t voltage; // Units of 0.5%. 0x00 (0%) - 0xc8 (100%) (optional, reportable). zb_uint8_t percentage; - // zb_uint8_t quantity; - // zb_uint8_t size; - // zb_uint8_t rated_voltage; - // zb_uint8_t voltage_min_thres; - // zb_uint8_t percentage_min_thres; } prst_batt_attrs_t; // Soil moisture cluster. typedef struct { + // 0-100, units of 0.01? zb_uint16_t percentage; } prst_soil_moisture_attrs_t; +struct zb_device_ctx { + zb_zcl_basic_attrs_ext_t basic_attr; + zb_zcl_identify_attrs_t identify_attr; + // In units of 0.01 C. + zb_zcl_temp_measurement_attrs_t temp_measure_attrs; + prst_rel_humidity_attrs_t rel_humidity_attrs; + // In units of 100 mV. + prst_batt_attrs_t batt_attrs; + prst_soil_moisture_attrs_t soil_moisture_attrs; +}; + #endif // _PRST_ZB_ATTRS_H_ diff --git a/code/nrf-connect/samples/zigbee/src/prst_zb_endpoint_defs.h b/code/nrf-connect/samples/zigbee/src/prst_zb_endpoint_defs.h index ca9b7c3..df2ffd1 100644 --- a/code/nrf-connect/samples/zigbee/src/prst_zb_endpoint_defs.h +++ b/code/nrf-connect/samples/zigbee/src/prst_zb_endpoint_defs.h @@ -3,6 +3,10 @@ #include "prst_zb_soil_moisture_defs.h" +#define PRST_ZIGBEE_ENDPOINT 10 +#define PRST_BASIC_MANUF_NAME "b-parasite" +#define PRST_BASIC_MODEL_ID "b-parasite" + #define PRST_ZB_DEVICE_ID 0x0008 #define PRST_ZB_DEVICE_VERSION 0 #define PRST_ZB_IN_CLUSTER_NUM 6 diff --git a/code/nrf-connect/samples/zigbee/src/prst_zb_soil_moisture_defs.c b/code/nrf-connect/samples/zigbee/src/prst_zb_soil_moisture_defs.c new file mode 100644 index 0000000..922a093 --- /dev/null +++ b/code/nrf-connect/samples/zigbee/src/prst_zb_soil_moisture_defs.c @@ -0,0 +1,15 @@ +#include "prst_zb_soil_moisture_defs.h" + +#include + +void prst_zcl_soil_moisture_init_server(void) { + zb_zcl_add_cluster_handlers(PRST_ZB_ZCL_ATTR_SOIL_MOISTURE_CLUSTER_ID, + ZB_ZCL_CLUSTER_SERVER_ROLE, + /*cluster_check_value=*/NULL, + /*cluster_write_attr_hook=*/NULL, + /*cluster_handler=*/NULL); +} + +void prst_zcl_soil_moisture_init_client(void) { + // Nothing. +} diff --git a/code/nrf-connect/samples/zigbee/src/prst_zb_soil_moisture_defs.h b/code/nrf-connect/samples/zigbee/src/prst_zb_soil_moisture_defs.h index 5c61029..8c01ae2 100644 --- a/code/nrf-connect/samples/zigbee/src/prst_zb_soil_moisture_defs.h +++ b/code/nrf-connect/samples/zigbee/src/prst_zb_soil_moisture_defs.h @@ -1,12 +1,14 @@ #ifndef _PRST_ZB_SOIL_MOISTURE_DEFS_ #define _PRST_ZB_SOIL_MOISTURE_DEFS_ +#include #include // Most defines in this file are updated from the ZB_ZCL_DECLARE_TEMP_MEASUREMENT_ATTRIB_LIST, // adapting attributes and IDs to match the mSoilMoisture cluster spec. // Values from https://github.com/Koenkk/zigbee-herdsman/blob/master/src/zcl/definition/cluster.ts#L2570 // (msSoilMoisture). +// Cluster attributes definitions in https://www.st.com/resource/en/user_manual/um2977-stm32wb-series-zigbee-cluster-library-api-stmicroelectronics.pdf. #define PRST_ZB_ZCL_ATTR_SOIL_MOISTURE_CLUSTER_ID 1032 From cb6ed73691eb39ad313effe21ef37a43626b8136 Mon Sep 17 00:00:00 2001 From: rbaron Date: Fri, 9 Dec 2022 19:02:55 +0100 Subject: [PATCH 11/36] Add battery percentage computation --- .../nrf-connect/prstlib/include/prstlib/adc.h | 7 +- .../prstlib/include/prstlib/sensors.h | 2 +- code/nrf-connect/prstlib/src/adc.c | 36 +++- code/nrf-connect/prstlib/src/sensors.c | 9 +- code/nrf-connect/samples/ble/src/encoding.c | 8 +- .../nrf-connect/samples/zigbee/CMakeLists.txt | 1 + code/nrf-connect/samples/zigbee/prj.conf | 25 +-- code/nrf-connect/samples/zigbee/src/main.c | 158 +++++------------- .../samples/zigbee/src/prst_zb_attrs.c | 31 ++++ .../samples/zigbee/src/prst_zb_attrs.h | 6 +- .../zigbee/src/prst_zb_endpoint_defs.h | 46 ++--- 11 files changed, 156 insertions(+), 173 deletions(-) create mode 100644 code/nrf-connect/samples/zigbee/src/prst_zb_attrs.c diff --git a/code/nrf-connect/prstlib/include/prstlib/adc.h b/code/nrf-connect/prstlib/include/prstlib/adc.h index 5ec3e9e..2fc29ce 100644 --- a/code/nrf-connect/prstlib/include/prstlib/adc.h +++ b/code/nrf-connect/prstlib/include/prstlib/adc.h @@ -9,6 +9,11 @@ typedef struct { float voltage; } prst_adc_read_t; +typedef struct { + prst_adc_read_t adc_read; + float percentage; +} prst_batt_t; + typedef struct { prst_adc_read_t adc_read; // A value from 0 (completely dry) to 2^10 (completely wet). @@ -25,7 +30,7 @@ typedef struct prst_adc_photo_sensor { int prst_adc_init(); -int prst_adc_batt_read(prst_adc_read_t* out); +int prst_adc_batt_read(prst_batt_t* out); int prst_adc_soil_read(float battery_voltage, prst_adc_soil_moisture_t* out); diff --git a/code/nrf-connect/prstlib/include/prstlib/sensors.h b/code/nrf-connect/prstlib/include/prstlib/sensors.h index 23c1c03..0f8f669 100644 --- a/code/nrf-connect/prstlib/include/prstlib/sensors.h +++ b/code/nrf-connect/prstlib/include/prstlib/sensors.h @@ -7,7 +7,7 @@ typedef struct { prst_adc_soil_moisture_t soil; prst_adc_photo_sensor_t photo; - prst_adc_read_t batt; + prst_batt_t batt; prst_shtc3_read_t shtc3; } prst_sensors_t; diff --git a/code/nrf-connect/prstlib/src/adc.c b/code/nrf-connect/prstlib/src/adc.c index d22f542..1856f7e 100644 --- a/code/nrf-connect/prstlib/src/adc.c +++ b/code/nrf-connect/prstlib/src/adc.c @@ -48,6 +48,37 @@ struct gpio_dt_spec ldr_enable_dt = #endif +typedef struct { + // High (h) and low (p) voltage (v) and % (p) points. + float vh, vl, ph, pl; +} batt_disch_linear_section_t; + +static void set_battery_percent(const prst_adc_read_t* read, prst_batt_t* out) { + // Must be sorted by .vh. + static const batt_disch_linear_section_t sections[] = { + {.vh = 3.00f, .vl = 2.90f, .ph = 1.00f, .pl = 0.42f}, + {.vh = 2.90f, .vl = 2.74f, .ph = 0.42f, .pl = 0.18f}, + {.vh = 2.74f, .vl = 2.44f, .ph = 0.18f, .pl = 0.06f}, + {.vh = 2.44f, .vl = 2.01f, .ph = 0.06f, .pl = 0.00f}, + }; + + const float v = read->voltage; + + if (v > sections[0].vh) { + out->percentage = 1.0f; + return; + } + for (int i = 0; i < ARRAY_SIZE(sections); i++) { + const batt_disch_linear_section_t* s = §ions[i]; + if (v > s->vl) { + out->percentage = s->pl + (v - s->vl) * ((s->ph - s->pl) / (s->vh - s->vl)); + return; + } + } + out->percentage = 0.0f; + return; +} + static inline float get_soil_moisture_percent(float battery_voltage, int16_t raw_adc_output) { const double x = battery_voltage; @@ -93,8 +124,9 @@ int prst_adc_init() { return 0; } -int prst_adc_batt_read(prst_adc_read_t* out) { - RET_IF_ERR(read_adc_spec(&adc_batt_spec, out)); +int prst_adc_batt_read(prst_batt_t* out) { + RET_IF_ERR(read_adc_spec(&adc_batt_spec, &out->adc_read)); + set_battery_percent(&out->adc_read, out); return 0; } diff --git a/code/nrf-connect/prstlib/src/sensors.c b/code/nrf-connect/prstlib/src/sensors.c index 8b8cc2a..e0b1ca9 100644 --- a/code/nrf-connect/prstlib/src/sensors.c +++ b/code/nrf-connect/prstlib/src/sensors.c @@ -10,17 +10,18 @@ LOG_MODULE_REGISTER(sensors, LOG_LEVEL_WRN); int prst_sensors_read_all(prst_sensors_t *sensors) { RET_IF_ERR(prst_adc_batt_read(&sensors->batt)); - RET_IF_ERR(prst_adc_soil_read(sensors->batt.voltage, &sensors->soil)); - RET_IF_ERR(prst_adc_photo_read(sensors->batt.voltage, &sensors->photo)); + RET_IF_ERR(prst_adc_soil_read(sensors->batt.adc_read.voltage, &sensors->soil)); + RET_IF_ERR(prst_adc_photo_read(sensors->batt.adc_read.voltage, &sensors->photo)); RET_IF_ERR(prst_shtc3_read(&sensors->shtc3)) - LOG_DBG("Batt: %d mV", sensors->batt.millivolts); + LOG_DBG("Batt: %d mV (%.2f%%)", sensors->batt.adc_read.millivolts, + 100 * sensors->batt.percentage); LOG_DBG("Soil: %.0f %% (%.3f mV)", 100 * sensors->soil.percentage, sensors->soil.adc_read.voltage); LOG_DBG("Photo: %u lx (%.3f mV)", sensors->photo.brightness, sensors->soil.adc_read.voltage); LOG_DBG("Temp: %f oC", sensors->shtc3.temp_c); - LOG_DBG("Humi: %.0f %%", 100.0 * sensors->shtc3.rel_humi); + LOG_DBG("Humi: %.0f %%", 100 * sensors->shtc3.rel_humi); LOG_DBG("--------------------------------------------------"); return 0; diff --git a/code/nrf-connect/samples/ble/src/encoding.c b/code/nrf-connect/samples/ble/src/encoding.c index 82a5a21..93b24d1 100644 --- a/code/nrf-connect/samples/ble/src/encoding.c +++ b/code/nrf-connect/samples/ble/src/encoding.c @@ -25,8 +25,8 @@ int prst_ble_encode_service_data(const prst_sensors_t* sensors, // 4 bits for a small wrap-around counter for deduplicating messages on the // receiver. // out[3] = sensors->run_counter & 0x0f; - out[4] = sensors->batt.millivolts >> 8; - out[5] = sensors->batt.millivolts & 0xff; + out[4] = sensors->batt.adc_read.millivolts >> 8; + out[5] = sensors->batt.adc_read.millivolts & 0xff; int16_t temp_centicelsius = 100 * sensors->shtc3.temp_c; out[6] = temp_centicelsius >> 8; out[7] = temp_centicelsius & 0xff; @@ -82,7 +82,7 @@ int prst_ble_encode_service_data(const prst_sensors_t* sensors, // Type - voltage. out[15] = 0x0c; // Value. Factor of 0.001. - uint16_t batt_val = sensors->batt.millivolts; + uint16_t batt_val = sensors->batt.adc_read.millivolts; out[16] = batt_val & 0xff; out[17] = batt_val >> 8; @@ -116,7 +116,7 @@ int prst_ble_encode_service_data(const prst_sensors_t* sensors, // Battery voltage. out[13] = 0x0c; // Value. Factor of 0.001. - uint16_t batt_val = sensors->batt.millivolts; + uint16_t batt_val = sensors->batt.adc_read.millivolts; out[14] = batt_val & 0xff; out[15] = batt_val >> 8; // Soil moisture. diff --git a/code/nrf-connect/samples/zigbee/CMakeLists.txt b/code/nrf-connect/samples/zigbee/CMakeLists.txt index ca8d2e3..db0b194 100644 --- a/code/nrf-connect/samples/zigbee/CMakeLists.txt +++ b/code/nrf-connect/samples/zigbee/CMakeLists.txt @@ -12,6 +12,7 @@ include_directories(src) target_sources(app PRIVATE src/main.c + src/prst_zb_attrs.c src/prst_zb_soil_moisture_defs.c ) diff --git a/code/nrf-connect/samples/zigbee/prj.conf b/code/nrf-connect/samples/zigbee/prj.conf index b1a522a..4a91f5d 100644 --- a/code/nrf-connect/samples/zigbee/prj.conf +++ b/code/nrf-connect/samples/zigbee/prj.conf @@ -1,12 +1,5 @@ -# -# Copyright (c) 2021 Nordic Semiconductor ASA -# -# SPDX-License-Identifier: LicenseRef-Nordic-5-Clause -# -CONFIG_NCS_SAMPLES_DEFAULTS=y - -CONFIG_CBPRINTF_FP_SUPPORT=y +CONFIG_LOG=y CONFIG_PWM=y CONFIG_I2C=y CONFIG_ADC=y @@ -18,12 +11,7 @@ CONFIG_PM_DEVICE=y CONFIG_NEWLIB_LIBC=y CONFIG_NEWLIB_LIBC_FLOAT_PRINTF=y -CONFIG_UART_INTERRUPT_DRIVEN=y -CONFIG_SERIAL=y - -# Make sure printk is not printing to the UART console -CONFIG_CONSOLE=y -CONFIG_UART_CONSOLE=y +CONFIG_SERIAL=n CONFIG_HEAP_MEM_POOL_SIZE=2048 CONFIG_MAIN_THREAD_PRIORITY=7 @@ -32,9 +20,6 @@ CONFIG_ZIGBEE=y CONFIG_ZIGBEE_APP_UTILS=y CONFIG_ZIGBEE_ROLE_END_DEVICE=y -# Enable DK LED and Buttons library -CONFIG_DK_LIBRARY=y - # This example requires more workqueue stack CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=2048 @@ -51,4 +36,8 @@ CONFIG_NET_IP_ADDR_CHECK=n CONFIG_NET_UDP=n # Get Zigbee to scan every channel. -CONFIG_ZIGBEE_CHANNEL_SELECTION_MODE_MULTI=y \ No newline at end of file +CONFIG_ZIGBEE_CHANNEL_SELECTION_MODE_MULTI=y + +# Enable API for powering down unused RAM parts. +# https://developer.nordicsemi.com/nRF_Connect_SDK/doc/1.7.1/nrf/ug_zigbee_configuring.html#power-saving-during-sleep +CONFIG_RAM_POWER_DOWN_LIBRARY=y diff --git a/code/nrf-connect/samples/zigbee/src/main.c b/code/nrf-connect/samples/zigbee/src/main.c index e0625fb..4cb9630 100644 --- a/code/nrf-connect/samples/zigbee/src/main.c +++ b/code/nrf-connect/samples/zigbee/src/main.c @@ -1,14 +1,3 @@ -/* - * Copyright (c) 2021 Nordic Semiconductor ASA - * - * SPDX-License-Identifier: LicenseRef-Nordic-5-Clause - */ - -/** @file - * - * @brief Zigbee application template. - */ - #include #include #include @@ -29,8 +18,7 @@ #include "prst_zb_endpoint_defs.h" #include "prst_zb_soil_moisture_defs.h" -#define IDENTIFY_MODE_BUTTON DK_BTN4_MSK -#define FACTORY_RESET_BUTTON IDENTIFY_MODE_BUTTON +#define FACTORY_RESET_BUTTON DK_BTN4_MSK LOG_MODULE_REGISTER(app, LOG_LEVEL_INF); @@ -92,7 +80,7 @@ PRST_ZB_ZCL_DECLARE_SOIL_MOISTURE_ATTRIB_LIST( soil_moisture_attr_list, &dev_ctx.soil_moisture_attrs.percentage); -ZB_DECLARE_RANGE_EXTENDER_CLUSTER_LIST( +PRST_ZB_DECLARE_CLUSTER_LIST( app_template_clusters, basic_attr_list, identify_attr_list, @@ -101,7 +89,7 @@ ZB_DECLARE_RANGE_EXTENDER_CLUSTER_LIST( basic_attr_list, soil_moisture_attr_list); -ZB_DECLARE_RANGE_EXTENDER_EP( +PRST_ZB_DECLARE_ENDPOINT( app_template_ep, PRST_ZIGBEE_ENDPOINT, app_template_clusters); @@ -110,79 +98,6 @@ ZBOSS_DECLARE_DEVICE_CTX_1_EP( app_template_ctx, app_template_ep); -static void app_clusters_attr_init(void) { - dev_ctx.basic_attr.zcl_version = ZB_ZCL_VERSION; - dev_ctx.basic_attr.power_source = ZB_ZCL_BASIC_POWER_SOURCE_BATTERY; - ZB_ZCL_SET_STRING_VAL( - dev_ctx.basic_attr.mf_name, - PRST_BASIC_MANUF_NAME, - ZB_ZCL_STRING_CONST_SIZE(PRST_BASIC_MANUF_NAME)); - - ZB_ZCL_SET_STRING_VAL( - dev_ctx.basic_attr.model_id, - PRST_BASIC_MODEL_ID, - ZB_ZCL_STRING_CONST_SIZE(PRST_BASIC_MODEL_ID)); - - dev_ctx.identify_attr.identify_time = - ZB_ZCL_IDENTIFY_IDENTIFY_TIME_DEFAULT_VALUE; -} - -static void toggle_identify_led(zb_bufid_t bufid) { - static int blink_status; - ZB_SCHEDULE_APP_ALARM(toggle_identify_led, bufid, ZB_MILLISECONDS_TO_BEACON_INTERVAL(100)); -} - -static void identify_cb(zb_bufid_t bufid) { - zb_ret_t zb_err_code; - - if (bufid) { - ZB_SCHEDULE_APP_CALLBACK(toggle_identify_led, bufid); - } else { - zb_err_code = ZB_SCHEDULE_APP_ALARM_CANCEL(toggle_identify_led, ZB_ALARM_ANY_PARAM); - ZVUNUSED(zb_err_code); - } -} - -static void start_identifying(zb_bufid_t bufid) { - ZVUNUSED(bufid); - - if (ZB_JOINED()) { - if (dev_ctx.identify_attr.identify_time == - ZB_ZCL_IDENTIFY_IDENTIFY_TIME_DEFAULT_VALUE) { - zb_ret_t zb_err_code = zb_bdb_finding_binding_target( - PRST_ZIGBEE_ENDPOINT); - - if (zb_err_code == RET_OK) { - LOG_INF("Enter identify mode"); - } else if (zb_err_code == RET_INVALID_STATE) { - LOG_WRN("RET_INVALID_STATE - Cannot enter identify mode"); - } else { - ZB_ERROR_CHECK(zb_err_code); - } - } else { - LOG_INF("Cancel identify mode"); - zb_bdb_finding_binding_target_cancel(); - } - } else { - LOG_WRN("Device not in a network - cannot enter identify mode"); - } -} - -static void button_changed(uint32_t button_state, uint32_t has_changed) { - if (IDENTIFY_MODE_BUTTON & has_changed) { - if (IDENTIFY_MODE_BUTTON & button_state) { - } else { - if (was_factory_reset_done()) { - LOG_DBG("After Factory Reset - ignore button release"); - } else { - ZB_SCHEDULE_APP_CALLBACK(start_identifying, 0); - } - } - } - - check_factory_reset_button(button_state, has_changed); -} - void zboss_signal_handler(zb_bufid_t bufid) { ZB_ERROR_CHECK(zigbee_default_signal_handler(bufid)); if (bufid) { @@ -198,36 +113,37 @@ void update_sensors_cb(zb_uint8_t arg) { return; } - static zb_uint8_t batt = 10; - batt += 1; - zb_zcl_set_attr_val(PRST_ZIGBEE_ENDPOINT, ZB_ZCL_CLUSTER_ID_POWER_CONFIG, - ZB_ZCL_CLUSTER_SERVER_ROLE, ZB_ZCL_ATTR_POWER_CONFIG_BATTERY_VOLTAGE_ID, - (zb_uint8_t*)&batt, ZB_FALSE); + // Battery voltlage in units of 100 mV. + uint8_t batt_voltage = sensors.batt.adc_read.millivolts / 100; + prst_zb_set_attr_value(ZB_ZCL_CLUSTER_ID_POWER_CONFIG, + ZB_ZCL_ATTR_POWER_CONFIG_BATTERY_VOLTAGE_ID, + &batt_voltage); - static zb_uint8_t batt_percentage = 10; - batt_percentage += 1; - zb_zcl_set_attr_val(PRST_ZIGBEE_ENDPOINT, ZB_ZCL_CLUSTER_ID_POWER_CONFIG, - ZB_ZCL_CLUSTER_SERVER_ROLE, ZB_ZCL_ATTR_POWER_CONFIG_BATTERY_PERCENTAGE_REMAINING_ID, - (zb_uint8_t*)&batt_percentage, ZB_FALSE); + // Battery percentage in units of 0.5%. + zb_uint8_t batt_percentage = 2 * 100 * sensors.batt.percentage; + prst_zb_set_attr_value(ZB_ZCL_CLUSTER_ID_POWER_CONFIG, + ZB_ZCL_ATTR_POWER_CONFIG_BATTERY_PERCENTAGE_REMAINING_ID, + &batt_percentage); - static zb_int16_t temperature_value = 27; - temperature_value += 1; - zb_zcl_set_attr_val(PRST_ZIGBEE_ENDPOINT, ZB_ZCL_CLUSTER_ID_TEMP_MEASUREMENT, - ZB_ZCL_CLUSTER_SERVER_ROLE, ZB_ZCL_ATTR_TEMP_MEASUREMENT_VALUE_ID, - (zb_uint8_t*)&temperature_value, ZB_FALSE); + // Temperature in units of 0.01 degrees Celcius. + zb_int16_t temperature_value = 100 * sensors.shtc3.temp_c; + prst_zb_set_attr_value(ZB_ZCL_CLUSTER_ID_TEMP_MEASUREMENT, + ZB_ZCL_ATTR_TEMP_MEASUREMENT_VALUE_ID, + &temperature_value); - static zb_int16_t rel_humi = 12; - rel_humi += 1; - zb_zcl_set_attr_val(PRST_ZIGBEE_ENDPOINT, ZB_ZCL_CLUSTER_ID_REL_HUMIDITY_MEASUREMENT, - ZB_ZCL_CLUSTER_SERVER_ROLE, ZB_ZCL_ATTR_REL_HUMIDITY_MEASUREMENT_VALUE_ID, - (zb_uint8_t*)&rel_humi, ZB_FALSE); + // Relative humidity in units of 0.01%. + zb_int16_t rel_humi = 100 * 100 * sensors.shtc3.rel_humi; + prst_zb_set_attr_value(ZB_ZCL_CLUSTER_ID_REL_HUMIDITY_MEASUREMENT, + ZB_ZCL_ATTR_REL_HUMIDITY_MEASUREMENT_VALUE_ID, + &rel_humi); + // Soil moisture in units of 0.01%. zb_int16_t soil_moisture = 100 * 100 * sensors.soil.percentage; - zb_zcl_set_attr_val(PRST_ZIGBEE_ENDPOINT, PRST_ZB_ZCL_ATTR_SOIL_MOISTURE_CLUSTER_ID, - ZB_ZCL_CLUSTER_SERVER_ROLE, PRST_ZB_ZCL_ATTR_SOIL_MOISTURE_VALUE_ID, - (zb_uint8_t*)&soil_moisture, ZB_FALSE); + prst_zb_set_attr_value(PRST_ZB_ZCL_ATTR_SOIL_MOISTURE_CLUSTER_ID, + PRST_ZB_ZCL_ATTR_SOIL_MOISTURE_VALUE_ID, + &soil_moisture); - ZB_SCHEDULE_APP_ALARM(update_sensors_cb, NULL, ZB_TIME_ONE_SECOND * 1); + ZB_SCHEDULE_APP_ALARM(update_sensors_cb, NULL, ZB_TIME_ONE_SECOND * 10); } int main(void) { @@ -235,23 +151,27 @@ int main(void) { RET_IF_ERR(prst_led_init()); RET_IF_ERR(prst_button_init()); + // We do this to quickly put the shtc3 to sleep. + prst_sensors_read_all(&sensors); + + zigbee_configure_sleepy_behavior(/*enable=*/true); + zb_set_rx_on_when_idle(ZB_FALSE); + register_factory_reset_button(FACTORY_RESET_BUTTON); - app_clusters_attr_init(); + prst_zb_attrs_init(&dev_ctx); ZB_AF_REGISTER_DEVICE_CTX(&app_template_ctx); - ZB_AF_SET_IDENTIFY_NOTIFICATION_HANDLER(PRST_ZIGBEE_ENDPOINT, identify_cb); - update_sensors_cb(/*arg=*/0); - // zigbee_configure_sleepy_behavior(/*enable=*/true); - RET_IF_ERR(prst_led_flash(2)); + // One minute. + zb_zdo_pim_set_long_poll_interval(60000); + power_down_unused_ram(); zigbee_enable(); - - LOG_INF("Zigbee application template started"); + zigbee_configure_sleepy_behavior(/*enable=*/true); return 0; } diff --git a/code/nrf-connect/samples/zigbee/src/prst_zb_attrs.c b/code/nrf-connect/samples/zigbee/src/prst_zb_attrs.c new file mode 100644 index 0000000..95c9873 --- /dev/null +++ b/code/nrf-connect/samples/zigbee/src/prst_zb_attrs.c @@ -0,0 +1,31 @@ +#include "prst_zb_attrs.h" + +#include + +#include "prst_zb_endpoint_defs.h" + +void prst_zb_attrs_init(struct zb_device_ctx *dev_ctx) { + dev_ctx->basic_attr.zcl_version = ZB_ZCL_VERSION; + dev_ctx->basic_attr.power_source = ZB_ZCL_BASIC_POWER_SOURCE_BATTERY; + ZB_ZCL_SET_STRING_VAL( + dev_ctx->basic_attr.mf_name, + PRST_BASIC_MANUF_NAME, + ZB_ZCL_STRING_CONST_SIZE(PRST_BASIC_MANUF_NAME)); + + ZB_ZCL_SET_STRING_VAL( + dev_ctx->basic_attr.model_id, + PRST_BASIC_MODEL_ID, + ZB_ZCL_STRING_CONST_SIZE(PRST_BASIC_MODEL_ID)); + + dev_ctx->identify_attr.identify_time = + ZB_ZCL_IDENTIFY_IDENTIFY_TIME_DEFAULT_VALUE; +} + +zb_zcl_status_t prst_zb_set_attr_value(zb_uint16_t cluster_id, zb_uint16_t attr_id, void *data) { + return zb_zcl_set_attr_val(PRST_ZIGBEE_ENDPOINT, + cluster_id, + ZB_ZCL_CLUSTER_SERVER_ROLE, + attr_id, + (zb_uint8_t *)data, + ZB_FALSE); +} diff --git a/code/nrf-connect/samples/zigbee/src/prst_zb_attrs.h b/code/nrf-connect/samples/zigbee/src/prst_zb_attrs.h index e996962..60222c7 100644 --- a/code/nrf-connect/samples/zigbee/src/prst_zb_attrs.h +++ b/code/nrf-connect/samples/zigbee/src/prst_zb_attrs.h @@ -1,7 +1,7 @@ #ifndef _PRST_ZB_ATTRS_H_ #define _PRST_ZB_ATTRS_H_ -#include +#include // Relative humimdity cluster - section 4.7.2.2.1. typedef struct { @@ -38,4 +38,8 @@ struct zb_device_ctx { prst_soil_moisture_attrs_t soil_moisture_attrs; }; +void prst_zb_attrs_init(struct zb_device_ctx *dev_ctx); + +zb_zcl_status_t prst_zb_set_attr_value(zb_uint16_t cluster_id, zb_uint16_t attr_id, void *data); + #endif // _PRST_ZB_ATTRS_H_ diff --git a/code/nrf-connect/samples/zigbee/src/prst_zb_endpoint_defs.h b/code/nrf-connect/samples/zigbee/src/prst_zb_endpoint_defs.h index df2ffd1..796f805 100644 --- a/code/nrf-connect/samples/zigbee/src/prst_zb_endpoint_defs.h +++ b/code/nrf-connect/samples/zigbee/src/prst_zb_endpoint_defs.h @@ -14,7 +14,7 @@ #define PRST_ZB_CLUSTER_NUM (PRST_ZB_IN_CLUSTER_NUM + PRST_ZB_OUT_CLUSTER_NUM) #define PRST_ZB_ATTR_REPORTING_COUNT 4 -#define ZB_DECLARE_RANGE_EXTENDER_CLUSTER_LIST( \ +#define PRST_ZB_DECLARE_CLUSTER_LIST( \ cluster_list_name, \ basic_attr_list, \ identify_attr_list, \ @@ -61,31 +61,31 @@ ZB_ZCL_CLUSTER_SERVER_ROLE, \ ZB_ZCL_MANUF_CODE_INVALID)} -#define ZB_ZCL_DECLARE_RANGE_EXTENDER_SIMPLE_DESC(ep_name, ep_id, in_clust_num, out_clust_num) \ - ZB_DECLARE_SIMPLE_DESC(in_clust_num, out_clust_num); \ - ZB_AF_SIMPLE_DESC_TYPE(in_clust_num, out_clust_num) \ - simple_desc_##ep_name = \ - { \ - ep_id, \ - ZB_AF_HA_PROFILE_ID, \ - PRST_ZB_DEVICE_ID, \ - PRST_ZB_DEVICE_VERSION, \ - 0, \ - in_clust_num, \ - out_clust_num, \ - { \ - ZB_ZCL_CLUSTER_ID_BASIC, \ - ZB_ZCL_CLUSTER_ID_IDENTIFY, \ - ZB_ZCL_CLUSTER_ID_TEMP_MEASUREMENT, \ - ZB_ZCL_CLUSTER_ID_REL_HUMIDITY_MEASUREMENT, \ - PRST_ZB_ZCL_ATTR_SOIL_MOISTURE_CLUSTER_ID, \ - ZB_ZCL_CLUSTER_ID_POWER_CONFIG, \ +#define PRST_ZB_DECLARE_SIMPLE_DESC(ep_name, ep_id, in_clust_num, out_clust_num) \ + ZB_DECLARE_SIMPLE_DESC(in_clust_num, out_clust_num); \ + ZB_AF_SIMPLE_DESC_TYPE(in_clust_num, out_clust_num) \ + simple_desc_##ep_name = \ + { \ + ep_id, \ + ZB_AF_HA_PROFILE_ID, \ + PRST_ZB_DEVICE_ID, \ + PRST_ZB_DEVICE_VERSION, \ + 0, \ + in_clust_num, \ + out_clust_num, \ + { \ + ZB_ZCL_CLUSTER_ID_BASIC, \ + ZB_ZCL_CLUSTER_ID_IDENTIFY, \ + ZB_ZCL_CLUSTER_ID_TEMP_MEASUREMENT, \ + ZB_ZCL_CLUSTER_ID_REL_HUMIDITY_MEASUREMENT, \ + PRST_ZB_ZCL_ATTR_SOIL_MOISTURE_CLUSTER_ID, \ + ZB_ZCL_CLUSTER_ID_POWER_CONFIG, \ }} -#define ZB_DECLARE_RANGE_EXTENDER_EP(ep_name, ep_id, cluster_list) \ +#define PRST_ZB_DECLARE_ENDPOINT(ep_name, ep_id, cluster_list) \ ZBOSS_DEVICE_DECLARE_REPORTING_CTX(reporting_ctx_##ep_name, PRST_ZB_ATTR_REPORTING_COUNT); \ - ZB_ZCL_DECLARE_RANGE_EXTENDER_SIMPLE_DESC(ep_name, ep_id, \ - PRST_ZB_IN_CLUSTER_NUM, PRST_ZB_OUT_CLUSTER_NUM); \ + PRST_ZB_DECLARE_SIMPLE_DESC(ep_name, ep_id, \ + PRST_ZB_IN_CLUSTER_NUM, PRST_ZB_OUT_CLUSTER_NUM); \ ZB_AF_DECLARE_ENDPOINT_DESC(ep_name, ep_id, ZB_AF_HA_PROFILE_ID, \ /*reserved_length=*/0, /*reserved_ptr=*/NULL, \ ZB_ZCL_ARRAY_SIZE(cluster_list, zb_zcl_cluster_desc_t), cluster_list, \ From fbf1a350992bb72ace2c5369dc23d7abdf23c46a Mon Sep 17 00:00:00 2001 From: rbaron Date: Fri, 9 Dec 2022 19:38:56 +0100 Subject: [PATCH 12/36] Moves configs to Kconfig --- code/nrf-connect/samples/zigbee/Kconfig | 9 +++++++++ code/nrf-connect/samples/zigbee/src/main.c | 12 ++++++------ 2 files changed, 15 insertions(+), 6 deletions(-) create mode 100644 code/nrf-connect/samples/zigbee/Kconfig diff --git a/code/nrf-connect/samples/zigbee/Kconfig b/code/nrf-connect/samples/zigbee/Kconfig new file mode 100644 index 0000000..93136ee --- /dev/null +++ b/code/nrf-connect/samples/zigbee/Kconfig @@ -0,0 +1,9 @@ +source "Kconfig.zephyr" + +config PRST_ZB_SLEEP_DURATION_SEC + int "Sleep duration between waking up and reading sensors (in seconds)" + default 300 + +config PRST_ZB_PARENT_POLL_INTERVAL_SEC + int "Interval for when b-parasite polls its parent for data (in seconds)" + default 300 \ No newline at end of file diff --git a/code/nrf-connect/samples/zigbee/src/main.c b/code/nrf-connect/samples/zigbee/src/main.c index 4cb9630..1dca231 100644 --- a/code/nrf-connect/samples/zigbee/src/main.c +++ b/code/nrf-connect/samples/zigbee/src/main.c @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -143,7 +144,9 @@ void update_sensors_cb(zb_uint8_t arg) { PRST_ZB_ZCL_ATTR_SOIL_MOISTURE_VALUE_ID, &soil_moisture); - ZB_SCHEDULE_APP_ALARM(update_sensors_cb, NULL, ZB_TIME_ONE_SECOND * 10); + ZB_SCHEDULE_APP_ALARM(update_sensors_cb, + /*param=*/0, + ZB_TIME_ONE_SECOND * CONFIG_PRST_ZB_SLEEP_DURATION_SEC); } int main(void) { @@ -154,9 +157,6 @@ int main(void) { // We do this to quickly put the shtc3 to sleep. prst_sensors_read_all(&sensors); - zigbee_configure_sleepy_behavior(/*enable=*/true); - zb_set_rx_on_when_idle(ZB_FALSE); - register_factory_reset_button(FACTORY_RESET_BUTTON); prst_zb_attrs_init(&dev_ctx); @@ -166,8 +166,8 @@ int main(void) { update_sensors_cb(/*arg=*/0); RET_IF_ERR(prst_led_flash(2)); - // One minute. - zb_zdo_pim_set_long_poll_interval(60000); + + zb_zdo_pim_set_long_poll_interval(CONFIG_PRST_ZB_PARENT_POLL_INTERVAL_SEC); power_down_unused_ram(); zigbee_enable(); From 3c2094db2d07a8d1df04d78dca89cde3195a17bf Mon Sep 17 00:00:00 2001 From: rbaron Date: Fri, 9 Dec 2022 20:01:46 +0100 Subject: [PATCH 13/36] Add GitHub action --- .github/workflows/b-parasite.yml | 8 +++++++- code/nrf-connect/samples/zigbee/Kconfig | 4 ++-- code/nrf-connect/samples/zigbee/prj.conf | 3 +++ code/nrf-connect/samples/zigbee/src/main.c | 3 ++- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/.github/workflows/b-parasite.yml b/.github/workflows/b-parasite.yml index a4cac62..4a165a8 100644 --- a/.github/workflows/b-parasite.yml +++ b/.github/workflows/b-parasite.yml @@ -71,4 +71,10 @@ jobs: with: sample-dir: code/nrf-connect/samples/ble board: bparasite_nrf52833 - output-bin: ble_nrf52833_default.hex \ No newline at end of file + output-bin: ble_nrf52833_default.hex + - name: Build zigbee_nrf528340_default.hex + uses: ./.github/actions/build_and_upload + with: + sample-dir: code/nrf-connect/samples/zigbee + board: bparasite_nrf52840 + output-bin: zigbee_nrf52840_default.hex \ No newline at end of file diff --git a/code/nrf-connect/samples/zigbee/Kconfig b/code/nrf-connect/samples/zigbee/Kconfig index 93136ee..f604209 100644 --- a/code/nrf-connect/samples/zigbee/Kconfig +++ b/code/nrf-connect/samples/zigbee/Kconfig @@ -2,8 +2,8 @@ source "Kconfig.zephyr" config PRST_ZB_SLEEP_DURATION_SEC int "Sleep duration between waking up and reading sensors (in seconds)" - default 300 + default 60 config PRST_ZB_PARENT_POLL_INTERVAL_SEC int "Interval for when b-parasite polls its parent for data (in seconds)" - default 300 \ No newline at end of file + default 60 \ No newline at end of file diff --git a/code/nrf-connect/samples/zigbee/prj.conf b/code/nrf-connect/samples/zigbee/prj.conf index 4a91f5d..552b18f 100644 --- a/code/nrf-connect/samples/zigbee/prj.conf +++ b/code/nrf-connect/samples/zigbee/prj.conf @@ -41,3 +41,6 @@ CONFIG_ZIGBEE_CHANNEL_SELECTION_MODE_MULTI=y # Enable API for powering down unused RAM parts. # https://developer.nordicsemi.com/nRF_Connect_SDK/doc/1.7.1/nrf/ug_zigbee_configuring.html#power-saving-during-sleep CONFIG_RAM_POWER_DOWN_LIBRARY=y + +# Config options in Kconfig. +# CONFIG_PRST_ZB_SLEEP_DURATION_SEC=5 diff --git a/code/nrf-connect/samples/zigbee/src/main.c b/code/nrf-connect/samples/zigbee/src/main.c index 1dca231..f5b87e2 100644 --- a/code/nrf-connect/samples/zigbee/src/main.c +++ b/code/nrf-connect/samples/zigbee/src/main.c @@ -167,7 +167,8 @@ int main(void) { RET_IF_ERR(prst_led_flash(2)); - zb_zdo_pim_set_long_poll_interval(CONFIG_PRST_ZB_PARENT_POLL_INTERVAL_SEC); + zb_zdo_pim_set_long_poll_interval( + ZB_TIME_ONE_SECOND * CONFIG_PRST_ZB_PARENT_POLL_INTERVAL_SEC); power_down_unused_ram(); zigbee_enable(); From 8eb54106d5084e4ea14c447d9992d261c40779ed Mon Sep 17 00:00:00 2001 From: rbaron Date: Sat, 10 Dec 2022 10:47:16 +0100 Subject: [PATCH 14/36] Add illuminance cluster & reporting --- code/nrf-connect/samples/zigbee/b-parasite.js | 25 ++++++++++++++++--- code/nrf-connect/samples/zigbee/src/main.c | 23 ++++++++++++----- .../samples/zigbee/src/prst_zb_attrs.h | 11 +++++--- .../zigbee/src/prst_zb_endpoint_defs.h | 14 ++++++++--- 4 files changed, 57 insertions(+), 16 deletions(-) diff --git a/code/nrf-connect/samples/zigbee/b-parasite.js b/code/nrf-connect/samples/zigbee/b-parasite.js index 262e9a2..63654ff 100644 --- a/code/nrf-connect/samples/zigbee/b-parasite.js +++ b/code/nrf-connect/samples/zigbee/b-parasite.js @@ -1,4 +1,7 @@ // This is a zigbee2mqtt zigbee2mqtt.io converter for this sample. +// See https://www.zigbee2mqtt.io/advanced/support-new-devices/01_support_new_devices.html +// on how to use it. + const fz = require('zigbee-herdsman-converters/converters/fromZigbee'); const tz = require('zigbee-herdsman-converters/converters/toZigbee'); const exposes = require('zigbee-herdsman-converters/lib/exposes'); @@ -12,18 +15,32 @@ const definition = { model: 'b-parasite', vendor: 'b-parasite', description: 'IoT development board - Zigbee sample', - fromZigbee: [fz.temperature, fz.humidity, fz.battery], + fromZigbee: [fz.temperature, fz.humidity, fz.battery, fz.soil_moisture, fz.illuminance], toZigbee: [], - exposes: [e.temperature(), e.humidity(), e.battery()], + exposes: [ + e.temperature(), + e.humidity(), + e.battery(), + e.soil_moisture(), + e.illuminance_lux()], configure: async (device, coordinatorEndpoint, logger) => { const endpoint = device.getEndpoint(10); await reporting.bind( endpoint, - coordinatorEndpoint, - ['genPowerCfg', 'msTemperatureMeasurement', 'msRelativeHumidity']); + coordinatorEndpoint, [ + 'genPowerCfg', + 'msTemperatureMeasurement', + 'msRelativeHumidity', + 'msSoilMoisture', + 'msIlluminanceMeasurement', + ]); await reporting.batteryPercentageRemaining(endpoint); + // Not reportable :( + // await reporting.batteryVoltage(endpoint); await reporting.temperature(endpoint); await reporting.humidity(endpoint); + await reporting.soil_moisture(endpoint); + await reporting.illuminance(endpoint); } }; diff --git a/code/nrf-connect/samples/zigbee/src/main.c b/code/nrf-connect/samples/zigbee/src/main.c index f5b87e2..cab3057 100644 --- a/code/nrf-connect/samples/zigbee/src/main.c +++ b/code/nrf-connect/samples/zigbee/src/main.c @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -81,6 +82,12 @@ PRST_ZB_ZCL_DECLARE_SOIL_MOISTURE_ATTRIB_LIST( soil_moisture_attr_list, &dev_ctx.soil_moisture_attrs.percentage); +ZB_ZCL_DECLARE_ILLUMINANCE_MEASUREMENT_ATTRIB_LIST( + illuminance_attr_list, + /*value=*/&dev_ctx.illuminance_attrs.log_lux, + /*min_value=*/NULL, + /*max_value*/ NULL); + PRST_ZB_DECLARE_CLUSTER_LIST( app_template_clusters, basic_attr_list, @@ -88,7 +95,8 @@ PRST_ZB_DECLARE_CLUSTER_LIST( temp_measurement_attr_list, rel_humi_attr_list, basic_attr_list, - soil_moisture_attr_list); + soil_moisture_attr_list, + illuminance_attr_list); PRST_ZB_DECLARE_ENDPOINT( app_template_ep, @@ -144,6 +152,12 @@ void update_sensors_cb(zb_uint8_t arg) { PRST_ZB_ZCL_ATTR_SOIL_MOISTURE_VALUE_ID, &soil_moisture); + // Illuminance in 10000 * log_10(lux) + 1. + zb_int16_t log_lux = 10000 * log10((float)sensors.photo.brightness) + 1; + prst_zb_set_attr_value(ZB_ZCL_CLUSTER_ID_ILLUMINANCE_MEASUREMENT, + ZB_ZCL_ATTR_ILLUMINANCE_MEASUREMENT_MEASURED_VALUE_ID, + &log_lux); + ZB_SCHEDULE_APP_ALARM(update_sensors_cb, /*param=*/0, ZB_TIME_ONE_SECOND * CONFIG_PRST_ZB_SLEEP_DURATION_SEC); @@ -154,9 +168,6 @@ int main(void) { RET_IF_ERR(prst_led_init()); RET_IF_ERR(prst_button_init()); - // We do this to quickly put the shtc3 to sleep. - prst_sensors_read_all(&sensors); - register_factory_reset_button(FACTORY_RESET_BUTTON); prst_zb_attrs_init(&dev_ctx); @@ -165,8 +176,6 @@ int main(void) { update_sensors_cb(/*arg=*/0); - RET_IF_ERR(prst_led_flash(2)); - zb_zdo_pim_set_long_poll_interval( ZB_TIME_ONE_SECOND * CONFIG_PRST_ZB_PARENT_POLL_INTERVAL_SEC); power_down_unused_ram(); @@ -174,5 +183,7 @@ int main(void) { zigbee_enable(); zigbee_configure_sleepy_behavior(/*enable=*/true); + RET_IF_ERR(prst_led_flash(2)); + return 0; } diff --git a/code/nrf-connect/samples/zigbee/src/prst_zb_attrs.h b/code/nrf-connect/samples/zigbee/src/prst_zb_attrs.h index 60222c7..55396cd 100644 --- a/code/nrf-connect/samples/zigbee/src/prst_zb_attrs.h +++ b/code/nrf-connect/samples/zigbee/src/prst_zb_attrs.h @@ -13,7 +13,7 @@ typedef struct { zb_uint16_t max_val; } prst_rel_humidity_attrs_t; -// Power configuration cluster - section 3.3.2.2.3 +// Power configuration cluster - section 3.3.2.2.3. typedef struct { // Units of 100 mV. 0x00 - 0xff (optional, not reportable :()). zb_uint8_t voltage; @@ -27,15 +27,20 @@ typedef struct { zb_uint16_t percentage; } prst_soil_moisture_attrs_t; +// Illuminance cluster - section 4.2.2.2. +typedef struct { + // 10000 * log_10(lux) + 1. + zb_uint16_t log_lux; +} prst_illuminancce_attrs_t; + struct zb_device_ctx { zb_zcl_basic_attrs_ext_t basic_attr; zb_zcl_identify_attrs_t identify_attr; - // In units of 0.01 C. zb_zcl_temp_measurement_attrs_t temp_measure_attrs; prst_rel_humidity_attrs_t rel_humidity_attrs; - // In units of 100 mV. prst_batt_attrs_t batt_attrs; prst_soil_moisture_attrs_t soil_moisture_attrs; + prst_illuminancce_attrs_t illuminance_attrs; }; void prst_zb_attrs_init(struct zb_device_ctx *dev_ctx); diff --git a/code/nrf-connect/samples/zigbee/src/prst_zb_endpoint_defs.h b/code/nrf-connect/samples/zigbee/src/prst_zb_endpoint_defs.h index 796f805..601daa2 100644 --- a/code/nrf-connect/samples/zigbee/src/prst_zb_endpoint_defs.h +++ b/code/nrf-connect/samples/zigbee/src/prst_zb_endpoint_defs.h @@ -9,10 +9,10 @@ #define PRST_ZB_DEVICE_ID 0x0008 #define PRST_ZB_DEVICE_VERSION 0 -#define PRST_ZB_IN_CLUSTER_NUM 6 +#define PRST_ZB_IN_CLUSTER_NUM 7 #define PRST_ZB_OUT_CLUSTER_NUM 0 #define PRST_ZB_CLUSTER_NUM (PRST_ZB_IN_CLUSTER_NUM + PRST_ZB_OUT_CLUSTER_NUM) -#define PRST_ZB_ATTR_REPORTING_COUNT 4 +#define PRST_ZB_ATTR_REPORTING_COUNT 5 #define PRST_ZB_DECLARE_CLUSTER_LIST( \ cluster_list_name, \ @@ -21,7 +21,8 @@ temp_measurement_attr_list, \ rel_humidity_attr_list, \ batt_att_list, \ - soil_moisture_attr_list) \ + soil_moisture_attr_list, \ + illuminance_attr_list) \ zb_zcl_cluster_desc_t cluster_list_name[] = \ { \ ZB_ZCL_CLUSTER_DESC( \ @@ -54,6 +55,12 @@ (soil_moisture_attr_list), \ ZB_ZCL_CLUSTER_SERVER_ROLE, \ ZB_ZCL_MANUF_CODE_INVALID), \ + ZB_ZCL_CLUSTER_DESC( \ + ZB_ZCL_CLUSTER_ID_ILLUMINANCE_MEASUREMENT, \ + ZB_ZCL_ARRAY_SIZE(illuminance_attr_list, zb_zcl_attr_t), \ + (illuminance_attr_list), \ + ZB_ZCL_CLUSTER_SERVER_ROLE, \ + ZB_ZCL_MANUF_CODE_INVALID), \ ZB_ZCL_CLUSTER_DESC( \ ZB_ZCL_CLUSTER_ID_POWER_CONFIG, \ ZB_ZCL_ARRAY_SIZE(batt_attr_list, zb_zcl_attr_t), \ @@ -79,6 +86,7 @@ ZB_ZCL_CLUSTER_ID_TEMP_MEASUREMENT, \ ZB_ZCL_CLUSTER_ID_REL_HUMIDITY_MEASUREMENT, \ PRST_ZB_ZCL_ATTR_SOIL_MOISTURE_CLUSTER_ID, \ + ZB_ZCL_CLUSTER_ID_ILLUMINANCE_MEASUREMENT, \ ZB_ZCL_CLUSTER_ID_POWER_CONFIG, \ }} From 7b4e64cec748224131df5e79c05bc13ae591de02 Mon Sep 17 00:00:00 2001 From: rbaron Date: Sat, 10 Dec 2022 12:37:29 +0100 Subject: [PATCH 15/36] Implemented a pairing-reset detection strategy This is a "tricky" workaround due to the lack of physical buttons: We can distinguish between the two "power up" modes: - Power on: when the device receives power for the first time. Example: swapping batteries, prroviding external power. This _DOES NOT_ reset the pairing info. - Reset pin: when the device is manually reset (by shorting the RESET pin to GND), or when a new firmware is flashed. This _RESETS_ the pairing info. --- code/nrf-connect/samples/zigbee/src/main.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/code/nrf-connect/samples/zigbee/src/main.c b/code/nrf-connect/samples/zigbee/src/main.c index cab3057..2709b43 100644 --- a/code/nrf-connect/samples/zigbee/src/main.c +++ b/code/nrf-connect/samples/zigbee/src/main.c @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -28,6 +29,18 @@ static struct zb_device_ctx dev_ctx; static prst_sensors_t sensors; +static void maybe_erase_pairing_info() { + uint32_t reset_reason = nrf_power_resetreas_get(NRF_POWER); + // If we're resetting via the RESET pin (e.g.: reset pin shorting, firmware flashing). + if (reset_reason & 0x1) { + LOG_WRN("Manual reset / re-flashing detected - erasing pairing info"); + zigbee_erase_persistent_storage(/*erase=*/true); + // It's a power-on cycle (e.g.: swapping battery, first boot). + } else { + LOG_INF("Power-on cycle - keeping pairing info"); + } +} + ZB_ZCL_DECLARE_IDENTIFY_ATTRIB_LIST( identify_attr_list, &dev_ctx.identify_attr.identify_time); @@ -168,6 +181,8 @@ int main(void) { RET_IF_ERR(prst_led_init()); RET_IF_ERR(prst_button_init()); + maybe_erase_pairing_info(); + register_factory_reset_button(FACTORY_RESET_BUTTON); prst_zb_attrs_init(&dev_ctx); From 3a6561bbf416772833ad1c848024c4c011b2fc59 Mon Sep 17 00:00:00 2001 From: rbaron Date: Sat, 10 Dec 2022 15:14:01 +0100 Subject: [PATCH 16/36] Make the LED flash while pairing --- code/nrf-connect/samples/zigbee/src/main.c | 40 ++++++++++++++++++---- 1 file changed, 34 insertions(+), 6 deletions(-) diff --git a/code/nrf-connect/samples/zigbee/src/main.c b/code/nrf-connect/samples/zigbee/src/main.c index 2709b43..ae08fcb 100644 --- a/code/nrf-connect/samples/zigbee/src/main.c +++ b/code/nrf-connect/samples/zigbee/src/main.c @@ -29,18 +29,24 @@ static struct zb_device_ctx dev_ctx; static prst_sensors_t sensors; -static void maybe_erase_pairing_info() { +static void maybe_erase_pairing_info(struct k_timer *timer) { uint32_t reset_reason = nrf_power_resetreas_get(NRF_POWER); // If we're resetting via the RESET pin (e.g.: reset pin shorting, firmware flashing). if (reset_reason & 0x1) { LOG_WRN("Manual reset / re-flashing detected - erasing pairing info"); + // TODO: consider zb_bdb_reset_via_local_action(/*param=*/0); zigbee_erase_persistent_storage(/*erase=*/true); - // It's a power-on cycle (e.g.: swapping battery, first boot). - } else { + } else { // It's a power-on cycle (e.g.: swapping battery, first boot). LOG_INF("Power-on cycle - keeping pairing info"); } } +static void led_flashing_cb(struct k_timer *timer) { + prst_led_toggle(); +} + +K_TIMER_DEFINE(led_flashing_timer, led_flashing_cb, /*stop_fn=*/NULL); + ZB_ZCL_DECLARE_IDENTIFY_ATTRIB_LIST( identify_attr_list, &dev_ctx.identify_attr.identify_time); @@ -121,6 +127,28 @@ ZBOSS_DECLARE_DEVICE_CTX_1_EP( app_template_ep); void zboss_signal_handler(zb_bufid_t bufid) { + // See zigbee_default_signal_handler() for all available signals. + zb_zdo_app_signal_type_t sig = zb_get_app_signal(bufid, /*sg_p=*/NULL); + zb_ret_t status = ZB_GET_APP_SIGNAL_STATUS(bufid); + switch (sig) { + case ZB_BDB_SIGNAL_STEERING: // New network. + case ZB_BDB_SIGNAL_DEVICE_REBOOT: { // Previously joined network. + LOG_DBG("Steering complete. Status: %d", status); + prst_led_flash(/*times=*/3); + if (status == RET_OK) { + k_timer_stop(&led_flashing_timer); + prst_led_off(); + } + break; + } + case ZB_ZDO_SIGNAL_SKIP_STARTUP: + case ZB_ZDO_SIGNAL_LEAVE: { + LOG_DBG("Will restart flashing"); + k_timer_start(&led_flashing_timer, K_NO_WAIT, K_SECONDS(1)); + break; + } + } + ZB_ERROR_CHECK(zigbee_default_signal_handler(bufid)); if (bufid) { zb_buf_free(bufid); @@ -181,7 +209,7 @@ int main(void) { RET_IF_ERR(prst_led_init()); RET_IF_ERR(prst_button_init()); - maybe_erase_pairing_info(); + maybe_erase_pairing_info(NULL); register_factory_reset_button(FACTORY_RESET_BUTTON); @@ -195,10 +223,10 @@ int main(void) { ZB_TIME_ONE_SECOND * CONFIG_PRST_ZB_PARENT_POLL_INTERVAL_SEC); power_down_unused_ram(); + RET_IF_ERR(prst_led_flash(2)); + zigbee_enable(); zigbee_configure_sleepy_behavior(/*enable=*/true); - RET_IF_ERR(prst_led_flash(2)); - return 0; } From 17b487f3627e57f7e8e22e6b1e3fc071067ea770 Mon Sep 17 00:00:00 2001 From: rbaron Date: Sat, 10 Dec 2022 15:45:22 +0100 Subject: [PATCH 17/36] Add docs --- README.md | 1 + code/nrf-connect/samples/zigbee/README.md | 42 ++++++++++++++++++ .../zigbee/media/power-profile/active.png | Bin 0 -> 93489 bytes .../zigbee/media/power-profile/sleeping.png | Bin 0 -> 90534 bytes 4 files changed, 43 insertions(+) create mode 100644 code/nrf-connect/samples/zigbee/README.md create mode 100644 code/nrf-connect/samples/zigbee/media/power-profile/active.png create mode 100644 code/nrf-connect/samples/zigbee/media/power-profile/sleeping.png diff --git a/README.md b/README.md index 71c1a20..33c6371 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,7 @@ This repository also hosts a few different firmware samples for b-parasite. |Sample|Description|Extra Documentation| |---|---|---| |[samples/ble](./code/nrf-connect/samples/ble)|This is the most battle-tested and useful firmware. It periodically reads all sensors and broadcast them via Bluetooth Low Energy (BLE). It works with [Home Assistant](https://www.home-assistant.io/) out of the box. |[Docs](./code/nrf-connect/samples/ble/README.md)| +|[samples/zigbee](./code/nrf-connect/samples/zigbee)| A new, experimental Zigbee sample. It integrates with [Home Assistant](https://www.home-assistant.io/) via [Zigbee2MQTT](https://www.zigbee2mqtt.io/). |[Docs](./code/nrf-connect/samples/zigbee/README.md)| |[samples/blinky](./code/nrf-connect/samples/blinky)| The classic "Hello, world" |-| |[samples/soil_read_loop](./code/nrf-connect/samples/soil_read_loop)| Read the soil moisture sensor on a loop. Useful for experimenting and calibrating the sensor. |-| diff --git a/code/nrf-connect/samples/zigbee/README.md b/code/nrf-connect/samples/zigbee/README.md new file mode 100644 index 0000000..69029f0 --- /dev/null +++ b/code/nrf-connect/samples/zigbee/README.md @@ -0,0 +1,42 @@ +# Zigbee firmware sample +This sample is adapted from the [zigbee_template](https://developer.nordicsemi.com/nRF_Connect_SDK/doc/latest/nrf/samples/zigbee/template/README.html) from the nRF Connect SDK. + +## Clusters +These [clusters](https://en.wikipedia.org/wiki/Zigbee#Cluster_library) are defined in the sample: + +|Cluster ID|Name| +|--------|---| +|0x0001|Power Configuration| +|0x0400|Illuminance Measurement| +|0x0402|Temperature Measurement| +|0x0405|Relative Humidity Measurement| +|0x0408|Soil Moisture Measurement| + +## Pairing Mode +The sample will first boot and start looking for a Zigbee coordinator - in pairing mode. The onboard LED will be flashing once a second while in this mode. Once a suitable network is found, the LED will briefly flash 3 times and remain off. + +### Factory Reset +Most Zigbee devices provide a physical button to "factory reset" it - causing it to forget its joined network and look for a new one. + +b-parasite has no physical buttons, and the implemented work around is to distinguish between two *reset modes*: +#### Power up mode +The device enters this mode when it is powered. For example, swapping an old battery or connecting to eternal power. This is the "usual" reset mode, and joined networks will be remembered. + +#### Reset pin mode +If the device's RESET pin is briefly grounded, the device will effectively be **factory reset**. The device will leave its previous network and start looking for a new one. + +## Configs +Available options in `Kconfig`. Notable options: +* `CONFIG_PRST_ZB_SLEEP_DURATION_SEC`: amount of time (in seconds) the device sleeps between reading all sensors and updating its clusters +* `CONFIG_PRST_ZB_PARENT_POLL_INTERVAL_SEC`: amount of time (in seconds) the device waits between polling its parent for data + +## Zigbee2MQTT & Home Assistant +This firmware sample has only been tested with [Zigbee2MQTT](https://zigbee2mqtt.io/), an open source Zigbee bridge that [connects seamlessly with Home Assistant](https://github.com/zigbee2mqtt/hassio-zigbee2mqtt). + +The [b-parasite.js](b-parasite.js) file contains a converter that can be installed to Zigbee2MQTT to suppoort this sample. See [Support new devices](https://www.zigbee2mqtt.io/advanced/support-new-devices/01_support_new_devices.html) for instructions. + +## Battery Life +While sleeping, the device consumes around 2 uA: +![sleeping current](./media/power-profile/sleeping.png) +In the active cycle, it averages around 370 uA for 2.6 seconds: +![active current](media/power-profile/active.png) diff --git a/code/nrf-connect/samples/zigbee/media/power-profile/active.png b/code/nrf-connect/samples/zigbee/media/power-profile/active.png new file mode 100644 index 0000000000000000000000000000000000000000..08a1473b2e49ebde1285a46e5c42ebe4441036f6 GIT binary patch literal 93489 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 GQU3vEbAcKF literal 0 HcmV?d00001 diff --git a/code/nrf-connect/samples/zigbee/media/power-profile/sleeping.png b/code/nrf-connect/samples/zigbee/media/power-profile/sleeping.png new file mode 100644 index 0000000000000000000000000000000000000000..b1d5b4025a8cf720defb764323b36d7a3914e418 GIT binary patch literal 90534 zcmeFZ2UL@57cPjsAaFb?NIyyd=}PZl1437tbd_F%^qQ!ss5A*B(vjYg8ah@G5kij; zNKkqSJqZv3^Tu;L|Gjf(-F4T@ojbE;O;#*{B;Q;1yZ5u7{p|0Bp}r>5Nsf~Y3=B+A ztsA!)7>;EyFdP{@eiZyf)Zjfo1H)eo&>L5c1Jjnq1FVLyw2n1O%R|xAr~f$e`O!;8 zbi2nhzP_b(NBLd7VT;i$B804L$1n=cDyhzf#t6X)2TH(oe?Ocr`nd7_egXc?^59!N^`F

&UgFEb=#zD7TuG{MBVJb* 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 literal 0 HcmV?d00001 From 37237a43019f5bd40abb4d6b8d0d21e5ecef9486 Mon Sep 17 00:00:00 2001 From: rbaron Date: Sat, 10 Dec 2022 15:48:02 +0100 Subject: [PATCH 18/36] More accurate power profile --- code/nrf-connect/samples/zigbee/README.md | 2 +- .../zigbee/media/power-profile/active.png | Bin 93489 -> 88293 bytes .../zigbee/media/power-profile/sleeping.png | Bin 90534 -> 85701 bytes 3 files changed, 1 insertion(+), 1 deletion(-) diff --git a/code/nrf-connect/samples/zigbee/README.md b/code/nrf-connect/samples/zigbee/README.md index 69029f0..a553060 100644 --- a/code/nrf-connect/samples/zigbee/README.md +++ b/code/nrf-connect/samples/zigbee/README.md @@ -38,5 +38,5 @@ The [b-parasite.js](b-parasite.js) file contains a converter that can be install ## Battery Life While sleeping, the device consumes around 2 uA: ![sleeping current](./media/power-profile/sleeping.png) -In the active cycle, it averages around 370 uA for 2.6 seconds: +In the active cycle, it averages around 125 uA for 1 second: ![active current](media/power-profile/active.png) diff --git a/code/nrf-connect/samples/zigbee/media/power-profile/active.png b/code/nrf-connect/samples/zigbee/media/power-profile/active.png index 08a1473b2e49ebde1285a46e5c42ebe4441036f6..b09cdc9a08c9ea42d51bc753be6f7a6d8fb2cf9e 100644 GIT binary patch delta 65958 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 HuipP3WJ>}2 delta 73773 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μ1GGZ$_xYFGa^<{LjeUBf6jXERQZfTRopj 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 HP6m)duP7;-uHc<=l}il_&kQ>nN4 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 n%ubI6CU&n#wce^t4@>ZO-uWAr8m6CN! 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 z z*wi+OmdU`t&dVtdUI6B+C#2+PKz0pqNDM(_5%7A8pLG(qx&@u8L}!#wLQ(>4*8~}> zBKD5J-C|@v6srFO6W9WI;abA%Xb>BYTO>;BL*fE#2d0`B;Dz7x?XBQs1F#2UV#^Kz zA{^8XRf2+sX2#?Jwv}?0#89m$GD4I6@N2Ggb)KHx}X;?5n(4dnAE(&1afc_Lu<1K%nK;{eGXwQ z(lKRD4|^L6Bft}}!P5ij8Mvt({xAaoH^Lo&lZgpfzz=aB7twNH18W9I<_rTy{Y3S5 ze&Y(xXWH&uT>c4{DMR;Q(Eo@sY{5-)tPAP`AbENSHT`awXQ$8u;dOUA)b(8nb{$1L(W~8Q5N+qd(&daywWPB<6(! zB_Thhc!~s6wRKnBe96%D_hc{L(sf`-46cvhfl&kZ2*?7Sd`7jq=zAvYG*R*Kejso| zTp)=PDBmM1ctL}BIvBzA;r`wN4(v@hHh@5RL@)LjLAaof>26v-j@Hmd2ado=Z7pz; z9b8j0a24%cO+5AJZYgk~HY)fc*yKEf?n+Vutr|&To2IkYK{j`}#m= z=liv~2c+zPKls|a3WJG8g$&6GKL=>>VuH+`8JCK2tN&pV@f{Vc=^@4euZxf-Nhvkj zgE1Kf9CTPJGzhRvmwYpTwuS8jEp{sx^;ab`ZP)3J+bmt|7&syJ+i$KV*BC}PziW3(Q z7nf;u(r}UvHdK)XLH7&Z+sQA$D4RUp<$TI%7k2PWrF?IiyU)UN_5XpnHmO|2L^*Pad$c$}!i* zBUv8=h~On)1~P7x0dd$yR^WOE38r98VX=(|gY8Y11@}KXJwNg-4G@V;uI{?5Bvw-| zO%MTY$`4T@z-a^gMuv88Ab%@?%SnF0*WbP-WF{++ZorYP`9 zzx4*dS>ywHv5Q}9LdJvD|9`r>@^~n_zCV$q2)Bx|C0i6DVw9~y8bW0&8Y&`+Ntnr4 zE-G|awz2O!F_!Gh*t%^g`!HgdDf>QRko`TL`?=re^L#$<^UwRd&p+?=-W*YvGQsp2uNf!@1Pz`$~TMG-p z^JS4cN80U@nswl64F?h+Fphw`oNKU5`ekdMv}CS*(FxF@!Sn;zo4%V9j=3e)#@Au| zu0q9NXAhQ~S*Shl^13a2s(at3^FVHnrL5p?hdW$$YeIck1@}JR;B5=I?yEfkgkPTO zfVDwX`{4fKE`_)}b%wARJet&IgAchO&vy6VemS4ls8z^Bdta!uQ;Dg0_Sa7H^?^Zc zLj<&)Kq4n5u9}r6%9;}&Tkx8*sJ=DjW;u3czfGtho5kl^I$N0g(x$bokga?e*Alx} z8ogg5R<%>rg)`u5P3JasbGtd(ZPme3YEoQELgE^2jis1#Ot`<(d)Exv6W_{n;gLW# z_s;<(k^7LZ6<&TbOG>Rzywzhve(|*~=2}%{@`7OijZ}CCV$g9-T=RmIU$XxUWuRW~_|DtB!>-B_OW&cq;iRIK#y? zr!g+4J0_a1D0&8N#yw>dy0-J+6|3LVUllgJP55-YPk31Ux{~K(gRaiBYw-gi$}Lfq zPy>DBT}QmB!{epZZlv`xqaO9uwbLvz`pV=4*;MM9u0C>gm~xa650^1N)yf~@y%2#A zLt4uU9cOrcFFu1^tWU;DnH7=Fxy!q4@hME5L)zybRfsm3jFVh-&1LRDKr=J;Jk9<# zd3Rjbp9a>vh%QpNI;*<*s>6F{EiE$=QgF$0i9sBQ9Y_fVxu0Wv#|Oe*wUl2l)4h(e z-{4Q>mQ3{R^a*Rqz)c5YOJ=`kIoPWWPkSlF>6>*#r@Fg)^}?|%tkf-?H8v6149K!gtG!|`nc1`5=Z*9hJvY2MhYZO1%&*~)P6K2WNC8CmtN}MSM z5yr-T@!o94CPtF2Du}rwyMN3T8fkCTW$kdgwl6*sWh>`qskphpQVj9B8IUTXvn z^$w-BtEhKN2B<57Tf|T3lD7s(r8^Cdz?$=sfc%<~o?`DKzs~8t2{uA$T7TmS3%U~! z>y~M#jmu>|o$;}e7^+wdIeacnc~#Wj?qNq7P$mt#Tbt#~R=bqlA*zkR%#;}jEm5Y< z%i)9%`Q4n*GONP(3vSTRZ)_ns7ll+6#7cN|u!~Kdm zrG>eMyIIeF`9-Jz=r{+b71EA&u|a=3NT* z)NX}o0Sb=Pb%riQge7D*zTV&0+sE4HxT@Ysfkp&|XQMb!PoI@EHGZ}&k9%b0^Y}iW z|4!|OBDk$q+hQr~;;G7b+?qY3nNq`6EB;nNksI(+vo_?_U z_RIBU=;t2~Yf9}2`L(XiEcOaqd8ZXY^CyyM@xjLSlb6tQIf3}z!FC=J1HmvM&~Rq{ z56-}`ADn7!eFr25DU=4;Q%BmqgeaW9#i6f%36pa@z%%=&WRSX%#OI_Q1lg%SIFiP_ z^nSrXZJta(d(5u0kOjlj(^&jOeC?pOy&F(w*U{h~Vk$f)cTohtsE*$EK1*_!O9o3u zc>vZ@O)=?2bfwf(?*wRPgqfeM=JE?w^OXtQ@+3$tGXD*G)2KPH_LSp+RFm}POQ(9a zmg5F}o@<6a&tGot_%-=-p{&el*bvgZklL)kHNKU77@nkb{)4(6ikErrs@3J0V5qYI zPZ`dP-xqU5YQTR3vsE?hI7la?34ES+3TwgkWSo_Jr#FuAVC}9XNwA;}Bldl6{Sq>! ze|~`PX2A`-xw$6E1~sM^ytK25dQew)vCYn>_GtiGp}Db}mz5=fqe1RTlpAA+fX)FO zyGK>yC((gLS!VgS9_i1oqvas3roSPs)EM>9W0U$yq@TL}j99zUC5n6AG$W)&lw59p zcEA=ln+m8dN#F}-6`4xSCzC$y1MIw!bCs4^`_o^xc=gvnruOes!+l?X|{FGxE4|#X?xtH&lcm$2CC&NLVor@rx$(8-u-%HJZYiJ zuRYh5zL~V!i_uZj7iMEbZt+lWA8YU*+s~3fp-@!xiQ63kl-{o1bmag|mn_3bvAp4m z@%R?)@5>Umtp&O4W43GfEj83I@?(Sf+W{*rla@VC_|>Pni#_Dg?2_#fr(20+?40qf z&u-WNcm8dNqx(($Ue|oeMj)JS&DzsPE^E653VF^MPN)eon=acLgo>GL8XSkm^LWb3 zi^}xn7OZ_!fPY9&?Ws1kpe3_tRN&e9TA9-UKDY}(pYq&wXv7MOmk6>VWOE)&Gu zS&eq-S%!RP14K;$2MH%y*vnonOT^4ZK^p;=psLkFbg4-&AUD<^s#4PE?sCO;0H^(M zW*(}HdrEIh@v)M3HRVPIX=pG;a{;3dd|gA`JN7pR z4g-JIc`pjS@}Nh4Zkdv8tgY%sL;NtJUS z1L13X;j9IxTIwg}A_i%**87S>gw8|Y>K%c}SOxc&O7x+$mc+X$zP0b=njRg)S1%KS z;tmiAfG;|RoJpk{Khq39fT6aw!$6!2k4V9P$q5nM@CG!l4JebG8H^<)R~Xj;#ZZli zUbx6uukKxw(#mg=?!3Eu#yO6T>aZkTi%jRA=aMymPcw_Q|H&M&zLDHA+WiGl{b@XY?pz@M#e4V?n;#K4+&Dq{oQ&kSQtH*%vrPg- zkds{R%XPiJBL0HPQ>9--&jY8Xq^zO`0_RL-ogn*_L5`WEnc;h8(D>Iw(Ic*_Kp8u+ zjbEjBu_tElVj#NcrSAf%TO(9Xex5?{u&WlNS@NS1FjZ~QFKHBA<%B4*bS3b)^23#O zi@L{T+F9v>gX=?oTqKDjt*?#wqi*trbXytj%(2>HDz(v@4J760_1zi;@p&HbX1FO8T35->>N6u- z#eVBV8qesm|Ex;+@WWcMjaME0Z3%f_GY!IBC7{K{5q^4ff1L{@s@?8AUu@cXaVByp zb0{BO{fwCCn^-lP*`#Zr8xEYLb=F(gD$Q7G{RLADQSBkkL)KdGnTQuXD8n4HeHz5k z(z1k`&UgJlBxb8Gkkul*m46XiOt~Zs{ehaDu0B5`fCfR%_KdH`xUK=dMb7xa0#K*12n9mQeQ0Yqg4?_;Bhzl1ggN z8g|N1PB5=}k>YOXHXO6sUSR{p=T|-qdN_{(qbw&kKcd~1G<3pob;&2L12TG%M;nyCID zw>gjzq_(rOMI|Rptnl;Rd!TN8-_&0s@MpeN?r?>+zD&H3CJoz{p#b&4MJ$28)|Hml zoNYc(tLJtet76|CM zxWT+DcTYT!tez5Nq%CLF)Sy_J9z7RV0sUX~ohJNy;SmUxw#&HThN?Lk7aO5)O5yR( zPj9bx@;{m7H}3zI4l3v5WRnok&PTCnh+bpFqZ7hl;vRhgw!M|$#LDJnZZFRa}*?Cd}`iuK5> zo0VDvBrH>>S@?h&5o=-I2cjB=F|SLfLHrr%2(8`U50tKOJTET=4=0Wl7V?n0ppLqt zFAn13tHe_=X_wwM-U%p96HXxdXG$z{8K-OEsNcTz=4M77&&aAWrhQA-P~A)wn+o!Yh4U7WBB*o>wk0^+M$15@0BpmTXJcEB`&)AH zSf0hV;bf(*er+5x8y81Wj|ZAVdHJk<2T;VnLCS31ZqDT$2o4Z?oGLSKpB61 zrW8$csjs&4L8Gcg!Q+K}kgpxg%fCgAu|%P7%y_Ejo``xM2DnCFMdSP|i}&`#tVd-8 z3?!^rS$si-h>@A4PzUH3rY9AV?!PmfkRfCms9CmKCZ{71&n*U@@ zUVGZMPEhO$6E8}g7-hi*gZao1S97X!%neoRZm0QMrH7|$%|mMOX!3h7WuF$J@y{8=Q)#%XeMsyjOZP+<@E4qm(F44Gvq?ULi@opKdzN1cO~(BBx-)RaTleg&meV z)UNa&M=2SV5C8JBbU3lNZc{u^vPFhZ(+UcV9w1{db1HnU^M_sR&Z7AgLH~kfO89_=enSBJ?MvA-AIomIx+T{8=Osm@@(;-s zS|EY%mm7K}7+e3nxlMEjkcOI8oN>o`>fuJ=~~^yk&@C-zFvpFiDa1LNSo4Y!U4mLL~z7;5ZNyGrtZSX-N8PIX}ho*y4EdwGy>Z9#+)IXJUOM| zDd27811lSEub{s!a!8jSzv`2T&B{T&|U zQ#9g!f65ls2~6QX4{-nWOa`jVf0bddb0UlE|0sQYU9a$uQvGjCo&PAo^bY>p75|3+ zf68Rl9sj*)G>rsF4*o^E_w4_t%>N6M|76j656=H9kny{$(Nn&RW2A Date: Sat, 10 Dec 2022 16:52:35 +0100 Subject: [PATCH 19/36] Update description --- README.md | 2 +- code/nrf-connect/samples/zigbee/README.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 33c6371..25d0ab3 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ This repository also hosts a few different firmware samples for b-parasite. |Sample|Description|Extra Documentation| |---|---|---| |[samples/ble](./code/nrf-connect/samples/ble)|This is the most battle-tested and useful firmware. It periodically reads all sensors and broadcast them via Bluetooth Low Energy (BLE). It works with [Home Assistant](https://www.home-assistant.io/) out of the box. |[Docs](./code/nrf-connect/samples/ble/README.md)| -|[samples/zigbee](./code/nrf-connect/samples/zigbee)| A new, experimental Zigbee sample. It integrates with [Home Assistant](https://www.home-assistant.io/) via [Zigbee2MQTT](https://www.zigbee2mqtt.io/). |[Docs](./code/nrf-connect/samples/zigbee/README.md)| +|[samples/zigbee](./code/nrf-connect/samples/zigbee)| An experimental/educational basic Zigbee sample built on [nRF Connect + ZBOSS](https://developer.nordicsemi.com/nRF_Connect_SDK/doc/latest/nrf/ug_zigbee.html). It integrates with [Home Assistant](https://www.home-assistant.io/) via [Zigbee2MQTT](https://www.zigbee2mqtt.io/). |[Docs](./code/nrf-connect/samples/zigbee/README.md)| |[samples/blinky](./code/nrf-connect/samples/blinky)| The classic "Hello, world" |-| |[samples/soil_read_loop](./code/nrf-connect/samples/soil_read_loop)| Read the soil moisture sensor on a loop. Useful for experimenting and calibrating the sensor. |-| diff --git a/code/nrf-connect/samples/zigbee/README.md b/code/nrf-connect/samples/zigbee/README.md index a553060..296c40a 100644 --- a/code/nrf-connect/samples/zigbee/README.md +++ b/code/nrf-connect/samples/zigbee/README.md @@ -1,5 +1,5 @@ # Zigbee firmware sample -This sample is adapted from the [zigbee_template](https://developer.nordicsemi.com/nRF_Connect_SDK/doc/latest/nrf/samples/zigbee/template/README.html) from the nRF Connect SDK. +This sample is adapted from the [zigbee_template](https://developer.nordicsemi.com/nRF_Connect_SDK/doc/latest/nrf/samples/zigbee/template/README.html) from the nRF Connect SDK. It's a basic experimental/educational firmware sample for b-parasite. ## Clusters These [clusters](https://en.wikipedia.org/wiki/Zigbee#Cluster_library) are defined in the sample: From 228b6f2f165597fe404f39993b14d7af9f2f9f7f Mon Sep 17 00:00:00 2001 From: Ole Odendahl Date: Fri, 16 Dec 2022 11:21:27 +0100 Subject: [PATCH 20/36] Making core log level configurable via Kconfig entry. --- .../prstlib/boards/arm/bparasite_nrf52833/Kconfig | 6 +++++- .../prstlib/boards/arm/bparasite_nrf52840/Kconfig | 6 +++++- code/nrf-connect/prstlib/src/adc.c | 2 +- code/nrf-connect/prstlib/src/button.c | 2 +- code/nrf-connect/prstlib/src/led.c | 2 +- code/nrf-connect/prstlib/src/sensors.c | 2 +- code/nrf-connect/prstlib/src/shtc3.c | 2 +- 7 files changed, 15 insertions(+), 7 deletions(-) diff --git a/code/nrf-connect/prstlib/boards/arm/bparasite_nrf52833/Kconfig b/code/nrf-connect/prstlib/boards/arm/bparasite_nrf52833/Kconfig index b6f2e0e..be20e5e 100644 --- a/code/nrf-connect/prstlib/boards/arm/bparasite_nrf52833/Kconfig +++ b/code/nrf-connect/prstlib/boards/arm/bparasite_nrf52833/Kconfig @@ -6,4 +6,8 @@ config BOARD_ENABLE_DCDC select SOC_DCDC_NRF52X default y -endif # BOARD_BPARASITE_NRF52833 \ No newline at end of file +endif # BOARD_BPARASITE_NRF52833 + +config CORE_LOG_LEVEL + int "Logging level in core prst library." + default 2 \ No newline at end of file diff --git a/code/nrf-connect/prstlib/boards/arm/bparasite_nrf52840/Kconfig b/code/nrf-connect/prstlib/boards/arm/bparasite_nrf52840/Kconfig index aa0eeee..e6418be 100644 --- a/code/nrf-connect/prstlib/boards/arm/bparasite_nrf52840/Kconfig +++ b/code/nrf-connect/prstlib/boards/arm/bparasite_nrf52840/Kconfig @@ -11,4 +11,8 @@ config BOARD_ENABLE_DCDC_HV select SOC_DCDC_NRF52X_HV default y -endif # BOARD_BPARASITE_NRF52840 \ No newline at end of file +endif # BOARD_BPARASITE_NRF52840 + +config CORE_LOG_LEVEL + int "Logging level in core prst library." + default 2 \ No newline at end of file diff --git a/code/nrf-connect/prstlib/src/adc.c b/code/nrf-connect/prstlib/src/adc.c index 1856f7e..69d32ad 100644 --- a/code/nrf-connect/prstlib/src/adc.c +++ b/code/nrf-connect/prstlib/src/adc.c @@ -9,7 +9,7 @@ #include "prstlib/macros.h" -LOG_MODULE_REGISTER(adc, LOG_LEVEL_WRN); +LOG_MODULE_REGISTER(adc, CONFIG_CORE_LOG_LEVEL); // PWM spec for square wave. Input to the soil sensing circuit. static const struct pwm_dt_spec soil_pwm_dt = diff --git a/code/nrf-connect/prstlib/src/button.c b/code/nrf-connect/prstlib/src/button.c index a27eda2..a545e9b 100644 --- a/code/nrf-connect/prstlib/src/button.c +++ b/code/nrf-connect/prstlib/src/button.c @@ -6,7 +6,7 @@ #include "prstlib/led.h" #include "prstlib/macros.h" -LOG_MODULE_REGISTER(button, LOG_LEVEL_WRN); +LOG_MODULE_REGISTER(button, CONFIG_CORE_LOG_LEVEL); static struct gpio_dt_spec button = GPIO_DT_SPEC_GET(DT_NODELABEL(button0), gpios); diff --git a/code/nrf-connect/prstlib/src/led.c b/code/nrf-connect/prstlib/src/led.c index 415296f..654339c 100644 --- a/code/nrf-connect/prstlib/src/led.c +++ b/code/nrf-connect/prstlib/src/led.c @@ -4,7 +4,7 @@ #include "prstlib/macros.h" -LOG_MODULE_REGISTER(led, LOG_LEVEL_WRN); +LOG_MODULE_REGISTER(led, CONFIG_CORE_LOG_LEVEL); struct gpio_dt_spec led = GPIO_DT_SPEC_GET(DT_NODELABEL(led0), gpios); diff --git a/code/nrf-connect/prstlib/src/sensors.c b/code/nrf-connect/prstlib/src/sensors.c index e0b1ca9..218ea77 100644 --- a/code/nrf-connect/prstlib/src/sensors.c +++ b/code/nrf-connect/prstlib/src/sensors.c @@ -6,7 +6,7 @@ #include "prstlib/led.h" #include "prstlib/macros.h" -LOG_MODULE_REGISTER(sensors, LOG_LEVEL_WRN); +LOG_MODULE_REGISTER(sensors, CONFIG_CORE_LOG_LEVEL); int prst_sensors_read_all(prst_sensors_t *sensors) { RET_IF_ERR(prst_adc_batt_read(&sensors->batt)); diff --git a/code/nrf-connect/prstlib/src/shtc3.c b/code/nrf-connect/prstlib/src/shtc3.c index 90cd6ba..dc1c90b 100644 --- a/code/nrf-connect/prstlib/src/shtc3.c +++ b/code/nrf-connect/prstlib/src/shtc3.c @@ -6,7 +6,7 @@ #include "prstlib/macros.h" -LOG_MODULE_REGISTER(shtc3, LOG_LEVEL_WRN); +LOG_MODULE_REGISTER(shtc3, CONFIG_CORE_LOG_LEVEL); static const struct i2c_dt_spec shtc3 = I2C_DT_SPEC_GET(DT_NODELABEL(shtc3)); From 96e1e851796a0a677a24df584a8385ae3a6992b9 Mon Sep 17 00:00:00 2001 From: Ole Odendahl Date: Fri, 16 Dec 2022 11:21:52 +0100 Subject: [PATCH 21/36] Making zigbee main log level configurable. --- code/nrf-connect/samples/zigbee/src/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/nrf-connect/samples/zigbee/src/main.c b/code/nrf-connect/samples/zigbee/src/main.c index ae08fcb..b93946e 100644 --- a/code/nrf-connect/samples/zigbee/src/main.c +++ b/code/nrf-connect/samples/zigbee/src/main.c @@ -23,7 +23,7 @@ #define FACTORY_RESET_BUTTON DK_BTN4_MSK -LOG_MODULE_REGISTER(app, LOG_LEVEL_INF); +LOG_MODULE_REGISTER(app, CONFIG_LOG_DEFAULT_LEVEL); static struct zb_device_ctx dev_ctx; From 03b45062c0cb9966d7f7fc7dda4caefad25ad3ab Mon Sep 17 00:00:00 2001 From: Ole Odendahl Date: Fri, 16 Dec 2022 11:49:37 +0100 Subject: [PATCH 22/36] Fixing sensor logging millivolts. --- code/nrf-connect/prstlib/src/sensors.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/nrf-connect/prstlib/src/sensors.c b/code/nrf-connect/prstlib/src/sensors.c index 218ea77..42b5e3c 100644 --- a/code/nrf-connect/prstlib/src/sensors.c +++ b/code/nrf-connect/prstlib/src/sensors.c @@ -16,10 +16,10 @@ int prst_sensors_read_all(prst_sensors_t *sensors) { LOG_DBG("Batt: %d mV (%.2f%%)", sensors->batt.adc_read.millivolts, 100 * sensors->batt.percentage); - LOG_DBG("Soil: %.0f %% (%.3f mV)", 100 * sensors->soil.percentage, - sensors->soil.adc_read.voltage); - LOG_DBG("Photo: %u lx (%.3f mV)", sensors->photo.brightness, - sensors->soil.adc_read.voltage); + LOG_DBG("Soil: %.0f %% (%d mV)", 100 * sensors->soil.percentage, + sensors->soil.adc_read.millivolts); + LOG_DBG("Photo: %u lx (%d mV)", sensors->photo.brightness, + sensors->soil.adc_read.millivolts); LOG_DBG("Temp: %f oC", sensors->shtc3.temp_c); LOG_DBG("Humi: %.0f %%", 100 * sensors->shtc3.rel_humi); LOG_DBG("--------------------------------------------------"); From 0a3d7117877fee7d9285bca6c42222b17503d138 Mon Sep 17 00:00:00 2001 From: Ole Odendahl Date: Fri, 16 Dec 2022 12:10:08 +0100 Subject: [PATCH 23/36] Fixed bug in cluster list not connecting power cluster. --- code/nrf-connect/samples/zigbee/src/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/nrf-connect/samples/zigbee/src/main.c b/code/nrf-connect/samples/zigbee/src/main.c index b93946e..46282bd 100644 --- a/code/nrf-connect/samples/zigbee/src/main.c +++ b/code/nrf-connect/samples/zigbee/src/main.c @@ -113,7 +113,7 @@ PRST_ZB_DECLARE_CLUSTER_LIST( identify_attr_list, temp_measurement_attr_list, rel_humi_attr_list, - basic_attr_list, + batt_attr_list, soil_moisture_attr_list, illuminance_attr_list); From 3b91d7525c22d12a339374af5b6bf613f6d6603e Mon Sep 17 00:00:00 2001 From: Ole Odendahl Date: Fri, 16 Dec 2022 12:15:36 +0100 Subject: [PATCH 24/36] Improved basic attribute list to include more properties. --- code/nrf-connect/samples/zigbee/src/main.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/code/nrf-connect/samples/zigbee/src/main.c b/code/nrf-connect/samples/zigbee/src/main.c index 46282bd..a76b541 100644 --- a/code/nrf-connect/samples/zigbee/src/main.c +++ b/code/nrf-connect/samples/zigbee/src/main.c @@ -57,13 +57,13 @@ ZB_ZCL_DECLARE_BASIC_ATTRIB_LIST_EXT( &dev_ctx.basic_attr.app_version, &dev_ctx.basic_attr.stack_version, &dev_ctx.basic_attr.hw_version, - dev_ctx.basic_attr.mf_name, - dev_ctx.basic_attr.model_id, - dev_ctx.basic_attr.date_code, + &dev_ctx.basic_attr.mf_name, + &dev_ctx.basic_attr.model_id, + &dev_ctx.basic_attr.date_code, &dev_ctx.basic_attr.power_source, - dev_ctx.basic_attr.location_id, + &dev_ctx.basic_attr.location_id, &dev_ctx.basic_attr.ph_env, - dev_ctx.basic_attr.sw_ver); + &dev_ctx.basic_attr.sw_ver); ZB_ZCL_DECLARE_TEMP_MEASUREMENT_ATTRIB_LIST(temp_measurement_attr_list, &dev_ctx.temp_measure_attrs.measure_value, From 61729aa81abbd8041216e756561124c04e795e65 Mon Sep 17 00:00:00 2001 From: Ole Odendahl Date: Fri, 16 Dec 2022 12:16:42 +0100 Subject: [PATCH 25/36] Made more basic attributes compile time configurable. --- code/nrf-connect/samples/zigbee/Kconfig | 10 +++++++++- code/nrf-connect/samples/zigbee/src/prst_zb_attrs.c | 5 +++++ .../samples/zigbee/src/prst_zb_endpoint_defs.h | 3 ++- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/code/nrf-connect/samples/zigbee/Kconfig b/code/nrf-connect/samples/zigbee/Kconfig index f604209..d721814 100644 --- a/code/nrf-connect/samples/zigbee/Kconfig +++ b/code/nrf-connect/samples/zigbee/Kconfig @@ -6,4 +6,12 @@ config PRST_ZB_SLEEP_DURATION_SEC config PRST_ZB_PARENT_POLL_INTERVAL_SEC int "Interval for when b-parasite polls its parent for data (in seconds)" - default 60 \ No newline at end of file + default 60 + +config BUILD_DATE + string "Zigbee app init basic date code. Can be used as build revision." + default "20221214" + +config MODEL_ID + string "Zigbee app model id." + default "b-parasite" \ No newline at end of file diff --git a/code/nrf-connect/samples/zigbee/src/prst_zb_attrs.c b/code/nrf-connect/samples/zigbee/src/prst_zb_attrs.c index 95c9873..a21ae28 100644 --- a/code/nrf-connect/samples/zigbee/src/prst_zb_attrs.c +++ b/code/nrf-connect/samples/zigbee/src/prst_zb_attrs.c @@ -17,6 +17,11 @@ void prst_zb_attrs_init(struct zb_device_ctx *dev_ctx) { PRST_BASIC_MODEL_ID, ZB_ZCL_STRING_CONST_SIZE(PRST_BASIC_MODEL_ID)); + ZB_ZCL_SET_STRING_VAL( + dev_ctx->basic_attr.date_code, + PRST_BASIC_DATE_CODE, + ZB_ZCL_STRING_CONST_SIZE(PRST_BASIC_DATE_CODE)); + dev_ctx->identify_attr.identify_time = ZB_ZCL_IDENTIFY_IDENTIFY_TIME_DEFAULT_VALUE; } diff --git a/code/nrf-connect/samples/zigbee/src/prst_zb_endpoint_defs.h b/code/nrf-connect/samples/zigbee/src/prst_zb_endpoint_defs.h index 601daa2..149c31f 100644 --- a/code/nrf-connect/samples/zigbee/src/prst_zb_endpoint_defs.h +++ b/code/nrf-connect/samples/zigbee/src/prst_zb_endpoint_defs.h @@ -5,7 +5,8 @@ #define PRST_ZIGBEE_ENDPOINT 10 #define PRST_BASIC_MANUF_NAME "b-parasite" -#define PRST_BASIC_MODEL_ID "b-parasite" +#define PRST_BASIC_MODEL_ID CONFIG_MODEL_ID +#define PRST_BASIC_DATE_CODE CONFIG_BUILD_DATE #define PRST_ZB_DEVICE_ID 0x0008 #define PRST_ZB_DEVICE_VERSION 0 From 891a63a1b3e3e0a52dcbba93dd44b1f7a9f23bbc Mon Sep 17 00:00:00 2001 From: Ole Odendahl Date: Fri, 16 Dec 2022 13:15:51 +0100 Subject: [PATCH 26/36] Added separate debug config to better separate flags during development. --- code/nrf-connect/samples/zigbee/prj.conf | 4 +- .../nrf-connect/samples/zigbee/prj_debug.conf | 52 +++++++++++++++++++ 2 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 code/nrf-connect/samples/zigbee/prj_debug.conf diff --git a/code/nrf-connect/samples/zigbee/prj.conf b/code/nrf-connect/samples/zigbee/prj.conf index 552b18f..002aa88 100644 --- a/code/nrf-connect/samples/zigbee/prj.conf +++ b/code/nrf-connect/samples/zigbee/prj.conf @@ -43,4 +43,6 @@ CONFIG_ZIGBEE_CHANNEL_SELECTION_MODE_MULTI=y CONFIG_RAM_POWER_DOWN_LIBRARY=y # Config options in Kconfig. -# CONFIG_PRST_ZB_SLEEP_DURATION_SEC=5 +CONFIG_PRST_ZB_SLEEP_DURATION_SEC=600 +CONFIG_MODEL_ID="Z-Parasite" +CONFIG_BUILD_DATE="20221216" \ No newline at end of file diff --git a/code/nrf-connect/samples/zigbee/prj_debug.conf b/code/nrf-connect/samples/zigbee/prj_debug.conf new file mode 100644 index 0000000..9f6d537 --- /dev/null +++ b/code/nrf-connect/samples/zigbee/prj_debug.conf @@ -0,0 +1,52 @@ + +CONFIG_LOG=y +CONFIG_PWM=y +CONFIG_I2C=y +CONFIG_ADC=y +CONFIG_GPIO=y + +CONFIG_PM=y +CONFIG_PM_DEVICE=y + +CONFIG_NEWLIB_LIBC=y +CONFIG_NEWLIB_LIBC_FLOAT_PRINTF=y + +CONFIG_SERIAL=n + +CONFIG_HEAP_MEM_POOL_SIZE=2048 +CONFIG_MAIN_THREAD_PRIORITY=7 + +CONFIG_ZIGBEE=y +CONFIG_ZIGBEE_APP_UTILS=y +CONFIG_ZIGBEE_ROLE_END_DEVICE=y + +# This example requires more workqueue stack +CONFIG_SYSTEM_WORKQUEUE_STACK_SIZE=2048 + +# Enable nRF ECB driver +CONFIG_CRYPTO=y +CONFIG_CRYPTO_NRF_ECB=y +CONFIG_CRYPTO_INIT_PRIORITY=80 + +# Networking +CONFIG_NET_IPV6_MLD=n +CONFIG_NET_IPV6_NBR_CACHE=n +CONFIG_NET_IPV6_RA_RDNSS=n +CONFIG_NET_IP_ADDR_CHECK=n +CONFIG_NET_UDP=n + +# Get Zigbee to scan every channel. +CONFIG_ZIGBEE_CHANNEL_SELECTION_MODE_MULTI=y + +# Enable API for powering down unused RAM parts. +# https://developer.nordicsemi.com/nRF_Connect_SDK/doc/1.7.1/nrf/ug_zigbee_configuring.html#power-saving-during-sleep +CONFIG_RAM_POWER_DOWN_LIBRARY=y + +# Config options in Kconfig. +CONFIG_PRST_ZB_SLEEP_DURATION_SEC=10 + +CONFIG_LOG_DEFAULT_LEVEL=4 +CONFIG_CORE_LOG_LEVEL=4 + +CONFIG_MODEL_ID="Z-Parasite" +CONFIG_BUILD_DATE="20221216" From 412188502b220357b94623f44b5d3d29012a1ad3 Mon Sep 17 00:00:00 2001 From: Ole Odendahl Date: Sun, 18 Dec 2022 16:55:32 +0100 Subject: [PATCH 27/36] Changed name of config value for prstlib default log level. --- code/nrf-connect/prstlib/boards/arm/bparasite_nrf52833/Kconfig | 2 +- code/nrf-connect/prstlib/boards/arm/bparasite_nrf52840/Kconfig | 2 +- code/nrf-connect/prstlib/src/adc.c | 2 +- code/nrf-connect/prstlib/src/button.c | 2 +- code/nrf-connect/prstlib/src/led.c | 2 +- code/nrf-connect/prstlib/src/sensors.c | 2 +- code/nrf-connect/prstlib/src/shtc3.c | 2 +- code/nrf-connect/samples/zigbee/prj_debug.conf | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/code/nrf-connect/prstlib/boards/arm/bparasite_nrf52833/Kconfig b/code/nrf-connect/prstlib/boards/arm/bparasite_nrf52833/Kconfig index be20e5e..05586ab 100644 --- a/code/nrf-connect/prstlib/boards/arm/bparasite_nrf52833/Kconfig +++ b/code/nrf-connect/prstlib/boards/arm/bparasite_nrf52833/Kconfig @@ -8,6 +8,6 @@ config BOARD_ENABLE_DCDC endif # BOARD_BPARASITE_NRF52833 -config CORE_LOG_LEVEL +config PRSTLIB_DEFAULT_LOG_LEVEL int "Logging level in core prst library." default 2 \ No newline at end of file diff --git a/code/nrf-connect/prstlib/boards/arm/bparasite_nrf52840/Kconfig b/code/nrf-connect/prstlib/boards/arm/bparasite_nrf52840/Kconfig index e6418be..45ac075 100644 --- a/code/nrf-connect/prstlib/boards/arm/bparasite_nrf52840/Kconfig +++ b/code/nrf-connect/prstlib/boards/arm/bparasite_nrf52840/Kconfig @@ -13,6 +13,6 @@ config BOARD_ENABLE_DCDC_HV endif # BOARD_BPARASITE_NRF52840 -config CORE_LOG_LEVEL +config PRSTLIB_DEFAULT_LOG_LEVEL int "Logging level in core prst library." default 2 \ No newline at end of file diff --git a/code/nrf-connect/prstlib/src/adc.c b/code/nrf-connect/prstlib/src/adc.c index 69d32ad..06a42ad 100644 --- a/code/nrf-connect/prstlib/src/adc.c +++ b/code/nrf-connect/prstlib/src/adc.c @@ -9,7 +9,7 @@ #include "prstlib/macros.h" -LOG_MODULE_REGISTER(adc, CONFIG_CORE_LOG_LEVEL); +LOG_MODULE_REGISTER(adc, CONFIG_PRSTLIB_DEFAULT_LOG_LEVEL); // PWM spec for square wave. Input to the soil sensing circuit. static const struct pwm_dt_spec soil_pwm_dt = diff --git a/code/nrf-connect/prstlib/src/button.c b/code/nrf-connect/prstlib/src/button.c index a545e9b..2243845 100644 --- a/code/nrf-connect/prstlib/src/button.c +++ b/code/nrf-connect/prstlib/src/button.c @@ -6,7 +6,7 @@ #include "prstlib/led.h" #include "prstlib/macros.h" -LOG_MODULE_REGISTER(button, CONFIG_CORE_LOG_LEVEL); +LOG_MODULE_REGISTER(button, CONFIG_PRSTLIB_DEFAULT_LOG_LEVEL); static struct gpio_dt_spec button = GPIO_DT_SPEC_GET(DT_NODELABEL(button0), gpios); diff --git a/code/nrf-connect/prstlib/src/led.c b/code/nrf-connect/prstlib/src/led.c index 654339c..cd99937 100644 --- a/code/nrf-connect/prstlib/src/led.c +++ b/code/nrf-connect/prstlib/src/led.c @@ -4,7 +4,7 @@ #include "prstlib/macros.h" -LOG_MODULE_REGISTER(led, CONFIG_CORE_LOG_LEVEL); +LOG_MODULE_REGISTER(led, CONFIG_PRSTLIB_DEFAULT_LOG_LEVEL); struct gpio_dt_spec led = GPIO_DT_SPEC_GET(DT_NODELABEL(led0), gpios); diff --git a/code/nrf-connect/prstlib/src/sensors.c b/code/nrf-connect/prstlib/src/sensors.c index 42b5e3c..e97a35f 100644 --- a/code/nrf-connect/prstlib/src/sensors.c +++ b/code/nrf-connect/prstlib/src/sensors.c @@ -6,7 +6,7 @@ #include "prstlib/led.h" #include "prstlib/macros.h" -LOG_MODULE_REGISTER(sensors, CONFIG_CORE_LOG_LEVEL); +LOG_MODULE_REGISTER(sensors, CONFIG_PRSTLIB_DEFAULT_LOG_LEVEL); int prst_sensors_read_all(prst_sensors_t *sensors) { RET_IF_ERR(prst_adc_batt_read(&sensors->batt)); diff --git a/code/nrf-connect/prstlib/src/shtc3.c b/code/nrf-connect/prstlib/src/shtc3.c index dc1c90b..5e2103b 100644 --- a/code/nrf-connect/prstlib/src/shtc3.c +++ b/code/nrf-connect/prstlib/src/shtc3.c @@ -6,7 +6,7 @@ #include "prstlib/macros.h" -LOG_MODULE_REGISTER(shtc3, CONFIG_CORE_LOG_LEVEL); +LOG_MODULE_REGISTER(shtc3, CONFIG_PRSTLIB_DEFAULT_LOG_LEVEL); static const struct i2c_dt_spec shtc3 = I2C_DT_SPEC_GET(DT_NODELABEL(shtc3)); diff --git a/code/nrf-connect/samples/zigbee/prj_debug.conf b/code/nrf-connect/samples/zigbee/prj_debug.conf index 9f6d537..da51b99 100644 --- a/code/nrf-connect/samples/zigbee/prj_debug.conf +++ b/code/nrf-connect/samples/zigbee/prj_debug.conf @@ -46,7 +46,7 @@ CONFIG_RAM_POWER_DOWN_LIBRARY=y CONFIG_PRST_ZB_SLEEP_DURATION_SEC=10 CONFIG_LOG_DEFAULT_LEVEL=4 -CONFIG_CORE_LOG_LEVEL=4 +CONFIG_PRSTLIB_DEFAULT_LOG_LEVEL=4 CONFIG_MODEL_ID="Z-Parasite" CONFIG_BUILD_DATE="20221216" From 0933c4a2a63483f2a06d9a90d0bb4a44aecea62d Mon Sep 17 00:00:00 2001 From: Ole Odendahl Date: Sun, 18 Dec 2022 16:57:50 +0100 Subject: [PATCH 28/36] Fixed default sleep duration in Kconfig to 600s. Removed specific Kconfig values from prj*.conf files. --- code/nrf-connect/samples/zigbee/Kconfig | 2 +- code/nrf-connect/samples/zigbee/prj.conf | 5 ----- code/nrf-connect/samples/zigbee/prj_debug.conf | 3 --- 3 files changed, 1 insertion(+), 9 deletions(-) diff --git a/code/nrf-connect/samples/zigbee/Kconfig b/code/nrf-connect/samples/zigbee/Kconfig index d721814..f60ec56 100644 --- a/code/nrf-connect/samples/zigbee/Kconfig +++ b/code/nrf-connect/samples/zigbee/Kconfig @@ -2,7 +2,7 @@ source "Kconfig.zephyr" config PRST_ZB_SLEEP_DURATION_SEC int "Sleep duration between waking up and reading sensors (in seconds)" - default 60 + default 600 config PRST_ZB_PARENT_POLL_INTERVAL_SEC int "Interval for when b-parasite polls its parent for data (in seconds)" diff --git a/code/nrf-connect/samples/zigbee/prj.conf b/code/nrf-connect/samples/zigbee/prj.conf index 002aa88..4a91f5d 100644 --- a/code/nrf-connect/samples/zigbee/prj.conf +++ b/code/nrf-connect/samples/zigbee/prj.conf @@ -41,8 +41,3 @@ CONFIG_ZIGBEE_CHANNEL_SELECTION_MODE_MULTI=y # Enable API for powering down unused RAM parts. # https://developer.nordicsemi.com/nRF_Connect_SDK/doc/1.7.1/nrf/ug_zigbee_configuring.html#power-saving-during-sleep CONFIG_RAM_POWER_DOWN_LIBRARY=y - -# Config options in Kconfig. -CONFIG_PRST_ZB_SLEEP_DURATION_SEC=600 -CONFIG_MODEL_ID="Z-Parasite" -CONFIG_BUILD_DATE="20221216" \ No newline at end of file diff --git a/code/nrf-connect/samples/zigbee/prj_debug.conf b/code/nrf-connect/samples/zigbee/prj_debug.conf index da51b99..a338a75 100644 --- a/code/nrf-connect/samples/zigbee/prj_debug.conf +++ b/code/nrf-connect/samples/zigbee/prj_debug.conf @@ -47,6 +47,3 @@ CONFIG_PRST_ZB_SLEEP_DURATION_SEC=10 CONFIG_LOG_DEFAULT_LEVEL=4 CONFIG_PRSTLIB_DEFAULT_LOG_LEVEL=4 - -CONFIG_MODEL_ID="Z-Parasite" -CONFIG_BUILD_DATE="20221216" From ac8677f3e827010e341bd890a93009ec54cc0212 Mon Sep 17 00:00:00 2001 From: Ole Odendahl Date: Sun, 18 Dec 2022 17:12:25 +0100 Subject: [PATCH 29/36] Renamed basic cluster attributes to comply with library defaults. --- code/nrf-connect/samples/zigbee/Kconfig | 6 +++--- code/nrf-connect/samples/zigbee/src/prst_zb_attrs.c | 8 ++++---- .../samples/zigbee/src/prst_zb_endpoint_defs.h | 2 -- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/code/nrf-connect/samples/zigbee/Kconfig b/code/nrf-connect/samples/zigbee/Kconfig index f60ec56..a2ef6c4 100644 --- a/code/nrf-connect/samples/zigbee/Kconfig +++ b/code/nrf-connect/samples/zigbee/Kconfig @@ -8,10 +8,10 @@ config PRST_ZB_PARENT_POLL_INTERVAL_SEC int "Interval for when b-parasite polls its parent for data (in seconds)" default 60 -config BUILD_DATE - string "Zigbee app init basic date code. Can be used as build revision." +config PRST_ZB_BUILD_DATE + string "Zigbee app init basic date code. Can be used as build revision. (1 byte)" default "20221214" -config MODEL_ID +config PRST_ZB_MODEL_ID string "Zigbee app model id." default "b-parasite" \ No newline at end of file diff --git a/code/nrf-connect/samples/zigbee/src/prst_zb_attrs.c b/code/nrf-connect/samples/zigbee/src/prst_zb_attrs.c index a21ae28..c241458 100644 --- a/code/nrf-connect/samples/zigbee/src/prst_zb_attrs.c +++ b/code/nrf-connect/samples/zigbee/src/prst_zb_attrs.c @@ -14,13 +14,13 @@ void prst_zb_attrs_init(struct zb_device_ctx *dev_ctx) { ZB_ZCL_SET_STRING_VAL( dev_ctx->basic_attr.model_id, - PRST_BASIC_MODEL_ID, - ZB_ZCL_STRING_CONST_SIZE(PRST_BASIC_MODEL_ID)); + CONFIG_PRST_ZB_MODEL_ID, + ZB_ZCL_STRING_CONST_SIZE(CONFIG_PRST_ZB_MODEL_ID)); ZB_ZCL_SET_STRING_VAL( dev_ctx->basic_attr.date_code, - PRST_BASIC_DATE_CODE, - ZB_ZCL_STRING_CONST_SIZE(PRST_BASIC_DATE_CODE)); + CONFIG_PRST_ZB_BUILD_DATE, + ZB_ZCL_STRING_CONST_SIZE(CONFIG_PRST_ZB_BUILD_DATE)); dev_ctx->identify_attr.identify_time = ZB_ZCL_IDENTIFY_IDENTIFY_TIME_DEFAULT_VALUE; diff --git a/code/nrf-connect/samples/zigbee/src/prst_zb_endpoint_defs.h b/code/nrf-connect/samples/zigbee/src/prst_zb_endpoint_defs.h index 149c31f..f66f877 100644 --- a/code/nrf-connect/samples/zigbee/src/prst_zb_endpoint_defs.h +++ b/code/nrf-connect/samples/zigbee/src/prst_zb_endpoint_defs.h @@ -5,8 +5,6 @@ #define PRST_ZIGBEE_ENDPOINT 10 #define PRST_BASIC_MANUF_NAME "b-parasite" -#define PRST_BASIC_MODEL_ID CONFIG_MODEL_ID -#define PRST_BASIC_DATE_CODE CONFIG_BUILD_DATE #define PRST_ZB_DEVICE_ID 0x0008 #define PRST_ZB_DEVICE_VERSION 0 From 580f425b01cafdd821a6f86e9499c16a2088703d Mon Sep 17 00:00:00 2001 From: Ole Odendahl Date: Sun, 18 Dec 2022 17:15:58 +0100 Subject: [PATCH 30/36] Added hardware version config value. --- code/nrf-connect/samples/zigbee/Kconfig | 6 +++++- code/nrf-connect/samples/zigbee/src/prst_zb_attrs.c | 2 ++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/code/nrf-connect/samples/zigbee/Kconfig b/code/nrf-connect/samples/zigbee/Kconfig index a2ef6c4..2dd871a 100644 --- a/code/nrf-connect/samples/zigbee/Kconfig +++ b/code/nrf-connect/samples/zigbee/Kconfig @@ -14,4 +14,8 @@ config PRST_ZB_BUILD_DATE config PRST_ZB_MODEL_ID string "Zigbee app model id." - default "b-parasite" \ No newline at end of file + default "b-parasite" + +config PRST_ZB_HARDWARE_VERSION + int "Zigbee basic cluster hardware version. (1 byte)" + default 2 \ No newline at end of file diff --git a/code/nrf-connect/samples/zigbee/src/prst_zb_attrs.c b/code/nrf-connect/samples/zigbee/src/prst_zb_attrs.c index c241458..74edf74 100644 --- a/code/nrf-connect/samples/zigbee/src/prst_zb_attrs.c +++ b/code/nrf-connect/samples/zigbee/src/prst_zb_attrs.c @@ -22,6 +22,8 @@ void prst_zb_attrs_init(struct zb_device_ctx *dev_ctx) { CONFIG_PRST_ZB_BUILD_DATE, ZB_ZCL_STRING_CONST_SIZE(CONFIG_PRST_ZB_BUILD_DATE)); + dev_ctx->basic_attr.hw_version = CONFIG_PRST_ZB_HARDWARE_VERSION; + dev_ctx->identify_attr.identify_time = ZB_ZCL_IDENTIFY_IDENTIFY_TIME_DEFAULT_VALUE; } From 0f859c77cddf4539ef4050e0997a425da77ab675 Mon Sep 17 00:00:00 2001 From: Ole Odendahl Date: Sun, 18 Dec 2022 17:27:43 +0100 Subject: [PATCH 31/36] Slightly improved power cluster with more values. --- code/nrf-connect/samples/zigbee/src/main.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/nrf-connect/samples/zigbee/src/main.c b/code/nrf-connect/samples/zigbee/src/main.c index a76b541..522acce 100644 --- a/code/nrf-connect/samples/zigbee/src/main.c +++ b/code/nrf-connect/samples/zigbee/src/main.c @@ -82,8 +82,8 @@ ZB_ZCL_DECLARE_REL_HUMIDITY_MEASUREMENT_ATTRIB_LIST( ZB_ZCL_DECLARE_POWER_CONFIG_BATTERY_ATTRIB_LIST_EXT( batt_attr_list, &dev_ctx.batt_attrs.voltage, - /*battery_size=*/NULL, - /*battery_quantity=*/NULL, + /*battery_size=*/ZB_ZCL_POWER_CONFIG_BATTERY_SIZE_OTHER, + /*battery_quantity=*/1, /*battery_rated_voltage=*/NULL, /*battery_alarm_mask=*/NULL, /*battery_voltage_min_threshold=*/NULL, @@ -163,7 +163,7 @@ void update_sensors_cb(zb_uint8_t arg) { return; } - // Battery voltlage in units of 100 mV. + // Battery voltage in units of 100 mV. uint8_t batt_voltage = sensors.batt.adc_read.millivolts / 100; prst_zb_set_attr_value(ZB_ZCL_CLUSTER_ID_POWER_CONFIG, ZB_ZCL_ATTR_POWER_CONFIG_BATTERY_VOLTAGE_ID, From 54382e3356ed3453e2b4d7034c6eb58949401a3a Mon Sep 17 00:00:00 2001 From: Ole Odendahl Date: Sun, 18 Dec 2022 21:23:10 +0100 Subject: [PATCH 32/36] Removed log level config from board definition. Moved prst lib log level config to application layer with prst lib default fallback behaviour. --- .../nrf-connect/prstlib/boards/arm/bparasite_nrf52833/Kconfig | 4 ---- .../nrf-connect/prstlib/boards/arm/bparasite_nrf52840/Kconfig | 4 ---- code/nrf-connect/prstlib/include/prstlib/macros.h | 4 ++++ code/nrf-connect/samples/zigbee/Kconfig | 4 ++++ 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/code/nrf-connect/prstlib/boards/arm/bparasite_nrf52833/Kconfig b/code/nrf-connect/prstlib/boards/arm/bparasite_nrf52833/Kconfig index 05586ab..a0c83d3 100644 --- a/code/nrf-connect/prstlib/boards/arm/bparasite_nrf52833/Kconfig +++ b/code/nrf-connect/prstlib/boards/arm/bparasite_nrf52833/Kconfig @@ -7,7 +7,3 @@ config BOARD_ENABLE_DCDC default y endif # BOARD_BPARASITE_NRF52833 - -config PRSTLIB_DEFAULT_LOG_LEVEL - int "Logging level in core prst library." - default 2 \ No newline at end of file diff --git a/code/nrf-connect/prstlib/boards/arm/bparasite_nrf52840/Kconfig b/code/nrf-connect/prstlib/boards/arm/bparasite_nrf52840/Kconfig index 45ac075..4ce925f 100644 --- a/code/nrf-connect/prstlib/boards/arm/bparasite_nrf52840/Kconfig +++ b/code/nrf-connect/prstlib/boards/arm/bparasite_nrf52840/Kconfig @@ -12,7 +12,3 @@ config BOARD_ENABLE_DCDC_HV default y endif # BOARD_BPARASITE_NRF52840 - -config PRSTLIB_DEFAULT_LOG_LEVEL - int "Logging level in core prst library." - default 2 \ No newline at end of file diff --git a/code/nrf-connect/prstlib/include/prstlib/macros.h b/code/nrf-connect/prstlib/include/prstlib/macros.h index dc3f82f..694d7e6 100644 --- a/code/nrf-connect/prstlib/include/prstlib/macros.h +++ b/code/nrf-connect/prstlib/include/prstlib/macros.h @@ -21,4 +21,8 @@ #define UNUSED_OK(expr) (void)expr; +#ifndef CONFIG_PRSTLIB_DEFAULT_LOG_LEVEL +#define CONFIG_PRSTLIB_DEFAULT_LOG_LEVEL LOG_LEVEL_WRN +#endif + #endif // _PRST_MACROS_H_ \ No newline at end of file diff --git a/code/nrf-connect/samples/zigbee/Kconfig b/code/nrf-connect/samples/zigbee/Kconfig index 2dd871a..f23bfef 100644 --- a/code/nrf-connect/samples/zigbee/Kconfig +++ b/code/nrf-connect/samples/zigbee/Kconfig @@ -8,6 +8,10 @@ config PRST_ZB_PARENT_POLL_INTERVAL_SEC int "Interval for when b-parasite polls its parent for data (in seconds)" default 60 +config PRSTLIB_DEFAULT_LOG_LEVEL + int "Logging level in core prst library. (0: NONE, 2: WARN, 4: DEBUG) See Zephyr logging for more." + default 2 + config PRST_ZB_BUILD_DATE string "Zigbee app init basic date code. Can be used as build revision. (1 byte)" default "20221214" From c567408861e786f19f63e1ae5af906137dc7bc36 Mon Sep 17 00:00:00 2001 From: rbaron Date: Mon, 19 Dec 2022 09:33:18 +0100 Subject: [PATCH 33/36] Fix prst_zb_attrs.c format --- code/nrf-connect/samples/zigbee/src/prst_zb_attrs.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/nrf-connect/samples/zigbee/src/prst_zb_attrs.c b/code/nrf-connect/samples/zigbee/src/prst_zb_attrs.c index 74edf74..783cd5b 100644 --- a/code/nrf-connect/samples/zigbee/src/prst_zb_attrs.c +++ b/code/nrf-connect/samples/zigbee/src/prst_zb_attrs.c @@ -18,9 +18,9 @@ void prst_zb_attrs_init(struct zb_device_ctx *dev_ctx) { ZB_ZCL_STRING_CONST_SIZE(CONFIG_PRST_ZB_MODEL_ID)); ZB_ZCL_SET_STRING_VAL( - dev_ctx->basic_attr.date_code, - CONFIG_PRST_ZB_BUILD_DATE, - ZB_ZCL_STRING_CONST_SIZE(CONFIG_PRST_ZB_BUILD_DATE)); + dev_ctx->basic_attr.date_code, + CONFIG_PRST_ZB_BUILD_DATE, + ZB_ZCL_STRING_CONST_SIZE(CONFIG_PRST_ZB_BUILD_DATE)); dev_ctx->basic_attr.hw_version = CONFIG_PRST_ZB_HARDWARE_VERSION; From fe63fda2f186cd37218a176ce682adb6ec541926 Mon Sep 17 00:00:00 2001 From: rbaron Date: Mon, 19 Dec 2022 18:34:03 +0100 Subject: [PATCH 34/36] Setup Kconfig for prstlib --- .github/workflows/b-parasite.yml | 3 ++- code/nrf-connect/prstlib/Kconfig | 3 +++ code/nrf-connect/prstlib/include/prstlib/macros.h | 4 ---- code/nrf-connect/prstlib/src/adc.c | 2 +- code/nrf-connect/prstlib/src/button.c | 2 +- code/nrf-connect/prstlib/src/led.c | 2 +- code/nrf-connect/prstlib/src/sensors.c | 2 +- code/nrf-connect/prstlib/src/shtc3.c | 2 +- code/nrf-connect/samples/ble/Kconfig | 1 + code/nrf-connect/samples/soil_read_loop/Kconfig | 2 ++ code/nrf-connect/samples/zigbee/Kconfig | 7 ++----- code/nrf-connect/samples/zigbee/prj_debug.conf | 2 +- 12 files changed, 16 insertions(+), 16 deletions(-) create mode 100644 code/nrf-connect/prstlib/Kconfig create mode 100644 code/nrf-connect/samples/soil_read_loop/Kconfig diff --git a/.github/workflows/b-parasite.yml b/.github/workflows/b-parasite.yml index 4a165a8..3a241e7 100644 --- a/.github/workflows/b-parasite.yml +++ b/.github/workflows/b-parasite.yml @@ -17,6 +17,7 @@ jobs: uses: jidicula/clang-format-action@v4.9.0 with: check-path: 'code/nrf-connect' + exclude-regex: '\/build\/' - name: Build blinky uses: ./.github/actions/build with: @@ -77,4 +78,4 @@ jobs: with: sample-dir: code/nrf-connect/samples/zigbee board: bparasite_nrf52840 - output-bin: zigbee_nrf52840_default.hex \ No newline at end of file + output-bin: zigbee_nrf52840_default.hex diff --git a/code/nrf-connect/prstlib/Kconfig b/code/nrf-connect/prstlib/Kconfig new file mode 100644 index 0000000..23a7071 --- /dev/null +++ b/code/nrf-connect/prstlib/Kconfig @@ -0,0 +1,3 @@ +module = PRSTLIB +module-str = prstlib +source "subsys/logging/Kconfig.template.log_config" diff --git a/code/nrf-connect/prstlib/include/prstlib/macros.h b/code/nrf-connect/prstlib/include/prstlib/macros.h index 694d7e6..dc3f82f 100644 --- a/code/nrf-connect/prstlib/include/prstlib/macros.h +++ b/code/nrf-connect/prstlib/include/prstlib/macros.h @@ -21,8 +21,4 @@ #define UNUSED_OK(expr) (void)expr; -#ifndef CONFIG_PRSTLIB_DEFAULT_LOG_LEVEL -#define CONFIG_PRSTLIB_DEFAULT_LOG_LEVEL LOG_LEVEL_WRN -#endif - #endif // _PRST_MACROS_H_ \ No newline at end of file diff --git a/code/nrf-connect/prstlib/src/adc.c b/code/nrf-connect/prstlib/src/adc.c index 06a42ad..f13232d 100644 --- a/code/nrf-connect/prstlib/src/adc.c +++ b/code/nrf-connect/prstlib/src/adc.c @@ -9,7 +9,7 @@ #include "prstlib/macros.h" -LOG_MODULE_REGISTER(adc, CONFIG_PRSTLIB_DEFAULT_LOG_LEVEL); +LOG_MODULE_REGISTER(adc, CONFIG_PRSTLIB_LOG_LEVEL); // PWM spec for square wave. Input to the soil sensing circuit. static const struct pwm_dt_spec soil_pwm_dt = diff --git a/code/nrf-connect/prstlib/src/button.c b/code/nrf-connect/prstlib/src/button.c index 2243845..54f2f2a 100644 --- a/code/nrf-connect/prstlib/src/button.c +++ b/code/nrf-connect/prstlib/src/button.c @@ -6,7 +6,7 @@ #include "prstlib/led.h" #include "prstlib/macros.h" -LOG_MODULE_REGISTER(button, CONFIG_PRSTLIB_DEFAULT_LOG_LEVEL); +LOG_MODULE_REGISTER(button, CONFIG_PRSTLIB_LOG_LEVEL); static struct gpio_dt_spec button = GPIO_DT_SPEC_GET(DT_NODELABEL(button0), gpios); diff --git a/code/nrf-connect/prstlib/src/led.c b/code/nrf-connect/prstlib/src/led.c index cd99937..9ba4d47 100644 --- a/code/nrf-connect/prstlib/src/led.c +++ b/code/nrf-connect/prstlib/src/led.c @@ -4,7 +4,7 @@ #include "prstlib/macros.h" -LOG_MODULE_REGISTER(led, CONFIG_PRSTLIB_DEFAULT_LOG_LEVEL); +LOG_MODULE_REGISTER(led, CONFIG_PRSTLIB_LOG_LEVEL); struct gpio_dt_spec led = GPIO_DT_SPEC_GET(DT_NODELABEL(led0), gpios); diff --git a/code/nrf-connect/prstlib/src/sensors.c b/code/nrf-connect/prstlib/src/sensors.c index e97a35f..b826d1c 100644 --- a/code/nrf-connect/prstlib/src/sensors.c +++ b/code/nrf-connect/prstlib/src/sensors.c @@ -6,7 +6,7 @@ #include "prstlib/led.h" #include "prstlib/macros.h" -LOG_MODULE_REGISTER(sensors, CONFIG_PRSTLIB_DEFAULT_LOG_LEVEL); +LOG_MODULE_REGISTER(sensors, CONFIG_PRSTLIB_LOG_LEVEL); int prst_sensors_read_all(prst_sensors_t *sensors) { RET_IF_ERR(prst_adc_batt_read(&sensors->batt)); diff --git a/code/nrf-connect/prstlib/src/shtc3.c b/code/nrf-connect/prstlib/src/shtc3.c index 5e2103b..189a221 100644 --- a/code/nrf-connect/prstlib/src/shtc3.c +++ b/code/nrf-connect/prstlib/src/shtc3.c @@ -6,7 +6,7 @@ #include "prstlib/macros.h" -LOG_MODULE_REGISTER(shtc3, CONFIG_PRSTLIB_DEFAULT_LOG_LEVEL); +LOG_MODULE_REGISTER(shtc3, CONFIG_PRSTLIB_LOG_LEVEL); static const struct i2c_dt_spec shtc3 = I2C_DT_SPEC_GET(DT_NODELABEL(shtc3)); diff --git a/code/nrf-connect/samples/ble/Kconfig b/code/nrf-connect/samples/ble/Kconfig index 6c505c1..d2d47c5 100644 --- a/code/nrf-connect/samples/ble/Kconfig +++ b/code/nrf-connect/samples/ble/Kconfig @@ -1,5 +1,6 @@ source "Kconfig.zephyr" +rsource "../../prstlib/Kconfig" config PRST_SLEEP_DURATION_SEC int "Sleep duration in seconds" diff --git a/code/nrf-connect/samples/soil_read_loop/Kconfig b/code/nrf-connect/samples/soil_read_loop/Kconfig new file mode 100644 index 0000000..8f070f8 --- /dev/null +++ b/code/nrf-connect/samples/soil_read_loop/Kconfig @@ -0,0 +1,2 @@ +source "Kconfig.zephyr" +rsource "../../prstlib/Kconfig" diff --git a/code/nrf-connect/samples/zigbee/Kconfig b/code/nrf-connect/samples/zigbee/Kconfig index f23bfef..c88d371 100644 --- a/code/nrf-connect/samples/zigbee/Kconfig +++ b/code/nrf-connect/samples/zigbee/Kconfig @@ -1,4 +1,5 @@ source "Kconfig.zephyr" +rsource "../../prstlib/Kconfig" config PRST_ZB_SLEEP_DURATION_SEC int "Sleep duration between waking up and reading sensors (in seconds)" @@ -8,10 +9,6 @@ config PRST_ZB_PARENT_POLL_INTERVAL_SEC int "Interval for when b-parasite polls its parent for data (in seconds)" default 60 -config PRSTLIB_DEFAULT_LOG_LEVEL - int "Logging level in core prst library. (0: NONE, 2: WARN, 4: DEBUG) See Zephyr logging for more." - default 2 - config PRST_ZB_BUILD_DATE string "Zigbee app init basic date code. Can be used as build revision. (1 byte)" default "20221214" @@ -22,4 +19,4 @@ config PRST_ZB_MODEL_ID config PRST_ZB_HARDWARE_VERSION int "Zigbee basic cluster hardware version. (1 byte)" - default 2 \ No newline at end of file + default 2 diff --git a/code/nrf-connect/samples/zigbee/prj_debug.conf b/code/nrf-connect/samples/zigbee/prj_debug.conf index a338a75..734b637 100644 --- a/code/nrf-connect/samples/zigbee/prj_debug.conf +++ b/code/nrf-connect/samples/zigbee/prj_debug.conf @@ -46,4 +46,4 @@ CONFIG_RAM_POWER_DOWN_LIBRARY=y CONFIG_PRST_ZB_SLEEP_DURATION_SEC=10 CONFIG_LOG_DEFAULT_LEVEL=4 -CONFIG_PRSTLIB_DEFAULT_LOG_LEVEL=4 +CONFIG_PRSTLIB_LOG_LEVEL_DBG=y From 3d68e5c689f83b7a732425b93cd714bf87dacc34 Mon Sep 17 00:00:00 2001 From: rbaron Date: Sat, 24 Dec 2022 10:06:35 +0100 Subject: [PATCH 35/36] Better docs --- README.md | 2 +- code/nrf-connect/samples/zigbee/Kconfig | 12 ++++++------ code/nrf-connect/samples/zigbee/README.md | 12 ++++++++---- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 25d0ab3..28c0d1e 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ This repository also hosts a few different firmware samples for b-parasite. |Sample|Description|Extra Documentation| |---|---|---| |[samples/ble](./code/nrf-connect/samples/ble)|This is the most battle-tested and useful firmware. It periodically reads all sensors and broadcast them via Bluetooth Low Energy (BLE). It works with [Home Assistant](https://www.home-assistant.io/) out of the box. |[Docs](./code/nrf-connect/samples/ble/README.md)| -|[samples/zigbee](./code/nrf-connect/samples/zigbee)| An experimental/educational basic Zigbee sample built on [nRF Connect + ZBOSS](https://developer.nordicsemi.com/nRF_Connect_SDK/doc/latest/nrf/ug_zigbee.html). It integrates with [Home Assistant](https://www.home-assistant.io/) via [Zigbee2MQTT](https://www.zigbee2mqtt.io/). |[Docs](./code/nrf-connect/samples/zigbee/README.md)| +|[samples/zigbee](./code/nrf-connect/samples/zigbee)| An experimental/educational/exploratory basic Zigbee sample built on [nRF Connect + ZBOSS](https://developer.nordicsemi.com/nRF_Connect_SDK/doc/latest/nrf/ug_zigbee.html). It integrates with [Home Assistant](https://www.home-assistant.io/) via [ZHA](https://www.home-assistant.io/integrations/zha) or [Zigbee2MQTT](https://www.zigbee2mqtt.io/). |[Docs](./code/nrf-connect/samples/zigbee/README.md)| |[samples/blinky](./code/nrf-connect/samples/blinky)| The classic "Hello, world" |-| |[samples/soil_read_loop](./code/nrf-connect/samples/soil_read_loop)| Read the soil moisture sensor on a loop. Useful for experimenting and calibrating the sensor. |-| diff --git a/code/nrf-connect/samples/zigbee/Kconfig b/code/nrf-connect/samples/zigbee/Kconfig index c88d371..39b9e88 100644 --- a/code/nrf-connect/samples/zigbee/Kconfig +++ b/code/nrf-connect/samples/zigbee/Kconfig @@ -2,21 +2,21 @@ source "Kconfig.zephyr" rsource "../../prstlib/Kconfig" config PRST_ZB_SLEEP_DURATION_SEC - int "Sleep duration between waking up and reading sensors (in seconds)" + int "Sleep duration between waking up and reading sensors in seconds." default 600 config PRST_ZB_PARENT_POLL_INTERVAL_SEC - int "Interval for when b-parasite polls its parent for data (in seconds)" + int "Interval for when b-parasite polls its parent for data in seconds." default 60 config PRST_ZB_BUILD_DATE - string "Zigbee app init basic date code. Can be used as build revision. (1 byte)" - default "20221214" + string "Zigbee basic cluster build date attribute. Max 16 bytes." + default "" config PRST_ZB_MODEL_ID - string "Zigbee app model id." + string "Zigbee basic cluster model id attribute. Max 32 bytes." default "b-parasite" config PRST_ZB_HARDWARE_VERSION - int "Zigbee basic cluster hardware version. (1 byte)" + int "Zigbee basic cluster hardware version attribute. 1 byte." default 2 diff --git a/code/nrf-connect/samples/zigbee/README.md b/code/nrf-connect/samples/zigbee/README.md index 296c40a..39504d3 100644 --- a/code/nrf-connect/samples/zigbee/README.md +++ b/code/nrf-connect/samples/zigbee/README.md @@ -1,5 +1,5 @@ # Zigbee firmware sample -This sample is adapted from the [zigbee_template](https://developer.nordicsemi.com/nRF_Connect_SDK/doc/latest/nrf/samples/zigbee/template/README.html) from the nRF Connect SDK. It's a basic experimental/educational firmware sample for b-parasite. +This sample is adapted from the [zigbee_template](https://developer.nordicsemi.com/nRF_Connect_SDK/doc/latest/nrf/samples/zigbee/template/README.html) from the nRF Connect SDK. It's a basic experimental/educational/exploratory firmware sample for b-parasite. ## Clusters These [clusters](https://en.wikipedia.org/wiki/Zigbee#Cluster_library) are defined in the sample: @@ -30,10 +30,14 @@ Available options in `Kconfig`. Notable options: * `CONFIG_PRST_ZB_SLEEP_DURATION_SEC`: amount of time (in seconds) the device sleeps between reading all sensors and updating its clusters * `CONFIG_PRST_ZB_PARENT_POLL_INTERVAL_SEC`: amount of time (in seconds) the device waits between polling its parent for data -## Zigbee2MQTT & Home Assistant -This firmware sample has only been tested with [Zigbee2MQTT](https://zigbee2mqtt.io/), an open source Zigbee bridge that [connects seamlessly with Home Assistant](https://github.com/zigbee2mqtt/hassio-zigbee2mqtt). +## Home Assistant Integration +This firmware sample has only been tested with Home Assistant, using one of the following integrations. -The [b-parasite.js](b-parasite.js) file contains a converter that can be installed to Zigbee2MQTT to suppoort this sample. See [Support new devices](https://www.zigbee2mqtt.io/advanced/support-new-devices/01_support_new_devices.html) for instructions. +### Zigbee Home Automation (ZHA) +With the [ZHA](https://www.home-assistant.io/integrations/zha) Home Assistant integration, b-parasite should work out of the box. + +### Zigbee2MQTT & Home Assistant +With [Zigbee2MQTT](https://zigbee2mqtt.io/), a custom converter is required. The [b-parasite.js](b-parasite.js) file contains such a converter. See [Support new devices](https://www.zigbee2mqtt.io/advanced/support-new-devices/01_support_new_devices.html) for instructions. ## Battery Life While sleeping, the device consumes around 2 uA: From c5a129a39ac24fe3fd4cea3798951725376096ec Mon Sep 17 00:00:00 2001 From: rbaron Date: Sat, 24 Dec 2022 10:19:10 +0100 Subject: [PATCH 36/36] Poor man's templating for PRST_ZB_BUILD_DATE=__TODAY__ in GitHub actions --- .github/actions/build/build.sh | 7 +++++++ .github/workflows/b-parasite.yml | 1 + 2 files changed, 8 insertions(+) diff --git a/.github/actions/build/build.sh b/.github/actions/build/build.sh index 5a8f8fc..b32fc87 100755 --- a/.github/actions/build/build.sh +++ b/.github/actions/build/build.sh @@ -7,8 +7,15 @@ REVISION=$3 CMAKE_EXTRA=$4 OUTPUT_BIN=$5 +TODAY=$(date +'%Y-%m-%d') + +# Replaces occurrences of "__TODAY__" with $TODAY in $CMAKE_EXTRA. +CMAKE_EXTRA="${CMAKE_EXTRA/__TODAY__/"$TODAY"}" + cd "${GITHUB_WORKSPACE}/${SAMPLE_DIR}" +echo $CMAKE_EXTRA + west build --build-dir ./build --pristine --board "${BOARD}@${REVISION}" -- $CMAKE_EXTRA mv build/zephyr/zephyr.hex build/zephyr/"${OUTPUT_BIN}" \ No newline at end of file diff --git a/.github/workflows/b-parasite.yml b/.github/workflows/b-parasite.yml index 3a241e7..c577bba 100644 --- a/.github/workflows/b-parasite.yml +++ b/.github/workflows/b-parasite.yml @@ -79,3 +79,4 @@ jobs: sample-dir: code/nrf-connect/samples/zigbee board: bparasite_nrf52840 output-bin: zigbee_nrf52840_default.hex + cmake-extra: -DPRST_ZB_BUILD_DATE=__TODAY__