1
1
#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
+ }
3
14
4
15
// There is no device_id for wind speed sensor, we use a generic one
5
16
ZigbeeWindSpeedSensor::ZigbeeWindSpeedSensor (uint8_t endpoint) : ZigbeeEP(endpoint) {
6
17
_device_id = ESP_ZB_HA_SIMPLE_SENSOR_DEVICE_ID;
7
18
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);
10
21
11
22
_ep_config = {
12
23
.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
13
24
};
14
25
}
15
26
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 );
18
29
}
19
30
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
- */
28
31
void 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);
31
34
esp_zb_attribute_list_t *windspeed_measure_cluster =
32
35
esp_zb_cluster_list_get_cluster (_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_WIND_SPEED_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE);
33
36
//
@@ -37,44 +40,34 @@ void ZigbeeWindSpeedSensor::setMinMaxValue(float min, float max) {
37
40
38
41
void ZigbeeWindSpeedSensor::setTolerance (float tolerance) {
39
42
// 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);
41
44
esp_zb_attribute_list_t *windspeed_measure_cluster =
42
45
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);
44
47
}
45
48
46
49
void 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);
73
65
esp_zb_zcl_update_reporting_info (&reporting_info);
66
+ esp_zb_lock_release ();
74
67
}
75
68
76
69
void ZigbeeWindSpeedSensor::setWindSpeed (float windspeed) {
77
- int16_t zb_windspeed = zb_windspeed_to_s16 (windspeed);
70
+ uint16_t zb_windspeed = zb_windspeed_to_u16 (windspeed);
78
71
log_v (" Updating windspeed sensor value..." );
79
72
/* Update windspeed sensor measured value */
80
73
log_d (" Setting windspeed to %d" , zb_windspeed);
@@ -90,14 +83,15 @@ void ZigbeeWindSpeedSensor::reportWindSpeed() {
90
83
esp_zb_zcl_report_attr_cmd_t report_attr_cmd;
91
84
report_attr_cmd.address_mode = ESP_ZB_APS_ADDR_MODE_DST_ADDR_ENDP_NOT_PRESENT;
92
85
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 ;
94
87
report_attr_cmd.clusterID = ESP_ZB_ZCL_CLUSTER_ID_WIND_SPEED_MEASUREMENT;
95
88
report_attr_cmd.zcl_basic_cmd .src_endpoint = _endpoint;
89
+ report_attr_cmd.manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC;
96
90
97
91
esp_zb_lock_acquire (portMAX_DELAY);
98
92
esp_zb_zcl_report_attr_cmd_req (&report_attr_cmd);
99
93
esp_zb_lock_release ();
100
- log_v (" Temperature report sent" );
94
+ log_v (" Wind speed measurement report sent" );
101
95
}
102
96
103
- #endif // SOC_IEEE802154_SUPPORTED
97
+ #endif // CONFIG_ZB_ENABLED
0 commit comments