2424#include "attribute_store_defined_attribute_types.h"
2525#include "ZW_classcmd.h"
2626#include "zpc_attribute_resolver.h"
27+ #include "zwave_command_classes_utils.h"
2728
2829// Includes from other Unify Components
2930#include "dotdot_mqtt.h"
3435#include "attribute_timeouts.h"
3536#include "sl_log.h"
3637
38+ #define LOG_TAG "zwave_command_class_switch_color"
39+
40+ [[maybe_unused ]]
41+ static void set_desired_duration (attribute_store_node_t state_node ,
42+ uint32_t duration )
43+ {
44+ attribute_store_node_t duration_node
45+ = attribute_store_get_first_child_by_type (
46+ state_node ,
47+ ATTRIBUTE_COMMAND_CLASS_SWITCH_COLOR_DURATION );
48+
49+ attribute_store_set_node_attribute_value (duration_node ,
50+ DESIRED_ATTRIBUTE ,
51+ (uint8_t * )& duration ,
52+ sizeof (duration ));
53+ }
54+
55+ static void set_reported_duration (attribute_store_node_t state_node ,
56+ uint32_t duration )
57+ {
58+ attribute_store_node_t duration_node
59+ = attribute_store_get_first_child_by_type (
60+ state_node ,
61+ ATTRIBUTE_COMMAND_CLASS_SWITCH_COLOR_DURATION );
62+
63+ attribute_store_set_node_attribute_value (duration_node ,
64+ REPORTED_ATTRIBUTE ,
65+ (uint8_t * )& duration ,
66+ sizeof (duration ));
67+ }
68+
69+ [[maybe_unused ]]
3770static void
3871 set_all_color_switch_durations (attribute_store_node_t state_node ,
3972 attribute_store_node_value_state_t value_state ,
@@ -64,6 +97,34 @@ static void
6497 }
6598}
6699
100+ static void switch_color_undefine_reported (attribute_store_node_t state_node )
101+ {
102+ zwave_command_class_switch_color_invoke_on_all_attributes_with_return_value (
103+ state_node ,
104+ ATTRIBUTE_COMMAND_CLASS_SWITCH_COLOR_VALUE ,
105+ attribute_stop_transition );
106+
107+ attribute_store_node_t duration_node
108+ = attribute_store_get_first_child_by_type (
109+ state_node ,
110+ ATTRIBUTE_COMMAND_CLASS_SWITCH_COLOR_DURATION );
111+ color_component_id_duration_t duration = 0 ;
112+ attribute_store_undefine_desired (duration_node );
113+ attribute_store_set_reported (duration_node ,
114+ & duration ,
115+ sizeof (duration ));
116+
117+ sl_log_debug (LOG_TAG , "Transition time expired, probe color" );
118+ zwave_command_class_switch_color_invoke_on_all_attributes (
119+ state_node ,
120+ ATTRIBUTE_COMMAND_CLASS_SWITCH_COLOR_VALUE ,
121+ attribute_store_undefine_desired );
122+ zwave_command_class_switch_color_invoke_on_all_attributes (
123+ state_node ,
124+ ATTRIBUTE_COMMAND_CLASS_SWITCH_COLOR_VALUE ,
125+ attribute_store_undefine_reported );
126+ }
127+
67128// FIXME: UIC-1901 This function belongs to zwave_command_class_switch_color.rs, but this
68129// component really cannot interact with the attribute resolver.
69130static void
@@ -78,12 +139,22 @@ static void
78139 return ;
79140 }
80141
142+ attribute_store_node_t duration_node
143+ = attribute_store_get_first_child_by_type (
144+ state_node ,
145+ ATTRIBUTE_COMMAND_CLASS_SWITCH_COLOR_DURATION );
146+
147+ color_component_id_duration_t duration = 0 ;
148+ attribute_store_get_desired (duration_node ,
149+ & duration ,
150+ sizeof (duration ));
151+
152+ clock_time_t zwave_desired_duration
153+ = zwave_duration_to_time ((uint8_t )duration );
154+
81155 switch (event ) {
82156 case FRAME_SENT_EVENT_OK_SUPERVISION_WORKING :
83- zwave_command_class_switch_color_invoke_on_all_attributes_with_return_value (
84- state_node ,
85- ATTRIBUTE_COMMAND_CLASS_SWITCH_COLOR_DURATION ,
86- & attribute_store_set_reported_as_desired );
157+ attribute_store_set_reported_as_desired (duration_node );
87158 break ;
88159
89160 case FRAME_SENT_EVENT_OK_SUPERVISION_SUCCESS :
@@ -95,11 +166,44 @@ static void
95166 state_node ,
96167 ATTRIBUTE_COMMAND_CLASS_SWITCH_COLOR_VALUE ,
97168 & attribute_store_undefine_desired );
98- set_all_color_switch_durations (state_node , REPORTED_ATTRIBUTE , 0 );
99- set_all_color_switch_durations (state_node , DESIRED_ATTRIBUTE , 0 );
169+ set_reported_duration (state_node , 0 );
170+ attribute_store_undefine_desired (duration_node );
171+ break ;
172+
173+ case FRAME_SENT_EVENT_OK_NO_SUPERVISION :
174+ zwave_command_class_switch_color_invoke_on_all_attributes_with_return_value (
175+ state_node ,
176+ ATTRIBUTE_COMMAND_CLASS_SWITCH_COLOR_VALUE ,
177+ attribute_stop_transition );
178+ if (zwave_desired_duration > 0 ) {
179+ // Should we estimate reported color values during transition
180+ // and publish them as reported, like we did for level cluster?
181+
182+ zwave_command_class_switch_color_invoke_on_all_attributes (
183+ state_node ,
184+ ATTRIBUTE_COMMAND_CLASS_SWITCH_COLOR_VALUE ,
185+ attribute_store_undefine_desired );
186+
187+ attribute_store_set_reported_as_desired (duration_node );
188+ attribute_store_undefine_desired (duration_node );
189+
190+ // Probe again after this duration
191+ attribute_timeout_set_callback (state_node ,
192+ zwave_desired_duration + PROBE_BACK_OFF ,
193+ & switch_color_undefine_reported );
194+ } else {
195+ zwave_command_class_switch_color_invoke_on_all_attributes (
196+ state_node ,
197+ ATTRIBUTE_COMMAND_CLASS_SWITCH_COLOR_VALUE ,
198+ attribute_store_undefine_desired );
199+ zwave_command_class_switch_color_invoke_on_all_attributes (
200+ state_node ,
201+ ATTRIBUTE_COMMAND_CLASS_SWITCH_COLOR_VALUE ,
202+ attribute_store_undefine_reported );
203+ attribute_store_undefine_desired (duration_node );
204+ }
100205 break ;
101206
102- // FRAME_SENT_EVENT_OK_NO_SUPERVISION:
103207 // FRAME_SENT_EVENT_OK_SUPERVISION_NO_SUPPORT:
104208 // FRAME_SENT_EVENT_OK_SUPERVISION_FAIL:
105209 default :
@@ -115,14 +219,8 @@ static void
115219 state_node ,
116220 ATTRIBUTE_COMMAND_CLASS_SWITCH_COLOR_VALUE ,
117221 & attribute_store_undefine_reported );
118- zwave_command_class_switch_color_invoke_on_all_attributes (
119- state_node ,
120- ATTRIBUTE_COMMAND_CLASS_SWITCH_COLOR_DURATION ,
121- & attribute_store_undefine_desired );
122- zwave_command_class_switch_color_invoke_on_all_attributes (
123- state_node ,
124- ATTRIBUTE_COMMAND_CLASS_SWITCH_COLOR_DURATION ,
125- & attribute_store_undefine_reported );
222+ attribute_store_undefine_desired (duration_node );
223+ attribute_store_undefine_reported (duration_node );
126224 break ;
127225 }
128226
@@ -190,4 +288,4 @@ void zwave_command_class_switch_color_invoke_on_all_attributes_with_return_value
190288 ATTRIBUTE_COMMAND_CLASS_SWITCH_COLOR_COLOR_COMPONENT_ID ,
191289 index );
192290 }
193- }
291+ }
0 commit comments