From 676b525bd9a775ef9f3253606e72d993bb4b8c09 Mon Sep 17 00:00:00 2001 From: rbaron Date: Wed, 7 Dec 2022 22:22:41 +0100 Subject: [PATCH] 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