From cb635e3d7b2e93c7e4a0426fd2861cfd9567f2c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20BOU=C3=89?= Date: Sun, 13 Oct 2024 11:59:31 +0200 Subject: [PATCH 01/23] Create ZigbeeWindSpeedSensor.h --- .../Zigbee/src/ep/ZigbeeWindSpeedSensor.h | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.h diff --git a/libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.h b/libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.h new file mode 100644 index 00000000000..ba9400d0f6f --- /dev/null +++ b/libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.h @@ -0,0 +1,30 @@ +/* Class of Zigbee WindSpeed sensor endpoint inherited from common EP class */ + +#pragma once + +#include "soc/soc_caps.h" +#if SOC_IEEE802154_SUPPORTED + +#include "ZigbeeEP.h" +#include "ha/esp_zigbee_ha_standard.h" + +class ZigbeeWindSpeedSensor : public ZigbeeEP { +public: + ZigbeeWindSpeedSensor(uint8_t endpoint); + ~ZigbeeWindSpeedSensor(); + + // Set the WindSpeed value in 0,01°C + void setWindSpeed(float value); + + // Set the min and max value for the WindSpeed sensor + void setMinMaxValue(float min, float max); + + // Set the tolerance value for the WindSpeed sensor + void setTolerance(float tolerance); + + // Set the reporting interval for WindSpeed measurement in seconds and delta + void setReporting(uint16_t min_interval, uint16_t max_interval, float delta); + void reportWindSpeed(); +}; + +#endif //SOC_IEEE802154_SUPPORTED From 7cf9246349927d6d1c1cc86a23cd8fc801baf9e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20BOU=C3=89?= Date: Sun, 13 Oct 2024 12:12:37 +0200 Subject: [PATCH 02/23] Create ZigbeeWindSpeedSensor.cpp --- .../Zigbee/src/ep/ZigbeeWindSpeedSensor.cpp | 105 ++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.cpp diff --git a/libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.cpp b/libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.cpp new file mode 100644 index 00000000000..da3eb2ee7f7 --- /dev/null +++ b/libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.cpp @@ -0,0 +1,105 @@ +#include "ZigbeeTempSensor.h" +#if SOC_IEEE802154_SUPPORTED + +// CLUSTER_FN_ENTRY(wind_speed_measurement, ESP_ZB_ZCL_CLUSTER_ID_WIND_SPEED_MEASUREMENT), + +ZigbeeWindSpeedSensor::ZigbeeWindSpeedSensor(uint8_t endpoint) : ZigbeeEP(endpoint) { + _device_id = ESP_ZB_HA_TEMPERATURE_SENSOR_DEVICE_ID; + + esp_zb_windspeed_sensor_cfg_t windspeed_sensor_cfg = ESP_ZB_DEFAULT_TEMPERATURE_SENSOR_CONFIG(); + _cluster_list = esp_zb_windspeed_sensor_clusters_create(&windspeed_sensor_cfg); + + _ep_config = { + .endpoint = _endpoint, .app_profile_id = ESP_ZB_AF_HA_PROFILE_ID, .app_device_id = ESP_ZB_HA_TEMPERATURE_SENSOR_DEVICE_ID, .app_device_version = 0 + }; +} + +static int16_t zb_windspeed_to_s16(float temp) { + return (int16_t)(temp * 100); +} + +/** @brief Wind_Speed_Measurement cluster server attribute identifiers +typedef enum { + ESP_ZB_ZCL_ATTR_WIND_SPEED_MEASUREMENT_MEASURED_VALUE_ID = 0x0000, < MeasuredValue Attribute + ESP_ZB_ZCL_ATTR_WIND_SPEED_MEASUREMENT_MIN_MEASURED_VALUE_ID = 0x0001, < MinMeasuredValue Attribute + ESP_ZB_ZCL_ATTR_WIND_SPEED_MEASUREMENT_MAX_MEASURED_VALUE_ID = 0x0002, < MaxMeasuredValue Attribute + ESP_ZB_ZCL_ATTR_WIND_SPEED_MEASUREMENT_TOLERANCE_ID = 0x0003, < Tolerance Attribute +} esp_zb_zcl_wind_speed_measurement_srv_attr_t; +*/ +void ZigbeeWindSpeedSensor::setMinMaxValue(float min, float max) { + int16_t zb_min = zb_windspeed_to_s16(min); + int16_t zb_max = zb_windspeed_to_s16(max); + esp_zb_attribute_list_t *temp_measure_cluster = + esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_WIND_SPEED_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + // + esp_zb_cluster_update_attr(temp_measure_cluster, ESP_ZB_ZCL_ATTR_TEMP_MEASUREMENT_MIN_VALUE_ID, (void *)&zb_min); + esp_zb_cluster_update_attr(temp_measure_cluster, ESP_ZB_ZCL_ATTR_TEMP_MEASUREMENT_MAX_VALUE_ID, (void *)&zb_max); +} + +void ZigbeeWindSpeedSensor::setTolerance(float tolerance) { + // Convert tolerance to ZCL uint16_t + uint16_t zb_tolerance = (uint16_t)(tolerance * 100); + esp_zb_attribute_list_t *temp_measure_cluster = + esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_WIND_SPEED_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_windspeed_meas_cluster_add_attr(temp_measure_cluster, ESP_ZB_ZCL_ATTR_TEMP_MEASUREMENT_TOLERANCE_ID, (void *)&zb_tolerance); +} + +void ZigbeeWindSpeedSensor::setReporting(uint16_t min_interval, uint16_t max_interval, float delta) { + esp_zb_zcl_reporting_info_t reporting_info = { + .direction = ESP_ZB_ZCL_CMD_DIRECTION_TO_SRV, + .ep = _endpoint, + .cluster_id = ESP_ZB_ZCL_CLUSTER_ID_WIND_SPEED_MEASUREMENT, + .cluster_role = ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, + //.attr_id = ESP_ZB_ZCL_ATTR_TEMP_MEASUREMENT_VALUE_ID, + .attr_id = ESP_ZB_ZCL_ATTR_WIND_SPEED_MEASUREMENT_MEASURED_VALUE_ID, + .u = + { + .send_info = + { + .min_interval = min_interval, + .max_interval = max_interval, + .delta = + { + .u16 = (uint16_t)(delta * 100), // Convert delta to ZCL uint16_t + }, + .def_min_interval = min_interval, + .def_max_interval = max_interval, + }, + }, + .dst = + { + .profile_id = ESP_ZB_AF_HA_PROFILE_ID, + }, + .manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC, + }; + esp_zb_zcl_update_reporting_info(&reporting_info); +} + +void ZigbeeWindSpeedSensor::setWindspeed(float windspeed) { + int16_t zb_windspeed = zb_windspeed_to_s16(windspeed); + log_v("Updating windspeed sensor value..."); + /* Update windspeed sensor measured value */ + log_d("Setting windspeed to %d", zb_windspeed); + esp_zb_lock_acquire(portMAX_DELAY); + esp_zb_zcl_set_attribute_val( + _endpoint, ESP_ZB_ZCL_CLUSTER_ID_WIND_SPEED_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_WIND_SPEED_MEASUREMENT_MEASURED_VALUE_ID, &zb_windspeed, false + ); + esp_zb_lock_release(); +} + +void ZigbeeWindSpeedSensor::reportWindspeed() { + /* Send report attributes command */ + esp_zb_zcl_report_attr_cmd_t report_attr_cmd; + report_attr_cmd.address_mode = ESP_ZB_APS_ADDR_MODE_DST_ADDR_ENDP_NOT_PRESENT; + report_attr_cmd.attributeID = ESP_ZB_ZCL_ATTR_WIND_SPEED_MEASUREMENT_MEASURED_VALUE_ID; + report_attr_cmd.cluster_role = ESP_ZB_ZCL_CLUSTER_SERVER_ROLE; + report_attr_cmd.clusterID = ESP_ZB_ZCL_CLUSTER_ID_WIND_SPEED_MEASUREMENT; + report_attr_cmd.zcl_basic_cmd.src_endpoint = _endpoint; + + esp_zb_lock_acquire(portMAX_DELAY); + esp_zb_zcl_report_attr_cmd_req(&report_attr_cmd); + esp_zb_lock_release(); + log_v("Temperature report sent"); +} + +#endif //SOC_IEEE802154_SUPPORTED From 2f35d86e9a0cc663dbbae96ba67ef7015ad98ae5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20BOU=C3=89?= Date: Sun, 13 Oct 2024 12:34:37 +0200 Subject: [PATCH 03/23] Update ZigbeeWindSpeedSensor.cpp --- libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.cpp b/libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.cpp index da3eb2ee7f7..a0f31dabd7f 100644 --- a/libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.cpp @@ -1,4 +1,4 @@ -#include "ZigbeeTempSensor.h" +#include "ZigbeeWindSpeedSensor.h" #if SOC_IEEE802154_SUPPORTED // CLUSTER_FN_ENTRY(wind_speed_measurement, ESP_ZB_ZCL_CLUSTER_ID_WIND_SPEED_MEASUREMENT), From f063d8d5a8053a037e2a86aa164f68106025c390 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20BOU=C3=89?= Date: Sun, 13 Oct 2024 13:53:07 +0200 Subject: [PATCH 04/23] Update ZigbeeWindSpeedSensor.cpp --- libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.cpp | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.cpp b/libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.cpp index a0f31dabd7f..ae02f3c18ad 100644 --- a/libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.cpp @@ -14,8 +14,8 @@ ZigbeeWindSpeedSensor::ZigbeeWindSpeedSensor(uint8_t endpoint) : ZigbeeEP(endpoi }; } -static int16_t zb_windspeed_to_s16(float temp) { - return (int16_t)(temp * 100); +static int16_t zb_windspeed_to_s16(float windspeed) { + return (int16_t)(windspeed * 100); } /** @brief Wind_Speed_Measurement cluster server attribute identifiers @@ -29,19 +29,19 @@ typedef enum { void ZigbeeWindSpeedSensor::setMinMaxValue(float min, float max) { int16_t zb_min = zb_windspeed_to_s16(min); int16_t zb_max = zb_windspeed_to_s16(max); - esp_zb_attribute_list_t *temp_measure_cluster = + esp_zb_attribute_list_t *windspeed_measure_cluster = esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_WIND_SPEED_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); // - esp_zb_cluster_update_attr(temp_measure_cluster, ESP_ZB_ZCL_ATTR_TEMP_MEASUREMENT_MIN_VALUE_ID, (void *)&zb_min); - esp_zb_cluster_update_attr(temp_measure_cluster, ESP_ZB_ZCL_ATTR_TEMP_MEASUREMENT_MAX_VALUE_ID, (void *)&zb_max); + esp_zb_cluster_update_attr(windspeed_measure_cluster, ESP_ZB_ZCL_ATTR_WIND_SPEED_MEASUREMENT_MIN_MEASURED_VALUE_ID, (void *)&zb_min); + esp_zb_cluster_update_attr(windspeed_measure_cluster, ESP_ZB_ZCL_ATTR_WIND_SPEED_MEASUREMENT_MAX_MEASURED_VALUE_ID, (void *)&zb_max); } void ZigbeeWindSpeedSensor::setTolerance(float tolerance) { // Convert tolerance to ZCL uint16_t uint16_t zb_tolerance = (uint16_t)(tolerance * 100); - esp_zb_attribute_list_t *temp_measure_cluster = + esp_zb_attribute_list_t *windspeed_measure_cluster = esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_WIND_SPEED_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); - esp_zb_windspeed_meas_cluster_add_attr(temp_measure_cluster, ESP_ZB_ZCL_ATTR_TEMP_MEASUREMENT_TOLERANCE_ID, (void *)&zb_tolerance); + esp_zb_windspeed_meas_cluster_add_attr(windspeed_measure_cluster, ESP_ZB_ZCL_ATTR_WIND_SPEED_MEASUREMENT_TOLERANCE_ID, (void *)&zb_tolerance); } void ZigbeeWindSpeedSensor::setReporting(uint16_t min_interval, uint16_t max_interval, float delta) { @@ -50,7 +50,6 @@ void ZigbeeWindSpeedSensor::setReporting(uint16_t min_interval, uint16_t max_int .ep = _endpoint, .cluster_id = ESP_ZB_ZCL_CLUSTER_ID_WIND_SPEED_MEASUREMENT, .cluster_role = ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, - //.attr_id = ESP_ZB_ZCL_ATTR_TEMP_MEASUREMENT_VALUE_ID, .attr_id = ESP_ZB_ZCL_ATTR_WIND_SPEED_MEASUREMENT_MEASURED_VALUE_ID, .u = { From 5b149f6a25234e378bbfab7def91fd95b3d104d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20BOU=C3=89?= Date: Sun, 13 Oct 2024 14:00:29 +0200 Subject: [PATCH 05/23] Create ZigbeeWindSpeedSensor.ino --- .../ZigbeeWindSpeedSensor.ino | 107 ++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 libraries/Zigbee/examples/ZigbeeWindSpeedSensor/ZigbeeWindSpeedSensor.ino diff --git a/libraries/Zigbee/examples/ZigbeeWindSpeedSensor/ZigbeeWindSpeedSensor.ino b/libraries/Zigbee/examples/ZigbeeWindSpeedSensor/ZigbeeWindSpeedSensor.ino new file mode 100644 index 00000000000..2ad87bf7b97 --- /dev/null +++ b/libraries/Zigbee/examples/ZigbeeWindSpeedSensor/ZigbeeWindSpeedSensor.ino @@ -0,0 +1,107 @@ +// Copyright 2024 Espressif Systems (Shanghai) PTE LTD +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/** + * @brief This example demonstrates Zigbee temperature sensor. + * + * The example demonstrates how to use Zigbee library to create a end device wind speed sensor. + * The wind speed sensor is a Zigbee end device, which is controlled by a Zigbee coordinator. + * + * Proper Zigbee mode must be selected in Tools->Zigbee mode + * and also the correct partition scheme must be selected in Tools->Partition Scheme. + * + * Please check the README.md for instructions and more detailed description. + * + * Created by Jan Procházka (https://github.com/P-R-O-C-H-Y/) + */ + +#ifndef ZIGBEE_MODE_ED +#error "Zigbee coordinator mode is not selected in Tools->Zigbee mode" +#endif + +#include "ZigbeeCore.h" +#include "ep/ZigbeeWindSpeedSensor.h" + +#define BUTTON_PIN 9 //Boot button for C6/H2 +#define TEMP_SENSOR_ENDPOINT_NUMBER 10 + +ZigbeeWindSpeedSensor zbWindSpeedSensor = ZigbeeWindSpeedSensor(TEMP_SENSOR_ENDPOINT_NUMBER); + +/************************ Temp sensor *****************************/ +static void windspeed_sensor_value_update(void *arg) { + for (;;) { + // Read temperature sensor value + float tsens_value = temperatureRead(); + log_v("Temperature sensor value: %.2f°C", tsens_value); + // Update temperature value in Temperature sensor EP + zbWindSpeedSensor.setWindspeed(tsens_value); + delay(1000); + } +} + +/********************* Arduino functions **************************/ +void setup() { + + Serial.begin(115200); + while (!Serial) { + delay(10); + } + + // Init button switch + pinMode(BUTTON_PIN, INPUT); + + // Optional: set Zigbee device name and model + zbWindSpeedSensor.setManufacturerAndModel("Espressif", "ZigbeeWindSpeedSensor"); + + // Set minimum and maximum temperature measurement value (10-50°C is default range for chip temperature measurement) + zbWindSpeedSensor.setMinMaxValue(10, 50); + + // Set tolerance for temperature measurement in °C (lowest possible value is 0.01°C) + zbWindSpeedSensor.setTolerance(1); + + // Add endpoint to Zigbee Core + Zigbee.addEndpoint(&zbWindSpeedSensor); + + // When all EPs are registered, start Zigbee in End Device mode + Zigbee.begin(); + + // Start Wind speed sensor reading task + xTaskCreate(windspeed_sensor_value_update, "wind_speed_sensor_update", 2048, NULL, 10, NULL); + + // Set reporting interval for temperature measurement in seconds, must be called after Zigbee.begin() + // min_interval and max_interval in seconds, delta (temp change in °C) + // if min = 1 and max = 0, reporting is sent only when temperature changes by delta + // if min = 0 and max = 10, reporting is sent every 10 seconds or temperature changes by delta + // if min = 0, max = 10 and delta = 0, reporting is sent every 10 seconds regardless of temperature change + zbWindSpeedSensor.setReporting(1, 0, 1); +} + +void loop() { + // Checking button for factory reset + if (digitalRead(BUTTON_PIN) == LOW) { // Push button pressed + // Key debounce handling + delay(100); + int startTime = millis(); + while (digitalRead(BUTTON_PIN) == LOW) { + delay(50); + if ((millis() - startTime) > 3000) { + // If key pressed for more than 3secs, factory reset Zigbee and reboot + Serial.printf("Resetting Zigbee to factory settings, reboot.\n"); + Zigbee.factoryReset(); + } + } + zbWindSpeedSensor.reportWindspeed(); + } + delay(100); +} From bbf625c218091ec58b58c4fbdf8128eb18e47541 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20BOU=C3=89?= Date: Sun, 13 Oct 2024 14:36:46 +0200 Subject: [PATCH 06/23] Update ZigbeeWindSpeedSensor.ino --- .../ZigbeeWindSpeedSensor.ino | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/libraries/Zigbee/examples/ZigbeeWindSpeedSensor/ZigbeeWindSpeedSensor.ino b/libraries/Zigbee/examples/ZigbeeWindSpeedSensor/ZigbeeWindSpeedSensor.ino index 2ad87bf7b97..407ac706de7 100644 --- a/libraries/Zigbee/examples/ZigbeeWindSpeedSensor/ZigbeeWindSpeedSensor.ino +++ b/libraries/Zigbee/examples/ZigbeeWindSpeedSensor/ZigbeeWindSpeedSensor.ino @@ -13,7 +13,7 @@ // limitations under the License. /** - * @brief This example demonstrates Zigbee temperature sensor. + * @brief This example demonstrates Zigbee windspeed sensor. * * The example demonstrates how to use Zigbee library to create a end device wind speed sensor. * The wind speed sensor is a Zigbee end device, which is controlled by a Zigbee coordinator. @@ -34,17 +34,17 @@ #include "ep/ZigbeeWindSpeedSensor.h" #define BUTTON_PIN 9 //Boot button for C6/H2 -#define TEMP_SENSOR_ENDPOINT_NUMBER 10 +#define WIND_SPEED_SENSOR_ENDPOINT_NUMBER 10 -ZigbeeWindSpeedSensor zbWindSpeedSensor = ZigbeeWindSpeedSensor(TEMP_SENSOR_ENDPOINT_NUMBER); +ZigbeeWindSpeedSensor zbWindSpeedSensor = ZigbeeWindSpeedSensor(WIND_SPEED_SENSOR_ENDPOINT_NUMBER); /************************ Temp sensor *****************************/ static void windspeed_sensor_value_update(void *arg) { for (;;) { - // Read temperature sensor value - float tsens_value = temperatureRead(); + // Read wind speed sensor value + float tsens_value = windspeedRead(); log_v("Temperature sensor value: %.2f°C", tsens_value); - // Update temperature value in Temperature sensor EP + // Update windspeed value in Windspeed sensor EP zbWindSpeedSensor.setWindspeed(tsens_value); delay(1000); } @@ -64,10 +64,10 @@ void setup() { // Optional: set Zigbee device name and model zbWindSpeedSensor.setManufacturerAndModel("Espressif", "ZigbeeWindSpeedSensor"); - // Set minimum and maximum temperature measurement value (10-50°C is default range for chip temperature measurement) + // Set minimum and maximum windspeed measurement value (10-50°C is default range for chip windspeed measurement) zbWindSpeedSensor.setMinMaxValue(10, 50); - // Set tolerance for temperature measurement in °C (lowest possible value is 0.01°C) + // Set tolerance for windspeed measurement in °C (lowest possible value is 0.01°C) zbWindSpeedSensor.setTolerance(1); // Add endpoint to Zigbee Core @@ -79,11 +79,11 @@ void setup() { // Start Wind speed sensor reading task xTaskCreate(windspeed_sensor_value_update, "wind_speed_sensor_update", 2048, NULL, 10, NULL); - // Set reporting interval for temperature measurement in seconds, must be called after Zigbee.begin() + // Set reporting interval for windspeed measurement in seconds, must be called after Zigbee.begin() // min_interval and max_interval in seconds, delta (temp change in °C) - // if min = 1 and max = 0, reporting is sent only when temperature changes by delta - // if min = 0 and max = 10, reporting is sent every 10 seconds or temperature changes by delta - // if min = 0, max = 10 and delta = 0, reporting is sent every 10 seconds regardless of temperature change + // if min = 1 and max = 0, reporting is sent only when windspeed changes by delta + // if min = 0 and max = 10, reporting is sent every 10 seconds or windspeed changes by delta + // if min = 0, max = 10 and delta = 0, reporting is sent every 10 seconds regardless of windspeed change zbWindSpeedSensor.setReporting(1, 0, 1); } From d3e76850ee9bc0427983327a3493bd51bed331d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20BOU=C3=89?= Date: Sun, 13 Oct 2024 14:38:40 +0200 Subject: [PATCH 07/23] Update ZigbeeWindSpeedSensor.ino --- .../ZigbeeWindSpeedSensor/ZigbeeWindSpeedSensor.ino | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/libraries/Zigbee/examples/ZigbeeWindSpeedSensor/ZigbeeWindSpeedSensor.ino b/libraries/Zigbee/examples/ZigbeeWindSpeedSensor/ZigbeeWindSpeedSensor.ino index 407ac706de7..dc46ef8c591 100644 --- a/libraries/Zigbee/examples/ZigbeeWindSpeedSensor/ZigbeeWindSpeedSensor.ino +++ b/libraries/Zigbee/examples/ZigbeeWindSpeedSensor/ZigbeeWindSpeedSensor.ino @@ -38,14 +38,14 @@ ZigbeeWindSpeedSensor zbWindSpeedSensor = ZigbeeWindSpeedSensor(WIND_SPEED_SENSOR_ENDPOINT_NUMBER); -/************************ Temp sensor *****************************/ +/************************ WindSpeed sensor *****************************/ static void windspeed_sensor_value_update(void *arg) { for (;;) { // Read wind speed sensor value - float tsens_value = windspeedRead(); - log_v("Temperature sensor value: %.2f°C", tsens_value); + float wssens_value = windspeedRead(); + log_v("Wind speed sensor value: %.2fm/s", wssens_value); // Update windspeed value in Windspeed sensor EP - zbWindSpeedSensor.setWindspeed(tsens_value); + zbWindSpeedSensor.setWindspeed(wssens_value); delay(1000); } } @@ -80,7 +80,7 @@ void setup() { xTaskCreate(windspeed_sensor_value_update, "wind_speed_sensor_update", 2048, NULL, 10, NULL); // Set reporting interval for windspeed measurement in seconds, must be called after Zigbee.begin() - // min_interval and max_interval in seconds, delta (temp change in °C) + // min_interval and max_interval in seconds, delta (WindSpeed change in °C) // if min = 1 and max = 0, reporting is sent only when windspeed changes by delta // if min = 0 and max = 10, reporting is sent every 10 seconds or windspeed changes by delta // if min = 0, max = 10 and delta = 0, reporting is sent every 10 seconds regardless of windspeed change From 1da3fbe660aefd869be48d75dd0fe7dbbe7a15b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20BOU=C3=89?= Date: Sun, 13 Oct 2024 14:40:39 +0200 Subject: [PATCH 08/23] Create ci.json --- libraries/Zigbee/examples/ZigbeeWindSpeedSensor/ci.json | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 libraries/Zigbee/examples/ZigbeeWindSpeedSensor/ci.json diff --git a/libraries/Zigbee/examples/ZigbeeWindSpeedSensor/ci.json b/libraries/Zigbee/examples/ZigbeeWindSpeedSensor/ci.json new file mode 100644 index 00000000000..7b7ccef8ed7 --- /dev/null +++ b/libraries/Zigbee/examples/ZigbeeWindSpeedSensor/ci.json @@ -0,0 +1,6 @@ +{ + "fqbn_append": "PartitionScheme=zigbee,ZigbeeMode=ed", + "requires": [ + "CONFIG_SOC_IEEE802154_SUPPORTED=y" + ] +} From 56e5091d594f8cacebd61c8a3f597087080d9e98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20BOU=C3=89?= Date: Sun, 13 Oct 2024 14:41:26 +0200 Subject: [PATCH 09/23] Rename ZigbeeWindSpeedSensor.ino to Zigbee_Wind_Speed_Sensor.ino --- .../Zigbee_Wind_Speed_Sensor.ino} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename libraries/Zigbee/examples/{ZigbeeWindSpeedSensor/ZigbeeWindSpeedSensor.ino => Zigbee_Wind_Speed_Sensor/Zigbee_Wind_Speed_Sensor.ino} (100%) diff --git a/libraries/Zigbee/examples/ZigbeeWindSpeedSensor/ZigbeeWindSpeedSensor.ino b/libraries/Zigbee/examples/Zigbee_Wind_Speed_Sensor/Zigbee_Wind_Speed_Sensor.ino similarity index 100% rename from libraries/Zigbee/examples/ZigbeeWindSpeedSensor/ZigbeeWindSpeedSensor.ino rename to libraries/Zigbee/examples/Zigbee_Wind_Speed_Sensor/Zigbee_Wind_Speed_Sensor.ino From 69be6353955691fb71aa89677edd7a4bb331be26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20BOU=C3=89?= Date: Sun, 13 Oct 2024 14:41:46 +0200 Subject: [PATCH 10/23] Rename ci.json to ci.json --- .../{ZigbeeWindSpeedSensor => Zigbee_Wind_Speed_Sensor}/ci.json | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename libraries/Zigbee/examples/{ZigbeeWindSpeedSensor => Zigbee_Wind_Speed_Sensor}/ci.json (100%) diff --git a/libraries/Zigbee/examples/ZigbeeWindSpeedSensor/ci.json b/libraries/Zigbee/examples/Zigbee_Wind_Speed_Sensor/ci.json similarity index 100% rename from libraries/Zigbee/examples/ZigbeeWindSpeedSensor/ci.json rename to libraries/Zigbee/examples/Zigbee_Wind_Speed_Sensor/ci.json From cb1b062c825d2af016c1dea133cd3ac19a41372a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20BOU=C3=89?= Date: Sun, 13 Oct 2024 14:44:26 +0200 Subject: [PATCH 11/23] Update CMakeLists.txt --- CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9a858ee79cd..3a9e8c66b1a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -251,6 +251,7 @@ set(ARDUINO_LIBRARY_Zigbee_SRCS libraries/Zigbee/src/ep/ZigbeeSwitch.cpp libraries/Zigbee/src/ep/ZigbeeTempSensor.cpp libraries/Zigbee/src/ep/ZigbeeThermostat.cpp + libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.cpp ) set(ARDUINO_LIBRARY_BLE_SRCS From 52ab37cc3c6c228783f6861b42be4a4f9d88b310 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20BOU=C3=89?= Date: Sun, 13 Oct 2024 14:46:42 +0200 Subject: [PATCH 12/23] Update Zigbee_Wind_Speed_Sensor.ino --- .../Zigbee_Wind_Speed_Sensor/Zigbee_Wind_Speed_Sensor.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/Zigbee/examples/Zigbee_Wind_Speed_Sensor/Zigbee_Wind_Speed_Sensor.ino b/libraries/Zigbee/examples/Zigbee_Wind_Speed_Sensor/Zigbee_Wind_Speed_Sensor.ino index dc46ef8c591..8d3278e7988 100644 --- a/libraries/Zigbee/examples/Zigbee_Wind_Speed_Sensor/Zigbee_Wind_Speed_Sensor.ino +++ b/libraries/Zigbee/examples/Zigbee_Wind_Speed_Sensor/Zigbee_Wind_Speed_Sensor.ino @@ -101,7 +101,7 @@ void loop() { Zigbee.factoryReset(); } } - zbWindSpeedSensor.reportWindspeed(); + zbWindSpeedSensor.reportWindSpeed(); } delay(100); } From 47cf600b2d6f7cf0beb60e63f0ac8709547115f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20BOU=C3=89?= Date: Sun, 13 Oct 2024 14:51:05 +0200 Subject: [PATCH 13/23] Update Zigbee_Wind_Speed_Sensor.ino --- .../Zigbee_Wind_Speed_Sensor/Zigbee_Wind_Speed_Sensor.ino | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/Zigbee/examples/Zigbee_Wind_Speed_Sensor/Zigbee_Wind_Speed_Sensor.ino b/libraries/Zigbee/examples/Zigbee_Wind_Speed_Sensor/Zigbee_Wind_Speed_Sensor.ino index 8d3278e7988..83926b55f41 100644 --- a/libraries/Zigbee/examples/Zigbee_Wind_Speed_Sensor/Zigbee_Wind_Speed_Sensor.ino +++ b/libraries/Zigbee/examples/Zigbee_Wind_Speed_Sensor/Zigbee_Wind_Speed_Sensor.ino @@ -45,7 +45,7 @@ static void windspeed_sensor_value_update(void *arg) { float wssens_value = windspeedRead(); log_v("Wind speed sensor value: %.2fm/s", wssens_value); // Update windspeed value in Windspeed sensor EP - zbWindSpeedSensor.setWindspeed(wssens_value); + zbWindSpeedSensor.setWindSpeed(wssens_value); delay(1000); } } From 94a3cbbf4c07389ba3dfec5808cec772c955c642 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20BOU=C3=89?= Date: Sun, 13 Oct 2024 14:55:46 +0200 Subject: [PATCH 14/23] Update Zigbee_Wind_Speed_Sensor.ino --- .../Zigbee_Wind_Speed_Sensor/Zigbee_Wind_Speed_Sensor.ino | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/libraries/Zigbee/examples/Zigbee_Wind_Speed_Sensor/Zigbee_Wind_Speed_Sensor.ino b/libraries/Zigbee/examples/Zigbee_Wind_Speed_Sensor/Zigbee_Wind_Speed_Sensor.ino index 83926b55f41..1a4ae03e960 100644 --- a/libraries/Zigbee/examples/Zigbee_Wind_Speed_Sensor/Zigbee_Wind_Speed_Sensor.ino +++ b/libraries/Zigbee/examples/Zigbee_Wind_Speed_Sensor/Zigbee_Wind_Speed_Sensor.ino @@ -42,7 +42,8 @@ ZigbeeWindSpeedSensor zbWindSpeedSensor = ZigbeeWindSpeedSensor(WIND_SPEED_SENSO static void windspeed_sensor_value_update(void *arg) { for (;;) { // Read wind speed sensor value - float wssens_value = windspeedRead(); + // float wssens_value = windspeedRead(); + float wssens_value = 5.2; log_v("Wind speed sensor value: %.2fm/s", wssens_value); // Update windspeed value in Windspeed sensor EP zbWindSpeedSensor.setWindSpeed(wssens_value); From efa1c460a5bb7a80886c9872a48dd7771c53b0e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20BOU=C3=89?= Date: Sun, 13 Oct 2024 15:28:40 +0200 Subject: [PATCH 15/23] Update ZigbeeWindSpeedSensor.cpp --- libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.cpp b/libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.cpp index ae02f3c18ad..15d3d370182 100644 --- a/libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.cpp @@ -74,7 +74,7 @@ void ZigbeeWindSpeedSensor::setReporting(uint16_t min_interval, uint16_t max_int esp_zb_zcl_update_reporting_info(&reporting_info); } -void ZigbeeWindSpeedSensor::setWindspeed(float windspeed) { +void ZigbeeWindSpeedSensor::setWindSpeed(float windspeed) { int16_t zb_windspeed = zb_windspeed_to_s16(windspeed); log_v("Updating windspeed sensor value..."); /* Update windspeed sensor measured value */ @@ -86,7 +86,7 @@ void ZigbeeWindSpeedSensor::setWindspeed(float windspeed) { esp_zb_lock_release(); } -void ZigbeeWindSpeedSensor::reportWindspeed() { +void ZigbeeWindSpeedSensor::reportWindSpeed() { /* Send report attributes command */ esp_zb_zcl_report_attr_cmd_t report_attr_cmd; report_attr_cmd.address_mode = ESP_ZB_APS_ADDR_MODE_DST_ADDR_ENDP_NOT_PRESENT; From bd56b00d2880a3bf0c2b101141faf43938237f06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20BOU=C3=89?= Date: Tue, 15 Oct 2024 11:35:40 +0200 Subject: [PATCH 16/23] Update ZigbeeWindSpeedSensor.cpp Use ESP_ZB_HA_SIMPLE_SENSOR_DEVICE_ID device id --- libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.cpp b/libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.cpp index 15d3d370182..b156c29c2cd 100644 --- a/libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.cpp @@ -1,16 +1,15 @@ #include "ZigbeeWindSpeedSensor.h" #if SOC_IEEE802154_SUPPORTED -// CLUSTER_FN_ENTRY(wind_speed_measurement, ESP_ZB_ZCL_CLUSTER_ID_WIND_SPEED_MEASUREMENT), - +// There is no device_id for wind speed sensor, we use a generic one ZigbeeWindSpeedSensor::ZigbeeWindSpeedSensor(uint8_t endpoint) : ZigbeeEP(endpoint) { - _device_id = ESP_ZB_HA_TEMPERATURE_SENSOR_DEVICE_ID; + _device_id = ESP_ZB_HA_SIMPLE_SENSOR_DEVICE_ID; esp_zb_windspeed_sensor_cfg_t windspeed_sensor_cfg = ESP_ZB_DEFAULT_TEMPERATURE_SENSOR_CONFIG(); _cluster_list = esp_zb_windspeed_sensor_clusters_create(&windspeed_sensor_cfg); _ep_config = { - .endpoint = _endpoint, .app_profile_id = ESP_ZB_AF_HA_PROFILE_ID, .app_device_id = ESP_ZB_HA_TEMPERATURE_SENSOR_DEVICE_ID, .app_device_version = 0 + .endpoint = _endpoint, .app_profile_id = ESP_ZB_AF_HA_PROFILE_ID, .app_device_id = ESP_ZB_HA_SIMPLE_SENSOR_DEVICE_ID, .app_device_version = 0 }; } From 5dc5f7fd86f8bc16334c5859fdb53efae2a9d4e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Proch=C3=A1zka?= <90197375+P-R-O-C-H-Y@users.noreply.github.com> Date: Tue, 11 Mar 2025 11:21:42 +0100 Subject: [PATCH 17/23] feat(zigbee): Add windspeed sensor endpoint --- .../Zigbee_Wind_Speed_Sensor.ino | 173 ++++++++++-------- .../examples/Zigbee_Wind_Speed_Sensor/ci.json | 3 +- .../Zigbee/src/ep/ZigbeeWindSpeedSensor.cpp | 88 +++++---- .../Zigbee/src/ep/ZigbeeWindSpeedSensor.h | 33 +++- 4 files changed, 165 insertions(+), 132 deletions(-) diff --git a/libraries/Zigbee/examples/Zigbee_Wind_Speed_Sensor/Zigbee_Wind_Speed_Sensor.ino b/libraries/Zigbee/examples/Zigbee_Wind_Speed_Sensor/Zigbee_Wind_Speed_Sensor.ino index 1a4ae03e960..c660c0eaf26 100644 --- a/libraries/Zigbee/examples/Zigbee_Wind_Speed_Sensor/Zigbee_Wind_Speed_Sensor.ino +++ b/libraries/Zigbee/examples/Zigbee_Wind_Speed_Sensor/Zigbee_Wind_Speed_Sensor.ino @@ -26,83 +26,96 @@ * Created by Jan Procházka (https://github.com/P-R-O-C-H-Y/) */ -#ifndef ZIGBEE_MODE_ED -#error "Zigbee coordinator mode is not selected in Tools->Zigbee mode" -#endif - -#include "ZigbeeCore.h" -#include "ep/ZigbeeWindSpeedSensor.h" - -#define BUTTON_PIN 9 //Boot button for C6/H2 -#define WIND_SPEED_SENSOR_ENDPOINT_NUMBER 10 - -ZigbeeWindSpeedSensor zbWindSpeedSensor = ZigbeeWindSpeedSensor(WIND_SPEED_SENSOR_ENDPOINT_NUMBER); - -/************************ WindSpeed sensor *****************************/ -static void windspeed_sensor_value_update(void *arg) { - for (;;) { - // Read wind speed sensor value - // float wssens_value = windspeedRead(); - float wssens_value = 5.2; - log_v("Wind speed sensor value: %.2fm/s", wssens_value); - // Update windspeed value in Windspeed sensor EP - zbWindSpeedSensor.setWindSpeed(wssens_value); - delay(1000); - } -} - -/********************* Arduino functions **************************/ -void setup() { - - Serial.begin(115200); - while (!Serial) { - delay(10); - } - - // Init button switch - pinMode(BUTTON_PIN, INPUT); - - // Optional: set Zigbee device name and model - zbWindSpeedSensor.setManufacturerAndModel("Espressif", "ZigbeeWindSpeedSensor"); - - // Set minimum and maximum windspeed measurement value (10-50°C is default range for chip windspeed measurement) - zbWindSpeedSensor.setMinMaxValue(10, 50); - - // Set tolerance for windspeed measurement in °C (lowest possible value is 0.01°C) - zbWindSpeedSensor.setTolerance(1); - - // Add endpoint to Zigbee Core - Zigbee.addEndpoint(&zbWindSpeedSensor); - - // When all EPs are registered, start Zigbee in End Device mode - Zigbee.begin(); - - // Start Wind speed sensor reading task - xTaskCreate(windspeed_sensor_value_update, "wind_speed_sensor_update", 2048, NULL, 10, NULL); - - // Set reporting interval for windspeed measurement in seconds, must be called after Zigbee.begin() - // min_interval and max_interval in seconds, delta (WindSpeed change in °C) - // if min = 1 and max = 0, reporting is sent only when windspeed changes by delta - // if min = 0 and max = 10, reporting is sent every 10 seconds or windspeed changes by delta - // if min = 0, max = 10 and delta = 0, reporting is sent every 10 seconds regardless of windspeed change - zbWindSpeedSensor.setReporting(1, 0, 1); -} - -void loop() { - // Checking button for factory reset - if (digitalRead(BUTTON_PIN) == LOW) { // Push button pressed - // Key debounce handling - delay(100); - int startTime = millis(); - while (digitalRead(BUTTON_PIN) == LOW) { - delay(50); - if ((millis() - startTime) > 3000) { - // If key pressed for more than 3secs, factory reset Zigbee and reboot - Serial.printf("Resetting Zigbee to factory settings, reboot.\n"); - Zigbee.factoryReset(); - } - } - zbWindSpeedSensor.reportWindSpeed(); - } - delay(100); -} + #ifndef ZIGBEE_MODE_ED + #error "Zigbee coordinator mode is not selected in Tools->Zigbee mode" + #endif + + #include "ZigbeeCore.h" + #include "ep/ZigbeeWindSpeedSensor.h" + + #define BUTTON_PIN 9 //Boot button for C6/H2 + #define WIND_SPEED_SENSOR_ENDPOINT_NUMBER 10 + + ZigbeeWindSpeedSensor zbWindSpeedSensor = ZigbeeWindSpeedSensor(WIND_SPEED_SENSOR_ENDPOINT_NUMBER); + + /************************ WindSpeed sensor *****************************/ + static void windspeed_sensor_value_update(void *arg) { + for (;;) { + // Read wind speed sensor value (simulated now by temperature sensor) + float windspeed = temperatureRead(); + log_v("Wind speed sensor value: %.2fm/s", windspeed); + // Update windspeed value in Windspeed sensor EP + zbWindSpeedSensor.setWindSpeed(windspeed); + delay(1000); + } + } + + /********************* Arduino functions **************************/ + void setup() { + Serial.begin(115200); + while (!Serial) { + delay(10); + } + + // Init button switch + pinMode(BUTTON_PIN, INPUT); + + // Optional: set Zigbee device name and model + zbWindSpeedSensor.setManufacturerAndModel("Espressif", "ZigbeeWindSpeedSensor"); + + // Set minimum and maximum windspeed measurement value in m/s + zbWindSpeedSensor.setMinMaxValue(0, 50); + + // Set tolerance for windspeed measurement in m/s (lowest possible value is 0.01 m/s) + zbWindSpeedSensor.setTolerance(1); + + // Add endpoint to Zigbee Core + Zigbee.addEndpoint(&zbWindSpeedSensor); + + Serial.println("Starting Zigbee..."); + // When all EPs are registered, start Zigbee in End Device mode + if (!Zigbee.begin()) { + Serial.println("Zigbee failed to start!"); + Serial.println("Rebooting..."); + ESP.restart(); + } else { + Serial.println("Zigbee started successfully!"); + } + Serial.println("Connecting to network"); + while (!Zigbee.connected()) { + Serial.print("."); + delay(100); + } + Serial.println(); + + // Start Wind speed sensor reading task + xTaskCreate(windspeed_sensor_value_update, "wind_speed_sensor_update", 2048, NULL, 10, NULL); + + // Set reporting interval for windspeed measurement in seconds, must be called after Zigbee.begin() + // min_interval and max_interval in seconds, delta (WindSpeed change in m/s) + // if min = 1 and max = 0, reporting is sent only when windspeed changes by delta + // if min = 0 and max = 10, reporting is sent every 10 seconds or windspeed changes by delta + // if min = 0, max = 10 and delta = 0, reporting is sent every 10 seconds regardless of windspeed change + zbWindSpeedSensor.setReporting(1, 0, 1); + } + + void loop() { + // Checking button for factory reset + if (digitalRead(BUTTON_PIN) == LOW) { // Push button pressed + // Key debounce handling + delay(100); + int startTime = millis(); + while (digitalRead(BUTTON_PIN) == LOW) { + delay(50); + if ((millis() - startTime) > 3000) { + // If key pressed for more than 3secs, factory reset Zigbee and reboot + Serial.println("Resetting Zigbee to factory and rebooting in 1s."); + delay(1000); + Zigbee.factoryReset(); + } + } + zbWindSpeedSensor.reportWindSpeed(); + } + delay(100); + } + \ No newline at end of file diff --git a/libraries/Zigbee/examples/Zigbee_Wind_Speed_Sensor/ci.json b/libraries/Zigbee/examples/Zigbee_Wind_Speed_Sensor/ci.json index 7b7ccef8ed7..ceacc367801 100644 --- a/libraries/Zigbee/examples/Zigbee_Wind_Speed_Sensor/ci.json +++ b/libraries/Zigbee/examples/Zigbee_Wind_Speed_Sensor/ci.json @@ -1,6 +1,7 @@ { "fqbn_append": "PartitionScheme=zigbee,ZigbeeMode=ed", "requires": [ - "CONFIG_SOC_IEEE802154_SUPPORTED=y" + "CONFIG_SOC_IEEE802154_SUPPORTED=y", + "CONFIG_ZB_ENABLED=y" ] } diff --git a/libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.cpp b/libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.cpp index b156c29c2cd..d4650e0d43b 100644 --- a/libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.cpp @@ -1,33 +1,36 @@ #include "ZigbeeWindSpeedSensor.h" -#if SOC_IEEE802154_SUPPORTED +#if CONFIG_ZB_ENABLED + +esp_zb_cluster_list_t *zigbee_wind_speed_sensor_clusters_create(zigbee_wind_speed_sensor_cfg_t *wind_speed_sensor) { + esp_zb_basic_cluster_cfg_t *basic_cfg = wind_speed_sensor ? &(wind_speed_sensor->basic_cfg) : NULL; + esp_zb_identify_cluster_cfg_t *identify_cfg = wind_speed_sensor ? &(wind_speed_sensor->identify_cfg) : NULL; + esp_zb_wind_speed_measurement_cluster_cfg_t *wind_speed_cfg = wind_speed_sensor ? &(wind_speed_sensor->wind_speed_meas_cfg) : NULL; + esp_zb_cluster_list_t *cluster_list = esp_zb_zcl_cluster_list_create(); + esp_zb_cluster_list_add_basic_cluster(cluster_list, esp_zb_basic_cluster_create(basic_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_cluster_list_add_identify_cluster(cluster_list, esp_zb_identify_cluster_create(identify_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_cluster_list_add_wind_speed_measurement_cluster(cluster_list, esp_zb_wind_speed_measurement_cluster_create(wind_speed_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + return cluster_list; +} // There is no device_id for wind speed sensor, we use a generic one ZigbeeWindSpeedSensor::ZigbeeWindSpeedSensor(uint8_t endpoint) : ZigbeeEP(endpoint) { _device_id = ESP_ZB_HA_SIMPLE_SENSOR_DEVICE_ID; - esp_zb_windspeed_sensor_cfg_t windspeed_sensor_cfg = ESP_ZB_DEFAULT_TEMPERATURE_SENSOR_CONFIG(); - _cluster_list = esp_zb_windspeed_sensor_clusters_create(&windspeed_sensor_cfg); + zigbee_wind_speed_sensor_cfg_t windspeed_sensor_cfg = ZIGBEE_DEFAULT_WIND_SPEED_SENSOR_CONFIG(); + _cluster_list = zigbee_wind_speed_sensor_clusters_create(&windspeed_sensor_cfg); _ep_config = { .endpoint = _endpoint, .app_profile_id = ESP_ZB_AF_HA_PROFILE_ID, .app_device_id = ESP_ZB_HA_SIMPLE_SENSOR_DEVICE_ID, .app_device_version = 0 }; } -static int16_t zb_windspeed_to_s16(float windspeed) { - return (int16_t)(windspeed * 100); +static uint16_t zb_windspeed_to_u16(float windspeed) { + return (uint16_t)(windspeed * 100); } -/** @brief Wind_Speed_Measurement cluster server attribute identifiers -typedef enum { - ESP_ZB_ZCL_ATTR_WIND_SPEED_MEASUREMENT_MEASURED_VALUE_ID = 0x0000, < MeasuredValue Attribute - ESP_ZB_ZCL_ATTR_WIND_SPEED_MEASUREMENT_MIN_MEASURED_VALUE_ID = 0x0001, < MinMeasuredValue Attribute - ESP_ZB_ZCL_ATTR_WIND_SPEED_MEASUREMENT_MAX_MEASURED_VALUE_ID = 0x0002, < MaxMeasuredValue Attribute - ESP_ZB_ZCL_ATTR_WIND_SPEED_MEASUREMENT_TOLERANCE_ID = 0x0003, < Tolerance Attribute -} esp_zb_zcl_wind_speed_measurement_srv_attr_t; -*/ void ZigbeeWindSpeedSensor::setMinMaxValue(float min, float max) { - int16_t zb_min = zb_windspeed_to_s16(min); - int16_t zb_max = zb_windspeed_to_s16(max); + uint16_t zb_min = zb_windspeed_to_u16(min); + uint16_t zb_max = zb_windspeed_to_u16(max); esp_zb_attribute_list_t *windspeed_measure_cluster = esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_WIND_SPEED_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); // @@ -37,44 +40,34 @@ void ZigbeeWindSpeedSensor::setMinMaxValue(float min, float max) { void ZigbeeWindSpeedSensor::setTolerance(float tolerance) { // Convert tolerance to ZCL uint16_t - uint16_t zb_tolerance = (uint16_t)(tolerance * 100); + uint16_t zb_tolerance = zb_windspeed_to_u16(tolerance); esp_zb_attribute_list_t *windspeed_measure_cluster = esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_WIND_SPEED_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); - esp_zb_windspeed_meas_cluster_add_attr(windspeed_measure_cluster, ESP_ZB_ZCL_ATTR_WIND_SPEED_MEASUREMENT_TOLERANCE_ID, (void *)&zb_tolerance); + esp_zb_wind_speed_measurement_cluster_add_attr(windspeed_measure_cluster, ESP_ZB_ZCL_ATTR_WIND_SPEED_MEASUREMENT_TOLERANCE_ID, (void *)&zb_tolerance); } void ZigbeeWindSpeedSensor::setReporting(uint16_t min_interval, uint16_t max_interval, float delta) { - esp_zb_zcl_reporting_info_t reporting_info = { - .direction = ESP_ZB_ZCL_CMD_DIRECTION_TO_SRV, - .ep = _endpoint, - .cluster_id = ESP_ZB_ZCL_CLUSTER_ID_WIND_SPEED_MEASUREMENT, - .cluster_role = ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, - .attr_id = ESP_ZB_ZCL_ATTR_WIND_SPEED_MEASUREMENT_MEASURED_VALUE_ID, - .u = - { - .send_info = - { - .min_interval = min_interval, - .max_interval = max_interval, - .delta = - { - .u16 = (uint16_t)(delta * 100), // Convert delta to ZCL uint16_t - }, - .def_min_interval = min_interval, - .def_max_interval = max_interval, - }, - }, - .dst = - { - .profile_id = ESP_ZB_AF_HA_PROFILE_ID, - }, - .manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC, - }; + esp_zb_zcl_reporting_info_t reporting_info; + memset(&reporting_info, 0, sizeof(esp_zb_zcl_reporting_info_t)); + reporting_info.direction = ESP_ZB_ZCL_CMD_DIRECTION_TO_SRV; + reporting_info.ep = _endpoint; + reporting_info.cluster_id = ESP_ZB_ZCL_CLUSTER_ID_WIND_SPEED_MEASUREMENT; + reporting_info.cluster_role = ESP_ZB_ZCL_CLUSTER_SERVER_ROLE; + reporting_info.attr_id = ESP_ZB_ZCL_ATTR_WIND_SPEED_MEASUREMENT_MEASURED_VALUE_ID; + reporting_info.u.send_info.min_interval = min_interval; + reporting_info.u.send_info.max_interval = max_interval; + reporting_info.u.send_info.def_min_interval = min_interval; + reporting_info.u.send_info.def_max_interval = max_interval; + reporting_info.u.send_info.delta.u16 = (uint16_t)(delta * 100); // Convert delta to ZCL uint16_t + reporting_info.dst.profile_id = ESP_ZB_AF_HA_PROFILE_ID; + reporting_info.manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC; + esp_zb_lock_acquire(portMAX_DELAY); esp_zb_zcl_update_reporting_info(&reporting_info); + esp_zb_lock_release(); } void ZigbeeWindSpeedSensor::setWindSpeed(float windspeed) { - int16_t zb_windspeed = zb_windspeed_to_s16(windspeed); + uint16_t zb_windspeed = zb_windspeed_to_u16(windspeed); log_v("Updating windspeed sensor value..."); /* Update windspeed sensor measured value */ log_d("Setting windspeed to %d", zb_windspeed); @@ -90,14 +83,15 @@ void ZigbeeWindSpeedSensor::reportWindSpeed() { esp_zb_zcl_report_attr_cmd_t report_attr_cmd; report_attr_cmd.address_mode = ESP_ZB_APS_ADDR_MODE_DST_ADDR_ENDP_NOT_PRESENT; report_attr_cmd.attributeID = ESP_ZB_ZCL_ATTR_WIND_SPEED_MEASUREMENT_MEASURED_VALUE_ID; - report_attr_cmd.cluster_role = ESP_ZB_ZCL_CLUSTER_SERVER_ROLE; + report_attr_cmd.direction = ESP_ZB_ZCL_CMD_DIRECTION_TO_CLI; report_attr_cmd.clusterID = ESP_ZB_ZCL_CLUSTER_ID_WIND_SPEED_MEASUREMENT; report_attr_cmd.zcl_basic_cmd.src_endpoint = _endpoint; + report_attr_cmd.manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC; esp_zb_lock_acquire(portMAX_DELAY); esp_zb_zcl_report_attr_cmd_req(&report_attr_cmd); esp_zb_lock_release(); - log_v("Temperature report sent"); + log_v("Wind speed measurement report sent"); } -#endif //SOC_IEEE802154_SUPPORTED +#endif //CONFIG_ZB_ENABLED diff --git a/libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.h b/libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.h index ba9400d0f6f..ef7a73a293e 100644 --- a/libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.h +++ b/libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.h @@ -3,17 +3,42 @@ #pragma once #include "soc/soc_caps.h" -#if SOC_IEEE802154_SUPPORTED +#if CONFIG_ZB_ENABLED #include "ZigbeeEP.h" #include "ha/esp_zigbee_ha_standard.h" +#define ZIGBEE_DEFAULT_WIND_SPEED_SENSOR_CONFIG() \ + { \ + .basic_cfg = \ + { \ + .zcl_version = ESP_ZB_ZCL_BASIC_ZCL_VERSION_DEFAULT_VALUE, \ + .power_source = ESP_ZB_ZCL_BASIC_POWER_SOURCE_DEFAULT_VALUE, \ + }, \ + .identify_cfg = \ + { \ + .identify_time = ESP_ZB_ZCL_IDENTIFY_IDENTIFY_TIME_DEFAULT_VALUE, \ + }, \ + .wind_speed_meas_cfg = \ + { \ + .measured_value = ESP_ZB_ZCL_WIND_SPEED_MEASUREMENT_MEASURED_VALUE_DEFAULT, \ + .min_measured_value = ESP_ZB_ZCL_WIND_SPEED_MEASUREMENT_MIN_MEASURED_VALUE_DEFAULT, \ + .max_measured_value = ESP_ZB_ZCL_WIND_SPEED_MEASUREMENT_MAX_MEASURED_VALUE_DEFAULT, \ + }, \ + } + +typedef struct zigbee_wind_speed_sensor_cfg_s { + esp_zb_basic_cluster_cfg_t basic_cfg; /*!< Basic cluster configuration, @ref esp_zb_basic_cluster_cfg_s */ + esp_zb_identify_cluster_cfg_t identify_cfg; /*!< Identify cluster configuration, @ref esp_zb_identify_cluster_cfg_s */ + esp_zb_wind_speed_measurement_cluster_cfg_t wind_speed_meas_cfg; /*!< Wind speed measurement cluster configuration, @ref esp_zb_wind_speed_measurement_cluster_cfg_s */ +} zigbee_wind_speed_sensor_cfg_t; + class ZigbeeWindSpeedSensor : public ZigbeeEP { public: ZigbeeWindSpeedSensor(uint8_t endpoint); - ~ZigbeeWindSpeedSensor(); + ~ZigbeeWindSpeedSensor() {} - // Set the WindSpeed value in 0,01°C + // Set the WindSpeed value in 0,01 m/s void setWindSpeed(float value); // Set the min and max value for the WindSpeed sensor @@ -27,4 +52,4 @@ class ZigbeeWindSpeedSensor : public ZigbeeEP { void reportWindSpeed(); }; -#endif //SOC_IEEE802154_SUPPORTED +#endif //CONFIG_ZB_ENABLED From 23a296728ba8945101fd128957a654ede7b211b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20BOU=C3=89?= Date: Tue, 11 Mar 2025 13:10:35 +0100 Subject: [PATCH 18/23] Update Zigbee.h Add ZigbeeWindSpeedSensor.h --- libraries/Zigbee/src/Zigbee.h | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/Zigbee/src/Zigbee.h b/libraries/Zigbee/src/Zigbee.h index 9ccf1e7d8f2..e5f669ba899 100644 --- a/libraries/Zigbee/src/Zigbee.h +++ b/libraries/Zigbee/src/Zigbee.h @@ -25,3 +25,4 @@ #include "ep/ZigbeeVibrationSensor.h" #include "ep/ZigbeeRangeExtender.h" #include "ep/ZigbeeGateway.h" +#include "ep/ZigbeeWindSpeedSensor.h" From a08bfd4385213cf90870f0a83d0a19538c9a6797 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Proch=C3=A1zka?= <90197375+P-R-O-C-H-Y@users.noreply.github.com> Date: Tue, 11 Mar 2025 13:42:27 +0100 Subject: [PATCH 19/23] update example --- .../Zigbee_Wind_Speed_Sensor/Zigbee_Wind_Speed_Sensor.ino | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/libraries/Zigbee/examples/Zigbee_Wind_Speed_Sensor/Zigbee_Wind_Speed_Sensor.ino b/libraries/Zigbee/examples/Zigbee_Wind_Speed_Sensor/Zigbee_Wind_Speed_Sensor.ino index c660c0eaf26..df127bd243b 100644 --- a/libraries/Zigbee/examples/Zigbee_Wind_Speed_Sensor/Zigbee_Wind_Speed_Sensor.ino +++ b/libraries/Zigbee/examples/Zigbee_Wind_Speed_Sensor/Zigbee_Wind_Speed_Sensor.ino @@ -30,8 +30,7 @@ #error "Zigbee coordinator mode is not selected in Tools->Zigbee mode" #endif - #include "ZigbeeCore.h" - #include "ep/ZigbeeWindSpeedSensor.h" + #include "Zigbee.h" #define BUTTON_PIN 9 //Boot button for C6/H2 #define WIND_SPEED_SENSOR_ENDPOINT_NUMBER 10 From 9df06c5863fd44b3d71a0ee69e7121ad04eef592 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Proch=C3=A1zka?= <90197375+P-R-O-C-H-Y@users.noreply.github.com> Date: Tue, 11 Mar 2025 13:46:09 +0100 Subject: [PATCH 20/23] add missing sdkconfig include --- libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.h | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.h b/libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.h index ef7a73a293e..3c1329a7e25 100644 --- a/libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.h +++ b/libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.h @@ -3,6 +3,7 @@ #pragma once #include "soc/soc_caps.h" +#include "sdkconfig.h" #if CONFIG_ZB_ENABLED #include "ZigbeeEP.h" From 30482f1f05c4180c0808235bcec9a4285184b33a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Proch=C3=A1zka?= <90197375+P-R-O-C-H-Y@users.noreply.github.com> Date: Tue, 11 Mar 2025 16:52:40 +0100 Subject: [PATCH 21/23] add readme --- .../Zigbee_Wind_Speed_Sensor/README.md | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 libraries/Zigbee/examples/Zigbee_Wind_Speed_Sensor/README.md diff --git a/libraries/Zigbee/examples/Zigbee_Wind_Speed_Sensor/README.md b/libraries/Zigbee/examples/Zigbee_Wind_Speed_Sensor/README.md new file mode 100644 index 00000000000..a2d8290545f --- /dev/null +++ b/libraries/Zigbee/examples/Zigbee_Wind_Speed_Sensor/README.md @@ -0,0 +1,60 @@ +# Zigbee Wind Speed Sensor Integration with HomeAssistant ZHA + +This guide provides a workaround for integrating a Zigbee Wind Speed Sensor with HomeAssistant using the ZHA integration. Since the wind speed cluster is not natively supported, we will use the ZHA Toolkit from HACS to read the wind speed attribute and store it in a helper variable. +## Alternative Option: Creating a Custom Quirk + +For advanced users, a more robust solution is to create a custom quirk for your Zigbee Wind Speed Sensor. This approach involves writing a custom device handler that directly supports the wind speed cluster, providing a more seamless integration with HomeAssistant. + +Creating a custom quirk can be complex and requires familiarity with Python and the Zigbee protocol. However, it offers greater flexibility and control over your device's behavior. + +For more information and guidance on creating custom quirks, visit the [ZHA Device Handlers repository](https://github.com/zigpy/zha-device-handlers/). + +## Prerequisites + +- HomeAssistant installed and running +- Zigbee Wind Speed Sensor paired with HomeAssistant ZHA +- HACS (Home Assistant Community Store) installed. For more information, visit [HACS](https://hacs.xyz) + +## Steps + +### 1. Install ZHA Toolkit + +1. Open HomeAssistant. +2. Navigate to HACS > Integrations. +3. Search for "ZHA Toolkit - Service for advanced Zigbee Usage" and install it. For more information, visit the [ZHA Toolkit repository](https://github.com/mdeweerd/zha-toolkit). +4. Restart HomeAssistant to apply changes. + +### 2. Create a Helper Variable + +1. Go to Configuration -> Devices & Services -> Helpers. +2. Click on "Add Helper" and select "Number". +3. Name the helper (e.g., `wind_speed`), set the minimum and maximum values, and save it. + +### 3. Create an Automation + +1. Go to Configuration > Automations & Scenes. +2. Click on "Add Automation" and choose "Start with an empty automation". +3. Set a name for the automation (e.g., `Read Wind Speed`). +4. Add a trigger: + - Trigger Type: Time Pattern + - Every: 30 seconds +5. Add an action (Then do): + - Action Type: ZHA Toolkit: Read Attribute + - Setup the action: + ```yaml + action: zha_toolkit.attr_read + metadata: {} + data: + ieee: f0:f5:bd:ff:fe:0e:61:30 #set device IEEE address + endpoint: 10 #set windspeed device endpoint + cluster: 1035 #use this windspeed cluster + attribute: 0 #read meaurement value + state_id: input_number.wind_speed #save to created helper variable + state_value_template: value/100 #use correct value format (convert u16 to float) + ``` +6. Save the automation. + +## Conclusion + +By following these steps, you can successfully integrate your Zigbee Wind Speed Sensor with HomeAssistant using the ZHA integration and ZHA Toolkit. The wind speed readings will be updated every 30 seconds and stored in the helper variable for use in your HomeAssistant setup. +The helper variable `wind_speed` is now an entity in HomeAssistant. You can use this entity to display the wind speed on your dashboard or in other automations. From 216f1f157449773ee2e2ffe15896fa3bb2cc9007 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci-lite[bot]" <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> Date: Wed, 12 Mar 2025 12:14:40 +0000 Subject: [PATCH 22/23] ci(pre-commit): Apply automatic fixes --- .../Zigbee_Wind_Speed_Sensor/README.md | 2 +- .../Zigbee_Wind_Speed_Sensor.ino | 183 +++++++++--------- .../Zigbee/src/ep/ZigbeeWindSpeedSensor.cpp | 13 +- .../Zigbee/src/ep/ZigbeeWindSpeedSensor.h | 42 ++-- 4 files changed, 120 insertions(+), 120 deletions(-) diff --git a/libraries/Zigbee/examples/Zigbee_Wind_Speed_Sensor/README.md b/libraries/Zigbee/examples/Zigbee_Wind_Speed_Sensor/README.md index a2d8290545f..c293cfa665f 100644 --- a/libraries/Zigbee/examples/Zigbee_Wind_Speed_Sensor/README.md +++ b/libraries/Zigbee/examples/Zigbee_Wind_Speed_Sensor/README.md @@ -42,7 +42,7 @@ For more information and guidance on creating custom quirks, visit the [ZHA Devi - Action Type: ZHA Toolkit: Read Attribute - Setup the action: ```yaml - action: zha_toolkit.attr_read + action: zha_toolkit.attr_read metadata: {} data: ieee: f0:f5:bd:ff:fe:0e:61:30 #set device IEEE address diff --git a/libraries/Zigbee/examples/Zigbee_Wind_Speed_Sensor/Zigbee_Wind_Speed_Sensor.ino b/libraries/Zigbee/examples/Zigbee_Wind_Speed_Sensor/Zigbee_Wind_Speed_Sensor.ino index df127bd243b..1c24df9a091 100644 --- a/libraries/Zigbee/examples/Zigbee_Wind_Speed_Sensor/Zigbee_Wind_Speed_Sensor.ino +++ b/libraries/Zigbee/examples/Zigbee_Wind_Speed_Sensor/Zigbee_Wind_Speed_Sensor.ino @@ -26,95 +26,94 @@ * Created by Jan Procházka (https://github.com/P-R-O-C-H-Y/) */ - #ifndef ZIGBEE_MODE_ED - #error "Zigbee coordinator mode is not selected in Tools->Zigbee mode" - #endif - - #include "Zigbee.h" - - #define BUTTON_PIN 9 //Boot button for C6/H2 - #define WIND_SPEED_SENSOR_ENDPOINT_NUMBER 10 - - ZigbeeWindSpeedSensor zbWindSpeedSensor = ZigbeeWindSpeedSensor(WIND_SPEED_SENSOR_ENDPOINT_NUMBER); - - /************************ WindSpeed sensor *****************************/ - static void windspeed_sensor_value_update(void *arg) { - for (;;) { - // Read wind speed sensor value (simulated now by temperature sensor) - float windspeed = temperatureRead(); - log_v("Wind speed sensor value: %.2fm/s", windspeed); - // Update windspeed value in Windspeed sensor EP - zbWindSpeedSensor.setWindSpeed(windspeed); - delay(1000); - } - } - - /********************* Arduino functions **************************/ - void setup() { - Serial.begin(115200); - while (!Serial) { - delay(10); - } - - // Init button switch - pinMode(BUTTON_PIN, INPUT); - - // Optional: set Zigbee device name and model - zbWindSpeedSensor.setManufacturerAndModel("Espressif", "ZigbeeWindSpeedSensor"); - - // Set minimum and maximum windspeed measurement value in m/s - zbWindSpeedSensor.setMinMaxValue(0, 50); - - // Set tolerance for windspeed measurement in m/s (lowest possible value is 0.01 m/s) - zbWindSpeedSensor.setTolerance(1); - - // Add endpoint to Zigbee Core - Zigbee.addEndpoint(&zbWindSpeedSensor); - - Serial.println("Starting Zigbee..."); - // When all EPs are registered, start Zigbee in End Device mode - if (!Zigbee.begin()) { - Serial.println("Zigbee failed to start!"); - Serial.println("Rebooting..."); - ESP.restart(); - } else { - Serial.println("Zigbee started successfully!"); - } - Serial.println("Connecting to network"); - while (!Zigbee.connected()) { - Serial.print("."); - delay(100); - } - Serial.println(); - - // Start Wind speed sensor reading task - xTaskCreate(windspeed_sensor_value_update, "wind_speed_sensor_update", 2048, NULL, 10, NULL); - - // Set reporting interval for windspeed measurement in seconds, must be called after Zigbee.begin() - // min_interval and max_interval in seconds, delta (WindSpeed change in m/s) - // if min = 1 and max = 0, reporting is sent only when windspeed changes by delta - // if min = 0 and max = 10, reporting is sent every 10 seconds or windspeed changes by delta - // if min = 0, max = 10 and delta = 0, reporting is sent every 10 seconds regardless of windspeed change - zbWindSpeedSensor.setReporting(1, 0, 1); - } - - void loop() { - // Checking button for factory reset - if (digitalRead(BUTTON_PIN) == LOW) { // Push button pressed - // Key debounce handling - delay(100); - int startTime = millis(); - while (digitalRead(BUTTON_PIN) == LOW) { - delay(50); - if ((millis() - startTime) > 3000) { - // If key pressed for more than 3secs, factory reset Zigbee and reboot - Serial.println("Resetting Zigbee to factory and rebooting in 1s."); - delay(1000); - Zigbee.factoryReset(); - } - } - zbWindSpeedSensor.reportWindSpeed(); - } - delay(100); - } - \ No newline at end of file +#ifndef ZIGBEE_MODE_ED +#error "Zigbee coordinator mode is not selected in Tools->Zigbee mode" +#endif + +#include "Zigbee.h" + +#define BUTTON_PIN 9 //Boot button for C6/H2 +#define WIND_SPEED_SENSOR_ENDPOINT_NUMBER 10 + +ZigbeeWindSpeedSensor zbWindSpeedSensor = ZigbeeWindSpeedSensor(WIND_SPEED_SENSOR_ENDPOINT_NUMBER); + +/************************ WindSpeed sensor *****************************/ +static void windspeed_sensor_value_update(void *arg) { + for (;;) { + // Read wind speed sensor value (simulated now by temperature sensor) + float windspeed = temperatureRead(); + log_v("Wind speed sensor value: %.2fm/s", windspeed); + // Update windspeed value in Windspeed sensor EP + zbWindSpeedSensor.setWindSpeed(windspeed); + delay(1000); + } +} + +/********************* Arduino functions **************************/ +void setup() { + Serial.begin(115200); + while (!Serial) { + delay(10); + } + + // Init button switch + pinMode(BUTTON_PIN, INPUT); + + // Optional: set Zigbee device name and model + zbWindSpeedSensor.setManufacturerAndModel("Espressif", "ZigbeeWindSpeedSensor"); + + // Set minimum and maximum windspeed measurement value in m/s + zbWindSpeedSensor.setMinMaxValue(0, 50); + + // Set tolerance for windspeed measurement in m/s (lowest possible value is 0.01 m/s) + zbWindSpeedSensor.setTolerance(1); + + // Add endpoint to Zigbee Core + Zigbee.addEndpoint(&zbWindSpeedSensor); + + Serial.println("Starting Zigbee..."); + // When all EPs are registered, start Zigbee in End Device mode + if (!Zigbee.begin()) { + Serial.println("Zigbee failed to start!"); + Serial.println("Rebooting..."); + ESP.restart(); + } else { + Serial.println("Zigbee started successfully!"); + } + Serial.println("Connecting to network"); + while (!Zigbee.connected()) { + Serial.print("."); + delay(100); + } + Serial.println(); + + // Start Wind speed sensor reading task + xTaskCreate(windspeed_sensor_value_update, "wind_speed_sensor_update", 2048, NULL, 10, NULL); + + // Set reporting interval for windspeed measurement in seconds, must be called after Zigbee.begin() + // min_interval and max_interval in seconds, delta (WindSpeed change in m/s) + // if min = 1 and max = 0, reporting is sent only when windspeed changes by delta + // if min = 0 and max = 10, reporting is sent every 10 seconds or windspeed changes by delta + // if min = 0, max = 10 and delta = 0, reporting is sent every 10 seconds regardless of windspeed change + zbWindSpeedSensor.setReporting(1, 0, 1); +} + +void loop() { + // Checking button for factory reset + if (digitalRead(BUTTON_PIN) == LOW) { // Push button pressed + // Key debounce handling + delay(100); + int startTime = millis(); + while (digitalRead(BUTTON_PIN) == LOW) { + delay(50); + if ((millis() - startTime) > 3000) { + // If key pressed for more than 3secs, factory reset Zigbee and reboot + Serial.println("Resetting Zigbee to factory and rebooting in 1s."); + delay(1000); + Zigbee.factoryReset(); + } + } + zbWindSpeedSensor.reportWindSpeed(); + } + delay(100); +} diff --git a/libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.cpp b/libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.cpp index d4650e0d43b..d93b02adbc3 100644 --- a/libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.cpp +++ b/libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.cpp @@ -8,7 +8,9 @@ esp_zb_cluster_list_t *zigbee_wind_speed_sensor_clusters_create(zigbee_wind_spee esp_zb_cluster_list_t *cluster_list = esp_zb_zcl_cluster_list_create(); esp_zb_cluster_list_add_basic_cluster(cluster_list, esp_zb_basic_cluster_create(basic_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); esp_zb_cluster_list_add_identify_cluster(cluster_list, esp_zb_identify_cluster_create(identify_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); - esp_zb_cluster_list_add_wind_speed_measurement_cluster(cluster_list, esp_zb_wind_speed_measurement_cluster_create(wind_speed_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); + esp_zb_cluster_list_add_wind_speed_measurement_cluster( + cluster_list, esp_zb_wind_speed_measurement_cluster_create(wind_speed_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE + ); return cluster_list; } @@ -19,9 +21,7 @@ ZigbeeWindSpeedSensor::ZigbeeWindSpeedSensor(uint8_t endpoint) : ZigbeeEP(endpoi zigbee_wind_speed_sensor_cfg_t windspeed_sensor_cfg = ZIGBEE_DEFAULT_WIND_SPEED_SENSOR_CONFIG(); _cluster_list = zigbee_wind_speed_sensor_clusters_create(&windspeed_sensor_cfg); - _ep_config = { - .endpoint = _endpoint, .app_profile_id = ESP_ZB_AF_HA_PROFILE_ID, .app_device_id = ESP_ZB_HA_SIMPLE_SENSOR_DEVICE_ID, .app_device_version = 0 - }; + _ep_config = {.endpoint = _endpoint, .app_profile_id = ESP_ZB_AF_HA_PROFILE_ID, .app_device_id = ESP_ZB_HA_SIMPLE_SENSOR_DEVICE_ID, .app_device_version = 0}; } static uint16_t zb_windspeed_to_u16(float windspeed) { @@ -33,7 +33,7 @@ void ZigbeeWindSpeedSensor::setMinMaxValue(float min, float max) { uint16_t zb_max = zb_windspeed_to_u16(max); esp_zb_attribute_list_t *windspeed_measure_cluster = esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_WIND_SPEED_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); - // + // esp_zb_cluster_update_attr(windspeed_measure_cluster, ESP_ZB_ZCL_ATTR_WIND_SPEED_MEASUREMENT_MIN_MEASURED_VALUE_ID, (void *)&zb_min); esp_zb_cluster_update_attr(windspeed_measure_cluster, ESP_ZB_ZCL_ATTR_WIND_SPEED_MEASUREMENT_MAX_MEASURED_VALUE_ID, (void *)&zb_max); } @@ -73,7 +73,8 @@ void ZigbeeWindSpeedSensor::setWindSpeed(float windspeed) { log_d("Setting windspeed to %d", zb_windspeed); esp_zb_lock_acquire(portMAX_DELAY); esp_zb_zcl_set_attribute_val( - _endpoint, ESP_ZB_ZCL_CLUSTER_ID_WIND_SPEED_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_WIND_SPEED_MEASUREMENT_MEASURED_VALUE_ID, &zb_windspeed, false + _endpoint, ESP_ZB_ZCL_CLUSTER_ID_WIND_SPEED_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_WIND_SPEED_MEASUREMENT_MEASURED_VALUE_ID, + &zb_windspeed, false ); esp_zb_lock_release(); } diff --git a/libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.h b/libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.h index 3c1329a7e25..e091d3ae548 100644 --- a/libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.h +++ b/libraries/Zigbee/src/ep/ZigbeeWindSpeedSensor.h @@ -9,29 +9,29 @@ #include "ZigbeeEP.h" #include "ha/esp_zigbee_ha_standard.h" -#define ZIGBEE_DEFAULT_WIND_SPEED_SENSOR_CONFIG() \ - { \ - .basic_cfg = \ - { \ - .zcl_version = ESP_ZB_ZCL_BASIC_ZCL_VERSION_DEFAULT_VALUE, \ - .power_source = ESP_ZB_ZCL_BASIC_POWER_SOURCE_DEFAULT_VALUE, \ - }, \ - .identify_cfg = \ - { \ - .identify_time = ESP_ZB_ZCL_IDENTIFY_IDENTIFY_TIME_DEFAULT_VALUE, \ - }, \ - .wind_speed_meas_cfg = \ - { \ - .measured_value = ESP_ZB_ZCL_WIND_SPEED_MEASUREMENT_MEASURED_VALUE_DEFAULT, \ - .min_measured_value = ESP_ZB_ZCL_WIND_SPEED_MEASUREMENT_MIN_MEASURED_VALUE_DEFAULT, \ - .max_measured_value = ESP_ZB_ZCL_WIND_SPEED_MEASUREMENT_MAX_MEASURED_VALUE_DEFAULT, \ - }, \ - } +#define ZIGBEE_DEFAULT_WIND_SPEED_SENSOR_CONFIG() \ + { \ + .basic_cfg = \ + { \ + .zcl_version = ESP_ZB_ZCL_BASIC_ZCL_VERSION_DEFAULT_VALUE, \ + .power_source = ESP_ZB_ZCL_BASIC_POWER_SOURCE_DEFAULT_VALUE, \ + }, \ + .identify_cfg = \ + { \ + .identify_time = ESP_ZB_ZCL_IDENTIFY_IDENTIFY_TIME_DEFAULT_VALUE, \ + }, \ + .wind_speed_meas_cfg = { \ + .measured_value = ESP_ZB_ZCL_WIND_SPEED_MEASUREMENT_MEASURED_VALUE_DEFAULT, \ + .min_measured_value = ESP_ZB_ZCL_WIND_SPEED_MEASUREMENT_MIN_MEASURED_VALUE_DEFAULT, \ + .max_measured_value = ESP_ZB_ZCL_WIND_SPEED_MEASUREMENT_MAX_MEASURED_VALUE_DEFAULT, \ + }, \ + } typedef struct zigbee_wind_speed_sensor_cfg_s { - esp_zb_basic_cluster_cfg_t basic_cfg; /*!< Basic cluster configuration, @ref esp_zb_basic_cluster_cfg_s */ - esp_zb_identify_cluster_cfg_t identify_cfg; /*!< Identify cluster configuration, @ref esp_zb_identify_cluster_cfg_s */ - esp_zb_wind_speed_measurement_cluster_cfg_t wind_speed_meas_cfg; /*!< Wind speed measurement cluster configuration, @ref esp_zb_wind_speed_measurement_cluster_cfg_s */ + esp_zb_basic_cluster_cfg_t basic_cfg; /*!< Basic cluster configuration, @ref esp_zb_basic_cluster_cfg_s */ + esp_zb_identify_cluster_cfg_t identify_cfg; /*!< Identify cluster configuration, @ref esp_zb_identify_cluster_cfg_s */ + esp_zb_wind_speed_measurement_cluster_cfg_t + wind_speed_meas_cfg; /*!< Wind speed measurement cluster configuration, @ref esp_zb_wind_speed_measurement_cluster_cfg_s */ } zigbee_wind_speed_sensor_cfg_t; class ZigbeeWindSpeedSensor : public ZigbeeEP { From da5080d408200558a04cfab69fe1736762835b4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Proch=C3=A1zka?= <90197375+P-R-O-C-H-Y@users.noreply.github.com> Date: Wed, 12 Mar 2025 14:02:52 +0100 Subject: [PATCH 23/23] Update README.md --- libraries/Zigbee/examples/Zigbee_Wind_Speed_Sensor/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/Zigbee/examples/Zigbee_Wind_Speed_Sensor/README.md b/libraries/Zigbee/examples/Zigbee_Wind_Speed_Sensor/README.md index c293cfa665f..826c7666e6b 100644 --- a/libraries/Zigbee/examples/Zigbee_Wind_Speed_Sensor/README.md +++ b/libraries/Zigbee/examples/Zigbee_Wind_Speed_Sensor/README.md @@ -48,7 +48,7 @@ For more information and guidance on creating custom quirks, visit the [ZHA Devi ieee: f0:f5:bd:ff:fe:0e:61:30 #set device IEEE address endpoint: 10 #set windspeed device endpoint cluster: 1035 #use this windspeed cluster - attribute: 0 #read meaurement value + attribute: 0 #read measurement value state_id: input_number.wind_speed #save to created helper variable state_value_template: value/100 #use correct value format (convert u16 to float) ```