Skip to content

Commit 7afa12b

Browse files
committed
GH-32: Thermostat Mode CC correctly exposed to MQTT
Forwarded: #32 Bug-SiliconLabs: UIC-3069 Bug-Github: #32
1 parent 3b43b68 commit 7afa12b

24 files changed

+835
-25
lines changed

applications/dev_ui/dev_gui/zap-generated/src/cluster-types/cluster-type-attributes.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//This file is generated automatically. Don't try to change something here.
22
//To add support for new clusters, modify addon-helper.js
33
//To change the stucture of the ClusterTypeAttrs, modify cluster-type-attributes.zapt
4-
4+
55

66
//generate ClusterTypes
77
export let ClusterTypeAttrs: any = {
@@ -8657,7 +8657,17 @@ export let ClusterTypeAttrs: any = {
86578657
{ name: "Precooling", value: 6},
86588658
{ name: "FanOnly", value: 7},
86598659
{ name: "Dry", value: 8},
8660-
{ name: "Sleep", value: 9}
8660+
{ name: "Sleep", value: 9},
8661+
{ name: "AuxiliaryHeat", value: 10},
8662+
{ name: "Resume", value: 11},
8663+
{ name: "Furnace", value: 12},
8664+
{ name: "MoistAir", value: 13},
8665+
{ name: "AutoChangeover", value: 14},
8666+
{ name: "EnergySaveHeat", value: 15},
8667+
{ name: "EnergySaveCool", value: 16},
8668+
{ name: "Away", value: 17},
8669+
{ name: "FullPower", value: 18},
8670+
{ name: "ManufacturerSpecific", value: 19}
86618671
],
86628672
},
86638673
{

applications/zpc/components/dotdot_mapper/rules/Thermostat.uam

Lines changed: 38 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ def zb_MinSetpointDeadBand 0x02010019
3737
def zb_RemoteSensing 0x0201001a
3838
def zb_ControlSequenceOfOperation 0x0201001b
3939
def zb_SystemMode 0x0201001c
40+
def zb_SupportedSystemMode 0x0201011c
4041
def zb_TemperatureSetpointHold 0x02010023
4142
def zb_TemperatureSetpointHoldDuration 0x02010024
4243
def zb_ThermostatProgrammingOperationMode 0x02010025
@@ -131,23 +132,44 @@ scope 0 {
131132

132133

133134
r'zb_SystemMode =
134-
if (r'zwTHERMOSTAT_MODE == 0) 0
135-
if (r'zwTHERMOSTAT_MODE == 1) 4
136-
if (r'zwTHERMOSTAT_MODE == 2) 3
137-
if (r'zwTHERMOSTAT_MODE == 3) 1
138-
if (r'zwTHERMOSTAT_MODE == 6) 7
139-
if (r'zwTHERMOSTAT_MODE == 8) 8
135+
if (r'zwTHERMOSTAT_MODE == 0x00) 0x00
136+
if (r'zwTHERMOSTAT_MODE == 0x01) 0x04
137+
if (r'zwTHERMOSTAT_MODE == 0x02) 0x03
138+
if (r'zwTHERMOSTAT_MODE == 0x03) 0x01
139+
if (r'zwTHERMOSTAT_MODE == 0x04) 0x0A
140+
if (r'zwTHERMOSTAT_MODE == 0x05) 0x0B
141+
if (r'zwTHERMOSTAT_MODE == 0x06) 0x07
142+
if (r'zwTHERMOSTAT_MODE == 0x07) 0x0C
143+
if (r'zwTHERMOSTAT_MODE == 0x08) 0x08
144+
if (r'zwTHERMOSTAT_MODE == 0x09) 0x0D
145+
if (r'zwTHERMOSTAT_MODE == 0x0A) 0x0E
146+
if (r'zwTHERMOSTAT_MODE == 0x0B) 0x0F
147+
if (r'zwTHERMOSTAT_MODE == 0x0C) 0x10
148+
if (r'zwTHERMOSTAT_MODE == 0x0D) 0x11
149+
if (r'zwTHERMOSTAT_MODE == 0x0F) 0x12
150+
if (r'zwTHERMOSTAT_MODE == 0x1F) 0x13
140151
undefined
141152

142-
d'zwTHERMOSTAT_MODE =
143-
if ( d'zb_SystemMode == 0) 0
144-
if ( d'zb_SystemMode == 4) 1
145-
if ( d'zb_SystemMode == 3) 2
146-
if ( d'zb_SystemMode == 1) 3
147-
if ( d'zb_SystemMode == 7) 6
148-
if ( d'zb_SystemMode == 8) 8
153+
r'zwTHERMOSTAT_MODE =
154+
if (r'zb_SystemMode == 0x00) 0x00
155+
if (r'zb_SystemMode == 0x04) 0x01
156+
if (r'zb_SystemMode == 0x03) 0x02
157+
if (r'zb_SystemMode == 0x01) 0x03
158+
if (r'zb_SystemMode == 0x0A) 0x04
159+
if (r'zb_SystemMode == 0x0B) 0x05
160+
if (r'zb_SystemMode == 0x07) 0x06
161+
if (r'zb_SystemMode == 0x0C) 0x07
162+
if (r'zb_SystemMode == 0x08) 0x08
163+
if (r'zb_SystemMode == 0x0D) 0x09
164+
if (r'zb_SystemMode == 0x0E) 0x0A
165+
if (r'zb_SystemMode == 0x0F) 0x0B
166+
if (r'zb_SystemMode == 0x10) 0x0C
167+
if (r'zb_SystemMode == 0x11) 0x0D
168+
if (r'zb_SystemMode == 0x12) 0x0F
169+
if (r'zb_SystemMode == 0x13) 0x1F
149170
undefined
150171

172+
151173
r'zb_ControlSequenceOfOperation =
152174
if(((r'zwTHERMOSTAT_SUPPORTED_MODES) & 6) == 0x06) 0x04
153175
if(((r'zwTHERMOSTAT_SUPPORTED_MODES) & 6) == 0x02) 0x02
@@ -252,4 +274,7 @@ scope 0 chain_reaction(0) {
252274
d'zb_ACCapacityFormat =
253275
if (r'zb_ACCapacityFormat != d'zb_ACCapacityFormat) r'zb_ACCapacityFormat
254276
undefined
277+
278+
279+
r'zb_SupportedSystemMode = r'zwTHERMOSTAT_SUPPORTED_MODES
255280
}

applications/zpc/components/zpc_attribute_store/src/zpc_attribute_store_type_registration.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,7 @@ static const std::vector<attribute_schema_t> attribute_schema = {
289289
/////////////////////////////////////////////////////////////////////
290290
{ATTRIBUTE_COMMAND_CLASS_THERMOSTAT_MODE_VERSION, "Thermostat Mode Version", ATTRIBUTE_ENDPOINT_ID, U8_STORAGE_TYPE},
291291
{ATTRIBUTE_COMMAND_CLASS_THERMOSTAT_MODE, "Thermostat Mode", ATTRIBUTE_ENDPOINT_ID, I32_STORAGE_TYPE},
292-
{ATTRIBUTE_COMMAND_CLASS_THERMOSTAT_SUPPORTED_MODES, "Thermostat Supported Modes", ATTRIBUTE_ENDPOINT_ID, BYTE_ARRAY_STORAGE_TYPE},
292+
{ATTRIBUTE_COMMAND_CLASS_THERMOSTAT_SUPPORTED_MODES, "Thermostat Supported Modes", ATTRIBUTE_ENDPOINT_ID, U32_STORAGE_TYPE},
293293
/////////////////////////////////////////////////////////////////////
294294
// Thermostat Setpoint Command Class attributes
295295
/////////////////////////////////////////////////////////////////////

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

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -189,12 +189,23 @@ static sl_status_t zwave_command_class_thermostat_mode_handle_supported_report(
189189

190190
uint8_t bitmask_length
191191
= frame_length - THERMOSTAT_MODE_SUPPORTED_REPORT_BITMASK_INDEX;
192+
uint32_t supported_thermostat_bitmask = 0x0000;
192193

193-
attribute_store_set_node_attribute_value(
194-
supported_modes_node,
195-
REPORTED_ATTRIBUTE,
196-
&frame_data[THERMOSTAT_MODE_SUPPORTED_REPORT_BITMASK_INDEX],
197-
bitmask_length);
194+
// Since we are using uint32_t we can't have more that 4 bit mask
195+
if (bitmask_length > 4) {
196+
sl_log_error(LOG_TAG,
197+
"Supported Thermostat Mode type Bit Mask length is not supported\n");
198+
return SL_STATUS_NOT_SUPPORTED;
199+
}
200+
201+
for (int i = bitmask_length; i > 0; i--) {
202+
supported_thermostat_bitmask
203+
= (supported_thermostat_bitmask << 8) | frame_data[1 + i];
204+
}
205+
206+
attribute_store_set_reported(supported_modes_node,
207+
&supported_thermostat_bitmask,
208+
sizeof(supported_thermostat_bitmask));
198209

199210
return SL_STATUS_OK;
200211
}

components/uic_dotdot/dotdot-xml/Thermostat.xml

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,8 +151,40 @@ applicable to this document can be found in the LICENSE.md file.
151151
<type:enumeration value="07" name="FanOnly" />
152152
<type:enumeration value="08" name="Dry" />
153153
<type:enumeration value="09" name="Sleep" />
154+
<!-- Z-Wave specific -->
155+
<type:enumeration value="0A" name="AuxiliaryHeat" />
156+
<type:enumeration value="0B" name="Resume" />
157+
<type:enumeration value="0C" name="Furnace" />
158+
<type:enumeration value="0D" name="MoistAir" />
159+
<type:enumeration value="0E" name="AutoChangeover" />
160+
<type:enumeration value="0F" name="EnergySaveHeat" />
161+
<type:enumeration value="10" name="EnergySaveCool" />
162+
<type:enumeration value="11" name="Away" />
163+
<type:enumeration value="12" name="FullPower" />
164+
<type:enumeration value="13" name="ManufacturerSpecific" />
154165
</restriction>
155166
</attribute>
167+
<!-- Z-Wave specific -->
168+
<attribute id="011C" name="SupportedSystemMode" type="map16" writable="false" required="false" default="0">
169+
<bitmap>
170+
<element name="Off" type="bool" mask="01" />
171+
<element name="Heat" type="bool" mask="02" shiftRight="1" />
172+
<element name="Cool" type="bool" mask="04" shiftRight="2" />
173+
<element name="Auto" type="bool" mask="08" shiftRight="3" />
174+
<element name="AuxiliaryHeat" type="bool" mask="10" shiftRight="4" />
175+
<element name="Resume" type="bool" mask="20" shiftRight="5" />
176+
<element name="FanOnly" type="bool" mask="40" shiftRight="6" />
177+
<element name="Furnace" type="bool" mask="80" shiftRight="7" />
178+
<element name="DryAir" type="bool" mask="100" shiftRight="8" />
179+
<element name="MoistAir" type="bool" mask="200" shiftRight="9"/>
180+
<element name="AutoChangeover" type="bool" mask="400" shiftRight="10"/>
181+
<element name="EnergySaveHeat" type="bool" mask="800" shiftRight="10"/>
182+
<element name="EnergySaveCool" type="bool" mask="1000" shiftRight="11"/>
183+
<element name="Away" type="bool" mask="2000" shiftRight="12"/>
184+
<element name="FullPower" type="bool" mask="4000" shiftRight="13"/>
185+
<element name="ManufacturerSpecific" type="bool" mask="8000" shiftRight="14"/>
186+
</bitmap>
187+
</attribute>
156188
<attribute id="001D" name="AlarmMask" type="map8" default="0">
157189
<bitmap>
158190
<element name="InitializationFailure" type="bool" mask="01" />

components/uic_dotdot/zap-generated/include/dotdot_attribute_id_definitions.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -393,6 +393,7 @@ typedef enum {
393393
#define DOTDOT_THERMOSTAT_AC_LOUVER_POSITION_ATTRIBUTE_ID ((dotdot_attribute_id_t)0x45)
394394
#define DOTDOT_THERMOSTAT_AC_COIL_TEMPERATURE_ATTRIBUTE_ID ((dotdot_attribute_id_t)0x46)
395395
#define DOTDOT_THERMOSTAT_AC_CAPACITY_FORMAT_ATTRIBUTE_ID ((dotdot_attribute_id_t)0x47)
396+
#define DOTDOT_THERMOSTAT_SUPPORTED_SYSTEM_MODE_ATTRIBUTE_ID ((dotdot_attribute_id_t)0x11C)
396397
// Definitions for cluster: FanControl
397398
#define DOTDOT_FAN_CONTROL_FAN_MODE_ATTRIBUTE_ID ((dotdot_attribute_id_t)0x0)
398399
#define DOTDOT_FAN_CONTROL_FAN_MODE_SEQUENCE_ATTRIBUTE_ID ((dotdot_attribute_id_t)0x1)

components/uic_dotdot/zap-generated/include/zap-types.h

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1209,6 +1209,16 @@ typedef enum {
12091209
ZCL_THERMOSTAT_SYSTEM_MODE_FAN_ONLY = 7,
12101210
ZCL_THERMOSTAT_SYSTEM_MODE_DRY = 8,
12111211
ZCL_THERMOSTAT_SYSTEM_MODE_SLEEP = 9,
1212+
ZCL_THERMOSTAT_SYSTEM_MODE_AUXILIARY_HEAT = 10,
1213+
ZCL_THERMOSTAT_SYSTEM_MODE_RESUME = 11,
1214+
ZCL_THERMOSTAT_SYSTEM_MODE_FURNACE = 12,
1215+
ZCL_THERMOSTAT_SYSTEM_MODE_MOIST_AIR = 13,
1216+
ZCL_THERMOSTAT_SYSTEM_MODE_AUTO_CHANGEOVER = 14,
1217+
ZCL_THERMOSTAT_SYSTEM_MODE_ENERGY_SAVE_HEAT = 15,
1218+
ZCL_THERMOSTAT_SYSTEM_MODE_ENERGY_SAVE_COOL = 16,
1219+
ZCL_THERMOSTAT_SYSTEM_MODE_AWAY = 17,
1220+
ZCL_THERMOSTAT_SYSTEM_MODE_FULL_POWER = 18,
1221+
ZCL_THERMOSTAT_SYSTEM_MODE_MANUFACTURER_SPECIFIC = 19,
12121222
} ThermostatSystemMode;
12131223

12141224
// Enum for ThermostatTemperatureSetpointHold
@@ -1906,6 +1916,38 @@ typedef enum {
19061916
#define THERMOSTAT_REMOTE_SENSING_OUTDOOR_TEMPERATURE_REMOTE_OFFSET (1)
19071917
#define THERMOSTAT_REMOTE_SENSING_OCCUPANCY_REMOTE (4)
19081918
#define THERMOSTAT_REMOTE_SENSING_OCCUPANCY_REMOTE_OFFSET (2)
1919+
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_OFF (1)
1920+
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_OFF_OFFSET (0)
1921+
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_HEAT (2)
1922+
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_HEAT_OFFSET (1)
1923+
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_COOL (4)
1924+
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_COOL_OFFSET (2)
1925+
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_AUTO (8)
1926+
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_AUTO_OFFSET (3)
1927+
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_AUXILIARY_HEAT (16)
1928+
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_AUXILIARY_HEAT_OFFSET (4)
1929+
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_RESUME (32)
1930+
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_RESUME_OFFSET (5)
1931+
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_FAN_ONLY (64)
1932+
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_FAN_ONLY_OFFSET (6)
1933+
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_FURNACE (128)
1934+
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_FURNACE_OFFSET (7)
1935+
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_DRY_AIR (256)
1936+
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_DRY_AIR_OFFSET (8)
1937+
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_MOIST_AIR (512)
1938+
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_MOIST_AIR_OFFSET (9)
1939+
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_AUTO_CHANGEOVER (1024)
1940+
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_AUTO_CHANGEOVER_OFFSET (10)
1941+
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_ENERGY_SAVE_HEAT (2048)
1942+
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_ENERGY_SAVE_HEAT_OFFSET (11)
1943+
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_ENERGY_SAVE_COOL (4096)
1944+
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_ENERGY_SAVE_COOL_OFFSET (12)
1945+
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_AWAY (8192)
1946+
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_AWAY_OFFSET (13)
1947+
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_FULL_POWER (16384)
1948+
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_FULL_POWER_OFFSET (14)
1949+
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_MANUFACTURER_SPECIFIC (32768)
1950+
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_MANUFACTURER_SPECIFIC_OFFSET (15)
19091951
#define THERMOSTAT_THERMOSTAT_PROGRAMMING_OPERATION_MODE_PROGRAMMING_MODE (1)
19101952
#define THERMOSTAT_THERMOSTAT_PROGRAMMING_OPERATION_MODE_PROGRAMMING_MODE_OFFSET (0)
19111953
#define THERMOSTAT_THERMOSTAT_PROGRAMMING_OPERATION_MODE_AUTO_OR_RECOVERY (2)

0 commit comments

Comments
 (0)