11#include " ZigbeeWindSpeedSensor.h"
2- #if SOC_IEEE802154_SUPPORTED
2+ #if CONFIG_ZB_ENABLED
3+
4+ esp_zb_cluster_list_t *zigbee_wind_speed_sensor_clusters_create (zigbee_wind_speed_sensor_cfg_t *wind_speed_sensor) {
5+ esp_zb_basic_cluster_cfg_t *basic_cfg = wind_speed_sensor ? &(wind_speed_sensor->basic_cfg ) : NULL ;
6+ esp_zb_identify_cluster_cfg_t *identify_cfg = wind_speed_sensor ? &(wind_speed_sensor->identify_cfg ) : NULL ;
7+ esp_zb_wind_speed_measurement_cluster_cfg_t *wind_speed_cfg = wind_speed_sensor ? &(wind_speed_sensor->wind_speed_meas_cfg ) : NULL ;
8+ esp_zb_cluster_list_t *cluster_list = esp_zb_zcl_cluster_list_create ();
9+ esp_zb_cluster_list_add_basic_cluster (cluster_list, esp_zb_basic_cluster_create (basic_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE);
10+ esp_zb_cluster_list_add_identify_cluster (cluster_list, esp_zb_identify_cluster_create (identify_cfg), ESP_ZB_ZCL_CLUSTER_SERVER_ROLE);
11+ 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);
12+ return cluster_list;
13+ }
314
415// There is no device_id for wind speed sensor, we use a generic one
516ZigbeeWindSpeedSensor::ZigbeeWindSpeedSensor (uint8_t endpoint) : ZigbeeEP(endpoint) {
617 _device_id = ESP_ZB_HA_SIMPLE_SENSOR_DEVICE_ID;
718
8- esp_zb_windspeed_sensor_cfg_t windspeed_sensor_cfg = ESP_ZB_DEFAULT_TEMPERATURE_SENSOR_CONFIG ();
9- _cluster_list = esp_zb_windspeed_sensor_clusters_create (&windspeed_sensor_cfg);
19+ zigbee_wind_speed_sensor_cfg_t windspeed_sensor_cfg = ZIGBEE_DEFAULT_WIND_SPEED_SENSOR_CONFIG ();
20+ _cluster_list = zigbee_wind_speed_sensor_clusters_create (&windspeed_sensor_cfg);
1021
1122 _ep_config = {
1223 .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
1324 };
1425}
1526
16- static int16_t zb_windspeed_to_s16 (float windspeed) {
17- return (int16_t )(windspeed * 100 );
27+ static uint16_t zb_windspeed_to_u16 (float windspeed) {
28+ return (uint16_t )(windspeed * 100 );
1829}
1930
20- /* * @brief Wind_Speed_Measurement cluster server attribute identifiers
21- typedef enum {
22- ESP_ZB_ZCL_ATTR_WIND_SPEED_MEASUREMENT_MEASURED_VALUE_ID = 0x0000, < MeasuredValue Attribute
23- ESP_ZB_ZCL_ATTR_WIND_SPEED_MEASUREMENT_MIN_MEASURED_VALUE_ID = 0x0001, < MinMeasuredValue Attribute
24- ESP_ZB_ZCL_ATTR_WIND_SPEED_MEASUREMENT_MAX_MEASURED_VALUE_ID = 0x0002, < MaxMeasuredValue Attribute
25- ESP_ZB_ZCL_ATTR_WIND_SPEED_MEASUREMENT_TOLERANCE_ID = 0x0003, < Tolerance Attribute
26- } esp_zb_zcl_wind_speed_measurement_srv_attr_t;
27- */
2831void ZigbeeWindSpeedSensor::setMinMaxValue (float min, float max) {
29- int16_t zb_min = zb_windspeed_to_s16 (min);
30- int16_t zb_max = zb_windspeed_to_s16 (max);
32+ uint16_t zb_min = zb_windspeed_to_u16 (min);
33+ uint16_t zb_max = zb_windspeed_to_u16 (max);
3134 esp_zb_attribute_list_t *windspeed_measure_cluster =
3235 esp_zb_cluster_list_get_cluster (_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_WIND_SPEED_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE);
3336 //
@@ -37,44 +40,34 @@ void ZigbeeWindSpeedSensor::setMinMaxValue(float min, float max) {
3740
3841void ZigbeeWindSpeedSensor::setTolerance (float tolerance) {
3942 // Convert tolerance to ZCL uint16_t
40- uint16_t zb_tolerance = ( uint16_t )( tolerance * 100 );
43+ uint16_t zb_tolerance = zb_windspeed_to_u16 ( tolerance);
4144 esp_zb_attribute_list_t *windspeed_measure_cluster =
4245 esp_zb_cluster_list_get_cluster (_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_WIND_SPEED_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE);
43- esp_zb_windspeed_meas_cluster_add_attr (windspeed_measure_cluster, ESP_ZB_ZCL_ATTR_WIND_SPEED_MEASUREMENT_TOLERANCE_ID, (void *)&zb_tolerance);
46+ esp_zb_wind_speed_measurement_cluster_add_attr (windspeed_measure_cluster, ESP_ZB_ZCL_ATTR_WIND_SPEED_MEASUREMENT_TOLERANCE_ID, (void *)&zb_tolerance);
4447}
4548
4649void ZigbeeWindSpeedSensor::setReporting (uint16_t min_interval, uint16_t max_interval, float delta) {
47- esp_zb_zcl_reporting_info_t reporting_info = {
48- .direction = ESP_ZB_ZCL_CMD_DIRECTION_TO_SRV,
49- .ep = _endpoint,
50- .cluster_id = ESP_ZB_ZCL_CLUSTER_ID_WIND_SPEED_MEASUREMENT,
51- .cluster_role = ESP_ZB_ZCL_CLUSTER_SERVER_ROLE,
52- .attr_id = ESP_ZB_ZCL_ATTR_WIND_SPEED_MEASUREMENT_MEASURED_VALUE_ID,
53- .u =
54- {
55- .send_info =
56- {
57- .min_interval = min_interval,
58- .max_interval = max_interval,
59- .delta =
60- {
61- .u16 = (uint16_t )(delta * 100 ), // Convert delta to ZCL uint16_t
62- },
63- .def_min_interval = min_interval,
64- .def_max_interval = max_interval,
65- },
66- },
67- .dst =
68- {
69- .profile_id = ESP_ZB_AF_HA_PROFILE_ID,
70- },
71- .manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC,
72- };
50+ esp_zb_zcl_reporting_info_t reporting_info;
51+ memset (&reporting_info, 0 , sizeof (esp_zb_zcl_reporting_info_t ));
52+ reporting_info.direction = ESP_ZB_ZCL_CMD_DIRECTION_TO_SRV;
53+ reporting_info.ep = _endpoint;
54+ reporting_info.cluster_id = ESP_ZB_ZCL_CLUSTER_ID_WIND_SPEED_MEASUREMENT;
55+ reporting_info.cluster_role = ESP_ZB_ZCL_CLUSTER_SERVER_ROLE;
56+ reporting_info.attr_id = ESP_ZB_ZCL_ATTR_WIND_SPEED_MEASUREMENT_MEASURED_VALUE_ID;
57+ reporting_info.u .send_info .min_interval = min_interval;
58+ reporting_info.u .send_info .max_interval = max_interval;
59+ reporting_info.u .send_info .def_min_interval = min_interval;
60+ reporting_info.u .send_info .def_max_interval = max_interval;
61+ reporting_info.u .send_info .delta .u16 = (uint16_t )(delta * 100 ); // Convert delta to ZCL uint16_t
62+ reporting_info.dst .profile_id = ESP_ZB_AF_HA_PROFILE_ID;
63+ reporting_info.manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC;
64+ esp_zb_lock_acquire (portMAX_DELAY);
7365 esp_zb_zcl_update_reporting_info (&reporting_info);
66+ esp_zb_lock_release ();
7467}
7568
7669void ZigbeeWindSpeedSensor::setWindSpeed (float windspeed) {
77- int16_t zb_windspeed = zb_windspeed_to_s16 (windspeed);
70+ uint16_t zb_windspeed = zb_windspeed_to_u16 (windspeed);
7871 log_v (" Updating windspeed sensor value..." );
7972 /* Update windspeed sensor measured value */
8073 log_d (" Setting windspeed to %d" , zb_windspeed);
@@ -90,14 +83,15 @@ void ZigbeeWindSpeedSensor::reportWindSpeed() {
9083 esp_zb_zcl_report_attr_cmd_t report_attr_cmd;
9184 report_attr_cmd.address_mode = ESP_ZB_APS_ADDR_MODE_DST_ADDR_ENDP_NOT_PRESENT;
9285 report_attr_cmd.attributeID = ESP_ZB_ZCL_ATTR_WIND_SPEED_MEASUREMENT_MEASURED_VALUE_ID;
93- report_attr_cmd.cluster_role = ESP_ZB_ZCL_CLUSTER_SERVER_ROLE ;
86+ report_attr_cmd.direction = ESP_ZB_ZCL_CMD_DIRECTION_TO_CLI ;
9487 report_attr_cmd.clusterID = ESP_ZB_ZCL_CLUSTER_ID_WIND_SPEED_MEASUREMENT;
9588 report_attr_cmd.zcl_basic_cmd .src_endpoint = _endpoint;
89+ report_attr_cmd.manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC;
9690
9791 esp_zb_lock_acquire (portMAX_DELAY);
9892 esp_zb_zcl_report_attr_cmd_req (&report_attr_cmd);
9993 esp_zb_lock_release ();
100- log_v (" Temperature report sent" );
94+ log_v (" Wind speed measurement report sent" );
10195}
10296
103- #endif // SOC_IEEE802154_SUPPORTED
97+ #endif // CONFIG_ZB_ENABLED
0 commit comments