Skip to content

Commit be9c968

Browse files
committed
fix(zigbee): Fix TimeCluster missing status attribute
1 parent 7ff80d6 commit be9c968

File tree

2 files changed

+14
-2
lines changed

2 files changed

+14
-2
lines changed

Diff for: libraries/Zigbee/src/ZigbeeEP.cpp

+13-2
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ ZigbeeEP::ZigbeeEP(uint8_t endpoint) {
1919
_ep_config.endpoint = 0;
2020
_cluster_list = nullptr;
2121
_on_identify = nullptr;
22+
_time_status = 0;
2223
if (!lock) {
2324
lock = xSemaphoreCreateBinary();
2425
if (lock == NULL) {
@@ -240,7 +241,6 @@ void ZigbeeEP::zbIdentify(const esp_zb_zcl_set_attr_value_message_t *message) {
240241

241242
void ZigbeeEP::addTimeCluster(tm time, int32_t gmt_offset) {
242243
time_t utc_time = 0;
243-
244244
// Check if time is set
245245
if (time.tm_year > 0) {
246246
// Convert time to UTC
@@ -251,6 +251,7 @@ void ZigbeeEP::addTimeCluster(tm time, int32_t gmt_offset) {
251251
esp_zb_attribute_list_t *time_cluster_server = esp_zb_zcl_attr_list_create(ESP_ZB_ZCL_CLUSTER_ID_TIME);
252252
esp_zb_time_cluster_add_attr(time_cluster_server, ESP_ZB_ZCL_ATTR_TIME_TIME_ZONE_ID, (void *)&gmt_offset);
253253
esp_zb_time_cluster_add_attr(time_cluster_server, ESP_ZB_ZCL_ATTR_TIME_TIME_ID, (void *)&utc_time);
254+
esp_zb_time_cluster_add_attr(time_cluster_server, ESP_ZB_ZCL_ATTR_TIME_TIME_STATUS_ID, (void *)&_time_status);
254255
// Create time cluster client attributes
255256
esp_zb_attribute_list_t *time_cluster_client = esp_zb_zcl_attr_list_create(ESP_ZB_ZCL_CLUSTER_ID_TIME);
256257
// Add time clusters to cluster list
@@ -260,6 +261,7 @@ void ZigbeeEP::addTimeCluster(tm time, int32_t gmt_offset) {
260261

261262
void ZigbeeEP::setTime(tm time) {
262263
time_t utc_time = mktime(&time);
264+
log_d("Setting time to %lld", utc_time);
263265
esp_zb_lock_acquire(portMAX_DELAY);
264266
esp_zb_zcl_set_attribute_val(_endpoint, ESP_ZB_ZCL_CLUSTER_ID_TIME, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_TIME_TIME_ID, &utc_time, false);
265267
esp_zb_lock_release();
@@ -306,6 +308,14 @@ tm ZigbeeEP::getTime(uint8_t endpoint, int32_t short_addr, esp_zb_ieee_addr_t ie
306308

307309
struct tm *timeinfo = localtime(&_read_time);
308310
if (timeinfo) {
311+
// Update time
312+
setTime(*timeinfo);
313+
// Update time status to synced
314+
_time_status |= 0x02;
315+
esp_zb_lock_acquire(portMAX_DELAY);
316+
esp_zb_zcl_set_attribute_val(_endpoint, ESP_ZB_ZCL_CLUSTER_ID_TIME, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_TIME_TIME_STATUS_ID, &_time_status, false);
317+
esp_zb_lock_release();
318+
309319
return *timeinfo;
310320
} else {
311321
log_e("Error while converting time");
@@ -343,8 +353,9 @@ int32_t ZigbeeEP::getTimezone(uint8_t endpoint, int32_t short_addr, esp_zb_ieee_
343353
//Wait for response or timeout
344354
if (xSemaphoreTake(lock, ZB_CMD_TIMEOUT) != pdTRUE) {
345355
log_e("Error while reading timezone");
356+
return 0;
346357
}
347-
358+
setTimezone(_read_timezone);
348359
return _read_timezone;
349360
}
350361

Diff for: libraries/Zigbee/src/ZigbeeEP.h

+1
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,7 @@ class ZigbeeEP {
153153
std::list<zb_device_params_t *> _bound_devices;
154154
SemaphoreHandle_t lock;
155155
zb_power_source_t _power_source;
156+
uint8_t _time_status;
156157

157158
friend class ZigbeeCore;
158159
};

0 commit comments

Comments
 (0)