feat(Zigbee): Add Zigbee Dimmable light endpoint class
Add a endpoint type class for a dimmable light. Based on a copy of color dimmable light.
This commit is contained in:
parent
7dc1c92813
commit
a44e45795c
3 changed files with 197 additions and 0 deletions
|
|
@ -9,6 +9,7 @@
|
|||
// Endpoints
|
||||
#include "ep/ZigbeeLight.h"
|
||||
#include "ep/ZigbeeSwitch.h"
|
||||
#include "ep/ZigbeeDimmableLight.h"
|
||||
#include "ep/ZigbeeColorDimmableLight.h"
|
||||
#include "ep/ZigbeeColorDimmerSwitch.h"
|
||||
#include "ep/ZigbeeTempSensor.h"
|
||||
|
|
|
|||
93
libraries/Zigbee/src/ep/ZigbeeDimmableLight.cpp
Normal file
93
libraries/Zigbee/src/ep/ZigbeeDimmableLight.cpp
Normal file
|
|
@ -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
libraries/Zigbee/src/ep/ZigbeeDimmableLight.h
Normal file
103
libraries/Zigbee/src/ep/ZigbeeDimmableLight.h
Normal file
|
|
@ -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
|
||||
Loading…
Reference in a new issue