Skip to content

Commit bc4f3a5

Browse files
hastynivi-applerestyled-commitsbzbarsky-appletehampson
authored andcommitted
[HVAC] Clear the active preset when the relevant setpoint attributes are set manually (project-chip#35223)
* Add support for Presets attributes and commands to the Thermostat cluster Clean up the Thermostat cluster and remove the TemperatureSetpointHoldPolicy attribute and SetTemperatureSetpointHoldPolicy command * Restyled by whitespace * Restyled by clang-format * Restyled by gn. * Fix build error for Linux configure build of all-clusters-app * Fix Darwin CI issues Editorial fixes * Restyled by clang-format * More fixes * Restyled by clang-format * BUILD.gn fixes for CI * Apply suggestions from code review Co-authored-by: Boris Zbarsky <bzbarsky@apple.com> * Address review comments. * Restyled by clang-format * Regenerate Thermostat XML from spec * Move atomic enum to global-enums.xml, actually # Conflicts: # src/app/zap-templates/zcl/data-model/chip/global-structs.xml * Regenerate XML and convert thermostat-server to atomic writes * Pull in ACCapacityFormat typo un-fix * Update Test_TC_TSTAT_1_1 to know about AtomicResponse command. * Restyled patch * Fix weird merge with upstream * Fix emberAfIsTypeSigned not understanding temperature type * Merge fixes from atomic write branch * Relocate thermostat-manager sample code to all-clusters-common * Fix g++ build error on linux * Fix C formatter for long int, cast whole expression * Sync cast fix with master * Add thermostat-common dependency to thermostat app under linux * Remove MatterPostAttributeChangeCallback from thermostat-manager, as it conflicts with other implementations * Convert Atomic enums and structs to global * Restyled patch * Apply suggestions from code review Co-authored-by: Boris Zbarsky <bzbarsky@apple.com> * Regen with alchemy 0.6.1 * Updates based on comments * Add TC_MCORE_FS_1_3.py test implementation (project-chip#34650) * Fix most TC-SWTCH-2.4 remaining issues (project-chip#34677) - Move 2.4 in a better place in the file - Add test steps properly - Allow default button press position override Issue project-chip#34656 Testing done: - Test still passes on DUT with automation * Initial test script for Fabric Sync TC_MCORE_FS_1_2 (project-chip#34675) * Initial test script for Fabric Sync TC_MCORE_FS_1_2 * Apply suggestions from code review Co-authored-by: C Freeman <cecille@google.com> * Address Review Comments * Address review comments * Fix default timeout after other timeouts changed * Restyled by autopep8 * Fix linter error --------- Co-authored-by: C Freeman <cecille@google.com> Co-authored-by: Restyled.io <commits@restyled.io> * Test automation for FabricSync ICD BridgedDeviceBasicInfoCluster (project-chip#34628) * WIP Bridged ICD, commissioning to both fabrics * wip testing sending KeepActive * wip most steps implemented * using SIGSTOP and SIGCONT to control ICD server pausing * Update src/python_testing/TC_BRBINFO_4_1.py Co-authored-by: Terence Hampson <thampson@google.com> * comments addressed * more comments addressed * lint pass * Update src/python_testing/TC_BRBINFO_4_1.py Co-authored-by: C Freeman <cecille@google.com> * comments addressed, incl TH_SERVER configurable * added setupQRCode and setupManualCode as options for DUT commissioning * Restyled by autopep8 * Restyled by isort * Update src/python_testing/TC_BRBINFO_4_1.py Co-authored-by: Terence Hampson <thampson@google.com> * Update src/python_testing/TC_BRBINFO_4_1.py Co-authored-by: Terence Hampson <thampson@google.com> * Update src/python_testing/TC_BRBINFO_4_1.py Co-authored-by: Terence Hampson <thampson@google.com> * comments addressed * Restyled by autopep8 --------- Co-authored-by: Terence Hampson <thampson@google.com> Co-authored-by: C Freeman <cecille@google.com> Co-authored-by: Restyled.io <commits@restyled.io> * ServiceArea test scripts (project-chip#34548) * initial commit * fix bugs * fix issues reported by the linter * fix bug in checking for unique areaDesc * add TC 1.5 * Update src/python_testing/TC_SEAR_1_2.py Co-authored-by: William <hicklin@users.noreply.github.com> * Update src/python_testing/TC_SEAR_1_2.py Co-authored-by: William <hicklin@users.noreply.github.com> * address code review comments * fix issue introduced by the previous commit * address code review feedback * Update src/python_testing/TC_SEAR_1_2.py Co-authored-by: Kiel Oleson <kielo@apple.com> * address code review feedback * remove PICS checked by the TC_SEAR_1.6 * more code review updates * Restyled by autopep8 --------- Co-authored-by: William <hicklin@users.noreply.github.com> Co-authored-by: Kiel Oleson <kielo@apple.com> Co-authored-by: Restyled.io <commits@restyled.io> * Remove manual tests for Thermostat presets (project-chip#34679) * Dump details about leaked ExchangeContexts before aborting (project-chip#34617) * Dump details about leaked ExchangeContexts before aborting This is implemented via a VerifyOrDieWithObject() variant of the existing VerifyOrDie() macro that calls a DumpToLog() method on the provided object if it exists (otherwise this is simply a no-op). If CHIP_CONFIG_VERBOSE_VERIFY_OR_DIE is not enabled, VerifyOrDieWithObject() simply behaves like a plain VerifyOrDie(). DumpToLog() implementations can use ChipLogFormatRtti to log type information about an object (usually a delegate); if RTTI is disabled this simply outputs whether the object was null or not. * Address review comments * Make gcc happy and improve documentation * Remove unused include * Fix compile error without CHIP_CONFIG_VERBOSE_VERIFY_OR_DIE * Avoid unused parameter warning * [TI] CC13x4_26x4 build fixes (project-chip#34682) * lwip pbuf, map file, and hex creation when OTA is disabled * added cc13x4 family define around the non OTA hex creation * whitespace fix * reversed custom factoy data flash with cc13x4 check * more whitespace fixes * [ICD] Add missing polling function to NoWifi connectivity manager (project-chip#34684) * Add missing polling function to NoWifi connectivity manager * Update GenericConnectivityManagerImpl_NoWiFi.h Co-authored-by: Boris Zbarsky <bzbarsky@apple.com> --------- Co-authored-by: Boris Zbarsky <bzbarsky@apple.com> * [OPSTATE] Add Q test script for CountdownTime (project-chip#34632) * Add Q test * Added test to test set * Remove unused var * Restyled by autopep8 * Restyled by isort * Fix name * Use pics over other method * Removed unused stuff * Added pipe commands * Fix reset * Get example to report appropriate changes. * WiP * Added some comments * Changes to make things work * Removed dev msgs * Missed some * Removed dev msgs * Straggler * Restyled by clang-format * Restyled by autopep8 * Restyled by isort * Commented unused var * Update examples/all-clusters-app/linux/AllClustersCommandDelegate.cpp * Fix bug --------- Co-authored-by: Restyled.io <commits@restyled.io> * YAML update to BRBINFO, ProductId (project-chip#34513) * Bridged Device Information Cluster, Attribute ProductID test reflects marking as O, not X * Update src/app/tests/suites/certification/Test_TC_BRBINFO_2_1.yaml Co-authored-by: Terence Hampson <thampson@google.com> * corrected pics * corrected pics * WIP Bridged ICD, commissioning to both fabrics * wip testing sending KeepActive * update to bridged-device-basic-information.xml and zap generated files * removed unrelated file --------- Co-authored-by: Terence Hampson <thampson@google.com> Co-authored-by: Andrei Litvin <andy314@gmail.com> * Fix simplified Linux tv-casting-app gn build error. (project-chip#34692) * adding parallel execution to restyle-diff (project-chip#34663) * adding parallel execution to restyle-diff * using xargs to call restyle-paths * fixing Copyright year * restyle the restyler * Add some bits to exercise global structs/enums to Unit Testing cluster. (project-chip#34540) * Adds things to the Unit Testing cluster XML. * This requires those things to be enabled in all-clusters-app, all-clusters-minimal-app, and one of the chef contact sensors to pass CI. * That requires an implementation in test-cluster-server * At which point might as well add a YAML test to exercise it all. * [Silabs] Port platform specific Multi-Chip OTA work (project-chip#34440) * Pull request project-chip#1836: Cherry multi ota Merge in WMN_TOOLS/matter from cherry-multi-ota to silabs_slc_1.3 Squashed commit of the following: commit 4320bb46571658bc44fb82345348265def394991 Author: Michael Rupp <michael.rupp@silabs.com> Date: Fri May 10 14:26:07 2024 -0400 remove some unwanted diffs in provision files commit be160931dc600de7e7ead378b70d6a43c3945e46 Author: Michael Rupp <michael.rupp@silabs.com> Date: Fri May 10 14:24:25 2024 -0400 revert changes to generator.project.mak commit 14b6605887166e6d5284a61feb2bf407d850bdcf Author: Michael Rupp <michael.rupp@silabs.com> Date: Fri May 10 13:06:12 2024 -0400 revert NVM key changes and script changes ... and 8 more commits * Restyled by whitespace * Restyled by clang-format * Restyled by gn * Restyled by autopep8 * remove unused libs caught by linter * update doctree with new readmes * rerun CI, cirque failing for unknown reasons * fix include guards in provision examples * Restyled by clang-format --------- Co-authored-by: Restyled.io <commits@restyled.io> * Add python tests for Thermostat presets feature (project-chip#34693) * Add python tests for Thermostat presets feature * Restyled by autopep8 * Restyled by isort * Update the PICS code for presets attribute --------- Co-authored-by: Restyled.io <commits@restyled.io> * removing unneccessary git fetch (project-chip#34698) * Restyle patch * Regen to fix ordering of global structs * Apply suggestions from code review Co-authored-by: Boris Zbarsky <bzbarsky@apple.com> * Return correct AtomicResponse when committing or rolling back * Patch tests for atomic write of presets * Fix tests to work with the new setup. Specific changes: * Enable SetActivePresetRequest command in all-clusters-app. * Fix assignment of a PresetStructWithOwnedMembers to another PresetStructWithOwnedMembers to actually work correctly. * Move constraint checks that happen on write from commit to write. * Fix sending of atomic responses to not have use-stack-after-return. * Fix PICS for the tests involved. * Fix PICS values for atomic requests * Remove PresetsSchedulesEditable and QueuedPreset from various places * Restyled patch * Restyled patch, again * Remove PICS value for PresetsSchedulesEditable * clang-tidy fixes * clang-tidy fixes * Clear associated atomic writes when fabric is removed * Add tests for fabric removal and lockout of clients outside of atomic write * Python linter * Restyled patch * Clear timer when fabric is removed * Check for open atomic write before resetting * Revert auto delegate declaration on lines where there's no collision * Allow Thermostat delegate to provide timeout for atomic requests * Relocate thermostat example code to thermostat-common * Remove thermostat-manager code, replace with thermostat delegate * Sync atomic write error order with spec * Restyle patch * Drop memset of atomic write sessions * Add PreCommit stage to allow rollback of multiple attributes when only one fails * Separate OnTimerExpired method, vs ResetWrite * Method documentation * Apply suggestions from code review Co-authored-by: Nivi Sarkar <55898241+nivi-apple@users.noreply.github.com> * Remove unused InWrite check * Drop imcode alias * Switch AtomicWriteState to enum class * DRY up atomic write manager * Apply suggestions from code review Co-authored-by: Nivi Sarkar <55898241+nivi-apple@users.noreply.github.com> * Drop duplicate doc comments * Rename GetAtomicWriteScopedNodeId to GetAtomicWriteOriginatorScopedNodeId * Updates based on comments * Add MatterReportingAttributeChangeCallback calls for updated attributes * Relocate thermostat example code to thermostat-common, and remove thermostat-manager * Merge atomic write code back into thermostat-server * Apply suggestions from code review Co-authored-by: Boris Zbarsky <bzbarsky@apple.com> * Fix build after suggestions * Actually track attribute IDs associated with atomic write * Only commit presets if all attribute precommits were successful * Fix scope on err * Add documentation to methods * Remove duplicate preset check. * Move various functions into anonymous namespaces, or Thermostat namespace * Drop impossible non-atomic attribute status after rollback * Allow null BuiltIn field when saving Presets * Namespace workaround for compilers on other platforms * Fix bad merge * Fix readability issue * Force built-in to false on new presets * [HVAC] Clear ActivePresetHandle attribute when changing relevant setpoint attributes * Apply suggestions from code review Co-authored-by: Boris Zbarsky <bzbarsky@apple.com> --------- Co-authored-by: Nivedita Sarkar <nivedita_sarkar@apple.com> Co-authored-by: Restyled.io <commits@restyled.io> Co-authored-by: Nivi Sarkar <55898241+nivi-apple@users.noreply.github.com> Co-authored-by: Boris Zbarsky <bzbarsky@apple.com> Co-authored-by: Terence Hampson <thampson@google.com> Co-authored-by: Tennessee Carmel-Veilleux <tennessee.carmelveilleux@gmail.com> Co-authored-by: Chris Letnick <cletnick@google.com> Co-authored-by: C Freeman <cecille@google.com> Co-authored-by: Douglas Rocha Ferraz <rochaferraz@google.com> Co-authored-by: Petru Lauric <81822411+plauric@users.noreply.github.com> Co-authored-by: William <hicklin@users.noreply.github.com> Co-authored-by: Kiel Oleson <kielo@apple.com> Co-authored-by: Karsten Sperling <113487422+ksperling-apple@users.noreply.github.com> Co-authored-by: Anu Biradar <104591549+abiradarti@users.noreply.github.com> Co-authored-by: mkardous-silabs <84793247+mkardous-silabs@users.noreply.github.com> Co-authored-by: Rob Bultman <rob.Bultman@gmail.com> Co-authored-by: Andrei Litvin <andy314@gmail.com> Co-authored-by: Shao Ling Tan <161761051+shaoltan-amazon@users.noreply.github.com> Co-authored-by: Amine Alami <43780877+Alami-Amine@users.noreply.github.com> Co-authored-by: Michael Rupp <95718139+mykrupp@users.noreply.github.com>
1 parent c192e2d commit bc4f3a5

File tree

5 files changed

+67
-1
lines changed

5 files changed

+67
-1
lines changed

scripts/tools/zap/tests/outputs/all-clusters-app/app-templates/endpoint_config.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -2217,6 +2217,7 @@
22172217
}; \
22182218
const EmberAfGenericClusterFunction chipFuncArrayThermostatServer[] = { \
22192219
(EmberAfGenericClusterFunction) emberAfThermostatClusterServerInitCallback, \
2220+
(EmberAfGenericClusterFunction) MatterThermostatClusterServerAttributeChangedCallback, \
22202221
(EmberAfGenericClusterFunction) MatterThermostatClusterServerShutdownCallback, \
22212222
(EmberAfGenericClusterFunction) MatterThermostatClusterServerPreAttributeChangedCallback, \
22222223
}; \
@@ -3756,7 +3757,7 @@
37563757
.attributes = ZAP_ATTRIBUTE_INDEX(616), \
37573758
.attributeCount = 26, \
37583759
.clusterSize = 72, \
3759-
.mask = ZAP_CLUSTER_MASK(SERVER) | ZAP_CLUSTER_MASK(INIT_FUNCTION) | ZAP_CLUSTER_MASK(SHUTDOWN_FUNCTION) | ZAP_CLUSTER_MASK(PRE_ATTRIBUTE_CHANGED_FUNCTION), \
3760+
.mask = ZAP_CLUSTER_MASK(SERVER) | ZAP_CLUSTER_MASK(INIT_FUNCTION) | ZAP_CLUSTER_MASK(ATTRIBUTE_CHANGED_FUNCTION) | ZAP_CLUSTER_MASK(SHUTDOWN_FUNCTION) | ZAP_CLUSTER_MASK(PRE_ATTRIBUTE_CHANGED_FUNCTION), \
37603761
.functions = chipFuncArrayThermostatServer, \
37613762
.acceptedCommandList = ZAP_GENERATED_COMMANDS_INDEX( 241 ), \
37623763
.generatedCommandList = ZAP_GENERATED_COMMANDS_INDEX( 246 ), \

src/app/clusters/thermostat-server/thermostat-server.cpp

+51
Original file line numberDiff line numberDiff line change
@@ -468,6 +468,52 @@ void ThermostatAttrAccess::OnFabricRemoved(const FabricTable & fabricTable, Fabr
468468
}
469469
}
470470

471+
void MatterThermostatClusterServerAttributeChangedCallback(const ConcreteAttributePath & attributePath)
472+
{
473+
uint32_t flags;
474+
if (FeatureMap::Get(attributePath.mEndpointId, &flags) != Status::Success)
475+
{
476+
ChipLogError(Zcl, "MatterThermostatClusterServerAttributeChangedCallback: could not get feature flags");
477+
return;
478+
}
479+
480+
auto featureMap = BitMask<Feature, uint32_t>(flags);
481+
if (!featureMap.Has(Feature::kPresets))
482+
{
483+
// This server does not support presets, so nothing to do
484+
return;
485+
}
486+
487+
bool occupied = true;
488+
if (featureMap.Has(Feature::kOccupancy))
489+
{
490+
BitMask<OccupancyBitmap, uint8_t> occupancy;
491+
if (Occupancy::Get(attributePath.mEndpointId, &occupancy) == Status::Success)
492+
{
493+
occupied = occupancy.Has(OccupancyBitmap::kOccupied);
494+
}
495+
}
496+
497+
bool clearActivePreset = false;
498+
switch (attributePath.mAttributeId)
499+
{
500+
case OccupiedHeatingSetpoint::Id:
501+
case OccupiedCoolingSetpoint::Id:
502+
clearActivePreset = occupied;
503+
break;
504+
case UnoccupiedHeatingSetpoint::Id:
505+
case UnoccupiedCoolingSetpoint::Id:
506+
clearActivePreset = !occupied;
507+
break;
508+
}
509+
if (!clearActivePreset)
510+
{
511+
return;
512+
}
513+
ChipLogProgress(Zcl, "Setting active preset to null");
514+
gThermostatAttrAccess.SetActivePreset(attributePath.mEndpointId, std::nullopt);
515+
}
516+
471517
} // namespace Thermostat
472518
} // namespace Clusters
473519
} // namespace app
@@ -762,6 +808,11 @@ MatterThermostatClusterServerPreAttributeChangedCallback(const app::ConcreteAttr
762808
}
763809
}
764810

811+
void MatterThermostatClusterServerAttributeChangedCallback(const ConcreteAttributePath & attributePath)
812+
{
813+
Thermostat::MatterThermostatClusterServerAttributeChangedCallback(attributePath);
814+
}
815+
765816
bool emberAfThermostatClusterClearWeeklyScheduleCallback(app::CommandHandler * commandObj,
766817
const app::ConcreteCommandPath & commandPath,
767818
const Commands::ClearWeeklySchedule::DecodableType & commandData)

src/app/clusters/thermostat-server/thermostat-server.h

+1
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,7 @@ class ThermostatAttrAccess : public chip::app::AttributeAccessInterface, public
207207
friend void TimerExpiredCallback(System::Layer * systemLayer, void * callbackContext);
208208

209209
friend void MatterThermostatClusterServerShutdownCallback(EndpointId endpoint);
210+
friend void MatterThermostatClusterServerAttributeChangedCallback(const chip::app::ConcreteAttributePath & attributePath);
210211

211212
friend bool emberAfThermostatClusterSetActivePresetRequestCallback(
212213
CommandHandler * commandObj, const ConcreteCommandPath & commandPath,

src/app/common/templates/config-data.yaml

+1
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ ClustersWithAttributeChangedFunctions:
7272
- Pump Configuration and Control
7373
- Window Covering
7474
- Fan Control
75+
- Thermostat
7576

7677
ClustersWithShutdownFunctions:
7778
- Barrier Control

src/python_testing/TC_TSTAT_4_2.py

+12
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,11 @@ async def test_TC_TSTAT_4_2(self):
291291
logger.info(f"Rx'd Presets: {presets}")
292292
asserts.assert_equal(presets, new_presets_with_handle, "Presets were not updated which is not expected")
293293

294+
# Send the SetActivePresetRequest command
295+
await self.send_set_active_preset_handle_request_command(value=b'\x03')
296+
297+
activePresetHandle = await self.read_single_attribute_check_success(endpoint=endpoint, cluster=cluster, attribute=cluster.Attributes.ActivePresetHandle)
298+
294299
self.step("5")
295300
if self.pics_guard(self.check_pics("TSTAT.S.F08") and self.check_pics("TSTAT.S.A0050") and self.check_pics("TSTAT.S.Cfe.Rsp")):
296301

@@ -327,6 +332,13 @@ async def test_TC_TSTAT_4_2(self):
327332
# Send the AtomicRequest commit command and expect InvalidInState for presets.
328333
await self.send_atomic_request_commit_command(expected_overall_status=Status.Failure, expected_preset_status=Status.InvalidInState)
329334

335+
# Write the occupied cooling setpoint to a different value
336+
await self.write_single_attribute(attribute_value=cluster.Attributes.OccupiedCoolingSetpoint(2300), endpoint_id=endpoint)
337+
338+
activePresetHandle = await self.read_single_attribute_check_success(endpoint=endpoint, cluster=cluster, attribute=cluster.Attributes.ActivePresetHandle)
339+
logger.info(f"Rx'd ActivePresetHandle: {activePresetHandle}")
340+
asserts.assert_equal(activePresetHandle, NullValue, "Active preset handle was not cleared as expected")
341+
330342
self.step("7")
331343
if self.pics_guard(self.check_pics("TSTAT.S.F08") and self.check_pics("TSTAT.S.A0050") and self.check_pics("TSTAT.S.Cfe.Rsp")):
332344

0 commit comments

Comments
 (0)