@@ -129,8 +129,8 @@ bool ZigbeeAnalog::setAnalogOutputApplication(uint32_t application_type) {
129129void ZigbeeAnalog::zbAttributeSet (const esp_zb_zcl_set_attr_value_message_t *message) {
130130 if (message->info .cluster == ESP_ZB_ZCL_CLUSTER_ID_ANALOG_OUTPUT) {
131131 if (message->attribute .id == ESP_ZB_ZCL_ATTR_ANALOG_OUTPUT_PRESENT_VALUE_ID && message->attribute .data .type == ESP_ZB_ZCL_ATTR_TYPE_SINGLE) {
132- float analog_output = *(float *)message->attribute .data .value ;
133- analogOutputChanged (analog_output );
132+ _output_state = *(float *)message->attribute .data .value ;
133+ analogOutputChanged ();
134134 } else {
135135 log_w (" Received message ignored. Attribute ID: %d not supported for Analog Output" , message->attribute .id );
136136 }
@@ -139,9 +139,9 @@ void ZigbeeAnalog::zbAttributeSet(const esp_zb_zcl_set_attr_value_message_t *mes
139139 }
140140}
141141
142- void ZigbeeAnalog::analogOutputChanged (float analog_output ) {
142+ void ZigbeeAnalog::analogOutputChanged () {
143143 if (_on_analog_output_change) {
144- _on_analog_output_change (analog_output );
144+ _on_analog_output_change (_output_state );
145145 } else {
146146 log_w (" No callback function set for analog output change" );
147147 }
@@ -166,6 +166,26 @@ bool ZigbeeAnalog::setAnalogInput(float analog) {
166166 return true ;
167167}
168168
169+ bool ZigbeeAnalog::setAnalogOutput (float analog) {
170+ esp_zb_zcl_status_t ret = ESP_ZB_ZCL_STATUS_SUCCESS;
171+ _output_state = analog;
172+ analogOutputChanged ();
173+
174+ log_v (" Updating analog output to %.2f" , analog);
175+ /* Update analog output */
176+ esp_zb_lock_acquire (portMAX_DELAY);
177+ ret = esp_zb_zcl_set_attribute_val (
178+ _endpoint, ESP_ZB_ZCL_CLUSTER_ID_ANALOG_OUTPUT, ESP_ZB_ZCL_CLUSTER_SERVER_ROLE, ESP_ZB_ZCL_ATTR_ANALOG_OUTPUT_PRESENT_VALUE_ID, &_output_state, false
179+ );
180+ esp_zb_lock_release ();
181+
182+ if (ret != ESP_ZB_ZCL_STATUS_SUCCESS) {
183+ log_e (" Failed to set analog output: 0x%x: %s" , ret, esp_zb_zcl_status_to_name (ret));
184+ return false ;
185+ }
186+ return true ;
187+ }
188+
169189bool ZigbeeAnalog::reportAnalogInput () {
170190 /* Send report attributes command */
171191 esp_zb_zcl_report_attr_cmd_t report_attr_cmd;
@@ -187,6 +207,27 @@ bool ZigbeeAnalog::reportAnalogInput() {
187207 return true ;
188208}
189209
210+ bool ZigbeeAnalog::reportAnalogOutput () {
211+ /* Send report attributes command */
212+ esp_zb_zcl_report_attr_cmd_t report_attr_cmd;
213+ report_attr_cmd.address_mode = ESP_ZB_APS_ADDR_MODE_DST_ADDR_ENDP_NOT_PRESENT;
214+ report_attr_cmd.attributeID = ESP_ZB_ZCL_ATTR_ANALOG_OUTPUT_PRESENT_VALUE_ID;
215+ report_attr_cmd.direction = ESP_ZB_ZCL_CMD_DIRECTION_TO_CLI;
216+ report_attr_cmd.clusterID = ESP_ZB_ZCL_CLUSTER_ID_ANALOG_OUTPUT;
217+ report_attr_cmd.zcl_basic_cmd .src_endpoint = _endpoint;
218+ report_attr_cmd.manuf_code = ESP_ZB_ZCL_ATTR_NON_MANUFACTURER_SPECIFIC;
219+
220+ esp_zb_lock_acquire (portMAX_DELAY);
221+ esp_err_t ret = esp_zb_zcl_report_attr_cmd_req (&report_attr_cmd);
222+ esp_zb_lock_release ();
223+ if (ret != ESP_OK) {
224+ log_e (" Failed to send Analog Output report: 0x%x: %s" , ret, esp_err_to_name (ret));
225+ return false ;
226+ }
227+ log_v (" Analog Output report sent" );
228+ return true ;
229+ }
230+
190231bool ZigbeeAnalog::setAnalogInputReporting (uint16_t min_interval, uint16_t max_interval, float delta) {
191232 esp_zb_zcl_reporting_info_t reporting_info;
192233 memset (&reporting_info, 0 , sizeof (esp_zb_zcl_reporting_info_t ));
0 commit comments