Skip to content

Commit

Permalink
Add Zigbee Dimmable light endpoint class (copy of color dimmable light)
Browse files Browse the repository at this point in the history
  • Loading branch information
FaBjE committed Dec 13, 2024
1 parent fb6e977 commit 0d3656d
Show file tree
Hide file tree
Showing 2 changed files with 196 additions and 0 deletions.
93 changes: 93 additions & 0 deletions libraries/Zigbee/src/ep/ZigbeeDimmableLight.cpp
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
103 changes: 103 additions & 0 deletions libraries/Zigbee/src/ep/ZigbeeDimmableLight.h
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

0 comments on commit 0d3656d

Please sign in to comment.