diff --git a/examples/closure-app/closure-common/src/ClosureControlEndpoint.cpp b/examples/closure-app/closure-common/src/ClosureControlEndpoint.cpp index f060bf4ea6b2d9..cbf1787a1752b1 100644 --- a/examples/closure-app/closure-common/src/ClosureControlEndpoint.cpp +++ b/examples/closure-app/closure-common/src/ClosureControlEndpoint.cpp @@ -273,6 +273,25 @@ void ClosureControlEndpoint::UpdateCurrentStateFromTargetState() overallCurrentState.Value().speed.SetValue(overallTargetState.Value().speed.Value()); } + bool isClosureInSecureState = true; + + // First, check if the closure is fully closed and has positioning feature. + if (mLogic.GetConformance().FeatureMap().Has(Feature::kPositioning)) + { + isClosureInSecureState &= overallCurrentState.Value().position.HasValue() && + !overallCurrentState.Value().position.Value().IsNull() && + overallCurrentState.Value().position.Value().Value() == CurrentPositionEnum::kFullyClosed; + } + + // Next, check if motion latching is enabled and latch is true. + if (mLogic.GetConformance().FeatureMap().Has(Feature::kMotionLatching)) + { + isClosureInSecureState &= overallCurrentState.Value().latch.HasValue() && + !overallCurrentState.Value().latch.Value().IsNull() && overallCurrentState.Value().latch.Value().Value() == true; + } + + overallCurrentState.Value().secureState.SetValue(MakeNullable(isClosureInSecureState)); + mLogic.SetOverallCurrentState(overallCurrentState); } diff --git a/src/app/clusters/closure-control-server/closure-control-cluster-logic.cpp b/src/app/clusters/closure-control-server/closure-control-cluster-logic.cpp index 5a77e10b6e3ec0..8507d562d8befd 100644 --- a/src/app/clusters/closure-control-server/closure-control-cluster-logic.cpp +++ b/src/app/clusters/closure-control-server/closure-control-cluster-logic.cpp @@ -272,6 +272,29 @@ CHIP_ERROR ClusterLogic::SetOverallCurrentState(const DataModel::Nullable