Skip to content

Commit

Permalink
GH-32: Thermostat Mode CC correctly exposed to MQTT
Browse files Browse the repository at this point in the history
Forwarded: #32
Bug-SiliconLabs: UIC-3069
Bug-Github: #32
  • Loading branch information
silabs-borisl committed Feb 16, 2024
1 parent 3b43b68 commit 7afa12b
Show file tree
Hide file tree
Showing 24 changed files with 835 additions and 25 deletions.
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
//This file is generated automatically. Don't try to change something here.
//To add support for new clusters, modify addon-helper.js
//To change the stucture of the ClusterTypeAttrs, modify cluster-type-attributes.zapt



//generate ClusterTypes
export let ClusterTypeAttrs: any = {
Expand Down Expand Up @@ -8657,7 +8657,17 @@ export let ClusterTypeAttrs: any = {
{ name: "Precooling", value: 6},
{ name: "FanOnly", value: 7},
{ name: "Dry", value: 8},
{ name: "Sleep", value: 9}
{ name: "Sleep", value: 9},
{ name: "AuxiliaryHeat", value: 10},
{ name: "Resume", value: 11},
{ name: "Furnace", value: 12},
{ name: "MoistAir", value: 13},
{ name: "AutoChangeover", value: 14},
{ name: "EnergySaveHeat", value: 15},
{ name: "EnergySaveCool", value: 16},
{ name: "Away", value: 17},
{ name: "FullPower", value: 18},
{ name: "ManufacturerSpecific", value: 19}
],
},
{
Expand Down
51 changes: 38 additions & 13 deletions applications/zpc/components/dotdot_mapper/rules/Thermostat.uam
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ def zb_MinSetpointDeadBand 0x02010019
def zb_RemoteSensing 0x0201001a
def zb_ControlSequenceOfOperation 0x0201001b
def zb_SystemMode 0x0201001c
def zb_SupportedSystemMode 0x0201011c
def zb_TemperatureSetpointHold 0x02010023
def zb_TemperatureSetpointHoldDuration 0x02010024
def zb_ThermostatProgrammingOperationMode 0x02010025
Expand Down Expand Up @@ -131,23 +132,44 @@ scope 0 {


r'zb_SystemMode =
if (r'zwTHERMOSTAT_MODE == 0) 0
if (r'zwTHERMOSTAT_MODE == 1) 4
if (r'zwTHERMOSTAT_MODE == 2) 3
if (r'zwTHERMOSTAT_MODE == 3) 1
if (r'zwTHERMOSTAT_MODE == 6) 7
if (r'zwTHERMOSTAT_MODE == 8) 8
if (r'zwTHERMOSTAT_MODE == 0x00) 0x00
if (r'zwTHERMOSTAT_MODE == 0x01) 0x04
if (r'zwTHERMOSTAT_MODE == 0x02) 0x03
if (r'zwTHERMOSTAT_MODE == 0x03) 0x01
if (r'zwTHERMOSTAT_MODE == 0x04) 0x0A
if (r'zwTHERMOSTAT_MODE == 0x05) 0x0B
if (r'zwTHERMOSTAT_MODE == 0x06) 0x07
if (r'zwTHERMOSTAT_MODE == 0x07) 0x0C
if (r'zwTHERMOSTAT_MODE == 0x08) 0x08
if (r'zwTHERMOSTAT_MODE == 0x09) 0x0D
if (r'zwTHERMOSTAT_MODE == 0x0A) 0x0E
if (r'zwTHERMOSTAT_MODE == 0x0B) 0x0F
if (r'zwTHERMOSTAT_MODE == 0x0C) 0x10
if (r'zwTHERMOSTAT_MODE == 0x0D) 0x11
if (r'zwTHERMOSTAT_MODE == 0x0F) 0x12
if (r'zwTHERMOSTAT_MODE == 0x1F) 0x13
undefined

d'zwTHERMOSTAT_MODE =
if ( d'zb_SystemMode == 0) 0
if ( d'zb_SystemMode == 4) 1
if ( d'zb_SystemMode == 3) 2
if ( d'zb_SystemMode == 1) 3
if ( d'zb_SystemMode == 7) 6
if ( d'zb_SystemMode == 8) 8
r'zwTHERMOSTAT_MODE =
if (r'zb_SystemMode == 0x00) 0x00
if (r'zb_SystemMode == 0x04) 0x01
if (r'zb_SystemMode == 0x03) 0x02
if (r'zb_SystemMode == 0x01) 0x03
if (r'zb_SystemMode == 0x0A) 0x04
if (r'zb_SystemMode == 0x0B) 0x05
if (r'zb_SystemMode == 0x07) 0x06
if (r'zb_SystemMode == 0x0C) 0x07
if (r'zb_SystemMode == 0x08) 0x08
if (r'zb_SystemMode == 0x0D) 0x09
if (r'zb_SystemMode == 0x0E) 0x0A
if (r'zb_SystemMode == 0x0F) 0x0B
if (r'zb_SystemMode == 0x10) 0x0C
if (r'zb_SystemMode == 0x11) 0x0D
if (r'zb_SystemMode == 0x12) 0x0F
if (r'zb_SystemMode == 0x13) 0x1F
undefined


r'zb_ControlSequenceOfOperation =
if(((r'zwTHERMOSTAT_SUPPORTED_MODES) & 6) == 0x06) 0x04
if(((r'zwTHERMOSTAT_SUPPORTED_MODES) & 6) == 0x02) 0x02
Expand Down Expand Up @@ -252,4 +274,7 @@ scope 0 chain_reaction(0) {
d'zb_ACCapacityFormat =
if (r'zb_ACCapacityFormat != d'zb_ACCapacityFormat) r'zb_ACCapacityFormat
undefined


r'zb_SupportedSystemMode = r'zwTHERMOSTAT_SUPPORTED_MODES
}
Original file line number Diff line number Diff line change
Expand Up @@ -289,7 +289,7 @@ static const std::vector<attribute_schema_t> attribute_schema = {
/////////////////////////////////////////////////////////////////////
{ATTRIBUTE_COMMAND_CLASS_THERMOSTAT_MODE_VERSION, "Thermostat Mode Version", ATTRIBUTE_ENDPOINT_ID, U8_STORAGE_TYPE},
{ATTRIBUTE_COMMAND_CLASS_THERMOSTAT_MODE, "Thermostat Mode", ATTRIBUTE_ENDPOINT_ID, I32_STORAGE_TYPE},
{ATTRIBUTE_COMMAND_CLASS_THERMOSTAT_SUPPORTED_MODES, "Thermostat Supported Modes", ATTRIBUTE_ENDPOINT_ID, BYTE_ARRAY_STORAGE_TYPE},
{ATTRIBUTE_COMMAND_CLASS_THERMOSTAT_SUPPORTED_MODES, "Thermostat Supported Modes", ATTRIBUTE_ENDPOINT_ID, U32_STORAGE_TYPE},
/////////////////////////////////////////////////////////////////////
// Thermostat Setpoint Command Class attributes
/////////////////////////////////////////////////////////////////////
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -189,12 +189,23 @@ static sl_status_t zwave_command_class_thermostat_mode_handle_supported_report(

uint8_t bitmask_length
= frame_length - THERMOSTAT_MODE_SUPPORTED_REPORT_BITMASK_INDEX;
uint32_t supported_thermostat_bitmask = 0x0000;

attribute_store_set_node_attribute_value(
supported_modes_node,
REPORTED_ATTRIBUTE,
&frame_data[THERMOSTAT_MODE_SUPPORTED_REPORT_BITMASK_INDEX],
bitmask_length);
// Since we are using uint32_t we can't have more that 4 bit mask
if (bitmask_length > 4) {
sl_log_error(LOG_TAG,
"Supported Thermostat Mode type Bit Mask length is not supported\n");
return SL_STATUS_NOT_SUPPORTED;
}

for (int i = bitmask_length; i > 0; i--) {
supported_thermostat_bitmask
= (supported_thermostat_bitmask << 8) | frame_data[1 + i];
}

attribute_store_set_reported(supported_modes_node,
&supported_thermostat_bitmask,
sizeof(supported_thermostat_bitmask));

return SL_STATUS_OK;
}
Expand Down
32 changes: 32 additions & 0 deletions components/uic_dotdot/dotdot-xml/Thermostat.xml
Original file line number Diff line number Diff line change
Expand Up @@ -151,8 +151,40 @@ applicable to this document can be found in the LICENSE.md file.
<type:enumeration value="07" name="FanOnly" />
<type:enumeration value="08" name="Dry" />
<type:enumeration value="09" name="Sleep" />
<!-- Z-Wave specific -->
<type:enumeration value="0A" name="AuxiliaryHeat" />
<type:enumeration value="0B" name="Resume" />
<type:enumeration value="0C" name="Furnace" />
<type:enumeration value="0D" name="MoistAir" />
<type:enumeration value="0E" name="AutoChangeover" />
<type:enumeration value="0F" name="EnergySaveHeat" />
<type:enumeration value="10" name="EnergySaveCool" />
<type:enumeration value="11" name="Away" />
<type:enumeration value="12" name="FullPower" />
<type:enumeration value="13" name="ManufacturerSpecific" />
</restriction>
</attribute>
<!-- Z-Wave specific -->
<attribute id="011C" name="SupportedSystemMode" type="map16" writable="false" required="false" default="0">
<bitmap>
<element name="Off" type="bool" mask="01" />
<element name="Heat" type="bool" mask="02" shiftRight="1" />
<element name="Cool" type="bool" mask="04" shiftRight="2" />
<element name="Auto" type="bool" mask="08" shiftRight="3" />
<element name="AuxiliaryHeat" type="bool" mask="10" shiftRight="4" />
<element name="Resume" type="bool" mask="20" shiftRight="5" />
<element name="FanOnly" type="bool" mask="40" shiftRight="6" />
<element name="Furnace" type="bool" mask="80" shiftRight="7" />
<element name="DryAir" type="bool" mask="100" shiftRight="8" />
<element name="MoistAir" type="bool" mask="200" shiftRight="9"/>
<element name="AutoChangeover" type="bool" mask="400" shiftRight="10"/>
<element name="EnergySaveHeat" type="bool" mask="800" shiftRight="10"/>
<element name="EnergySaveCool" type="bool" mask="1000" shiftRight="11"/>
<element name="Away" type="bool" mask="2000" shiftRight="12"/>
<element name="FullPower" type="bool" mask="4000" shiftRight="13"/>
<element name="ManufacturerSpecific" type="bool" mask="8000" shiftRight="14"/>
</bitmap>
</attribute>
<attribute id="001D" name="AlarmMask" type="map8" default="0">
<bitmap>
<element name="InitializationFailure" type="bool" mask="01" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -393,6 +393,7 @@ typedef enum {
#define DOTDOT_THERMOSTAT_AC_LOUVER_POSITION_ATTRIBUTE_ID ((dotdot_attribute_id_t)0x45)
#define DOTDOT_THERMOSTAT_AC_COIL_TEMPERATURE_ATTRIBUTE_ID ((dotdot_attribute_id_t)0x46)
#define DOTDOT_THERMOSTAT_AC_CAPACITY_FORMAT_ATTRIBUTE_ID ((dotdot_attribute_id_t)0x47)
#define DOTDOT_THERMOSTAT_SUPPORTED_SYSTEM_MODE_ATTRIBUTE_ID ((dotdot_attribute_id_t)0x11C)
// Definitions for cluster: FanControl
#define DOTDOT_FAN_CONTROL_FAN_MODE_ATTRIBUTE_ID ((dotdot_attribute_id_t)0x0)
#define DOTDOT_FAN_CONTROL_FAN_MODE_SEQUENCE_ATTRIBUTE_ID ((dotdot_attribute_id_t)0x1)
Expand Down
42 changes: 42 additions & 0 deletions components/uic_dotdot/zap-generated/include/zap-types.h
Original file line number Diff line number Diff line change
Expand Up @@ -1209,6 +1209,16 @@ typedef enum {
ZCL_THERMOSTAT_SYSTEM_MODE_FAN_ONLY = 7,
ZCL_THERMOSTAT_SYSTEM_MODE_DRY = 8,
ZCL_THERMOSTAT_SYSTEM_MODE_SLEEP = 9,
ZCL_THERMOSTAT_SYSTEM_MODE_AUXILIARY_HEAT = 10,
ZCL_THERMOSTAT_SYSTEM_MODE_RESUME = 11,
ZCL_THERMOSTAT_SYSTEM_MODE_FURNACE = 12,
ZCL_THERMOSTAT_SYSTEM_MODE_MOIST_AIR = 13,
ZCL_THERMOSTAT_SYSTEM_MODE_AUTO_CHANGEOVER = 14,
ZCL_THERMOSTAT_SYSTEM_MODE_ENERGY_SAVE_HEAT = 15,
ZCL_THERMOSTAT_SYSTEM_MODE_ENERGY_SAVE_COOL = 16,
ZCL_THERMOSTAT_SYSTEM_MODE_AWAY = 17,
ZCL_THERMOSTAT_SYSTEM_MODE_FULL_POWER = 18,
ZCL_THERMOSTAT_SYSTEM_MODE_MANUFACTURER_SPECIFIC = 19,
} ThermostatSystemMode;

// Enum for ThermostatTemperatureSetpointHold
Expand Down Expand Up @@ -1906,6 +1916,38 @@ typedef enum {
#define THERMOSTAT_REMOTE_SENSING_OUTDOOR_TEMPERATURE_REMOTE_OFFSET (1)
#define THERMOSTAT_REMOTE_SENSING_OCCUPANCY_REMOTE (4)
#define THERMOSTAT_REMOTE_SENSING_OCCUPANCY_REMOTE_OFFSET (2)
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_OFF (1)
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_OFF_OFFSET (0)
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_HEAT (2)
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_HEAT_OFFSET (1)
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_COOL (4)
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_COOL_OFFSET (2)
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_AUTO (8)
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_AUTO_OFFSET (3)
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_AUXILIARY_HEAT (16)
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_AUXILIARY_HEAT_OFFSET (4)
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_RESUME (32)
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_RESUME_OFFSET (5)
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_FAN_ONLY (64)
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_FAN_ONLY_OFFSET (6)
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_FURNACE (128)
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_FURNACE_OFFSET (7)
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_DRY_AIR (256)
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_DRY_AIR_OFFSET (8)
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_MOIST_AIR (512)
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_MOIST_AIR_OFFSET (9)
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_AUTO_CHANGEOVER (1024)
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_AUTO_CHANGEOVER_OFFSET (10)
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_ENERGY_SAVE_HEAT (2048)
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_ENERGY_SAVE_HEAT_OFFSET (11)
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_ENERGY_SAVE_COOL (4096)
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_ENERGY_SAVE_COOL_OFFSET (12)
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_AWAY (8192)
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_AWAY_OFFSET (13)
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_FULL_POWER (16384)
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_FULL_POWER_OFFSET (14)
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_MANUFACTURER_SPECIFIC (32768)
#define THERMOSTAT_SUPPORTED_SYSTEM_MODE_MANUFACTURER_SPECIFIC_OFFSET (15)
#define THERMOSTAT_THERMOSTAT_PROGRAMMING_OPERATION_MODE_PROGRAMMING_MODE (1)
#define THERMOSTAT_THERMOSTAT_PROGRAMMING_OPERATION_MODE_PROGRAMMING_MODE_OFFSET (0)
#define THERMOSTAT_THERMOSTAT_PROGRAMMING_OPERATION_MODE_AUTO_OR_RECOVERY (2)
Expand Down
Loading

0 comments on commit 7afa12b

Please sign in to comment.