-
Notifications
You must be signed in to change notification settings - Fork 7.5k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add Zigbee Dimmable light endpoint class (copy of color dimmable light)
- Loading branch information
Showing
2 changed files
with
196 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,93 @@ | ||
|
||
#include "ZigbeeDimmableLight.h" | ||
#if SOC_IEEE802154_SUPPORTED | ||
|
||
#include "esp_zigbee_cluster.h" | ||
|
||
ZigbeeDimmableLight::ZigbeeDimmableLight(uint8_t endpoint) : ZigbeeEP(endpoint) | ||
{ | ||
_device_id = ESP_ZB_HA_DIMMABLE_LIGHT_DEVICE_ID; | ||
|
||
esp_zb_dimmable_light_cfg_t light_cfg = ESP_ZB_DEFAULT_DIMMABLE_LIGHT_CONFIG(); | ||
_cluster_list = esp_zb_dimmable_light_clusters_create(&light_cfg); | ||
|
||
_ep_config = {.endpoint = _endpoint, .app_profile_id = ESP_ZB_AF_HA_PROFILE_ID, .app_device_id = ESP_ZB_HA_DIMMABLE_LIGHT_DEVICE_ID, .app_device_version = 0}; | ||
|
||
// set default values | ||
_current_state = false; | ||
_current_level = 255; | ||
} | ||
|
||
// set attribute method -> method overridden in child class | ||
void ZigbeeDimmableLight::zbAttributeSet(const esp_zb_zcl_set_attr_value_message_t *message) | ||
{ | ||
// check the data and call right method | ||
if (message->info.cluster == ESP_ZB_ZCL_CLUSTER_ID_ON_OFF) | ||
{ | ||
if (message->attribute.id == ESP_ZB_ZCL_ATTR_ON_OFF_ON_OFF_ID && message->attribute.data.type == ESP_ZB_ZCL_ATTR_TYPE_BOOL) | ||
{ | ||
if (_current_state != *(bool *)message->attribute.data.value) | ||
{ | ||
_current_state = *(bool *)message->attribute.data.value; | ||
lightChanged(); | ||
} | ||
return; | ||
} | ||
else | ||
{ | ||
log_w("Received message ignored. Attribute ID: %d not supported for On/Off Light", message->attribute.id); | ||
} | ||
} | ||
else if (message->info.cluster == ESP_ZB_ZCL_CLUSTER_ID_LEVEL_CONTROL) | ||
{ | ||
if (message->attribute.id == ESP_ZB_ZCL_ATTR_LEVEL_CONTROL_CURRENT_LEVEL_ID && message->attribute.data.type == ESP_ZB_ZCL_ATTR_TYPE_U8) | ||
{ | ||
if (_current_level != *(uint8_t *)message->attribute.data.value) | ||
{ | ||
_current_level = *(uint8_t *)message->attribute.data.value; | ||
lightChanged(); | ||
} | ||
return; | ||
} | ||
else | ||
{ | ||
log_w("Received message ignored. Attribute ID: %d not supported for Level Control", message->attribute.id); | ||
// TODO: implement more attributes -> includes/zcl/esp_zigbee_zcl_level.h | ||
} | ||
} | ||
else | ||
{ | ||
log_w("Received message ignored. Cluster ID: %d not supported for Color dimmable Light", message->info.cluster); | ||
} | ||
} | ||
|
||
void ZigbeeDimmableLight::lightChanged() | ||
{ | ||
if (_on_light_change) | ||
{ | ||
_on_light_change(_current_state, _current_level); | ||
} | ||
} | ||
|
||
esp_zb_cluster_list_t *ZigbeeDimmableLight::esp_zb_dimmable_light_clusters_create(esp_zb_dimmable_light_cfg_t *light_cfg) | ||
{ | ||
esp_zb_attribute_list_t *esp_zb_basic_cluster = esp_zb_basic_cluster_create(&light_cfg->basic_cfg); | ||
esp_zb_attribute_list_t *esp_zb_identify_cluster = esp_zb_identify_cluster_create(&light_cfg->identify_cfg); | ||
esp_zb_attribute_list_t *esp_zb_groups_cluster = esp_zb_groups_cluster_create(&light_cfg->groups_cfg); | ||
esp_zb_attribute_list_t *esp_zb_scenes_cluster = esp_zb_scenes_cluster_create(&light_cfg->scenes_cfg); | ||
esp_zb_attribute_list_t *esp_zb_on_off_cluster = esp_zb_on_off_cluster_create(&light_cfg->on_off_cfg); | ||
esp_zb_attribute_list_t *esp_zb_level_cluster = esp_zb_level_cluster_create(&light_cfg->level_cfg); | ||
|
||
// ------------------------------ Create cluster list ------------------------------ | ||
esp_zb_cluster_list_t *esp_zb_cluster_list = esp_zb_zcl_cluster_list_create(); | ||
esp_zb_cluster_list_add_basic_cluster(esp_zb_cluster_list, esp_zb_basic_cluster, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); | ||
esp_zb_cluster_list_add_identify_cluster(esp_zb_cluster_list, esp_zb_identify_cluster, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); | ||
esp_zb_cluster_list_add_groups_cluster(esp_zb_cluster_list, esp_zb_groups_cluster, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); | ||
esp_zb_cluster_list_add_scenes_cluster(esp_zb_cluster_list, esp_zb_scenes_cluster, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); | ||
esp_zb_cluster_list_add_on_off_cluster(esp_zb_cluster_list, esp_zb_on_off_cluster, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); | ||
esp_zb_cluster_list_add_level_cluster(esp_zb_cluster_list, esp_zb_level_cluster, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE); | ||
|
||
return esp_zb_cluster_list; | ||
} | ||
|
||
#endif // SOC_IEEE802154_SUPPORTED |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,103 @@ | ||
/* Class of Zigbee On/Off Light endpoint inherited from common EP class */ | ||
|
||
#pragma once | ||
|
||
#include "soc/soc_caps.h" | ||
#if SOC_IEEE802154_SUPPORTED | ||
|
||
#include "ZigbeeEP.h" | ||
#include "ha/esp_zigbee_ha_standard.h" | ||
|
||
/** | ||
* @brief Zigbee HA standard dimmable light device clusters. | ||
* Added here as not supported by ESP Zigbee library. | ||
* | ||
* | ||
*/ | ||
typedef struct esp_zb_dimmable_light_cfg_s | ||
{ | ||
esp_zb_basic_cluster_cfg_t basic_cfg; /*!< Basic cluster configuration, @ref esp_zb_basic_cluster_cfg_s */ | ||
esp_zb_identify_cluster_cfg_t identify_cfg; /*!< Identify cluster configuration, @ref esp_zb_identify_cluster_cfg_s */ | ||
esp_zb_groups_cluster_cfg_t groups_cfg; /*!< Groups cluster configuration, @ref esp_zb_groups_cluster_cfg_s */ | ||
esp_zb_scenes_cluster_cfg_t scenes_cfg; /*!< Scenes cluster configuration, @ref esp_zb_scenes_cluster_cfg_s */ | ||
esp_zb_on_off_cluster_cfg_t on_off_cfg; /*!< On off cluster configuration, @ref esp_zb_on_off_cluster_cfg_s */ | ||
esp_zb_level_cluster_cfg_t level_cfg; /*!< Level cluster configuration, @ref esp_zb_level_cluster_cfg_s */ | ||
} esp_zb_dimmable_light_cfg_t; | ||
|
||
/** | ||
* @brief Zigbee HA standard dimmable light device default config value. | ||
* Added here as not supported by ESP Zigbee library. | ||
* | ||
*/ | ||
#define ESP_ZB_DEFAULT_DIMMABLE_LIGHT_CONFIG() \ | ||
{ \ | ||
.basic_cfg = \ | ||
{ \ | ||
.zcl_version = ESP_ZB_ZCL_BASIC_ZCL_VERSION_DEFAULT_VALUE, \ | ||
.power_source = ESP_ZB_ZCL_BASIC_POWER_SOURCE_DEFAULT_VALUE, \ | ||
}, \ | ||
.identify_cfg = \ | ||
{ \ | ||
.identify_time = ESP_ZB_ZCL_IDENTIFY_IDENTIFY_TIME_DEFAULT_VALUE, \ | ||
}, \ | ||
.groups_cfg = \ | ||
{ \ | ||
.groups_name_support_id = ESP_ZB_ZCL_GROUPS_NAME_SUPPORT_DEFAULT_VALUE, \ | ||
}, \ | ||
.scenes_cfg = \ | ||
{ \ | ||
.scenes_count = ESP_ZB_ZCL_SCENES_SCENE_COUNT_DEFAULT_VALUE, \ | ||
.current_scene = ESP_ZB_ZCL_SCENES_CURRENT_SCENE_DEFAULT_VALUE, \ | ||
.current_group = ESP_ZB_ZCL_SCENES_CURRENT_GROUP_DEFAULT_VALUE, \ | ||
.scene_valid = ESP_ZB_ZCL_SCENES_SCENE_VALID_DEFAULT_VALUE, \ | ||
.name_support = ESP_ZB_ZCL_SCENES_NAME_SUPPORT_DEFAULT_VALUE, \ | ||
}, \ | ||
.on_off_cfg = \ | ||
{ \ | ||
.on_off = ESP_ZB_ZCL_ON_OFF_ON_OFF_DEFAULT_VALUE, \ | ||
}, \ | ||
.level_cfg = \ | ||
{ \ | ||
.current_level = ESP_ZB_ZCL_LEVEL_CONTROL_CURRENT_LEVEL_DEFAULT_VALUE, \ | ||
}, \ | ||
} | ||
|
||
class ZigbeeDimmableLight : public ZigbeeEP | ||
{ | ||
public: | ||
ZigbeeDimmableLight(uint8_t endpoint); | ||
~ZigbeeDimmableLight(); | ||
|
||
void onLightChange(void (*callback)(bool, uint8_t)) | ||
{ | ||
_on_light_change = callback; | ||
} | ||
void restoreLight() | ||
{ | ||
lightChanged(); | ||
} | ||
|
||
private: | ||
void zbAttributeSet(const esp_zb_zcl_set_attr_value_message_t *message) override; | ||
|
||
void lightChanged(); | ||
// callback function to be called on light change (State, Level) | ||
void (*_on_light_change)(bool, uint8_t); | ||
|
||
/** | ||
* @brief Create a standard HA dimmable light cluster list. | ||
* Added here as not supported by ESP Zigbee library. | ||
* | ||
* @note This contains basic, identify, groups, scenes, on-off, level, as server side. | ||
* @param[in] light_cfg Configuration parameters for this cluster lists defined by @ref esp_zb_dimmable_light_cfg_t | ||
* | ||
* @return Pointer to cluster list @ref esp_zb_cluster_list_s | ||
* | ||
*/ | ||
esp_zb_cluster_list_t *esp_zb_dimmable_light_clusters_create(esp_zb_dimmable_light_cfg_t *light_cfg); | ||
|
||
bool _current_state; | ||
uint8_t _current_level; | ||
}; | ||
|
||
#endif // SOC_IEEE802154_SUPPORTED |