Skip to content

Commit 3c2c659

Browse files
committed
feat(zigbee): Add battery voltage attribute support
1 parent 7b0298b commit 3c2c659

File tree

3 files changed

+26
-7
lines changed

3 files changed

+26
-7
lines changed

libraries/Zigbee/examples/Zigbee_Temp_Hum_Sensor_Sleepy/Zigbee_Temp_Hum_Sensor_Sleepy.ino

+3-3
Original file line numberDiff line numberDiff line change
@@ -85,9 +85,9 @@ void setup() {
8585
// Set tolerance for temperature measurement in °C (lowest possible value is 0.01°C)
8686
zbTempSensor.setTolerance(1);
8787

88-
// Set power source to battery and set battery percentage to measured value (now 100% for demonstration)
89-
// The value can be also updated by calling zbTempSensor.setBatteryPercentage(percentage) anytime
90-
zbTempSensor.setPowerSource(ZB_POWER_SOURCE_BATTERY, 100);
88+
// Set power source to battery, battery percentage and battery voltage (now 100% and 3.5Vfor demonstration)
89+
// The value can be also updated by calling zbTempSensor.setBatteryPercentage(percentage) or zbTempSensor.setBatteryVoltage(voltage) anytime after Zigbee.begin()
90+
zbTempSensor.setPowerSource(ZB_POWER_SOURCE_BATTERY, 100, 35);
9191

9292
// Add humidity cluster to the temperature sensor device with min, max and tolerance values
9393
zbTempSensor.addHumiditySensor(0, 100, 1);

libraries/Zigbee/src/ZigbeeEP.cpp

+19-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ bool ZigbeeEP::setManufacturerAndModel(const char *name, const char *model) {
6868
return ret_name == ESP_OK && ret_model == ESP_OK;
6969
}
7070

71-
bool ZigbeeEP::setPowerSource(zb_power_source_t power_source, uint8_t battery_percentage) {
71+
bool ZigbeeEP::setPowerSource(zb_power_source_t power_source, uint8_t battery_percentage, uint8_t battery_voltage) {
7272
esp_zb_attribute_list_t *basic_cluster = esp_zb_cluster_list_get_cluster(_cluster_list, ESP_ZB_ZCL_CLUSTER_ID_BASIC, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE);
7373
esp_err_t ret = esp_zb_cluster_update_attr(basic_cluster, ESP_ZB_ZCL_ATTR_BASIC_POWER_SOURCE_ID, (void *)&power_source);
7474
if (ret != ESP_OK) {
@@ -88,6 +88,11 @@ bool ZigbeeEP::setPowerSource(zb_power_source_t power_source, uint8_t battery_pe
8888
log_e("Failed to add battery percentage attribute: 0x%x: %s", ret, esp_err_to_name(ret));
8989
return false;
9090
}
91+
ret = esp_zb_power_config_cluster_add_attr(power_config_cluster, ESP_ZB_ZCL_ATTR_POWER_CONFIG_BATTERY_VOLTAGE_ID, (void *)&battery_voltage);
92+
if (ret != ESP_OK) {
93+
log_e("Failed to add battery percentage attribute: 0x%x: %s", ret, esp_err_to_name(ret));
94+
return false;
95+
}
9196
ret = esp_zb_cluster_list_add_power_config_cluster(_cluster_list, power_config_cluster, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE);
9297
if (ret != ESP_OK) {
9398
log_e("Failed to add power config cluster: 0x%x: %s", ret, esp_err_to_name(ret));
@@ -120,6 +125,19 @@ bool ZigbeeEP::setBatteryPercentage(uint8_t percentage) {
120125
return true;
121126
}
122127

128+
bool ZigbeeEP::setBatteryVoltage(uint8_t voltage) {
129+
esp_zb_zcl_status_t ret = ESP_ZB_ZCL_STATUS_SUCCESS;
130+
esp_zb_lock_acquire(portMAX_DELAY);
131+
ret = esp_zb_zcl_set_attribute_val(_endpoint, ESP_ZB_ZCL_CLUSTER_ID_POWER_CONFIG, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_POWER_CONFIG_BATTERY_VOLTAGE_ID, &voltage, false);
132+
esp_zb_lock_release();
133+
if (ret != ESP_ZB_ZCL_STATUS_SUCCESS) {
134+
log_e("Failed to set battery voltage: 0x%x: %s", ret, esp_zb_zcl_status_to_name(ret));
135+
return false;
136+
}
137+
log_v("Battery voltage updated");
138+
return true;
139+
}
140+
123141
bool ZigbeeEP::reportBatteryPercentage() {
124142
/* Send report attributes command */
125143
esp_zb_zcl_report_attr_cmd_t report_attr_cmd;

libraries/Zigbee/src/ZigbeeEP.h

+4-3
Original file line numberDiff line numberDiff line change
@@ -77,9 +77,10 @@ class ZigbeeEP {
7777
char *readModel(uint8_t endpoint, uint16_t short_addr, esp_zb_ieee_addr_t ieee_addr);
7878

7979
// Set Power source and battery percentage for battery powered devices
80-
bool setPowerSource(zb_power_source_t power_source, uint8_t percentage = 255);
81-
bool setBatteryPercentage(uint8_t percentage);
82-
bool reportBatteryPercentage();
80+
bool setPowerSource(zb_power_source_t power_source, uint8_t percentage = 0xff, uint8_t voltage = 0xff); // voltage in 100mV
81+
bool setBatteryPercentage(uint8_t percentage); // 0-100 %
82+
bool setBatteryVoltage(uint8_t voltage); // voltage in 100mV (example value 35 for 3.5V)
83+
bool reportBatteryPercentage(); // battery voltage is not reportable attribute
8384

8485
// Set time
8586
bool addTimeCluster(tm time = {}, int32_t gmt_offset = 0); // gmt offset in seconds

0 commit comments

Comments
 (0)