Skip to content

Commit 7cf9246

Browse files
authored
Create ZigbeeWindSpeedSensor.cpp
1 parent cb635e3 commit 7cf9246

File tree

1 file changed

+105
-0
lines changed

1 file changed

+105
-0
lines changed
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
#include "ZigbeeTempSensor.h"
2+
#if SOC_IEEE802154_SUPPORTED
3+
4+
// CLUSTER_FN_ENTRY(wind_speed_measurement, ESP_ZB_ZCL_CLUSTER_ID_WIND_SPEED_MEASUREMENT),
5+
6+
ZigbeeWindSpeedSensor::ZigbeeWindSpeedSensor(uint8_t endpoint) : ZigbeeEP(endpoint) {
7+
_device_id = ESP_ZB_HA_TEMPERATURE_SENSOR_DEVICE_ID;
8+
9+
esp_zb_windspeed_sensor_cfg_t windspeed_sensor_cfg = ESP_ZB_DEFAULT_TEMPERATURE_SENSOR_CONFIG();
10+
_cluster_list = esp_zb_windspeed_sensor_clusters_create(&windspeed_sensor_cfg);
11+
12+
_ep_config = {
13+
.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
14+
};
15+
}
16+
17+
static int16_t zb_windspeed_to_s16(float temp) {
18+
return (int16_t)(temp * 100);
19+
}
20+
21+
/** @brief Wind_Speed_Measurement cluster server attribute identifiers
22+
typedef enum {
23+
ESP_ZB_ZCL_ATTR_WIND_SPEED_MEASUREMENT_MEASURED_VALUE_ID = 0x0000, < MeasuredValue Attribute
24+
ESP_ZB_ZCL_ATTR_WIND_SPEED_MEASUREMENT_MIN_MEASURED_VALUE_ID = 0x0001, < MinMeasuredValue Attribute
25+
ESP_ZB_ZCL_ATTR_WIND_SPEED_MEASUREMENT_MAX_MEASURED_VALUE_ID = 0x0002, < MaxMeasuredValue Attribute
26+
ESP_ZB_ZCL_ATTR_WIND_SPEED_MEASUREMENT_TOLERANCE_ID = 0x0003, < Tolerance Attribute
27+
} esp_zb_zcl_wind_speed_measurement_srv_attr_t;
28+
*/
29+
void ZigbeeWindSpeedSensor::setMinMaxValue(float min, float max) {
30+
int16_t zb_min = zb_windspeed_to_s16(min);
31+
int16_t zb_max = zb_windspeed_to_s16(max);
32+
esp_zb_attribute_list_t *temp_measure_cluster =
33+
esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_WIND_SPEED_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE);
34+
//
35+
esp_zb_cluster_update_attr(temp_measure_cluster, ESP_ZB_ZCL_ATTR_TEMP_MEASUREMENT_MIN_VALUE_ID, (void *)&zb_min);
36+
esp_zb_cluster_update_attr(temp_measure_cluster, ESP_ZB_ZCL_ATTR_TEMP_MEASUREMENT_MAX_VALUE_ID, (void *)&zb_max);
37+
}
38+
39+
void ZigbeeWindSpeedSensor::setTolerance(float tolerance) {
40+
// Convert tolerance to ZCL uint16_t
41+
uint16_t zb_tolerance = (uint16_t)(tolerance * 100);
42+
esp_zb_attribute_list_t *temp_measure_cluster =
43+
esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_WIND_SPEED_MEASUREMENT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE);
44+
esp_zb_windspeed_meas_cluster_add_attr(temp_measure_cluster, ESP_ZB_ZCL_ATTR_TEMP_MEASUREMENT_TOLERANCE_ID, (void *)&zb_tolerance);
45+
}
46+
47+
void ZigbeeWindSpeedSensor::setReporting(uint16_t min_interval, uint16_t max_interval, float delta) {
48+
esp_zb_zcl_reporting_info_t reporting_info = {
49+
.direction = ESP_ZB_ZCL_CMD_DIRECTION_TO_SRV,
50+
.ep = _endpoint,
51+
.cluster_id = ESP_ZB_ZCL_CLUSTER_ID_WIND_SPEED_MEASUREMENT,
52+
.cluster_role = ESP_ZB_ZCL_CLUSTER_SERVER_ROLE,
53+
//.attr_id = ESP_ZB_ZCL_ATTR_TEMP_MEASUREMENT_VALUE_ID,
54+
.attr_id = ESP_ZB_ZCL_ATTR_WIND_SPEED_MEASUREMENT_MEASURED_VALUE_ID,
55+
.u =
56+
{
57+
.send_info =
58+
{
59+
.min_interval = min_interval,
60+
.max_interval = max_interval,
61+
.delta =
62+
{
63+
.u16 = (uint16_t)(delta * 100), // Convert delta to ZCL uint16_t
64+
},
65+
.def_min_interval = min_interval,
66+
.def_max_interval = max_interval,
67+
},
68+
},
69+
.dst =
70+
{
71+
.profile_id = ESP_ZB_AF_HA_PROFILE_ID,
72+
},
73+
.manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC,
74+
};
75+
esp_zb_zcl_update_reporting_info(&reporting_info);
76+
}
77+
78+
void ZigbeeWindSpeedSensor::setWindspeed(float windspeed) {
79+
int16_t zb_windspeed = zb_windspeed_to_s16(windspeed);
80+
log_v("Updating windspeed sensor value...");
81+
/* Update windspeed sensor measured value */
82+
log_d("Setting windspeed to %d", zb_windspeed);
83+
esp_zb_lock_acquire(portMAX_DELAY);
84+
esp_zb_zcl_set_attribute_val(
85+
_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
86+
);
87+
esp_zb_lock_release();
88+
}
89+
90+
void ZigbeeWindSpeedSensor::reportWindspeed() {
91+
/* Send report attributes command */
92+
esp_zb_zcl_report_attr_cmd_t report_attr_cmd;
93+
report_attr_cmd.address_mode = ESP_ZB_APS_ADDR_MODE_DST_ADDR_ENDP_NOT_PRESENT;
94+
report_attr_cmd.attributeID = ESP_ZB_ZCL_ATTR_WIND_SPEED_MEASUREMENT_MEASURED_VALUE_ID;
95+
report_attr_cmd.cluster_role = ESP_ZB_ZCL_CLUSTER_SERVER_ROLE;
96+
report_attr_cmd.clusterID = ESP_ZB_ZCL_CLUSTER_ID_WIND_SPEED_MEASUREMENT;
97+
report_attr_cmd.zcl_basic_cmd.src_endpoint = _endpoint;
98+
99+
esp_zb_lock_acquire(portMAX_DELAY);
100+
esp_zb_zcl_report_attr_cmd_req(&report_attr_cmd);
101+
esp_zb_lock_release();
102+
log_v("Temperature report sent");
103+
}
104+
105+
#endif //SOC_IEEE802154_SUPPORTED

0 commit comments

Comments
 (0)