Skip to content

Commit 75be48b

Browse files
committed
SiliconLabsGH-24: Fix CC SWITCH_COLOR Duration param
Duration can be any value in the range 0x01..0xFD. For reference, see: CC:0000.00.00.11.015 CC:0033.02.05.11.007 Signed-off-by: Nenad Kljajic <nkljajic@control4.com>
1 parent 5ad3615 commit 75be48b

File tree

3 files changed

+129
-30
lines changed

3 files changed

+129
-30
lines changed

applications/zpc/components/zpc_rust/src/rust_command_handlers/zwave_command_classes/zwave_command_class_switch_color.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -327,9 +327,7 @@ fn switch_color_set(state_node: Attribute) -> Result<(sl_status_t, Vec<u8>), Att
327327
reserved: 0,
328328
},
329329
vg1: colors,
330-
// FIXME: UIC-1926 This SwitchColorSetFrame wants a SwitchColorSetDurationEnum for
331-
// the duration, which prevents me to use my duration found in the attribute store.
332-
duration: SwitchColorSetDurationEnum::Instantly,
330+
duration: _duration as u8,
333331
};
334332

335333
Ok((SL_STATUS_OK, set_frame.into()))

applications/zpc/components/zwave_command_classes/assets/ZWave_custom_cmd_classes.xml

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12970,7 +12970,10 @@
1297012970
<param key="0x00" name="Color Component ID" type="BYTE" />
1297112971
<param key="0x01" name="Value" type="BYTE" />
1297212972
</variant_group>
12973-
<param key="0x02" name="Duration" type="BYTE" />
12973+
<param key="0x02" name="Duration" type="BYTE">
12974+
<bitflag key="0x01" flagname="Instantly" flagmask="0x00" />
12975+
<bitflag key="0x02" flagname="Default" flagmask="0xFF" />
12976+
</param>
1297412977
</cmd>
1297512978
<cmd key="0x06" name="SWITCH_COLOR_START_LEVEL_CHANGE" help="Color Switch Start Level Change" support_mode="RX">
1297612979
<param key="0x00" name="Properties1" type="STRUCT_BYTE">
@@ -12998,10 +13001,10 @@
1299813001
<param key="0x00" name="Color Component ID" type="BYTE" />
1299913002
<param key="0x01" name="Current Value" type="BYTE" />
1300013003
<param key="0x02" name="Target Value" type="BYTE" />
13001-
<param key="0x03" name="Duration" type="CONST">
13002-
<const key="0x00" flagname="Already at the Target Value" flagmask="0x00" />
13003-
<const key="0x01" flagname="Unknown duration" flagmask="0xFE" />
13004-
<const key="0x02" flagname="Reserved" flagmask="0xFF" />
13004+
<param key="0x03" name="Duration" type="BYTE">
13005+
<bitflag key="0x00" flagname="Already at the Target Value" flagmask="0x00" />
13006+
<bitflag key="0x01" flagname="Unknown duration" flagmask="0xFE" />
13007+
<bitflag key="0x02" flagname="Reserved" flagmask="0xFF" />
1300513008
</param>
1300613009
</cmd>
1300713010
<cmd key="0x05" name="SWITCH_COLOR_SET" help="Color Switch Set" support_mode="RX">
@@ -13013,9 +13016,9 @@
1301313016
<param key="0x00" name="Color Component ID" type="BYTE" />
1301413017
<param key="0x01" name="Value" type="BYTE" />
1301513018
</variant_group>
13016-
<param key="0x02" name="Duration" type="CONST">
13017-
<const key="0x00" flagname="Instantly" flagmask="0x00" />
13018-
<const key="0x01" flagname="Default" flagmask="0xFF" />
13019+
<param key="0x02" name="Duration" type="BYTE">
13020+
<bitflag key="0x01" flagname="Instantly" flagmask="0x00" />
13021+
<bitflag key="0x02" flagname="Default" flagmask="0xFF" />
1301913022
</param>
1302013023
</cmd>
1302113024
<cmd key="0x06" name="SWITCH_COLOR_START_LEVEL_CHANGE" help="Color Switch Start Level Change" support_mode="RX">
@@ -13027,9 +13030,9 @@
1302713030
</param>
1302813031
<param key="0x01" name="Color Component ID" type="BYTE" />
1302913032
<param key="0x02" name="Start Level" type="BYTE" />
13030-
<param key="0x03" name="Duration" type="CONST">
13031-
<const key="0x00" flagname="Instantly" flagmask="0x00" />
13032-
<const key="0x01" flagname="Default" flagmask="0xFF" />
13033+
<param key="0x03" name="Duration" type="BYTE">
13034+
<bitflag key="0x01" flagname="Instantly" flagmask="0x00" />
13035+
<bitflag key="0x02" flagname="Default" flagmask="0xFF" />
1303313036
</param>
1303413037
</cmd>
1303513038
<cmd key="0x07" name="SWITCH_COLOR_STOP_LEVEL_CHANGE" help="Color Switch Stop Level Change" support_mode="RX">

applications/zpc/components/zwave_command_classes/src/zwave_command_class_switch_color.c

Lines changed: 114 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
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"
@@ -34,6 +35,38 @@
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]]
3770
static 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.
69130
static 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

Comments
 (0)