ESPHome 2026.3.0-dev
Loading...
Searching...
No Matches
zigbee_number_zephyr.cpp
Go to the documentation of this file.
2#if defined(USE_ZIGBEE) && defined(USE_NRF52) && defined(USE_NUMBER)
3#include "esphome/core/log.h"
4extern "C" {
5#include <zboss_api.h>
6#include <zboss_api_addons.h>
7#include <zb_nrf_platform.h>
8#include <zigbee/zigbee_app_utils.h>
9#include <zb_error_to_string.h>
10}
11namespace esphome::zigbee {
12
13static const char *const TAG = "zigbee.number";
14
16 this->parent_->add_callback(this->endpoint_, [this](zb_bufid_t bufid) { this->zcl_device_cb_(bufid); });
17 this->number_->add_on_state_callback([this](float state) {
19 ESP_LOGD(TAG, "Set attribute endpoint: %d, present_value %f", this->endpoint_,
21 ZB_ZCL_SET_ATTRIBUTE(this->endpoint_, ZB_ZCL_CLUSTER_ID_ANALOG_OUTPUT, ZB_ZCL_CLUSTER_SERVER_ROLE,
23 ZB_FALSE);
24 this->parent_->force_report();
25 });
26}
27
29 ESP_LOGCONFIG(TAG,
30 "Zigbee Number\n"
31 " Endpoint: %d, present_value %f",
33}
34
35void ZigbeeNumber::zcl_device_cb_(zb_bufid_t bufid) {
36 zb_zcl_device_callback_param_t *p_device_cb_param = ZB_BUF_GET_PARAM(bufid, zb_zcl_device_callback_param_t);
37 zb_zcl_device_callback_id_t device_cb_id = p_device_cb_param->device_cb_id;
38 zb_uint16_t cluster_id = p_device_cb_param->cb_param.set_attr_value_param.cluster_id;
39 zb_uint16_t attr_id = p_device_cb_param->cb_param.set_attr_value_param.attr_id;
40
41 switch (device_cb_id) {
42 /* ZCL set attribute value */
43 case ZB_ZCL_SET_ATTR_VALUE_CB_ID:
44 if (cluster_id == ZB_ZCL_CLUSTER_ID_ANALOG_OUTPUT) {
45 ESP_LOGI(TAG, "Analog output attribute setting");
47 float value =
48 *reinterpret_cast<const float *>(&p_device_cb_param->cb_param.set_attr_value_param.values.data32);
49 this->defer([this, value]() {
51 auto call = this->number_->make_call();
52 call.set_value(value);
53 call.perform();
54 });
55 }
56 } else {
57 /* other clusters attribute handled here */
58 ESP_LOGI(TAG, "Unhandled cluster attribute id: %d", cluster_id);
59 p_device_cb_param->status = RET_NOT_IMPLEMENTED;
60 }
61 break;
62 default:
63 p_device_cb_param->status = RET_NOT_IMPLEMENTED;
64 break;
65 }
66
67 ESP_LOGD(TAG, "%s status: %hd", __func__, p_device_cb_param->status);
68}
69
71
72static zb_ret_t check_value_analog_server(zb_uint16_t attr_id, zb_uint8_t endpoint,
73 zb_uint8_t *value) { // NOLINT(readability-non-const-parameter)
74 zb_ret_t ret = RET_OK;
75 ZVUNUSED(endpoint);
76
77 switch (attr_id) {
79 ret = ZB_ZCL_CHECK_BOOL_VALUE(*value) ? RET_OK : RET_ERROR;
80 break;
82 break;
83
86 ret = RET_ERROR;
87 }
88 break;
89
90 default:
91 break;
92 }
93
94 return ret;
95}
96
97} // namespace esphome::zigbee
98
100 zb_zcl_add_cluster_handlers(ZB_ZCL_CLUSTER_ID_ANALOG_OUTPUT, ZB_ZCL_CLUSTER_SERVER_ROLE,
101 esphome::zigbee::check_value_analog_server, (zb_zcl_cluster_write_attr_hook_t) NULL,
102 (zb_zcl_cluster_handler_t) NULL);
103}
104
106 zb_zcl_add_cluster_handlers(ZB_ZCL_CLUSTER_ID_ANALOG_OUTPUT, ZB_ZCL_CLUSTER_CLIENT_ROLE,
107 (zb_zcl_cluster_check_value_t) NULL, (zb_zcl_cluster_write_attr_hook_t) NULL,
108 (zb_zcl_cluster_handler_t) NULL);
109}
110
111#endif
ESPDEPRECATED("Use const char* overload instead. Removed in 2026.7.0", "2026.1.0") void defer(const std voi defer)(const char *name, std::function< void()> &&f)
Defer a callback to the next loop() call.
Definition component.h:479
NumberCall & set_value(float value)
NumberCall make_call()
Definition number.h:35
void add_on_state_callback(std::function< void(float)> &&callback)
Definition number.cpp:32
void add_callback(zb_uint8_t endpoint, std::function< void(zb_bufid_t bufid)> &&cb)
void zcl_device_cb_(zb_bufid_t bufid)
bool state
Definition fan.h:0
const char *const TAG
Definition spi.cpp:7
const zb_uint8_t ZB_ZCL_ANALOG_OUTPUT_STATUS_FLAG_MAX_VALUE
void zb_zcl_analog_output_init_server()
void zb_zcl_analog_output_init_client()
@ ZB_ZCL_ATTR_ANALOG_OUTPUT_PRESENT_VALUE_ID
@ ZB_ZCL_ATTR_ANALOG_OUTPUT_OUT_OF_SERVICE_ID
@ ZB_ZCL_ATTR_ANALOG_OUTPUT_STATUS_FLAG_ID