diff --git a/.github/.wordlist.txt b/.github/.wordlist.txt
index ecfcb937e5b986..c4f48058b70416 100644
--- a/.github/.wordlist.txt
+++ b/.github/.wordlist.txt
@@ -650,6 +650,7 @@ href
HSM
hsm
HTTPS
+Humidistat
HW
hwadr
HydrogenConcentrationMeasurement
diff --git a/.github/workflows/darwin-tests.yaml b/.github/workflows/darwin-tests.yaml
index a916250572bb6e..815293204b09de 100644
--- a/.github/workflows/darwin-tests.yaml
+++ b/.github/workflows/darwin-tests.yaml
@@ -95,6 +95,7 @@ jobs:
--target darwin-x64-lit-icd-${BUILD_VARIANT} \
--target darwin-x64-microwave-oven-${BUILD_VARIANT} \
--target darwin-x64-rvc-${BUILD_VARIANT} \
+ --target darwin-x64-network-manager-${BUILD_VARIANT} \
build \
--copy-artifacts-to objdir-clone \
"
@@ -116,6 +117,7 @@ jobs:
--bridge-app ./out/darwin-x64-bridge-${BUILD_VARIANT}/chip-bridge-app \
--microwave-oven-app ./out/darwin-x64-microwave-oven-${BUILD_VARIANT}/chip-microwave-oven-app \
--rvc-app ./out/darwin-x64-rvc-${BUILD_VARIANT}/chip-rvc-app \
+ --network-manager-app ./out/darwin-x64-network-manager-${BUILD_VARIANT}/matter-network-manager-app \
"
- name: Run OTA Test
run: |
diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml
index d6ff5d341cd070..bd89c463fe8012 100644
--- a/.github/workflows/tests.yaml
+++ b/.github/workflows/tests.yaml
@@ -186,6 +186,7 @@ jobs:
src/app/zap-templates/zcl/data-model/chip/thermostat-cluster.xml \
src/app/zap-templates/zcl/data-model/chip/thread-border-router-management-cluster.xml \
src/app/zap-templates/zcl/data-model/chip/thread-network-diagnostics-cluster.xml \
+ src/app/zap-templates/zcl/data-model/chip/thread-network-directory-cluster.xml \
src/app/zap-templates/zcl/data-model/chip/time-format-localization-cluster.xml \
src/app/zap-templates/zcl/data-model/chip/time-synchronization-cluster.xml \
src/app/zap-templates/zcl/data-model/chip/timer-cluster.xml \
@@ -223,6 +224,7 @@ jobs:
--target linux-x64-lit-icd-${BUILD_VARIANT} \
--target linux-x64-microwave-oven-${BUILD_VARIANT} \
--target linux-x64-rvc-${BUILD_VARIANT} \
+ --target linux-x64-network-manager-${BUILD_VARIANT} \
build \
--copy-artifacts-to objdir-clone \
"
@@ -245,6 +247,7 @@ jobs:
--lit-icd-app ./out/linux-x64-lit-icd-${BUILD_VARIANT}/lit-icd-app \
--microwave-oven-app ./out/linux-x64-microwave-oven-${BUILD_VARIANT}/chip-microwave-oven-app \
--rvc-app ./out/linux-x64-rvc-${BUILD_VARIANT}/chip-rvc-app \
+ --network-manager-app ./out/linux-x64-network-manager-${BUILD_VARIANT}/matter-network-manager-app \
"
- name: Run purposeful failure tests using the python parser sending commands to chip-tool
@@ -286,6 +289,7 @@ jobs:
--lit-icd-app ./out/linux-x64-lit-icd-${BUILD_VARIANT}/lit-icd-app \
--microwave-oven-app ./out/linux-x64-microwave-oven-${BUILD_VARIANT}/chip-microwave-oven-app \
--rvc-app ./out/linux-x64-rvc-${BUILD_VARIANT}/chip-rvc-app \
+ --network-manager-app ./out/linux-x64-network-manager-${BUILD_VARIANT}/matter-network-manager-app \
"
- name: Run Tests using chip-repl (including slow)
if: github.event_name == 'push'
@@ -305,6 +309,7 @@ jobs:
--lit-icd-app ./out/linux-x64-lit-icd-${BUILD_VARIANT}/lit-icd-app \
--microwave-oven-app ./out/linux-x64-microwave-oven-${BUILD_VARIANT}/chip-microwave-oven-app \
--rvc-app ./out/linux-x64-rvc-${BUILD_VARIANT}/chip-rvc-app \
+ --network-manager-app ./out/linux-x64-network-manager-${BUILD_VARIANT}/matter-network-manager-app \
"
- name: Uploading core files
uses: actions/upload-artifact@v4
@@ -373,6 +378,7 @@ jobs:
--target darwin-x64-lit-icd-${BUILD_VARIANT} \
--target darwin-x64-microwave-oven-${BUILD_VARIANT} \
--target darwin-x64-rvc-${BUILD_VARIANT} \
+ --target darwin-x64-network-manager-${BUILD_VARIANT} \
build \
--copy-artifacts-to objdir-clone \
"
@@ -396,6 +402,7 @@ jobs:
--lit-icd-app ./out/darwin-x64-lit-icd-${BUILD_VARIANT}/lit-icd-app \
--microwave-oven-app ./out/darwin-x64-microwave-oven-${BUILD_VARIANT}/chip-microwave-oven-app \
--rvc-app ./out/darwin-x64-rvc-${BUILD_VARIANT}/chip-rvc-app \
+ --network-manager-app ./out/darwin-x64-network-manager-${BUILD_VARIANT}/matter-network-manager-app \
"
- name: Run purposeful failure tests using the python parser sending commands to chip-tool
@@ -591,6 +598,10 @@ jobs:
scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --load-from-env /tmp/test_env.yaml --script src/python_testing/TC_RVCOPSTATE_2_4.py'
scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --load-from-env /tmp/test_env.yaml --script src/python_testing/TC_SC_7_1.py'
scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --load-from-env /tmp/test_env.yaml --script src/python_testing/TC_SWTCH.py'
+ scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --load-from-env /tmp/test_env.yaml --script src/python_testing/TC_WHM_1_2.py'
+ scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --load-from-env /tmp/test_env.yaml --script src/python_testing/TC_WHM_2_1.py'
+ scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --load-from-env /tmp/test_env.yaml --script src/python_testing/TC_LVL_2_3.py'
+ scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --load-from-env /tmp/test_env.yaml --script src/python_testing/TCP_Tests.py'
scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --script "src/python_testing/TestConformanceSupport.py" --script-args "--trace-to json:out/trace_data/test-{SCRIPT_BASE_NAME}.json --trace-to perfetto:out/trace_data/test-{SCRIPT_BASE_NAME}.perfetto"'
scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --script "src/python_testing/TestMatterTestingSupport.py" --script-args "--trace-to json:out/trace_data/test-{SCRIPT_BASE_NAME}.json --trace-to perfetto:out/trace_data/test-{SCRIPT_BASE_NAME}.perfetto"'
scripts/run_in_python_env.sh out/venv './scripts/tests/run_python_test.py --script "src/python_testing/TestSpecParsingSupport.py" --script-args "--trace-to json:out/trace_data/test-{SCRIPT_BASE_NAME}.json --trace-to perfetto:out/trace_data/test-{SCRIPT_BASE_NAME}.perfetto"'
diff --git a/BUILD.gn b/BUILD.gn
index 4d76100fbe6d20..82c8d855bfd291 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -57,6 +57,8 @@ if (current_toolchain != "${dir_pw_toolchain}/default:default") {
"${chip_root}/src/lib/core/tests:fuzz-tlv-reader",
"${chip_root}/src/lib/dnssd/minimal_mdns/tests:fuzz-minmdns-packet-parsing",
"${chip_root}/src/lib/format/tests:fuzz-payload-decoder",
+ "${chip_root}/src/setup_payload/tests:fuzz-setup-payload-base38",
+ "${chip_root}/src/setup_payload/tests:fuzz-setup-payload-base38-decode",
]
}
}
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn
index 1e634152a61d49..93333078f6f477 100644
--- a/build/config/compiler/BUILD.gn
+++ b/build/config/compiler/BUILD.gn
@@ -14,6 +14,7 @@
import("//build_overrides/build.gni")
import("//build_overrides/pigweed.gni")
+import("//build_overrides/pigweed_environment.gni")
import("${build_root}/chip/java/config.gni")
import("${build_root}/config/compiler/compiler.gni")
import("${build_root}/config/sysroot.gni")
@@ -348,7 +349,14 @@ config("cosmetic_default") {
}
config("runtime_default") {
- if (is_clang) { # Using Pigweed clang instead of Darwin host clang
+ if (is_clang &&
+ current_os == "mac") { # Using Pigweed clang instead of Darwin host clang
+ # Without pw_env_setup_CIPD_PIGWEED defined the hostclang:no_system_libcpp
+ # config silently uses the system libc++, usually resulting in linker errors.
+ assert(
+ defined(pw_env_setup_CIPD_PIGWEED),
+ "//build_overrides/pigweed_environment.gni must define pw_env_setup_CIPD_PIGWEED when using pigweed clang")
+
configs = [
"$dir_pw_toolchain/host_clang:no_system_libcpp",
"$dir_pw_toolchain/host_clang:xcode_sysroot",
diff --git a/config/esp32/components/chip/CMakeLists.txt b/config/esp32/components/chip/CMakeLists.txt
index ab3d02023f67e1..7929e8bbbd14aa 100644
--- a/config/esp32/components/chip/CMakeLists.txt
+++ b/config/esp32/components/chip/CMakeLists.txt
@@ -237,6 +237,12 @@ else()
chip_gn_arg_append("chip_openthread_ftd" "false")
endif()
+if (CONFIG_OPENTHREAD_BORDER_ROUTER)
+ chip_gn_arg_append("chip_openthread_border_router" "true")
+else()
+ chip_gn_arg_append("chip_openthread_border_router" "false")
+endif()
+
if (CONFIG_ENABLE_OTA_REQUESTOR)
chip_gn_arg_append("chip_enable_ota_requestor" "true")
endif()
diff --git a/config/nrfconnect/chip-module/CMakeLists.txt b/config/nrfconnect/chip-module/CMakeLists.txt
index bccd16b1416160..20c5c692b68633 100644
--- a/config/nrfconnect/chip-module/CMakeLists.txt
+++ b/config/nrfconnect/chip-module/CMakeLists.txt
@@ -200,7 +200,6 @@ matter_generate_args_tmp_file()
# ==============================================================================
matter_build(chip
- LIB_SHELL ${CONFIG_CHIP_LIB_SHELL}
LIB_TESTS ${CONFIG_CHIP_BUILD_TESTS}
DEVICE_INFO_EXAMPLE_PROVIDER ${CONFIG_CHIP_EXAMPLE_DEVICE_INFO_PROVIDER}
GN_DEPENDENCIES kernel
@@ -225,6 +224,16 @@ if (CONFIG_CHIP_MALLOC_SYS_HEAP_OVERRIDE)
)
endif()
+if (CONFIG_CHIP_LIB_SHELL)
+ # Force pulling chip::Shell::Engine::RunMainLoop() in the final binary.
+ # Without this workaround, the linker script does not process the shell and
+ # init objects defined in MainLoopZephyr.cpp unless the Matter library or
+ # the Matter shell library is linked using the '--whole-archive' flag.
+ target_link_options(chip INTERFACE
+ -Wl,-u,_ZN4chip5Shell6Engine11RunMainLoopEv
+ )
+endif()
+
# ==============================================================================
# Define 'chip-ota-image' target for building CHIP OTA image
# ==============================================================================
diff --git a/data_model/master/clusters/ACL-Cluster.xml b/data_model/master/clusters/ACL-Cluster.xml
index d5fbf419ba4daf..2278f7c7920ce4 100644
--- a/data_model/master/clusters/ACL-Cluster.xml
+++ b/data_model/master/clusters/ACL-Cluster.xml
@@ -57,15 +57,18 @@ Davis, CA 95616, USA
-->
-
-
+
+
-
+
+
+
+
@@ -80,11 +83,6 @@ Davis, CA 95616, USA
-
- -
-
-
-
-
-
@@ -106,6 +104,20 @@ Davis, CA 95616, USA
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
-
@@ -164,6 +176,45 @@ Davis, CA 95616, USA
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -175,7 +226,9 @@ Davis, CA 95616, USA
-
+
+
+
@@ -196,8 +249,17 @@ Davis, CA 95616, USA
-
-
+
+
+
+
+
+
+
+
+
+
+
@@ -205,6 +267,27 @@ Davis, CA 95616, USA
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -229,7 +312,9 @@ Davis, CA 95616, USA
-
+
+
+
@@ -248,5 +333,30 @@ Davis, CA 95616, USA
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/master/clusters/AccountLogin.xml b/data_model/master/clusters/AccountLogin.xml
index 8a9ed7d9389f40..6205fb6cb73261 100644
--- a/data_model/master/clusters/AccountLogin.xml
+++ b/data_model/master/clusters/AccountLogin.xml
@@ -59,7 +59,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/AdminCommissioningCluster.xml b/data_model/master/clusters/AdminCommissioningCluster.xml
index 8e95e46f128db0..77a8862b2eedc7 100644
--- a/data_model/master/clusters/AdminCommissioningCluster.xml
+++ b/data_model/master/clusters/AdminCommissioningCluster.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/AirQuality.xml b/data_model/master/clusters/AirQuality.xml
index c05717863c5ff4..69387d451a38c0 100644
--- a/data_model/master/clusters/AirQuality.xml
+++ b/data_model/master/clusters/AirQuality.xml
@@ -59,7 +59,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/ApplicationBasic.xml b/data_model/master/clusters/ApplicationBasic.xml
index 28e47e7800352e..93ffeeb958ad3a 100644
--- a/data_model/master/clusters/ApplicationBasic.xml
+++ b/data_model/master/clusters/ApplicationBasic.xml
@@ -59,7 +59,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/ApplicationLauncher.xml b/data_model/master/clusters/ApplicationLauncher.xml
index 27fa528a81e8cf..51fcde769007e9 100644
--- a/data_model/master/clusters/ApplicationLauncher.xml
+++ b/data_model/master/clusters/ApplicationLauncher.xml
@@ -57,9 +57,10 @@ Davis, CA 95616, USA
:xrefstyle: basic
-->
-
+
-
+
+
@@ -75,10 +76,19 @@ Davis, CA 95616, USA
-
- -
+
-
- -
+
-
+
+
+ -
+
+
+ -
+
+
+ -
diff --git a/data_model/master/clusters/AudioOutput.xml b/data_model/master/clusters/AudioOutput.xml
index 27bb5a20bb7952..9972a8a87e7a6f 100644
--- a/data_model/master/clusters/AudioOutput.xml
+++ b/data_model/master/clusters/AudioOutput.xml
@@ -59,7 +59,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/BasicInformationCluster.xml b/data_model/master/clusters/BasicInformationCluster.xml
index 538b4f5e9e9f8b..168a0353761159 100644
--- a/data_model/master/clusters/BasicInformationCluster.xml
+++ b/data_model/master/clusters/BasicInformationCluster.xml
@@ -57,20 +57,15 @@ Davis, CA 95616, USA
-->
-
+
-
+
-
-
-
-
-
-
@@ -308,23 +303,12 @@ Davis, CA 95616, USA
-
+
-
-
-
-
-
-
-
-
-
-
-
@@ -351,15 +335,5 @@ Davis, CA 95616, USA
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/data_model/master/clusters/Binding-Cluster.xml b/data_model/master/clusters/Binding-Cluster.xml
index 055725f0b9ee47..72fc1eb6b3282d 100644
--- a/data_model/master/clusters/Binding-Cluster.xml
+++ b/data_model/master/clusters/Binding-Cluster.xml
@@ -59,7 +59,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/BooleanState.xml b/data_model/master/clusters/BooleanState.xml
index ddb16e26a1d6ad..9754a7af60b57a 100644
--- a/data_model/master/clusters/BooleanState.xml
+++ b/data_model/master/clusters/BooleanState.xml
@@ -59,7 +59,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/BooleanStateConfiguration.xml b/data_model/master/clusters/BooleanStateConfiguration.xml
index 719cd9569b5ae2..d4ae791ad7649f 100644
--- a/data_model/master/clusters/BooleanStateConfiguration.xml
+++ b/data_model/master/clusters/BooleanStateConfiguration.xml
@@ -59,7 +59,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/Channel.xml b/data_model/master/clusters/Channel.xml
index 6177bfe6a652cc..a2edf151cb6001 100644
--- a/data_model/master/clusters/Channel.xml
+++ b/data_model/master/clusters/Channel.xml
@@ -59,7 +59,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/CommissionerControlCluster.xml b/data_model/master/clusters/CommissionerControlCluster.xml
index eaaa3c51ec4a30..9cda8f414c89da 100644
--- a/data_model/master/clusters/CommissionerControlCluster.xml
+++ b/data_model/master/clusters/CommissionerControlCluster.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/ContentAppObserver.xml b/data_model/master/clusters/ContentAppObserver.xml
index d6808baf982215..7ffe0b11d04377 100644
--- a/data_model/master/clusters/ContentAppObserver.xml
+++ b/data_model/master/clusters/ContentAppObserver.xml
@@ -59,7 +59,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/ContentControl.xml b/data_model/master/clusters/ContentControl.xml
index 6848886c43ac02..6b72a298ebeead 100644
--- a/data_model/master/clusters/ContentControl.xml
+++ b/data_model/master/clusters/ContentControl.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/ContentLauncher.xml b/data_model/master/clusters/ContentLauncher.xml
index b4d6e7fa26500c..5470a14ce1da64 100644
--- a/data_model/master/clusters/ContentLauncher.xml
+++ b/data_model/master/clusters/ContentLauncher.xml
@@ -59,7 +59,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/Descriptor-Cluster.xml b/data_model/master/clusters/Descriptor-Cluster.xml
index 9c0bcf0b2348e3..fabc3a2a16c658 100644
--- a/data_model/master/clusters/Descriptor-Cluster.xml
+++ b/data_model/master/clusters/Descriptor-Cluster.xml
@@ -59,7 +59,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/DeviceEnergyManagement.xml b/data_model/master/clusters/DeviceEnergyManagement.xml
index efc027f27cdeee..cb7f46c008f5e1 100644
--- a/data_model/master/clusters/DeviceEnergyManagement.xml
+++ b/data_model/master/clusters/DeviceEnergyManagement.xml
@@ -59,7 +59,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/DiagnosticLogsCluster.xml b/data_model/master/clusters/DiagnosticLogsCluster.xml
index 38520e81a85e16..9dc7f4c7ef448d 100644
--- a/data_model/master/clusters/DiagnosticLogsCluster.xml
+++ b/data_model/master/clusters/DiagnosticLogsCluster.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/DiagnosticsEthernet.xml b/data_model/master/clusters/DiagnosticsEthernet.xml
index fd2bb0341ca06c..f000669f64156c 100644
--- a/data_model/master/clusters/DiagnosticsEthernet.xml
+++ b/data_model/master/clusters/DiagnosticsEthernet.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/DiagnosticsGeneral.xml b/data_model/master/clusters/DiagnosticsGeneral.xml
index ff78100fe3a7d3..1266705ba6d0dc 100644
--- a/data_model/master/clusters/DiagnosticsGeneral.xml
+++ b/data_model/master/clusters/DiagnosticsGeneral.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
@@ -200,12 +200,12 @@ Davis, CA 95616, USA
-
+
-
+
diff --git a/data_model/master/clusters/DiagnosticsSoftware.xml b/data_model/master/clusters/DiagnosticsSoftware.xml
index c7ee8ee842bf02..55e865af040763 100644
--- a/data_model/master/clusters/DiagnosticsSoftware.xml
+++ b/data_model/master/clusters/DiagnosticsSoftware.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/DiagnosticsThread.xml b/data_model/master/clusters/DiagnosticsThread.xml
index 1da3eba21a4e4e..a55412d7fd3eff 100644
--- a/data_model/master/clusters/DiagnosticsThread.xml
+++ b/data_model/master/clusters/DiagnosticsThread.xml
@@ -55,10 +55,11 @@ Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
-->
-
+
-
+
+
@@ -665,6 +666,16 @@ Davis, CA 95616, USA
+
+
+
+
+
+
+
+
+
+
diff --git a/data_model/master/clusters/DiagnosticsWiFi.xml b/data_model/master/clusters/DiagnosticsWiFi.xml
index 6ef28ee4cc09e0..87f7e44dc92b55 100644
--- a/data_model/master/clusters/DiagnosticsWiFi.xml
+++ b/data_model/master/clusters/DiagnosticsWiFi.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/DoorLock.xml b/data_model/master/clusters/DoorLock.xml
index 138d40bdd544d6..46d659da94a690 100644
--- a/data_model/master/clusters/DoorLock.xml
+++ b/data_model/master/clusters/DoorLock.xml
@@ -116,9 +116,6 @@ Davis, CA 95616, USA
-
-
-
@@ -279,23 +276,6 @@ Davis, CA 95616, USA
-
- -
-
-
- -
-
-
- -
-
-
- -
-
-
- -
-
-
-
-
@@ -494,66 +474,6 @@ Davis, CA 95616, USA
-
- -
-
-
- -
-
-
- -
-
-
- -
-
-
- -
-
-
- -
-
-
- -
-
-
- -
-
-
- -
-
-
- -
-
-
- -
-
-
- -
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
- -
-
-
- -
-
-
- -
-
-
-
-
@@ -598,29 +518,6 @@ Davis, CA 95616, USA
-
- -
-
-
- -
-
-
- -
-
-
- -
-
-
- -
-
-
- -
-
-
- -
-
-
-
-
@@ -778,56 +675,6 @@ Davis, CA 95616, USA
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -871,7 +718,7 @@ Davis, CA 95616, USA
-
+
@@ -1120,67 +967,6 @@ Davis, CA 95616, USA
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -1958,47 +1744,6 @@ Davis, CA 95616, USA
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/data_model/master/clusters/ElectricalEnergyMeasurement.xml b/data_model/master/clusters/ElectricalEnergyMeasurement.xml
index 77e05665b2d031..259f9f512aec02 100644
--- a/data_model/master/clusters/ElectricalEnergyMeasurement.xml
+++ b/data_model/master/clusters/ElectricalEnergyMeasurement.xml
@@ -59,7 +59,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/ElectricalPowerMeasurement.xml b/data_model/master/clusters/ElectricalPowerMeasurement.xml
index ba9dd22f3fa799..5953d36b9d992e 100644
--- a/data_model/master/clusters/ElectricalPowerMeasurement.xml
+++ b/data_model/master/clusters/ElectricalPowerMeasurement.xml
@@ -59,7 +59,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/EnergyCalendar.xml b/data_model/master/clusters/EnergyCalendar.xml
index 5e9b3b782a435c..5be0f8ff520aea 100644
--- a/data_model/master/clusters/EnergyCalendar.xml
+++ b/data_model/master/clusters/EnergyCalendar.xml
@@ -59,9 +59,9 @@ Davis, CA 95616, USA
-->
-
+
-
+
diff --git a/data_model/master/clusters/EnergyEVSE.xml b/data_model/master/clusters/EnergyEVSE.xml
index e481e06aa4e5d4..a4c865c3096a60 100644
--- a/data_model/master/clusters/EnergyEVSE.xml
+++ b/data_model/master/clusters/EnergyEVSE.xml
@@ -57,12 +57,11 @@ Davis, CA 95616, USA
:xrefstyle: basic
-->
-
+
-
+
-
-
+
@@ -76,16 +75,25 @@ Davis, CA 95616, USA
-
+
+
+
+
-
+
+
+
+
-
+
+
+
+
diff --git a/data_model/master/clusters/EnergyPreference.xml b/data_model/master/clusters/EnergyPreference.xml
index cd2b722607a45b..2534ccfc8474c6 100644
--- a/data_model/master/clusters/EnergyPreference.xml
+++ b/data_model/master/clusters/EnergyPreference.xml
@@ -59,7 +59,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/EnergyPrice.xml b/data_model/master/clusters/EnergyPrice.xml
index a4efa28e1b0dbf..aae07641398eeb 100644
--- a/data_model/master/clusters/EnergyPrice.xml
+++ b/data_model/master/clusters/EnergyPrice.xml
@@ -59,10 +59,10 @@ Davis, CA 95616, USA
-->
-
+
-
+
diff --git a/data_model/master/clusters/FanControl.xml b/data_model/master/clusters/FanControl.xml
index daae13aff910d4..9eba1df549981c 100644
--- a/data_model/master/clusters/FanControl.xml
+++ b/data_model/master/clusters/FanControl.xml
@@ -59,7 +59,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/GeneralCommissioningCluster.xml b/data_model/master/clusters/GeneralCommissioningCluster.xml
index ed10afa8406a5a..2d9e65848f0c85 100644
--- a/data_model/master/clusters/GeneralCommissioningCluster.xml
+++ b/data_model/master/clusters/GeneralCommissioningCluster.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/Group-Key-Management-Cluster.xml b/data_model/master/clusters/Group-Key-Management-Cluster.xml
index 35de0890bd87d3..784bdc903ec186 100644
--- a/data_model/master/clusters/Group-Key-Management-Cluster.xml
+++ b/data_model/master/clusters/Group-Key-Management-Cluster.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/Groups.xml b/data_model/master/clusters/Groups.xml
index 6c53c1a602f255..214e6c18280afa 100644
--- a/data_model/master/clusters/Groups.xml
+++ b/data_model/master/clusters/Groups.xml
@@ -59,7 +59,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/Humidistat.xml b/data_model/master/clusters/Humidistat.xml
index c3aac1dab85a20..1af54698489d31 100644
--- a/data_model/master/clusters/Humidistat.xml
+++ b/data_model/master/clusters/Humidistat.xml
@@ -59,7 +59,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/ICDManagement.xml b/data_model/master/clusters/ICDManagement.xml
index d4731fb545ad9a..830f62fba2a63f 100644
--- a/data_model/master/clusters/ICDManagement.xml
+++ b/data_model/master/clusters/ICDManagement.xml
@@ -57,10 +57,11 @@ Davis, CA 95616, USA
// Update Name
-->
-
+
-
+
+
@@ -91,6 +92,14 @@ Davis, CA 95616, USA
+
+
+
+
+
+
+
+
@@ -217,6 +226,9 @@ Davis, CA 95616, USA
+
+
+
diff --git a/data_model/master/clusters/Identify.xml b/data_model/master/clusters/Identify.xml
index 0ab68abb8b1635..a6682b7233d30a 100644
--- a/data_model/master/clusters/Identify.xml
+++ b/data_model/master/clusters/Identify.xml
@@ -59,7 +59,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/JointFabricDatastoreCluster.xml b/data_model/master/clusters/JointFabricDatastoreCluster.xml
index 40e46ecc78519c..79143f34d03f55 100644
--- a/data_model/master/clusters/JointFabricDatastoreCluster.xml
+++ b/data_model/master/clusters/JointFabricDatastoreCluster.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
@@ -75,14 +75,33 @@ Davis, CA 95616, USA
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -90,309 +109,376 @@ Davis, CA 95616, USA
+
-
+
+
+
+
+
+
+
+
+
-
-
+
+
+
-
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
-
+
+
-
-
-
+
+
+
-
+
+
+
-
+
+
+
-
-
+
+
+
-
+
+
+
-
+
+
-
+
+
-
-
+
+
+
-
+
+
-
-
+
+
+
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
-
+
+
-
+
+
-
+
-
+
-
+
-
+
-
+
-
-
-
-
-
-
-
+
-
+
-
+
-
+
+
-
+
+
-
-
-
-
-
+
+
-
-
-
-
-
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
+
-
+
-
+
-
+
+
-
-
-
-
-
+
+
+
-
+
+
+
-
+
-
-
-
-
+
-
+
-
+
-
+
+
-
+
+
+
+
+
-
+
-
+
+
-
+
-
-
-
-
+
-
+
-
+
-
+
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
-
-
-
+
-
+
-
+
@@ -402,32 +488,23 @@ Davis, CA 95616, USA
-
+
-
-
-
-
+
-
+
-
+
-
-
-
-
+
-
-
-
-
+
diff --git a/data_model/master/clusters/JointFabricPKICluster.xml b/data_model/master/clusters/JointFabricPKICluster.xml
index 3519a11cec79c6..b8c9474b0163d8 100644
--- a/data_model/master/clusters/JointFabricPKICluster.xml
+++ b/data_model/master/clusters/JointFabricPKICluster.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/KeypadInput.xml b/data_model/master/clusters/KeypadInput.xml
index 57d6ef4650e013..efeb92ba28fb73 100644
--- a/data_model/master/clusters/KeypadInput.xml
+++ b/data_model/master/clusters/KeypadInput.xml
@@ -59,7 +59,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/Label-Cluster-FixedLabelCluster.xml b/data_model/master/clusters/Label-Cluster-FixedLabelCluster.xml
index b915e77bb5a01f..a172d1e281eff5 100644
--- a/data_model/master/clusters/Label-Cluster-FixedLabelCluster.xml
+++ b/data_model/master/clusters/Label-Cluster-FixedLabelCluster.xml
@@ -59,7 +59,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/Label-Cluster-LabelCluster.xml b/data_model/master/clusters/Label-Cluster-LabelCluster.xml
index 43148b6dc9186f..2f8a371f74042c 100644
--- a/data_model/master/clusters/Label-Cluster-LabelCluster.xml
+++ b/data_model/master/clusters/Label-Cluster-LabelCluster.xml
@@ -59,7 +59,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/Label-Cluster-UserLabelCluster.xml b/data_model/master/clusters/Label-Cluster-UserLabelCluster.xml
index 40dac53a4242cd..466550f12520f1 100644
--- a/data_model/master/clusters/Label-Cluster-UserLabelCluster.xml
+++ b/data_model/master/clusters/Label-Cluster-UserLabelCluster.xml
@@ -59,7 +59,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/LaundryDryerControls.xml b/data_model/master/clusters/LaundryDryerControls.xml
index d860d2ef9dcf21..85f7871b267be5 100644
--- a/data_model/master/clusters/LaundryDryerControls.xml
+++ b/data_model/master/clusters/LaundryDryerControls.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/LaundryWasherControls.xml b/data_model/master/clusters/LaundryWasherControls.xml
index 6fbfc0a882d3d1..046ecc3c51d697 100644
--- a/data_model/master/clusters/LaundryWasherControls.xml
+++ b/data_model/master/clusters/LaundryWasherControls.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/LevelControl.xml b/data_model/master/clusters/LevelControl.xml
index 5da823bc1dceb0..28f88b96832c32 100644
--- a/data_model/master/clusters/LevelControl.xml
+++ b/data_model/master/clusters/LevelControl.xml
@@ -59,7 +59,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/LocalizationConfiguration.xml b/data_model/master/clusters/LocalizationConfiguration.xml
index 7ddfba8efcc9cb..6bc3abd50600ab 100644
--- a/data_model/master/clusters/LocalizationConfiguration.xml
+++ b/data_model/master/clusters/LocalizationConfiguration.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/LocalizationTimeFormat.xml b/data_model/master/clusters/LocalizationTimeFormat.xml
index 2ede281c7352a9..2de3724879701d 100644
--- a/data_model/master/clusters/LocalizationTimeFormat.xml
+++ b/data_model/master/clusters/LocalizationTimeFormat.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/LocalizationUnit.xml b/data_model/master/clusters/LocalizationUnit.xml
index 0157ebb53b0d39..e08ce0e8810f26 100644
--- a/data_model/master/clusters/LocalizationUnit.xml
+++ b/data_model/master/clusters/LocalizationUnit.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/LowPower.xml b/data_model/master/clusters/LowPower.xml
index cf75cb0c680164..2e91a02c16a4b3 100644
--- a/data_model/master/clusters/LowPower.xml
+++ b/data_model/master/clusters/LowPower.xml
@@ -59,7 +59,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/MediaInput.xml b/data_model/master/clusters/MediaInput.xml
index a92985ff924a75..c01567f6e1ae3e 100644
--- a/data_model/master/clusters/MediaInput.xml
+++ b/data_model/master/clusters/MediaInput.xml
@@ -59,7 +59,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/MediaPlayback.xml b/data_model/master/clusters/MediaPlayback.xml
index dae60d7a1b2572..e37d5944aeb366 100644
--- a/data_model/master/clusters/MediaPlayback.xml
+++ b/data_model/master/clusters/MediaPlayback.xml
@@ -59,7 +59,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/Messages.xml b/data_model/master/clusters/Messages.xml
index 402310c4b92eea..d2dbd28ba87f81 100644
--- a/data_model/master/clusters/Messages.xml
+++ b/data_model/master/clusters/Messages.xml
@@ -98,7 +98,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/MicrowaveOvenControl.xml b/data_model/master/clusters/MicrowaveOvenControl.xml
index 360b9edeaa55f1..2169f7b1437945 100644
--- a/data_model/master/clusters/MicrowaveOvenControl.xml
+++ b/data_model/master/clusters/MicrowaveOvenControl.xml
@@ -59,7 +59,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/ModeBase.xml b/data_model/master/clusters/ModeBase.xml
index 4a70ad670d0dca..c874eee69d3eb6 100644
--- a/data_model/master/clusters/ModeBase.xml
+++ b/data_model/master/clusters/ModeBase.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
@@ -105,7 +105,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/master/clusters/ModeSelect.xml b/data_model/master/clusters/ModeSelect.xml
index 76ebf5874af273..6e6f062182e503 100644
--- a/data_model/master/clusters/ModeSelect.xml
+++ b/data_model/master/clusters/ModeSelect.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
@@ -116,7 +116,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/master/clusters/Mode_DeviceEnergyManagement.xml b/data_model/master/clusters/Mode_DeviceEnergyManagement.xml
index 08c4044617d716..ff8f7e910e94b0 100644
--- a/data_model/master/clusters/Mode_DeviceEnergyManagement.xml
+++ b/data_model/master/clusters/Mode_DeviceEnergyManagement.xml
@@ -59,7 +59,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/Mode_Dishwasher.xml b/data_model/master/clusters/Mode_Dishwasher.xml
index 40a19828d44ebb..8069fdddcf0cc3 100644
--- a/data_model/master/clusters/Mode_Dishwasher.xml
+++ b/data_model/master/clusters/Mode_Dishwasher.xml
@@ -59,7 +59,7 @@ Davis, CA 95616, USA
-->
-
+
@@ -80,6 +80,11 @@ Davis, CA 95616, USA
+
+
+
+
+
@@ -88,10 +93,10 @@ Davis, CA 95616, USA
-
+
-
+
\ No newline at end of file
diff --git a/data_model/master/clusters/Mode_EVSE.xml b/data_model/master/clusters/Mode_EVSE.xml
index f139ab3cbfaf9a..daf8042cc3293b 100644
--- a/data_model/master/clusters/Mode_EVSE.xml
+++ b/data_model/master/clusters/Mode_EVSE.xml
@@ -59,7 +59,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/Mode_LaundryWasher.xml b/data_model/master/clusters/Mode_LaundryWasher.xml
index 5d3cce891790e1..444d536fd178fd 100644
--- a/data_model/master/clusters/Mode_LaundryWasher.xml
+++ b/data_model/master/clusters/Mode_LaundryWasher.xml
@@ -59,7 +59,7 @@ Davis, CA 95616, USA
-->
-
+
@@ -80,6 +80,11 @@ Davis, CA 95616, USA
+
+
+
+
+
@@ -88,10 +93,10 @@ Davis, CA 95616, USA
-
+
-
+
\ No newline at end of file
diff --git a/data_model/master/clusters/Mode_MicrowaveOven.xml b/data_model/master/clusters/Mode_MicrowaveOven.xml
index 6f1e8ed895f489..b5076d8c270099 100644
--- a/data_model/master/clusters/Mode_MicrowaveOven.xml
+++ b/data_model/master/clusters/Mode_MicrowaveOven.xml
@@ -59,12 +59,17 @@ Davis, CA 95616, USA
-->
-
+
+
+
+
+
+
diff --git a/data_model/master/clusters/Mode_Oven.xml b/data_model/master/clusters/Mode_Oven.xml
index bf6c1b57928a57..f7e8c8a4268cf2 100644
--- a/data_model/master/clusters/Mode_Oven.xml
+++ b/data_model/master/clusters/Mode_Oven.xml
@@ -59,7 +59,7 @@ Davis, CA 95616, USA
-->
-
+
@@ -79,4 +79,23 @@ Davis, CA 95616, USA
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/master/clusters/Mode_RVCClean.xml b/data_model/master/clusters/Mode_RVCClean.xml
index b48ffa24a35b50..26b5d15c185fe3 100644
--- a/data_model/master/clusters/Mode_RVCClean.xml
+++ b/data_model/master/clusters/Mode_RVCClean.xml
@@ -59,7 +59,7 @@ Davis, CA 95616, USA
-->
-
+
@@ -81,6 +81,11 @@ Davis, CA 95616, USA
+
+
+
+
+
diff --git a/data_model/master/clusters/Mode_RVCRun.xml b/data_model/master/clusters/Mode_RVCRun.xml
index ddfad8adc89d2e..ad0d7601a45c22 100644
--- a/data_model/master/clusters/Mode_RVCRun.xml
+++ b/data_model/master/clusters/Mode_RVCRun.xml
@@ -59,7 +59,7 @@ Davis, CA 95616, USA
-->
-
+
@@ -81,6 +81,11 @@ Davis, CA 95616, USA
+
+
+
+
+
diff --git a/data_model/master/clusters/Mode_Refrigerator.xml b/data_model/master/clusters/Mode_Refrigerator.xml
index b4550283daf9e5..84410d1ddfc465 100644
--- a/data_model/master/clusters/Mode_Refrigerator.xml
+++ b/data_model/master/clusters/Mode_Refrigerator.xml
@@ -59,7 +59,7 @@ Davis, CA 95616, USA
-->
-
+
@@ -80,6 +80,11 @@ Davis, CA 95616, USA
+
+
+
+
+
@@ -88,10 +93,10 @@ Davis, CA 95616, USA
-
+
-
+
\ No newline at end of file
diff --git a/data_model/master/clusters/Mode_WaterHeater.xml b/data_model/master/clusters/Mode_WaterHeater.xml
index 482ea0e33d0f9a..1779e74bab8c84 100644
--- a/data_model/master/clusters/Mode_WaterHeater.xml
+++ b/data_model/master/clusters/Mode_WaterHeater.xml
@@ -59,7 +59,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/NetworkCommissioningCluster.xml b/data_model/master/clusters/NetworkCommissioningCluster.xml
index 63efd6c3d3cbb2..8eefb234a2920a 100644
--- a/data_model/master/clusters/NetworkCommissioningCluster.xml
+++ b/data_model/master/clusters/NetworkCommissioningCluster.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/NetworkIdentityManagement.xml b/data_model/master/clusters/NetworkIdentityManagement.xml
index b432b8b68f6b23..cef2f88f6ddad9 100644
--- a/data_model/master/clusters/NetworkIdentityManagement.xml
+++ b/data_model/master/clusters/NetworkIdentityManagement.xml
@@ -59,7 +59,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/OTAProvider.xml b/data_model/master/clusters/OTAProvider.xml
index 2a5be10961f02c..f300a419518675 100644
--- a/data_model/master/clusters/OTAProvider.xml
+++ b/data_model/master/clusters/OTAProvider.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/OTARequestor.xml b/data_model/master/clusters/OTARequestor.xml
index 3a562c9f18a046..83314d14d9551a 100644
--- a/data_model/master/clusters/OTARequestor.xml
+++ b/data_model/master/clusters/OTARequestor.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/OccupancySensing.xml b/data_model/master/clusters/OccupancySensing.xml
index 2852ce812f9308..4cd027deb07279 100644
--- a/data_model/master/clusters/OccupancySensing.xml
+++ b/data_model/master/clusters/OccupancySensing.xml
@@ -410,7 +410,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/master/clusters/OnOff.xml b/data_model/master/clusters/OnOff.xml
index b06c96a64376ac..b1ea6ebba4af7d 100644
--- a/data_model/master/clusters/OnOff.xml
+++ b/data_model/master/clusters/OnOff.xml
@@ -59,7 +59,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/OperationalCredentialCluster.xml b/data_model/master/clusters/OperationalCredentialCluster.xml
index b3811db4a5774a..338a8af007c5b9 100644
--- a/data_model/master/clusters/OperationalCredentialCluster.xml
+++ b/data_model/master/clusters/OperationalCredentialCluster.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/OperationalState.xml b/data_model/master/clusters/OperationalState.xml
index 06c77fc29a2c19..354efa2400bda7 100644
--- a/data_model/master/clusters/OperationalState.xml
+++ b/data_model/master/clusters/OperationalState.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/OperationalState_Oven.xml b/data_model/master/clusters/OperationalState_Oven.xml
index fbcc634330faa7..710dea9806bf57 100644
--- a/data_model/master/clusters/OperationalState_Oven.xml
+++ b/data_model/master/clusters/OperationalState_Oven.xml
@@ -59,10 +59,21 @@ Davis, CA 95616, USA
-->
-
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/master/clusters/OperationalState_RVC.xml b/data_model/master/clusters/OperationalState_RVC.xml
index f33791fcf86407..5d2d28db2c2cad 100644
--- a/data_model/master/clusters/OperationalState_RVC.xml
+++ b/data_model/master/clusters/OperationalState_RVC.xml
@@ -59,7 +59,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/PowerSourceCluster.xml b/data_model/master/clusters/PowerSourceCluster.xml
index 4596880e32b938..a0b6b91c565dd8 100644
--- a/data_model/master/clusters/PowerSourceCluster.xml
+++ b/data_model/master/clusters/PowerSourceCluster.xml
@@ -55,10 +55,11 @@ Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
-->
-
+
-
+
+
@@ -631,7 +632,7 @@ Davis, CA 95616, USA
-
+
@@ -639,7 +640,7 @@ Davis, CA 95616, USA
-
+
@@ -744,7 +745,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/master/clusters/PowerSourceConfigurationCluster.xml b/data_model/master/clusters/PowerSourceConfigurationCluster.xml
index 5348f6f0b091b6..61df60149ca00f 100644
--- a/data_model/master/clusters/PowerSourceConfigurationCluster.xml
+++ b/data_model/master/clusters/PowerSourceConfigurationCluster.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/PowerTopology.xml b/data_model/master/clusters/PowerTopology.xml
index b958d03c01aeb1..eb0a2d74f5e585 100644
--- a/data_model/master/clusters/PowerTopology.xml
+++ b/data_model/master/clusters/PowerTopology.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/ProxyConfiguration-Cluster.xml b/data_model/master/clusters/ProxyConfiguration-Cluster.xml
index c33ed5cd03b841..6796e79ac9bf59 100644
--- a/data_model/master/clusters/ProxyConfiguration-Cluster.xml
+++ b/data_model/master/clusters/ProxyConfiguration-Cluster.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/ProxyDiscovery-Cluster.xml b/data_model/master/clusters/ProxyDiscovery-Cluster.xml
index 159bdff7333853..7353386929c109 100644
--- a/data_model/master/clusters/ProxyDiscovery-Cluster.xml
+++ b/data_model/master/clusters/ProxyDiscovery-Cluster.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/ResourceMonitoring.xml b/data_model/master/clusters/ResourceMonitoring.xml
index feb6394fd6b47d..b9d26ff6dd9ecf 100644
--- a/data_model/master/clusters/ResourceMonitoring.xml
+++ b/data_model/master/clusters/ResourceMonitoring.xml
@@ -59,7 +59,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/ServiceArea.xml b/data_model/master/clusters/ServiceArea.xml
index 4980fc5ad40274..6a54264a94928b 100644
--- a/data_model/master/clusters/ServiceArea.xml
+++ b/data_model/master/clusters/ServiceArea.xml
@@ -57,95 +57,77 @@ Davis, CA 95616, USA
-->
-
+
-
+
-
+
+
+
+
- -
-
-
- -
-
-
- -
-
-
- -
-
-
-
-
- -
-
-
- -
+
-
- -
+
-
- -
+
-
- -
+
-
-
- -
-
-
- -
-
-
- -
-
-
-
-
-
+
+
-
+
-
-
+
+
+
-
+
+
-
-
-
+
-
-
+
+
+
-
+
+
-
+
@@ -154,7 +136,7 @@ Davis, CA 95616, USA
-
+
@@ -164,92 +146,91 @@ Davis, CA 95616, USA
-
+
-
-
+
+
-
+
-
-
-
+
+
+
+
-
+
-
-
+
-
-
+
-
+
-
-
-
+
+
+
+
-
+
-
+
-
-
-
-
-
-
+
+
+
-
+
-
+
-
-
-
+
+
+
+
-
+
-
+
-
+
+
diff --git a/data_model/master/clusters/SmokeCOAlarm.xml b/data_model/master/clusters/SmokeCOAlarm.xml
index 4ba9bd2708b476..482a8a82f2abf5 100644
--- a/data_model/master/clusters/SmokeCOAlarm.xml
+++ b/data_model/master/clusters/SmokeCOAlarm.xml
@@ -59,7 +59,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/Switch.xml b/data_model/master/clusters/Switch.xml
index bb2066269b4f94..92489c1e9228a3 100644
--- a/data_model/master/clusters/Switch.xml
+++ b/data_model/master/clusters/Switch.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/TargetNavigator.xml b/data_model/master/clusters/TargetNavigator.xml
index c5fb59919585c1..b1fcff6d60cd1e 100644
--- a/data_model/master/clusters/TargetNavigator.xml
+++ b/data_model/master/clusters/TargetNavigator.xml
@@ -59,7 +59,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/TemperatureControl.xml b/data_model/master/clusters/TemperatureControl.xml
index 2f2527ce4ad0fa..79519716ea1cf8 100644
--- a/data_model/master/clusters/TemperatureControl.xml
+++ b/data_model/master/clusters/TemperatureControl.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/Thermostat.xml b/data_model/master/clusters/Thermostat.xml
index 4374bc3f1c8a7d..de1743d8addf1a 100644
--- a/data_model/master/clusters/Thermostat.xml
+++ b/data_model/master/clusters/Thermostat.xml
@@ -1,6 +1,6 @@
-
+
@@ -63,8 +63,9 @@ Davis, CA 95616, USA
-
-
+
@@ -396,10 +397,10 @@ Davis, CA 95616, USA
-
+
-
+
@@ -409,6 +410,11 @@ Davis, CA 95616, USA
+
+
+
+
+
@@ -589,7 +595,7 @@ Davis, CA 95616, USA
-
+
@@ -654,12 +660,11 @@ Davis, CA 95616, USA
-
+
-
@@ -726,7 +731,7 @@ Davis, CA 95616, USA
-
+
@@ -734,7 +739,7 @@ Davis, CA 95616, USA
-
+
@@ -816,7 +821,7 @@ Davis, CA 95616, USA
-
+
@@ -1047,7 +1052,7 @@ Davis, CA 95616, USA
-
+
@@ -1055,7 +1060,7 @@ Davis, CA 95616, USA
-
+
@@ -1079,16 +1084,7 @@ Davis, CA 95616, USA
-
-
-
-
-
-
-
-
-
-
+
@@ -1223,36 +1219,5 @@ Davis, CA 95616, USA
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/data_model/master/clusters/ThermostatUserInterfaceConfiguration.xml b/data_model/master/clusters/ThermostatUserInterfaceConfiguration.xml
index b4ecd49f93ae4a..d6a52248282321 100644
--- a/data_model/master/clusters/ThermostatUserInterfaceConfiguration.xml
+++ b/data_model/master/clusters/ThermostatUserInterfaceConfiguration.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/ThreadBorderRouterManagement.xml b/data_model/master/clusters/ThreadBorderRouterManagement.xml
index b22d4038219647..7ae4edab62f8b3 100644
--- a/data_model/master/clusters/ThreadBorderRouterManagement.xml
+++ b/data_model/master/clusters/ThreadBorderRouterManagement.xml
@@ -59,12 +59,12 @@ Davis, CA 95616, USA
-->
-
+
-
+
@@ -119,7 +119,7 @@ Davis, CA 95616, USA
-
+
@@ -130,7 +130,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/master/clusters/ThreadNetworkDirectory.xml b/data_model/master/clusters/ThreadNetworkDirectory.xml
index aeabdcf19f93d1..098b490fa5d369 100644
--- a/data_model/master/clusters/ThreadNetworkDirectory.xml
+++ b/data_model/master/clusters/ThreadNetworkDirectory.xml
@@ -59,7 +59,7 @@ Davis, CA 95616, USA
-->
-
+
@@ -67,8 +67,9 @@ Davis, CA 95616, USA
-
+
+
@@ -77,17 +78,21 @@ Davis, CA 95616, USA
+
+
+
-
-
+
+
+
-
+
@@ -111,15 +116,17 @@ Davis, CA 95616, USA
-
+
+
-
+
-
+
+
@@ -130,13 +137,4 @@ Davis, CA 95616, USA
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/data_model/master/clusters/TimeSync.xml b/data_model/master/clusters/TimeSync.xml
index a506a647aeb8a3..e72a9d32467983 100644
--- a/data_model/master/clusters/TimeSync.xml
+++ b/data_model/master/clusters/TimeSync.xml
@@ -60,7 +60,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/ValidProxies-Cluster.xml b/data_model/master/clusters/ValidProxies-Cluster.xml
index c5740c90e52433..51cfeedb46926d 100644
--- a/data_model/master/clusters/ValidProxies-Cluster.xml
+++ b/data_model/master/clusters/ValidProxies-Cluster.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/ValveConfigurationControl.xml b/data_model/master/clusters/ValveConfigurationControl.xml
index 736672bc78f716..03d40acd480ff4 100644
--- a/data_model/master/clusters/ValveConfigurationControl.xml
+++ b/data_model/master/clusters/ValveConfigurationControl.xml
@@ -59,7 +59,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/WakeOnLAN.xml b/data_model/master/clusters/WakeOnLAN.xml
index 7f5c08bdd624ad..092e0a8ea8f4de 100644
--- a/data_model/master/clusters/WakeOnLAN.xml
+++ b/data_model/master/clusters/WakeOnLAN.xml
@@ -59,7 +59,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/WaterHeaterManagement.xml b/data_model/master/clusters/WaterHeaterManagement.xml
index ee38a0058b50fb..cadf8e0a8af53b 100644
--- a/data_model/master/clusters/WaterHeaterManagement.xml
+++ b/data_model/master/clusters/WaterHeaterManagement.xml
@@ -59,7 +59,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/WiFiNetworkManagement.xml b/data_model/master/clusters/WiFiNetworkManagement.xml
index cfa10af25f0dd6..3aad5935d2843d 100644
--- a/data_model/master/clusters/WiFiNetworkManagement.xml
+++ b/data_model/master/clusters/WiFiNetworkManagement.xml
@@ -59,23 +59,28 @@ Davis, CA 95616, USA
-->
-
+
-
+
+
+
+
+
+
-
+
diff --git a/data_model/master/clusters/WindowCovering.xml b/data_model/master/clusters/WindowCovering.xml
index 2f087914405cf3..f8c60b46901dc9 100644
--- a/data_model/master/clusters/WindowCovering.xml
+++ b/data_model/master/clusters/WindowCovering.xml
@@ -340,13 +340,13 @@ Davis, CA 95616, USA
-
+
-
+
-
+
@@ -464,7 +464,7 @@ Davis, CA 95616, USA
-
+
@@ -474,7 +474,7 @@ Davis, CA 95616, USA
-
+
@@ -491,7 +491,7 @@ Davis, CA 95616, USA
-
+
@@ -501,7 +501,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/master/clusters/bridge-clusters-ActionsCluster.xml b/data_model/master/clusters/bridge-clusters-ActionsCluster.xml
index 5b9b54429b9429..4874aca26bc504 100644
--- a/data_model/master/clusters/bridge-clusters-ActionsCluster.xml
+++ b/data_model/master/clusters/bridge-clusters-ActionsCluster.xml
@@ -59,7 +59,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/clusters/bridge-clusters-BridgedDeviceBasicInformationCluster.xml b/data_model/master/clusters/bridge-clusters-BridgedDeviceBasicInformationCluster.xml
index 318ad7fa54dd2a..4368d991c832f4 100644
--- a/data_model/master/clusters/bridge-clusters-BridgedDeviceBasicInformationCluster.xml
+++ b/data_model/master/clusters/bridge-clusters-BridgedDeviceBasicInformationCluster.xml
@@ -59,17 +59,17 @@ Davis, CA 95616, USA
-->
-
+
-
+
-
+
@@ -86,9 +86,7 @@ Davis, CA 95616, USA
-
-
-
+
@@ -148,7 +146,7 @@ Davis, CA 95616, USA
-
+
@@ -178,11 +176,15 @@ Davis, CA 95616, USA
-
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/master/clusters/bridge-clusters-EcosystemInformationCluster.xml b/data_model/master/clusters/bridge-clusters-EcosystemInformationCluster.xml
index 4801cbf88800ae..22cc88097acf75 100644
--- a/data_model/master/clusters/bridge-clusters-EcosystemInformationCluster.xml
+++ b/data_model/master/clusters/bridge-clusters-EcosystemInformationCluster.xml
@@ -59,7 +59,7 @@ Davis, CA 95616, USA
-->
-
+
@@ -68,69 +68,79 @@ Davis, CA 95616, USA
+
-
-
-
+
+
+
-
+
+
-
-
+
+
+
+
+
+
-
+
+
+
-
+
+
-
-
+
+
+
-
-
-
-
+
+
+
+
-
-
+
+
-
-
+
+
-
+
-
-
+
+
-
+
\ No newline at end of file
diff --git a/data_model/master/device_types/Aggregator.xml b/data_model/master/device_types/Aggregator.xml
index 48aa4347d850e1..a99ee1108c3b50 100644
--- a/data_model/master/device_types/Aggregator.xml
+++ b/data_model/master/device_types/Aggregator.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/AirPurifier.xml b/data_model/master/device_types/AirPurifier.xml
index 538d9a4e341efb..62045f090c71a5 100644
--- a/data_model/master/device_types/AirPurifier.xml
+++ b/data_model/master/device_types/AirPurifier.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/AirQualitySensor.xml b/data_model/master/device_types/AirQualitySensor.xml
index bf56eb754f24c6..756b42e437ac9a 100644
--- a/data_model/master/device_types/AirQualitySensor.xml
+++ b/data_model/master/device_types/AirQualitySensor.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/BaseDeviceType.xml b/data_model/master/device_types/BaseDeviceType.xml
index ddcc49f258f0cb..272b74feb5ff67 100644
--- a/data_model/master/device_types/BaseDeviceType.xml
+++ b/data_model/master/device_types/BaseDeviceType.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/BasicVideoPlayer.xml b/data_model/master/device_types/BasicVideoPlayer.xml
index ed82d08bc7a112..d35bbed3211422 100644
--- a/data_model/master/device_types/BasicVideoPlayer.xml
+++ b/data_model/master/device_types/BasicVideoPlayer.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/BatteryStorage.xml b/data_model/master/device_types/BatteryStorage.xml
index 321e9f9dfe2159..5f09eeb1d2dac9 100644
--- a/data_model/master/device_types/BatteryStorage.xml
+++ b/data_model/master/device_types/BatteryStorage.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/BridgedNode.xml b/data_model/master/device_types/BridgedNode.xml
index 59414205c052b5..6f309001975627 100644
--- a/data_model/master/device_types/BridgedNode.xml
+++ b/data_model/master/device_types/BridgedNode.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/CastingVideoClient.xml b/data_model/master/device_types/CastingVideoClient.xml
index 8f816b3e2a8056..949142a6bca151 100644
--- a/data_model/master/device_types/CastingVideoClient.xml
+++ b/data_model/master/device_types/CastingVideoClient.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/CastingVideoPlayer.xml b/data_model/master/device_types/CastingVideoPlayer.xml
index 0b65f4f7aab57d..5c88cf92947e0b 100644
--- a/data_model/master/device_types/CastingVideoPlayer.xml
+++ b/data_model/master/device_types/CastingVideoPlayer.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/ColorDimmerSwitch.xml b/data_model/master/device_types/ColorDimmerSwitch.xml
index 190ab6c7fc8b7e..abc027eaec711c 100644
--- a/data_model/master/device_types/ColorDimmerSwitch.xml
+++ b/data_model/master/device_types/ColorDimmerSwitch.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/ColorTemperatureLight.xml b/data_model/master/device_types/ColorTemperatureLight.xml
index 4f7cf64a9fd0a2..56db5416cf02c9 100644
--- a/data_model/master/device_types/ColorTemperatureLight.xml
+++ b/data_model/master/device_types/ColorTemperatureLight.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/ContactSensor.xml b/data_model/master/device_types/ContactSensor.xml
index 6fa5620a77bebb..2767e5e37a384b 100644
--- a/data_model/master/device_types/ContactSensor.xml
+++ b/data_model/master/device_types/ContactSensor.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/ContentApp.xml b/data_model/master/device_types/ContentApp.xml
index 300e3122336ef4..81b967db9c8dc1 100644
--- a/data_model/master/device_types/ContentApp.xml
+++ b/data_model/master/device_types/ContentApp.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/ControlBridge.xml b/data_model/master/device_types/ControlBridge.xml
index 04ff66db808cc9..ab07228e728f52 100644
--- a/data_model/master/device_types/ControlBridge.xml
+++ b/data_model/master/device_types/ControlBridge.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/CookSurface.xml b/data_model/master/device_types/CookSurface.xml
index a32425e2f1df08..3a0e8f062c7495 100644
--- a/data_model/master/device_types/CookSurface.xml
+++ b/data_model/master/device_types/CookSurface.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/Cooktop.xml b/data_model/master/device_types/Cooktop.xml
index ea94653008d25a..2c7795de12233b 100644
--- a/data_model/master/device_types/Cooktop.xml
+++ b/data_model/master/device_types/Cooktop.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/DeviceEnergyManagement.xml b/data_model/master/device_types/DeviceEnergyManagement.xml
index cf148dabc13679..85f7c5d9a7cd66 100644
--- a/data_model/master/device_types/DeviceEnergyManagement.xml
+++ b/data_model/master/device_types/DeviceEnergyManagement.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/DimmableLight.xml b/data_model/master/device_types/DimmableLight.xml
index 059a0802f77906..4d6c53e4ae36fd 100644
--- a/data_model/master/device_types/DimmableLight.xml
+++ b/data_model/master/device_types/DimmableLight.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/DimmablePlug-InUnit.xml b/data_model/master/device_types/DimmablePlug-InUnit.xml
index 65f6b6e1dd2e9c..73fd2a37c48bab 100644
--- a/data_model/master/device_types/DimmablePlug-InUnit.xml
+++ b/data_model/master/device_types/DimmablePlug-InUnit.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/DimmerSwitch.xml b/data_model/master/device_types/DimmerSwitch.xml
index 0ad9f23638349a..9dce28fdd7ce71 100644
--- a/data_model/master/device_types/DimmerSwitch.xml
+++ b/data_model/master/device_types/DimmerSwitch.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/Dishwasher.xml b/data_model/master/device_types/Dishwasher.xml
index 6e351f38360e4e..b13f9a42ebcc49 100644
--- a/data_model/master/device_types/Dishwasher.xml
+++ b/data_model/master/device_types/Dishwasher.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/DoorLock.xml b/data_model/master/device_types/DoorLock.xml
index 8b73bbf8679a6b..121ea179d14589 100644
--- a/data_model/master/device_types/DoorLock.xml
+++ b/data_model/master/device_types/DoorLock.xml
@@ -57,8 +57,8 @@ Davis, CA 95616, USA
-->
-
-
+
+
@@ -95,14 +95,49 @@ Davis, CA 95616, USA
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/master/device_types/DoorLockController.xml b/data_model/master/device_types/DoorLockController.xml
index 64d26eba8d8eeb..101dc46f5ccd40 100644
--- a/data_model/master/device_types/DoorLockController.xml
+++ b/data_model/master/device_types/DoorLockController.xml
@@ -57,8 +57,8 @@ Davis, CA 95616, USA
-->
-
-
+
+
diff --git a/data_model/master/device_types/EVSE.xml b/data_model/master/device_types/EVSE.xml
index a6a1e3854c88eb..d468cb8a180f22 100644
--- a/data_model/master/device_types/EVSE.xml
+++ b/data_model/master/device_types/EVSE.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/ElectricalSensor.xml b/data_model/master/device_types/ElectricalSensor.xml
index 62c6dd9b4128b2..75c4b0bb7cbbed 100644
--- a/data_model/master/device_types/ElectricalSensor.xml
+++ b/data_model/master/device_types/ElectricalSensor.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/EnergyTariff.xml b/data_model/master/device_types/EnergyTariff.xml
index bf27554ff281db..887bfa420d8fd8 100644
--- a/data_model/master/device_types/EnergyTariff.xml
+++ b/data_model/master/device_types/EnergyTariff.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/EnergyTariffCalendar.xml b/data_model/master/device_types/EnergyTariffCalendar.xml
index ee3a6b9347db38..70d74b7239f41c 100644
--- a/data_model/master/device_types/EnergyTariffCalendar.xml
+++ b/data_model/master/device_types/EnergyTariffCalendar.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/ExtendedColorLight.xml b/data_model/master/device_types/ExtendedColorLight.xml
index b4057d6b5bc997..0678094669459f 100644
--- a/data_model/master/device_types/ExtendedColorLight.xml
+++ b/data_model/master/device_types/ExtendedColorLight.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/ExtractorHood.xml b/data_model/master/device_types/ExtractorHood.xml
index 6606b377f47a39..3e8064adb149f4 100644
--- a/data_model/master/device_types/ExtractorHood.xml
+++ b/data_model/master/device_types/ExtractorHood.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/Fan.xml b/data_model/master/device_types/Fan.xml
index 8bf8347e93c5b0..e5184cfe22aec7 100644
--- a/data_model/master/device_types/Fan.xml
+++ b/data_model/master/device_types/Fan.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/FlowSensor.xml b/data_model/master/device_types/FlowSensor.xml
index bcc27b318aac36..6a9023060e12f9 100644
--- a/data_model/master/device_types/FlowSensor.xml
+++ b/data_model/master/device_types/FlowSensor.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/GenericSwitch.xml b/data_model/master/device_types/GenericSwitch.xml
index acfa0a95005291..b8bc394b96e2e8 100644
--- a/data_model/master/device_types/GenericSwitch.xml
+++ b/data_model/master/device_types/GenericSwitch.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/HeatPump.xml b/data_model/master/device_types/HeatPump.xml
index ae0ce0e9a4d30a..61f556c6ed2a9b 100644
--- a/data_model/master/device_types/HeatPump.xml
+++ b/data_model/master/device_types/HeatPump.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/HumidifierDehumidifier.xml b/data_model/master/device_types/HumidifierDehumidifier.xml
index a917cbff4450f0..973919635fb4ae 100644
--- a/data_model/master/device_types/HumidifierDehumidifier.xml
+++ b/data_model/master/device_types/HumidifierDehumidifier.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
\ No newline at end of file
diff --git a/data_model/master/device_types/HumiditySensor.xml b/data_model/master/device_types/HumiditySensor.xml
index 4a1808d7e0c580..c6def400a2a6bb 100644
--- a/data_model/master/device_types/HumiditySensor.xml
+++ b/data_model/master/device_types/HumiditySensor.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/JointFabricAdmin.xml b/data_model/master/device_types/JointFabricAdmin.xml
index eb57fad58127a4..7d29cbba1305d5 100644
--- a/data_model/master/device_types/JointFabricAdmin.xml
+++ b/data_model/master/device_types/JointFabricAdmin.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/LaundryDryer.xml b/data_model/master/device_types/LaundryDryer.xml
index d4692c7ad818a5..36dc182c393bd7 100644
--- a/data_model/master/device_types/LaundryDryer.xml
+++ b/data_model/master/device_types/LaundryDryer.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/LaundryWasher.xml b/data_model/master/device_types/LaundryWasher.xml
index 03b85f3bd363b4..d88ee7e9fd94ca 100644
--- a/data_model/master/device_types/LaundryWasher.xml
+++ b/data_model/master/device_types/LaundryWasher.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/LightSensor.xml b/data_model/master/device_types/LightSensor.xml
index 0eca130f921623..e7200e347726aa 100644
--- a/data_model/master/device_types/LightSensor.xml
+++ b/data_model/master/device_types/LightSensor.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/MicrowaveOven.xml b/data_model/master/device_types/MicrowaveOven.xml
index 3ae1fd8d5bf22d..98d2902d049610 100644
--- a/data_model/master/device_types/MicrowaveOven.xml
+++ b/data_model/master/device_types/MicrowaveOven.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/ModeSelectDeviceType.xml b/data_model/master/device_types/ModeSelectDeviceType.xml
index 7848ba0adc787f..ad4cf56671243b 100644
--- a/data_model/master/device_types/ModeSelectDeviceType.xml
+++ b/data_model/master/device_types/ModeSelectDeviceType.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/MountedDimmableLoadControl.xml b/data_model/master/device_types/MountedDimmableLoadControl.xml
new file mode 100644
index 00000000000000..2527eb6aaefcd2
--- /dev/null
+++ b/data_model/master/device_types/MountedDimmableLoadControl.xml
@@ -0,0 +1,124 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/master/device_types/MountedOnOffControl.xml b/data_model/master/device_types/MountedOnOffControl.xml
new file mode 100644
index 00000000000000..1be3cf746418aa
--- /dev/null
+++ b/data_model/master/device_types/MountedOnOffControl.xml
@@ -0,0 +1,124 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/data_model/master/device_types/NetworkInfraManager.xml b/data_model/master/device_types/NetworkInfraManager.xml
index a4d17e11c0faaa..58cbae2e7ab440 100644
--- a/data_model/master/device_types/NetworkInfraManager.xml
+++ b/data_model/master/device_types/NetworkInfraManager.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/OccupancySensor.xml b/data_model/master/device_types/OccupancySensor.xml
index 233d04f196e388..f257bab38a7686 100644
--- a/data_model/master/device_types/OccupancySensor.xml
+++ b/data_model/master/device_types/OccupancySensor.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/OnOffLight.xml b/data_model/master/device_types/OnOffLight.xml
index f71c0bf77fa42c..c74f5f79000919 100644
--- a/data_model/master/device_types/OnOffLight.xml
+++ b/data_model/master/device_types/OnOffLight.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/OnOffLightSwitch.xml b/data_model/master/device_types/OnOffLightSwitch.xml
index d6ac7f79520d26..0cfa5ba7a3702c 100644
--- a/data_model/master/device_types/OnOffLightSwitch.xml
+++ b/data_model/master/device_types/OnOffLightSwitch.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/OnOffPlug-inUnit.xml b/data_model/master/device_types/OnOffPlug-inUnit.xml
index 888f365bed0b83..946f7919516e2d 100644
--- a/data_model/master/device_types/OnOffPlug-inUnit.xml
+++ b/data_model/master/device_types/OnOffPlug-inUnit.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/OnOffSensor.xml b/data_model/master/device_types/OnOffSensor.xml
index 935a438fb0bbef..0fc76f8314a6b5 100644
--- a/data_model/master/device_types/OnOffSensor.xml
+++ b/data_model/master/device_types/OnOffSensor.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/OtaProvider.xml b/data_model/master/device_types/OtaProvider.xml
index 375ab4e36aa987..b148d27ebb74e5 100644
--- a/data_model/master/device_types/OtaProvider.xml
+++ b/data_model/master/device_types/OtaProvider.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/OtaRequestor.xml b/data_model/master/device_types/OtaRequestor.xml
index 840e322bdccb72..d782ee992c454b 100644
--- a/data_model/master/device_types/OtaRequestor.xml
+++ b/data_model/master/device_types/OtaRequestor.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/Oven.xml b/data_model/master/device_types/Oven.xml
index 9c5d23e86afda7..d34bc4c52bfbb6 100644
--- a/data_model/master/device_types/Oven.xml
+++ b/data_model/master/device_types/Oven.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/PowerSource.xml b/data_model/master/device_types/PowerSource.xml
index 9ed71e905535bd..4e6c6defabccf9 100644
--- a/data_model/master/device_types/PowerSource.xml
+++ b/data_model/master/device_types/PowerSource.xml
@@ -58,7 +58,7 @@ Davis, CA 95616, USA
-
+
diff --git a/data_model/master/device_types/PressureSensor.xml b/data_model/master/device_types/PressureSensor.xml
index f2b7855db91c83..5b7ef86c25cc3d 100644
--- a/data_model/master/device_types/PressureSensor.xml
+++ b/data_model/master/device_types/PressureSensor.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/Pump.xml b/data_model/master/device_types/Pump.xml
index 461725136abaec..a39cd97b87e7ad 100644
--- a/data_model/master/device_types/Pump.xml
+++ b/data_model/master/device_types/Pump.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/PumpController.xml b/data_model/master/device_types/PumpController.xml
index 99acf1fa1c5757..25e9a8e982b5ff 100644
--- a/data_model/master/device_types/PumpController.xml
+++ b/data_model/master/device_types/PumpController.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/RainSensor.xml b/data_model/master/device_types/RainSensor.xml
index 473de6e31d1598..a03060c5415dc0 100644
--- a/data_model/master/device_types/RainSensor.xml
+++ b/data_model/master/device_types/RainSensor.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/Refrigerator.xml b/data_model/master/device_types/Refrigerator.xml
index 4899906c3b985e..c8bdf86e3ef737 100644
--- a/data_model/master/device_types/Refrigerator.xml
+++ b/data_model/master/device_types/Refrigerator.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/RoboticVacuumCleaner.xml b/data_model/master/device_types/RoboticVacuumCleaner.xml
index 2657a560109829..fd30668cd2e084 100644
--- a/data_model/master/device_types/RoboticVacuumCleaner.xml
+++ b/data_model/master/device_types/RoboticVacuumCleaner.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/RoomAirConditioner.xml b/data_model/master/device_types/RoomAirConditioner.xml
index 305a893dabc0fe..e2b3061a42b515 100644
--- a/data_model/master/device_types/RoomAirConditioner.xml
+++ b/data_model/master/device_types/RoomAirConditioner.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/RootNodeDeviceType.xml b/data_model/master/device_types/RootNodeDeviceType.xml
index 7dfd31996cc8e5..c96759503bfb13 100644
--- a/data_model/master/device_types/RootNodeDeviceType.xml
+++ b/data_model/master/device_types/RootNodeDeviceType.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/SecondaryNetworkInterface.xml b/data_model/master/device_types/SecondaryNetworkInterface.xml
index 51b4dc0e2ec4fa..8217aea71529d0 100644
--- a/data_model/master/device_types/SecondaryNetworkInterface.xml
+++ b/data_model/master/device_types/SecondaryNetworkInterface.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/SmokeCOAlarm.xml b/data_model/master/device_types/SmokeCOAlarm.xml
index 518809d449e35a..769e6f5f91bbe1 100644
--- a/data_model/master/device_types/SmokeCOAlarm.xml
+++ b/data_model/master/device_types/SmokeCOAlarm.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/SolarPower.xml b/data_model/master/device_types/SolarPower.xml
index 743da25e7a9a20..7556fb519a685d 100644
--- a/data_model/master/device_types/SolarPower.xml
+++ b/data_model/master/device_types/SolarPower.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/Speaker.xml b/data_model/master/device_types/Speaker.xml
index d1d9d85beb84c8..d3f9b1166e4458 100644
--- a/data_model/master/device_types/Speaker.xml
+++ b/data_model/master/device_types/Speaker.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/TemperatureControlledCabinet.xml b/data_model/master/device_types/TemperatureControlledCabinet.xml
index 299037e145d901..68788e22d7db06 100644
--- a/data_model/master/device_types/TemperatureControlledCabinet.xml
+++ b/data_model/master/device_types/TemperatureControlledCabinet.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/TemperatureSensor.xml b/data_model/master/device_types/TemperatureSensor.xml
index d6ccd5c18db89f..bf3221858dc103 100644
--- a/data_model/master/device_types/TemperatureSensor.xml
+++ b/data_model/master/device_types/TemperatureSensor.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/Thermostat.xml b/data_model/master/device_types/Thermostat.xml
index 6acdf63b10eba0..dfc55d628a5b6e 100644
--- a/data_model/master/device_types/Thermostat.xml
+++ b/data_model/master/device_types/Thermostat.xml
@@ -55,11 +55,12 @@ Connectivity Standards Alliance
508 Second Street, Suite 206
Davis, CA 95616, USA
-->
-
+
-
+
+
@@ -72,60 +73,27 @@ Davis, CA 95616, USA
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
-
-
-
+
-
-
-
-
+
+
-
-
-
-
+
+
diff --git a/data_model/master/device_types/ThreadBorderRouter.xml b/data_model/master/device_types/ThreadBorderRouter.xml
index 73561999d60eba..abe38a81396cd6 100644
--- a/data_model/master/device_types/ThreadBorderRouter.xml
+++ b/data_model/master/device_types/ThreadBorderRouter.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/VideoRemoteControl.xml b/data_model/master/device_types/VideoRemoteControl.xml
index 7896a6f6ee6be5..de83b02508a89f 100644
--- a/data_model/master/device_types/VideoRemoteControl.xml
+++ b/data_model/master/device_types/VideoRemoteControl.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/WaterFreezeDetector.xml b/data_model/master/device_types/WaterFreezeDetector.xml
index f3c5f0580af21f..b2f4a49a7847e4 100644
--- a/data_model/master/device_types/WaterFreezeDetector.xml
+++ b/data_model/master/device_types/WaterFreezeDetector.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/WaterHeater.xml b/data_model/master/device_types/WaterHeater.xml
index 6e80928d792cfc..9d038d89c55563 100644
--- a/data_model/master/device_types/WaterHeater.xml
+++ b/data_model/master/device_types/WaterHeater.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/WaterLeakDetector.xml b/data_model/master/device_types/WaterLeakDetector.xml
index 0518d148910c78..7277ce69908fb6 100644
--- a/data_model/master/device_types/WaterLeakDetector.xml
+++ b/data_model/master/device_types/WaterLeakDetector.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/WaterValve.xml b/data_model/master/device_types/WaterValve.xml
index 5c65f4565f6746..21b77edf5fc614 100644
--- a/data_model/master/device_types/WaterValve.xml
+++ b/data_model/master/device_types/WaterValve.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
diff --git a/data_model/master/device_types/WindowCovering.xml b/data_model/master/device_types/WindowCovering.xml
index a2d54453b7337f..a2e16beba60ee1 100644
--- a/data_model/master/device_types/WindowCovering.xml
+++ b/data_model/master/device_types/WindowCovering.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
@@ -75,15 +75,6 @@ Davis, CA 95616, USA
-
-
-
-
-
-
-
-
-
diff --git a/data_model/master/device_types/WindowCoveringController.xml b/data_model/master/device_types/WindowCoveringController.xml
index c48f327754c599..189fee3d9d6303 100644
--- a/data_model/master/device_types/WindowCoveringController.xml
+++ b/data_model/master/device_types/WindowCoveringController.xml
@@ -57,7 +57,7 @@ Davis, CA 95616, USA
-->
-
+
@@ -78,15 +78,6 @@ Davis, CA 95616, USA
-
-
-
-
-
-
-
-
-
diff --git a/data_model/master/spec_sha b/data_model/master/spec_sha
index 51aac4d9e877f4..16b2cbb1caa026 100644
--- a/data_model/master/spec_sha
+++ b/data_model/master/spec_sha
@@ -1 +1 @@
-358a64a52ea9583f19be23c7da0e33f19d4b1ee0
+12e2fa3014b316b202eed892cb50dec7b6851d8e
diff --git a/docs/guides/esp32/setup_idf_chip.md b/docs/guides/esp32/setup_idf_chip.md
index 5a6728c44d8417..035964bdfab1b5 100644
--- a/docs/guides/esp32/setup_idf_chip.md
+++ b/docs/guides/esp32/setup_idf_chip.md
@@ -13,25 +13,25 @@ step.
### Install Prerequisites
-- [Linux](https://docs.espressif.com/projects/esp-idf/en/v5.1.2/esp32/get-started/linux-macos-setup.html#for-linux-users)
-- [macOS](https://docs.espressif.com/projects/esp-idf/en/v5.1.2/esp32/get-started/linux-macos-setup.html#for-macos-users)
+- [Linux](https://docs.espressif.com/projects/esp-idf/en/v5.3/esp32/get-started/linux-macos-setup.html#for-linux-users)
+- [macOS](https://docs.espressif.com/projects/esp-idf/en/v5.3/esp32/get-started/linux-macos-setup.html#for-macos-users)
### Get IDF v5.1.2
-- Clone ESP-IDF [v5.1.2
- release](https://github.com/espressif/esp-idf/releases/tag/v5.1.2
+- Clone ESP-IDF [v5.3
+ release](https://github.com/espressif/esp-idf/releases/tag/v5.3
```
- git clone -b v5.1.2 --recursive --depth 1 --shallow-submodule https://github.com/espressif/esp-idf.git
+ git clone -b v5.3 --recursive --depth 1 --shallow-submodule https://github.com/espressif/esp-idf.git
cd esp-idf
./install.sh
```
-- To update an existing esp-idf toolchain to v5.1.2:
+- To update an existing esp-idf toolchain to v5.3:
```
cd path/to/esp-idf
- git fetch --depth 1 origin v5.1.2
+ git fetch --depth 1 origin v5.3
git reset --hard FETCH_HEAD
git submodule update --depth 1 --recursive --init
diff --git a/docs/spec_clusters.md b/docs/spec_clusters.md
index ef58f016154446..05bd215fe583dc 100644
--- a/docs/spec_clusters.md
+++ b/docs/spec_clusters.md
@@ -7,7 +7,6 @@ This file was **AUTOMATICALLY** generated by `python scripts/generate_spec_xml.p
|4 |0x0004 |Groups |
|6 |0x0006 |On/Off |
|8 |0x0008 |Level Control |
-|28 |0x001C |Pulse Width Modulation |
|29 |0x001D |Descriptor |
|30 |0x001E |Binding |
|31 |0x001F |AccessControl |
@@ -63,23 +62,31 @@ This file was **AUTOMATICALLY** generated by `python scripts/generate_spec_xml.p
|98 |0x0062 |Scenes Management |
|113 |0x0071 |HEPA Filter Monitoring |
|114 |0x0072 |Activated Carbon Filter Monitoring |
+|121 |0x0079 |Water Tank Level Monitoring |
|128 |0x0080 |Boolean State Configuration |
|129 |0x0081 |Valve Configuration and Control |
|144 |0x0090 |Electrical Power Measurement |
|145 |0x0091 |Electrical Energy Measurement |
+|148 |0x0094 |Water Heater Management |
+|149 |0x0095 |Energy Price |
+|150 |0x0096 |Demand Response Load Control |
|151 |0x0097 |Messages |
|152 |0x0098 |Device Energy Management |
|153 |0x0099 |Energy EVSE |
+|154 |0x009A |Energy Calendar |
|155 |0x009B |Energy Preference |
|156 |0x009C |Power Topology |
|157 |0x009D |Energy EVSE Mode |
+|158 |0x009E |Water Heater Mode |
|159 |0x009F |Device Energy Management Mode |
|257 |0x0101 |Door Lock |
|258 |0x0102 |Window Covering |
+|336 |0x0150 |Service Area |
|512 |0x0200 |Pump Configuration and Control |
|513 |0x0201 |Thermostat |
|514 |0x0202 |Fan Control |
|516 |0x0204 |Thermostat User Interface Configuration |
+|517 |0x0205 |Humidistat |
|768 |0x0300 |Color Control |
|769 |0x0301 |Ballast Configuration |
|1024 |0x0400 |Illuminance Measurement |
@@ -98,6 +105,10 @@ This file was **AUTOMATICALLY** generated by `python scripts/generate_spec_xml.p
|1069 |0x042D |PM10 Concentration Measurement |
|1070 |0x042E |Total Volatile Organic Compounds Concentration Measurement|
|1071 |0x042F |Radon Concentration Measurement |
+|1104 |0x0450 |Network Identity Management |
+|1105 |0x0451 |Wi-Fi Network Management |
+|1106 |0x0452 |Thread Border Router Management |
+|1107 |0x0453 |Thread Network Directory |
|1283 |0x0503 |Wake on LAN |
|1284 |0x0504 |Channel |
|1285 |0x0505 |Target Navigator |
@@ -112,3 +123,5 @@ This file was **AUTOMATICALLY** generated by `python scripts/generate_spec_xml.p
|1294 |0x050E |Account Login |
|1295 |0x050F |Content Control |
|1296 |0x0510 |Content App Observer |
+|1872 |0x0750 |Ecosystem Information |
+|1873 |0x0751 |Commissioner Control |
diff --git a/examples/air-purifier-app/air-purifier-common/air-purifier-app.matter b/examples/air-purifier-app/air-purifier-common/air-purifier-app.matter
index 864e3115bc06a9..ddfccaae2a712c 100644
--- a/examples/air-purifier-app/air-purifier-common/air-purifier-app.matter
+++ b/examples/air-purifier-app/air-purifier-common/air-purifier-app.matter
@@ -106,7 +106,7 @@ cluster Descriptor = 29 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -122,12 +122,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -163,17 +193,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -437,6 +491,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -445,6 +502,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -455,6 +516,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -488,12 +553,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
@@ -1294,7 +1370,8 @@ cluster Thermostat = 513 {
kSleep = 3;
kWake = 4;
kVacation = 5;
- kUserDefined = 6;
+ kGoingToSleep = 6;
+ kUserDefined = 254;
}
enum SetpointChangeSourceEnum : enum8 {
@@ -1420,11 +1497,6 @@ cluster Thermostat = 513 {
kSupportsOff = 0x8;
}
- bitmap TemperatureSetpointHoldPolicyBitmap : bitmap8 {
- kHoldDurationElapsed = 0x1;
- kHoldDurationElapsedOrPresetChanged = 0x2;
- }
-
struct ScheduleTransitionStruct {
ScheduleDayOfWeekBitmap dayOfWeek = 0;
int16u transitionTime = 1;
@@ -1530,8 +1602,7 @@ cluster Thermostat = 513 {
attribute access(write: manage) optional PresetStruct presets[] = 80;
attribute access(write: manage) optional ScheduleStruct schedules[] = 81;
readonly attribute optional boolean presetsSchedulesEditable = 82;
- readonly attribute optional TemperatureSetpointHoldPolicyBitmap temperatureSetpointHoldPolicy = 83;
- readonly attribute optional nullable epoch_s setpointHoldExpiryTimestamp = 84;
+ readonly attribute optional nullable epoch_s setpointHoldExpiryTimestamp = 83;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -1575,10 +1646,6 @@ cluster Thermostat = 513 {
int16u timeoutSeconds = 0;
}
- request struct SetTemperatureSetpointHoldPolicyRequest {
- TemperatureSetpointHoldPolicyBitmap temperatureSetpointHoldPolicy = 0;
- }
-
/** Command description for SetpointRaiseLower */
command SetpointRaiseLower(SetpointRaiseLowerRequest): DefaultSuccess = 0;
/** Command description for SetWeeklySchedule */
@@ -1597,8 +1664,6 @@ cluster Thermostat = 513 {
command access(invoke: manage) CancelPresetsSchedulesEditRequest(): DefaultSuccess = 8;
/** This command is used to notify the server that all edits are done and should be committed. */
command access(invoke: manage) CommitPresetsSchedulesRequest(): DefaultSuccess = 9;
- /** This command sets the set point hold policy. */
- command SetTemperatureSetpointHoldPolicy(SetTemperatureSetpointHoldPolicyRequest): DefaultSuccess = 11;
}
/** An interface for controlling a fan in a heating/cooling system. */
diff --git a/examples/air-quality-sensor-app/air-quality-sensor-common/air-quality-sensor-app.matter b/examples/air-quality-sensor-app/air-quality-sensor-common/air-quality-sensor-app.matter
index 294d3a19cb5772..9bffe726724599 100644
--- a/examples/air-quality-sensor-app/air-quality-sensor-common/air-quality-sensor-app.matter
+++ b/examples/air-quality-sensor-app/air-quality-sensor-common/air-quality-sensor-app.matter
@@ -106,7 +106,7 @@ cluster Descriptor = 29 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -122,12 +122,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -163,17 +193,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -437,6 +491,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -445,6 +502,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -455,6 +516,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -488,12 +553,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/all-clusters-app/all-clusters-common/all-clusters-app.matter b/examples/all-clusters-app/all-clusters-common/all-clusters-app.matter
index 7ffee39eb5101f..dc2d6fe75a3e82 100644
--- a/examples/all-clusters-app/all-clusters-common/all-clusters-app.matter
+++ b/examples/all-clusters-app/all-clusters-common/all-clusters-app.matter
@@ -508,7 +508,7 @@ cluster Binding = 30 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -524,12 +524,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -565,17 +595,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides a standardized way for a Node (typically a Bridge, but could be any Node) to expose action information. */
@@ -1375,6 +1429,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -1383,6 +1440,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -1393,6 +1454,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -1426,12 +1491,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
@@ -4092,6 +4168,64 @@ cluster ElectricalEnergyMeasurement = 145 {
readonly attribute int16u clusterRevision = 65533;
}
+/** This cluster is used to allow clients to control the operation of a hot water heating appliance so that it can be used with energy management. */
+provisional cluster WaterHeaterManagement = 148 {
+ revision 1;
+
+ enum BoostStateEnum : enum8 {
+ kInactive = 0;
+ kActive = 1;
+ }
+
+ bitmap Feature : bitmap32 {
+ kEnergyManagement = 0x1;
+ kTankPercent = 0x2;
+ }
+
+ bitmap WaterHeaterDemandBitmap : bitmap8 {
+ kImmersionElement1 = 0x1;
+ kImmersionElement2 = 0x2;
+ kHeatPump = 0x4;
+ kBoiler = 0x8;
+ kOther = 0x10;
+ }
+
+ bitmap WaterHeaterTypeBitmap : bitmap8 {
+ kImmersionElement1 = 0x1;
+ kImmersionElement2 = 0x2;
+ kHeatPump = 0x4;
+ kBoiler = 0x8;
+ kOther = 0x10;
+ }
+
+ readonly attribute WaterHeaterTypeBitmap heaterTypes = 0;
+ readonly attribute WaterHeaterDemandBitmap heatDemand = 1;
+ readonly attribute optional int16u tankVolume = 2;
+ readonly attribute optional energy_mwh estimatedHeatRequired = 3;
+ readonly attribute optional percent tankPercentage = 4;
+ readonly attribute BoostStateEnum boostState = 5;
+ readonly attribute command_id generatedCommandList[] = 65528;
+ readonly attribute command_id acceptedCommandList[] = 65529;
+ readonly attribute event_id eventList[] = 65530;
+ readonly attribute attrib_id attributeList[] = 65531;
+ readonly attribute bitmap32 featureMap = 65532;
+ readonly attribute int16u clusterRevision = 65533;
+
+ request struct BoostRequest {
+ elapsed_s duration = 0;
+ optional boolean oneShot = 1;
+ optional boolean emergencyBoost = 2;
+ optional temperature temporarySetpoint = 3;
+ optional percent targetPercentage = 4;
+ optional percent targetReheat = 5;
+ }
+
+ /** Allows a client to request that the water heater is put into a Boost state. */
+ command access(invoke: manage) Boost(BoostRequest): DefaultSuccess = 0;
+ /** Allows a client to cancel an ongoing Boost operation. */
+ command access(invoke: manage) CancelBoost(): DefaultSuccess = 1;
+}
+
/** This cluster allows a client to manage the power draw of a device. An example of such a client could be an Energy Management System (EMS) which controls an Energy Smart Appliance (ESA). */
provisional cluster DeviceEnergyManagement = 152 {
revision 4;
@@ -5073,7 +5207,8 @@ cluster Thermostat = 513 {
kSleep = 3;
kWake = 4;
kVacation = 5;
- kUserDefined = 6;
+ kGoingToSleep = 6;
+ kUserDefined = 254;
}
enum SetpointChangeSourceEnum : enum8 {
@@ -5199,11 +5334,6 @@ cluster Thermostat = 513 {
kSupportsOff = 0x8;
}
- bitmap TemperatureSetpointHoldPolicyBitmap : bitmap8 {
- kHoldDurationElapsed = 0x1;
- kHoldDurationElapsedOrPresetChanged = 0x2;
- }
-
struct ScheduleTransitionStruct {
ScheduleDayOfWeekBitmap dayOfWeek = 0;
int16u transitionTime = 1;
@@ -5309,8 +5439,7 @@ cluster Thermostat = 513 {
attribute access(write: manage) optional PresetStruct presets[] = 80;
attribute access(write: manage) optional ScheduleStruct schedules[] = 81;
readonly attribute optional boolean presetsSchedulesEditable = 82;
- readonly attribute optional TemperatureSetpointHoldPolicyBitmap temperatureSetpointHoldPolicy = 83;
- readonly attribute optional nullable epoch_s setpointHoldExpiryTimestamp = 84;
+ readonly attribute optional nullable epoch_s setpointHoldExpiryTimestamp = 83;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -5354,10 +5483,6 @@ cluster Thermostat = 513 {
int16u timeoutSeconds = 0;
}
- request struct SetTemperatureSetpointHoldPolicyRequest {
- TemperatureSetpointHoldPolicyBitmap temperatureSetpointHoldPolicy = 0;
- }
-
/** Command description for SetpointRaiseLower */
command SetpointRaiseLower(SetpointRaiseLowerRequest): DefaultSuccess = 0;
/** Command description for SetWeeklySchedule */
@@ -5376,8 +5501,6 @@ cluster Thermostat = 513 {
command access(invoke: manage) CancelPresetsSchedulesEditRequest(): DefaultSuccess = 8;
/** This command is used to notify the server that all edits are done and should be committed. */
command access(invoke: manage) CommitPresetsSchedulesRequest(): DefaultSuccess = 9;
- /** This command sets the set point hold policy. */
- command SetTemperatureSetpointHoldPolicy(SetTemperatureSetpointHoldPolicyRequest): DefaultSuccess = 11;
}
/** An interface for controlling a fan in a heating/cooling system. */
@@ -7974,7 +8097,7 @@ endpoint 1 {
ram attribute numberOfPositions default = 2;
ram attribute currentPosition;
ram attribute featureMap default = 1;
- ram attribute clusterRevision default = 1;
+ ram attribute clusterRevision default = 2;
}
server cluster FixedLabel {
@@ -8434,6 +8557,24 @@ endpoint 1 {
ram attribute clusterRevision default = 1;
}
+ server cluster WaterHeaterManagement {
+ callback attribute heaterTypes;
+ callback attribute heatDemand;
+ callback attribute tankVolume;
+ callback attribute estimatedHeatRequired;
+ callback attribute tankPercentage;
+ callback attribute boostState;
+ callback attribute generatedCommandList;
+ callback attribute acceptedCommandList;
+ callback attribute eventList;
+ callback attribute attributeList;
+ callback attribute featureMap;
+ callback attribute clusterRevision;
+
+ handle command Boost;
+ handle command CancelBoost;
+ }
+
server cluster DeviceEnergyManagement {
emits event PowerAdjustStart;
emits event PowerAdjustEnd;
@@ -8672,18 +8813,6 @@ endpoint 1 {
ram attribute minSetpointDeadBand default = 0x19;
ram attribute controlSequenceOfOperation default = 0x04;
ram attribute systemMode default = 0x01;
- callback attribute presetTypes;
- callback attribute scheduleTypes;
- ram attribute numberOfPresets default = 0;
- ram attribute numberOfSchedules default = 0;
- ram attribute numberOfScheduleTransitionPerDay default = 0xFF;
- ram attribute activePresetHandle;
- ram attribute activeScheduleHandle;
- callback attribute presets;
- callback attribute schedules;
- ram attribute presetsSchedulesEditable;
- ram attribute temperatureSetpointHoldPolicy default = 0;
- ram attribute setpointHoldExpiryTimestamp;
callback attribute generatedCommandList;
callback attribute acceptedCommandList;
callback attribute eventList;
@@ -8869,8 +8998,10 @@ endpoint 1 {
ram attribute occupancy;
ram attribute occupancySensorType;
ram attribute occupancySensorTypeBitmap;
- ram attribute featureMap default = 0;
- ram attribute clusterRevision default = 4;
+ ram attribute holdTime default = 10;
+ callback attribute holdTimeLimits;
+ ram attribute featureMap default = 0x01;
+ ram attribute clusterRevision default = 5;
}
server cluster CarbonMonoxideConcentrationMeasurement {
@@ -9338,8 +9469,10 @@ endpoint 2 {
ram attribute occupancy;
ram attribute occupancySensorType;
ram attribute occupancySensorTypeBitmap;
- ram attribute featureMap default = 0;
- ram attribute clusterRevision default = 4;
+ ram attribute holdTime default = 20;
+ callback attribute holdTimeLimits;
+ ram attribute featureMap default = 0x01;
+ ram attribute clusterRevision default = 5;
}
}
endpoint 3 {
diff --git a/examples/all-clusters-app/all-clusters-common/all-clusters-app.zap b/examples/all-clusters-app/all-clusters-common/all-clusters-app.zap
index 9e0452b0c423fc..31b6a05057dc74 100644
--- a/examples/all-clusters-app/all-clusters-common/all-clusters-app.zap
+++ b/examples/all-clusters-app/all-clusters-common/all-clusters-app.zap
@@ -8029,7 +8029,7 @@
"storageOption": "RAM",
"singleton": 0,
"bounded": 0,
- "defaultValue": "1",
+ "defaultValue": "2",
"reportable": 1,
"minInterval": 0,
"maxInterval": 65344,
@@ -13413,6 +13413,227 @@
}
]
},
+ {
+ "name": "Water Heater Management",
+ "code": 148,
+ "mfgCode": null,
+ "define": "WATER_HEATER_MANAGEMENT_CLUSTER",
+ "side": "server",
+ "enabled": 1,
+ "apiMaturity": "provisional",
+ "commands": [
+ {
+ "name": "Boost",
+ "code": 0,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 1,
+ "isEnabled": 1
+ },
+ {
+ "name": "CancelBoost",
+ "code": 1,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 1,
+ "isEnabled": 1
+ }
+ ],
+ "attributes": [
+ {
+ "name": "HeaterTypes",
+ "code": 0,
+ "mfgCode": null,
+ "side": "server",
+ "type": "WaterHeaterTypeBitmap",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": null,
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "HeatDemand",
+ "code": 1,
+ "mfgCode": null,
+ "side": "server",
+ "type": "WaterHeaterDemandBitmap",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": null,
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "TankVolume",
+ "code": 2,
+ "mfgCode": null,
+ "side": "server",
+ "type": "int16u",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": null,
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "EstimatedHeatRequired",
+ "code": 3,
+ "mfgCode": null,
+ "side": "server",
+ "type": "energy_mwh",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": null,
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "TankPercentage",
+ "code": 4,
+ "mfgCode": null,
+ "side": "server",
+ "type": "percent",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": null,
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "BoostState",
+ "code": 5,
+ "mfgCode": null,
+ "side": "server",
+ "type": "BoostStateEnum",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": null,
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "GeneratedCommandList",
+ "code": 65528,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": null,
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "AcceptedCommandList",
+ "code": 65529,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": null,
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "EventList",
+ "code": 65530,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": null,
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "AttributeList",
+ "code": 65531,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": null,
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "FeatureMap",
+ "code": 65532,
+ "mfgCode": null,
+ "side": "server",
+ "type": "bitmap32",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": null,
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "ClusterRevision",
+ "code": 65533,
+ "mfgCode": null,
+ "side": "server",
+ "type": "int16u",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": null,
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ }
+ ]
+ },
{
"name": "Device Energy Management",
"code": 152,
@@ -16415,214 +16636,6 @@
"maxInterval": 65344,
"reportableChange": 0
},
- {
- "name": "PresetTypes",
- "code": 72,
- "mfgCode": null,
- "side": "server",
- "type": "array",
- "included": 1,
- "storageOption": "External",
- "singleton": 0,
- "bounded": 0,
- "defaultValue": null,
- "reportable": 1,
- "minInterval": 1,
- "maxInterval": 65534,
- "reportableChange": 0
- },
- {
- "name": "ScheduleTypes",
- "code": 73,
- "mfgCode": null,
- "side": "server",
- "type": "array",
- "included": 1,
- "storageOption": "External",
- "singleton": 0,
- "bounded": 0,
- "defaultValue": null,
- "reportable": 1,
- "minInterval": 1,
- "maxInterval": 65534,
- "reportableChange": 0
- },
- {
- "name": "NumberOfPresets",
- "code": 74,
- "mfgCode": null,
- "side": "server",
- "type": "int8u",
- "included": 1,
- "storageOption": "RAM",
- "singleton": 0,
- "bounded": 0,
- "defaultValue": "0",
- "reportable": 1,
- "minInterval": 1,
- "maxInterval": 65534,
- "reportableChange": 0
- },
- {
- "name": "NumberOfSchedules",
- "code": 75,
- "mfgCode": null,
- "side": "server",
- "type": "int8u",
- "included": 1,
- "storageOption": "RAM",
- "singleton": 0,
- "bounded": 0,
- "defaultValue": "0",
- "reportable": 1,
- "minInterval": 1,
- "maxInterval": 65534,
- "reportableChange": 0
- },
- {
- "name": "NumberOfScheduleTransitionPerDay",
- "code": 77,
- "mfgCode": null,
- "side": "server",
- "type": "int8u",
- "included": 1,
- "storageOption": "RAM",
- "singleton": 0,
- "bounded": 0,
- "defaultValue": "0xFF",
- "reportable": 1,
- "minInterval": 1,
- "maxInterval": 65534,
- "reportableChange": 0
- },
- {
- "name": "ActivePresetHandle",
- "code": 78,
- "mfgCode": null,
- "side": "server",
- "type": "octet_string",
- "included": 1,
- "storageOption": "RAM",
- "singleton": 0,
- "bounded": 0,
- "defaultValue": "",
- "reportable": 1,
- "minInterval": 1,
- "maxInterval": 65534,
- "reportableChange": 0
- },
- {
- "name": "ActiveScheduleHandle",
- "code": 79,
- "mfgCode": null,
- "side": "server",
- "type": "octet_string",
- "included": 1,
- "storageOption": "RAM",
- "singleton": 0,
- "bounded": 0,
- "defaultValue": "",
- "reportable": 1,
- "minInterval": 1,
- "maxInterval": 65534,
- "reportableChange": 0
- },
- {
- "name": "Presets",
- "code": 80,
- "mfgCode": null,
- "side": "server",
- "type": "array",
- "included": 1,
- "storageOption": "External",
- "singleton": 0,
- "bounded": 0,
- "defaultValue": null,
- "reportable": 1,
- "minInterval": 1,
- "maxInterval": 65534,
- "reportableChange": 0
- },
- {
- "name": "Schedules",
- "code": 81,
- "mfgCode": null,
- "side": "server",
- "type": "array",
- "included": 1,
- "storageOption": "External",
- "singleton": 0,
- "bounded": 0,
- "defaultValue": null,
- "reportable": 1,
- "minInterval": 1,
- "maxInterval": 65534,
- "reportableChange": 0
- },
- {
- "name": "PresetsSchedulesEditable",
- "code": 82,
- "mfgCode": null,
- "side": "server",
- "type": "boolean",
- "included": 1,
- "storageOption": "RAM",
- "singleton": 0,
- "bounded": 0,
- "defaultValue": "",
- "reportable": 1,
- "minInterval": 1,
- "maxInterval": 65534,
- "reportableChange": 0
- },
- {
- "name": "TemperatureSetpointHoldPolicy",
- "code": 83,
- "mfgCode": null,
- "side": "server",
- "type": "TemperatureSetpointHoldPolicyBitmap",
- "included": 1,
- "storageOption": "RAM",
- "singleton": 0,
- "bounded": 0,
- "defaultValue": "0",
- "reportable": 1,
- "minInterval": 1,
- "maxInterval": 65534,
- "reportableChange": 0
- },
- {
- "name": "SetpointHoldExpiryTimestamp",
- "code": 84,
- "mfgCode": null,
- "side": "server",
- "type": "epoch_s",
- "included": 1,
- "storageOption": "RAM",
- "singleton": 0,
- "bounded": 0,
- "defaultValue": "",
- "reportable": 1,
- "minInterval": 1,
- "maxInterval": 65534,
- "reportableChange": 0
- },
- {
- "name": "QueuedPreset",
- "code": 85,
- "mfgCode": null,
- "side": "server",
- "type": "QueuedPresetStruct",
- "included": 1,
- "storageOption": "External",
- "singleton": 0,
- "bounded": 0,
- "defaultValue": null,
- "reportable": 1,
- "minInterval": 1,
- "maxInterval": 65534,
- "reportableChange": 0
- },
{
"name": "GeneratedCommandList",
"code": 65528,
@@ -18984,6 +18997,38 @@
"maxInterval": 65344,
"reportableChange": 0
},
+ {
+ "name": "HoldTime",
+ "code": 3,
+ "mfgCode": null,
+ "side": "server",
+ "type": "int16u",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "10",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "HoldTimeLimits",
+ "code": 4,
+ "mfgCode": null,
+ "side": "server",
+ "type": "HoldTimeLimitsStruct",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": null,
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
{
"name": "FeatureMap",
"code": 65532,
@@ -18994,7 +19039,7 @@
"storageOption": "RAM",
"singleton": 0,
"bounded": 0,
- "defaultValue": "0",
+ "defaultValue": "0x01",
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
@@ -19010,7 +19055,7 @@
"storageOption": "RAM",
"singleton": 0,
"bounded": 0,
- "defaultValue": "4",
+ "defaultValue": "5",
"reportable": 1,
"minInterval": 0,
"maxInterval": 65344,
@@ -25013,6 +25058,38 @@
"maxInterval": 65344,
"reportableChange": 0
},
+ {
+ "name": "HoldTime",
+ "code": 3,
+ "mfgCode": null,
+ "side": "server",
+ "type": "int16u",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "20",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "HoldTimeLimits",
+ "code": 4,
+ "mfgCode": null,
+ "side": "server",
+ "type": "HoldTimeLimitsStruct",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": null,
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
{
"name": "FeatureMap",
"code": 65532,
@@ -25023,7 +25100,7 @@
"storageOption": "RAM",
"singleton": 0,
"bounded": 0,
- "defaultValue": "0",
+ "defaultValue": "0x01",
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
@@ -25039,7 +25116,7 @@
"storageOption": "RAM",
"singleton": 0,
"bounded": 0,
- "defaultValue": "4",
+ "defaultValue": "5",
"reportable": 1,
"minInterval": 0,
"maxInterval": 65344,
@@ -26477,4 +26554,4 @@
"parentEndpointIdentifier": null
}
]
-}
\ No newline at end of file
+}
diff --git a/examples/all-clusters-app/all-clusters-common/include/WhmDelegate.h b/examples/all-clusters-app/all-clusters-common/include/WhmDelegate.h
new file mode 100644
index 00000000000000..ad73239e77990d
--- /dev/null
+++ b/examples/all-clusters-app/all-clusters-common/include/WhmDelegate.h
@@ -0,0 +1,270 @@
+/*
+ *
+ * Copyright (c) 2024 Project CHIP Authors
+ * All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include
+#include
+
+#include
+
+namespace chip {
+namespace app {
+namespace Clusters {
+namespace WaterHeaterManagement {
+
+class WhmManufacturer;
+
+enum HeatingOp
+{
+ TurnHeatingOn,
+ TurnHeatingOff,
+ LeaveHeatingUnchanged
+};
+
+// This is an application level delegate to handle operational state commands according to the specific business logic.
+class WaterHeaterManagementDelegate : public WaterHeaterManagement::Delegate
+{
+public:
+ WaterHeaterManagementDelegate(EndpointId clustersEndpoint);
+
+ virtual ~WaterHeaterManagementDelegate() = default;
+
+ void SetWaterHeaterManagementInstance(WaterHeaterManagement::Instance & instance);
+
+ void SetWhmManufacturer(WhmManufacturer & whmManufacturer);
+
+ /*********************************************************************************
+ *
+ * Methods implementing the WaterHeaterManagement::Delegate interface
+ *
+ *********************************************************************************/
+
+ /**
+ * @brief Delegate should implement a handler to start boosting the water temperature as required.
+ * Upon receipt, the Water Heater SHALL transition into the BOOST state, which SHALL cause the
+ * water in the tank (or the TargetPercentage of the water, if included) to be heated towards
+ * the set point (or the TemporarySetpoint, if included), which in turn may cause a call for heat,
+ * even if the mode is OFF, or is TIMED and it is during one of the Off periods.
+ *
+ * @param duration Indicates the time period in seconds for which the BOOST state is activated before it
+ * automatically reverts to the previous mode (e.g. OFF, MANUAL or TIMED).
+ * @param oneShot Indicates whether the BOOST state should be automatically canceled once the hot water has
+ * first reached the set point temperature (or the TemporarySetpoint temperature, if specified)
+ * for the TargetPercentage (if specified).
+ * @param emergencyBoost Indicates that the consumer wants the water to be heated as quickly as practicable.
+ * This MAY cause multiple heat sources to be activated (e.g. a heat pump and direct
+ * electric heating element).
+ * @param temporarySetpoint Indicates the target temperature to which to heat the hot water for this Boost command.
+ * It SHALL be used instead of the normal set point temperature whilst the BOOST state is active.
+ * @param targetPercentage If the tank supports the TankPercent feature, this field indicates the amount of water
+ * that SHALL be heated by this Boost command before the heater is switched off.
+ * @param targetReheat If the tank supports the TankPercent feature, and the heating by this Boost command has ceased
+ * because the TargetPercentage of the water in the tank has been heated to the set point (or
+ * TemporarySetpoint if included), this field indicates the percentage to which the hot water in
+ * the tank SHALL be allowed to fall before again beginning to reheat it.
+ *
+ * @return Success if the boost command is accepted; otherwise the command SHALL be rejected with appropriate error.
+ */
+ Protocols::InteractionModel::Status HandleBoost(uint32_t duration, Optional oneShot, Optional emergencyBoost,
+ Optional temporarySetpoint, Optional targetPercentage,
+ Optional targetReheat) override;
+
+ /**
+ * @brief Delegate should implement a handler to cancel a boost command.
+ * Upon receipt, the Water Heater SHALL transition back from the BOOST state to the previous mode
+ * (e.g. OFF, MANUAL or TIMED).
+ *
+ * @return It should report SUCCESS if successful and FAILURE otherwise.
+ */
+ Protocols::InteractionModel::Status HandleCancelBoost() override;
+
+ // ------------------------------------------------------------------
+ // Get attribute methods
+ BitMask GetHeaterTypes() override;
+ BitMask GetHeatDemand() override;
+ uint16_t GetTankVolume() override;
+ int64_t GetEstimatedHeatRequired() override;
+ Percent GetTankPercentage() override;
+ BoostStateEnum GetBoostState() override;
+
+ // ------------------------------------------------------------------
+ // Set attribute methods
+ void SetHeaterTypes(BitMask heaterTypes);
+ void SetHeatDemand(BitMask heatDemand);
+ void SetTankVolume(uint16_t tankVolume);
+ void SetEstimatedHeatRequired(int64_t estimatedHeatRequired);
+ void SetTankPercentage(Percent tankPercentage);
+ void SetBoostState(BoostStateEnum boostState);
+
+ /*********************************************************************************
+ *
+ * WaterHeaterManagementDelegate specific methods
+ *
+ *********************************************************************************/
+
+ /**
+ * @brief Set the Water Header Mode and act accordingly.
+ *
+ * @param mode The Water Heater Mode (e.g. OFF, MANUAL or TIMED).
+ */
+ Protocols::InteractionModel::Status SetWaterHeaterMode(uint8_t mode);
+
+ /**
+ * @brief Set the water temperature of the tank
+ *
+ * @param waterTemperature The water temperature in 100th's Celsius
+ */
+ void SetWaterTemperature(uint16_t waterTemperature);
+
+ /**
+ * @brief Set the target water temperature of the tank
+ *
+ * @param targetWaterTemperature The water temperature in 100th's Celsius
+ */
+ void SetTargetWaterTemperature(uint16_t targetWaterTemperature);
+
+ /**
+ * @brief Determine whether the heating sources need to be turned on or off
+ */
+ Protocols::InteractionModel::Status CheckIfHeatNeedsToBeTurnedOnOrOff();
+
+ /**
+ * @brief Static timer callback for when Boost timer expires.
+ */
+ static void BoostTimerExpiry(System::Layer * systemLayer, void * delegate);
+
+ /**
+ * @brief Object timer callback for when Boost timer expires.
+ */
+ void HandleBoostTimerExpiry();
+
+ /**
+ * Determines whether the tank water temperature has reached the target temperature.
+ *
+ * @return Returns True is tank water temperature has reached the target temperature, False otherwise.
+ */
+ bool HasWaterTemperatureReachedTarget() const;
+
+ /**
+ * Simulates water being drawn from the water tank.
+ *
+ * @param percentageReplaced The % of water being replaced with water with a temperature of replacedWaterTemperature.
+ * @param replacedWaterTemperature The temperature of the percentageReplaced water.
+ */
+ void DrawOffHotWater(chip::Percent percentageReplaced, uint16_t replacedWaterTemperature);
+
+private:
+ /**
+ * @brief Determine whether heating needs to be turned on or off or left as is.
+ *
+ * @param heatingOp[out] Set as determined whether heating needs to be turned on/off or left unchanged.
+ *
+ * @return Success if the heating operation could be determined otherwise returns with appropriate error.
+ */
+ Protocols::InteractionModel::Status DetermineIfChangingHeatingState(HeatingOp & heatingOp);
+
+private:
+ /*********************************************************************************
+ *
+ * WaterHeaterManagementDelegate specific attributes
+ *
+ *********************************************************************************/
+
+ // Need the following so can determine which features are supported
+ WaterHeaterManagement::Instance * mpWhmInstance;
+
+ // Pointer to the manufacturer specific object which understand the hardware
+ WhmManufacturer * mpWhmManufacturer;
+
+ // Target water temperature in 100ths of a C
+ uint16_t mTargetWaterTemperature;
+
+ // Actual water temperature in 100ths of a C
+ uint16_t mWaterTemperature;
+
+ // The % of water at temperature mReplacedWaterTemperature
+ uint16_t mReplacedWaterTemperature;
+
+ // Boost command parameters
+
+ // This field SHALL indicate whether the BOOST state should be automatically canceled once the hot water has first reached the
+ // set point temperature (or the TemporarySetpoint temperature, if specified) for the TargetPercentage (if specified).
+ Optional mBoostOneShot;
+
+ // This field indicates that the consumer wants the water to be heated as quickly as practicable. This MAY cause multiple heat
+ // sources to be activated (e.g. a heat pump and direct electric heating element).
+ Optional mBoostEmergencyBoost;
+
+ // This field indicates the target temperature to which to heat the hot water for this Boost command. It SHALL be used instead
+ // of the normal set point temperature whilst the BOOST state is active.
+ Optional mBoostTemporarySetpoint;
+
+ // If the tank supports the TankPercent feature, this field indicates the amount of water that SHALL be heated by this Boost
+ // command before the heater is switched off. This field is optional, however it SHALL be included if the TargetReheat field is
+ // included.
+ Optional mBoostTargetPercentage;
+
+ // If the tank supports the TankPercent feature, and the heating by this Boost command has ceased because the TargetPercentage
+ // of the water in the tank has been heated to the set point (or TemporarySetpoint if included), this field indicates the
+ // percentage to which the hot water in the tank SHALL be allowed to fall before again beginning to reheat it. For example if
+ // the TargetPercentage was 80%, and the TargetReheat was 40%, then after initial heating to 80% hot water, the tank may have
+ // hot water drawn off until only 40% hot water remains. At this point the heater will begin to heat back up to 80% of hot
+ // water. If this field and the OneShot field were both omitted, heating would begin again after any water draw which reduced
+ // the TankPercentage below 80%.
+ Optional mBoostTargetReheat;
+
+ // Track whether the water temperature has reached the water temperature specified in the boost command. Used in conjunction
+ // with the boost command boostTargetReheat parameter
+ bool mBoostTargetTemperatureReached;
+
+ /*********************************************************************************
+ *
+ * Member variables implementing the WaterHeaterManagement::Delegate interface
+ *
+ *********************************************************************************/
+
+ // This attribute SHALL indicate the methods to call for heat that the controller supports. If a bit is set then the controller
+ // supports the corresponding method.
+ BitMask mHeaterTypes;
+
+ // This attribute SHALL indicate if the controller is asking for heat. If a bit is set then the corresponding call for heat is
+ // active.
+ BitMask mHeatDemand;
+
+ // This attribute SHALL indicate the volume of water that the hot water tank can hold (in units of Litres). This allows an
+ // energy management system to estimate the required heating energy needed to reach the target temperature.
+ uint16_t mTankVolume;
+
+ // This attribute SHALL indicate the estimated heat energy needed to raise the water temperature to the target setpoint. This
+ // can be computed by taking the specific heat capacity of water (4182 J/kg °C) and by knowing the current temperature of the
+ // water, the tank volume and target temperature.
+ int64_t mEstimatedHeatRequired;
+
+ // This attribute SHALL indicate an approximate level of hot water stored in the tank, which may help consumers understand the
+ // amount of hot water remaining in the tank.
+ Percent mTankPercentage;
+
+ // This attribute SHALL indicate if the BOOST state, as triggered by a Boost command, is currently active.
+ BoostStateEnum mBoostState;
+};
+
+} // namespace WaterHeaterManagement
+} // namespace Clusters
+} // namespace app
+} // namespace chip
diff --git a/examples/all-clusters-app/all-clusters-common/include/WhmInstance.h b/examples/all-clusters-app/all-clusters-common/include/WhmInstance.h
new file mode 100644
index 00000000000000..a776bd92b99534
--- /dev/null
+++ b/examples/all-clusters-app/all-clusters-common/include/WhmInstance.h
@@ -0,0 +1,58 @@
+/*
+ *
+ * Copyright (c) 2024 Project CHIP Authors
+ * All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include
+#include
+#include
+#include
+
+namespace chip {
+namespace app {
+namespace Clusters {
+namespace WaterHeaterManagement {
+using namespace chip::app::Clusters::WaterHeaterManagement;
+
+class WaterHeaterManagementInstance : public Instance
+{
+public:
+ WaterHeaterManagementInstance(EndpointId aEndpointId, WaterHeaterManagementDelegate & aDelegate, Feature aFeature) :
+ WaterHeaterManagement::Instance(aEndpointId, aDelegate, aFeature)
+ {
+ mDelegate = &aDelegate;
+ }
+
+ // Delete copy constructor and assignment operator.
+ WaterHeaterManagementInstance(const WaterHeaterManagementInstance &) = delete;
+ WaterHeaterManagementInstance(const WaterHeaterManagementInstance &&) = delete;
+ WaterHeaterManagementInstance & operator=(const WaterHeaterManagementInstance &) = delete;
+
+ CHIP_ERROR Init();
+ void Shutdown();
+
+ WaterHeaterManagementDelegate * GetDelegate() { return mDelegate; };
+
+private:
+ WaterHeaterManagementDelegate * mDelegate;
+};
+
+} // namespace WaterHeaterManagement
+} // namespace Clusters
+} // namespace app
+} // namespace chip
diff --git a/examples/all-clusters-app/all-clusters-common/include/WhmMain.h b/examples/all-clusters-app/all-clusters-common/include/WhmMain.h
new file mode 100644
index 00000000000000..21dc9d86519307
--- /dev/null
+++ b/examples/all-clusters-app/all-clusters-common/include/WhmMain.h
@@ -0,0 +1,32 @@
+/*
+ *
+ * Copyright (c) 2024 Project CHIP Authors
+ * All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+namespace chip {
+namespace app {
+namespace Clusters {
+namespace WaterHeaterManagement {
+
+void WhmApplicationInit();
+void WhmApplicationShutdown();
+
+} // namespace WaterHeaterManagement
+} // namespace Clusters
+} // namespace app
+} // namespace chip
diff --git a/examples/all-clusters-app/all-clusters-common/include/WhmManufacturer.h b/examples/all-clusters-app/all-clusters-common/include/WhmManufacturer.h
new file mode 100644
index 00000000000000..d51e6a62f2021c
--- /dev/null
+++ b/examples/all-clusters-app/all-clusters-common/include/WhmManufacturer.h
@@ -0,0 +1,139 @@
+/*
+ *
+ * Copyright (c) 2024 Project CHIP Authors
+ * All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include
+#include
+
+namespace chip {
+namespace app {
+namespace Clusters {
+namespace WaterHeaterManagement {
+
+/**
+ * The WhmManufacturer example class
+ *
+ * Helps with handling the test triggers.
+ */
+
+class WhmManufacturer
+{
+public:
+ WhmManufacturer(WaterHeaterManagementInstance * whmInstance) { mWhmInstance = whmInstance; }
+
+ WaterHeaterManagementInstance * GetWhmInstance() { return mWhmInstance; }
+
+ WaterHeaterManagementDelegate * GetWhmDelegate()
+ {
+ if (mWhmInstance)
+ {
+ return mWhmInstance->GetDelegate();
+ }
+
+ return nullptr;
+ }
+
+ /**
+ * @brief Called at start up to apply hardware settings
+ */
+ CHIP_ERROR Init();
+
+ /**
+ * @brief Called at shutdown
+ */
+ CHIP_ERROR Shutdown();
+
+ /**
+ * @brief Called to determine which heating sources to use,
+ */
+ BitMask DetermineHeatingSources();
+
+ /**
+ * @brief Turn the heating of the water tank on.
+ *
+ * @param emergencyBoost Indicates that the consumer wants the water to be heated as quickly as practicable. This MAY cause
+ * multiple heat sources to be activated (e.g. a heat pump and direct electric heating element).
+ * @return An error if a problem occurs turning the heating on
+ */
+ Protocols::InteractionModel::Status TurnHeatingOn(bool emergencyBoost);
+
+ /**
+ * @brief Turn the heating of the water tank off.
+ *
+ * @return An error if a problem occurs turning the heating off
+ */
+ Protocols::InteractionModel::Status TurnHeatingOff();
+
+ /**
+ * @brief Called to handle a boost command.
+ *
+ * @param duration Indicates the time period in seconds for which the BOOST state is activated before it automatically reverts
+ * to the previous mode (e.g. OFF, MANUAL or TIMED).
+ * @param oneShot Indicates whether the BOOST state should be automatically canceled once the hot water has first reached the
+ * set point temperature (or the TemporarySetpoint temperature, if specified) for the TargetPercentage (if
+ * specified).
+ * @param emergencyBoost Indicates that the consumer wants the water to be heated as quickly as practicable. This MAY cause
+ * multiple heat sources to be activated (e.g. a heat pump and direct electric heating element).
+ * @param temporarySetpoint Indicates the target temperature to which to heat the hot water for this Boost command. It SHALL be
+ * used instead of the normal set point temperature whilst the BOOST state is active.
+ * @param targetPercentage If the tank supports the TankPercent feature, this field indicates the amount of water that SHALL be
+ * heated by this Boost command before the heater is switched off.
+ * @param targetReheat If the tank supports the TankPercent feature, and the heating by this Boost command has ceased because
+ * the TargetPercentage of the water in the tank has been heated to the set point (or TemporarySetpoint if
+ * included), this field indicates the percentage to which the hot water in the tank SHALL be allowed to fall before again
+ * beginning to reheat it.
+ *
+ * @return Success if the boost command is successful; otherwise return the appropriate error.
+ */
+ Protocols::InteractionModel::Status BoostCommandStarted(uint32_t duration, Optional oneShot,
+ Optional emergencyBoost, Optional temporarySetpoint,
+ Optional targetPercentage,
+ Optional targetReheat);
+
+ /**
+ * @brief Called when the Boost command has been cancelled.
+ *
+ * @return It should report SUCCESS if successful and FAILURE otherwise.
+ */
+ Protocols::InteractionModel::Status BoostCommandCancelled();
+
+ /**
+ * @brief Called when a boost command has completed.
+ */
+ void BoostCommandFinished();
+
+private:
+ WaterHeaterManagementInstance * mWhmInstance;
+};
+
+/** @brief Helper function to return the singleton WhmManufacturer instance
+ *
+ * This is needed by the WhmManufacturer class to support TestEventTriggers
+ * which are called outside of any class context. This allows the WhmManufacturer
+ * class to return the relevant Delegate instance in which to invoke the test
+ * events on.
+ *
+ * This function is typically found in main.cpp or wherever the singleton is created.
+ */
+WhmManufacturer * GetWhmManufacturer();
+
+} // namespace WaterHeaterManagement
+} // namespace Clusters
+} // namespace app
+} // namespace chip
diff --git a/examples/all-clusters-app/all-clusters-common/include/water-heater-mode.h b/examples/all-clusters-app/all-clusters-common/include/water-heater-mode.h
old mode 100644
new mode 100755
diff --git a/examples/all-clusters-app/all-clusters-common/src/WhmDelegateImpl.cpp b/examples/all-clusters-app/all-clusters-common/src/WhmDelegateImpl.cpp
new file mode 100644
index 00000000000000..0568e5c9c7d002
--- /dev/null
+++ b/examples/all-clusters-app/all-clusters-common/src/WhmDelegateImpl.cpp
@@ -0,0 +1,461 @@
+/*
+ *
+ * Copyright (c) 2024 Project CHIP Authors
+ * All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include
+
+#include
+#include
+#include
+
+using namespace chip;
+using namespace chip::app;
+using namespace chip::app::Clusters;
+using namespace chip::app::Clusters::WaterHeaterManagement;
+
+using Protocols::InteractionModel::Status;
+
+WaterHeaterManagementDelegate::WaterHeaterManagementDelegate(EndpointId clustersEndpoint) :
+ mpWhmInstance(nullptr), mpWhmManufacturer(nullptr), mWaterTemperature(0), mReplacedWaterTemperature(0),
+ mBoostTargetTemperatureReached(false), mTankVolume(0), mEstimatedHeatRequired(0), mTankPercentage(0),
+ mBoostState(BoostStateEnum::kInactive)
+{}
+
+void WaterHeaterManagementDelegate::SetWaterHeaterManagementInstance(WaterHeaterManagement::Instance & instance)
+{
+ mpWhmInstance = &instance;
+}
+
+void WaterHeaterManagementDelegate::SetWhmManufacturer(WhmManufacturer & whmManufacturer)
+{
+ mpWhmManufacturer = &whmManufacturer;
+}
+
+/*********************************************************************************
+ *
+ * Methods implementing the WaterHeaterManagement::Delegate interace
+ *
+ *********************************************************************************/
+
+BitMask WaterHeaterManagementDelegate::GetHeaterTypes()
+{
+ return mHeaterTypes;
+}
+
+BitMask WaterHeaterManagementDelegate::GetHeatDemand()
+{
+ return mHeatDemand;
+}
+
+uint16_t WaterHeaterManagementDelegate::GetTankVolume()
+{
+ return mTankVolume;
+}
+
+int64_t WaterHeaterManagementDelegate::GetEstimatedHeatRequired()
+{
+ return mEstimatedHeatRequired;
+}
+
+Percent WaterHeaterManagementDelegate::GetTankPercentage()
+{
+ return mTankPercentage;
+}
+
+BoostStateEnum WaterHeaterManagementDelegate::GetBoostState()
+{
+ return mBoostState;
+}
+
+void WaterHeaterManagementDelegate::SetHeaterTypes(BitMask heaterTypes)
+{
+ if (mHeaterTypes != heaterTypes)
+ {
+ mHeaterTypes = heaterTypes;
+
+ MatterReportingAttributeChangeCallback(mEndpointId, WaterHeaterManagement::Id, Attributes::HeaterTypes::Id);
+ }
+}
+
+void WaterHeaterManagementDelegate::SetHeatDemand(BitMask heatDemand)
+{
+ if (mHeatDemand != heatDemand)
+ {
+ mHeatDemand = heatDemand;
+
+ MatterReportingAttributeChangeCallback(mEndpointId, WaterHeaterManagement::Id, Attributes::HeatDemand::Id);
+ }
+}
+
+void WaterHeaterManagementDelegate::SetTankVolume(uint16_t tankVolume)
+{
+ if (mTankVolume != tankVolume)
+ {
+ mTankVolume = tankVolume;
+
+ MatterReportingAttributeChangeCallback(mEndpointId, WaterHeaterManagement::Id, Attributes::TankVolume::Id);
+ }
+}
+
+void WaterHeaterManagementDelegate::SetEstimatedHeatRequired(int64_t estimatedHeatRequired)
+{
+ if (mEstimatedHeatRequired != estimatedHeatRequired)
+ {
+ mEstimatedHeatRequired = estimatedHeatRequired;
+
+ MatterReportingAttributeChangeCallback(mEndpointId, WaterHeaterManagement::Id, Attributes::EstimatedHeatRequired::Id);
+ }
+}
+
+void WaterHeaterManagementDelegate::SetTankPercentage(Percent tankPercentage)
+{
+ if (mpWhmInstance != nullptr && mpWhmInstance->HasFeature(Feature::kTankPercent))
+ {
+ if (mTankPercentage != tankPercentage)
+ {
+ mTankPercentage = tankPercentage;
+
+ CheckIfHeatNeedsToBeTurnedOnOrOff();
+
+ MatterReportingAttributeChangeCallback(mEndpointId, WaterHeaterManagement::Id, Attributes::TankPercentage::Id);
+ }
+ }
+}
+
+void WaterHeaterManagementDelegate::SetBoostState(BoostStateEnum boostState)
+{
+ if (mBoostState != boostState)
+ {
+ mBoostState = boostState;
+
+ MatterReportingAttributeChangeCallback(mEndpointId, WaterHeaterManagement::Id, Attributes::BoostState::Id);
+ }
+}
+
+/**
+ * @brief Handles the boost command
+ *
+ * Upon receipt, the Water Heater SHALL transition into the BOOST state, which SHALL cause the water in the tank (or
+ * the TargetPercentage of the water, if included) to be heated towards the set point (or the TemporarySetpoint, if
+ * included), which in turn may cause a call for heat, even if the mode is OFF, or is TIMED and it is during one of
+ * the Off periods.
+ */
+Status WaterHeaterManagementDelegate::HandleBoost(uint32_t durationS, Optional oneShot, Optional emergencyBoost,
+ Optional temporarySetpoint, Optional targetPercentage,
+ Optional targetReheat)
+{
+ Status status = Status::Success;
+
+ ChipLogProgress(AppServer, "HandleBoost");
+
+ // Keep track of the boost command parameters
+ mBoostOneShot = oneShot;
+ mBoostEmergencyBoost = emergencyBoost;
+ mBoostTemporarySetpoint = temporarySetpoint;
+ mBoostTargetPercentage = targetPercentage;
+ mBoostTargetReheat = targetReheat;
+
+ mBoostTargetTemperatureReached = false;
+
+ // If a timer is running, cancel it so we can start a new boost command with the new duration
+ if (mBoostState == BoostStateEnum::kActive)
+ {
+ DeviceLayer::SystemLayer().CancelTimer(BoostTimerExpiry, this);
+ }
+
+ CHIP_ERROR err = DeviceLayer::SystemLayer().StartTimer(System::Clock::Seconds32(durationS), BoostTimerExpiry, this);
+ if (err != CHIP_NO_ERROR)
+ {
+ ChipLogError(AppServer, "HandleBoost: Unable to start a Boost timer: %" CHIP_ERROR_FORMAT, err.Format());
+
+ // Not a lot we can do -> just set the boost state to inactive
+ SetBoostState(BoostStateEnum::kInactive);
+
+ return Status::Failure;
+ }
+
+ // Now running a boost command
+ SetBoostState(BoostStateEnum::kActive);
+
+ if (mpWhmManufacturer != nullptr)
+ {
+ status = mpWhmManufacturer->BoostCommandStarted(durationS, oneShot, emergencyBoost, temporarySetpoint, targetPercentage,
+ targetReheat);
+ }
+ else
+ {
+ status = Status::InvalidInState;
+ ChipLogError(AppServer, "HandleBoost: mpWhmManufacturer == nullptr");
+ }
+
+ if (status == Status::Success)
+ {
+ // See if the heat needs to be turned on or off as a result of this boost command
+ status = CheckIfHeatNeedsToBeTurnedOnOrOff();
+ }
+
+ return status;
+}
+
+void WaterHeaterManagementDelegate::BoostTimerExpiry(System::Layer * systemLayer, void * delegate)
+{
+ WaterHeaterManagementDelegate * dg = static_cast(delegate);
+
+ dg->HandleBoostTimerExpiry();
+}
+
+/**
+ * @brief Timer for handling the completion of a boost command
+ */
+void WaterHeaterManagementDelegate::HandleBoostTimerExpiry()
+{
+ ChipLogError(AppServer, "HandleBoostTimerExpiry");
+
+ // The PowerAdjustment is no longer in progress
+ SetBoostState(BoostStateEnum::kInactive);
+
+ if (mpWhmManufacturer != nullptr)
+ {
+ mpWhmManufacturer->BoostCommandFinished();
+ }
+ else
+ {
+ ChipLogError(AppServer, "HandleBoostTimerExpiry: mpWhmManufacturer == nullptr");
+ }
+
+ CheckIfHeatNeedsToBeTurnedOnOrOff();
+}
+
+/**
+ * @brief Cancels a boost command
+ *
+ * Upon receipt, the Water Heater SHALL transition back from the BOOST state to the previous mode (e.g. OFF, MANUAL or TIMED).
+ */
+Status WaterHeaterManagementDelegate::HandleCancelBoost()
+{
+ ChipLogProgress(AppServer, "HandleCancelBoost");
+
+ if (mBoostState == BoostStateEnum::kActive)
+ {
+ SetBoostState(BoostStateEnum::kInactive);
+ mBoostEmergencyBoost.ClearValue();
+
+ DeviceLayer::SystemLayer().CancelTimer(BoostTimerExpiry, this);
+
+ VerifyOrReturnValue(mpWhmManufacturer != nullptr, Status::InvalidInState);
+
+ Status status = mpWhmManufacturer->BoostCommandCancelled();
+ VerifyOrReturnValue(status == Status::Success, status);
+
+ status = CheckIfHeatNeedsToBeTurnedOnOrOff();
+ VerifyOrReturnValue(status == Status::Success, status);
+ }
+
+ return Status::Success;
+}
+
+/*********************************************************************************
+ *
+ * WaterHeaterManagementDelegate specific methods
+ *
+ *********************************************************************************/
+
+void WaterHeaterManagementDelegate::SetWaterTemperature(uint16_t waterTemperature)
+{
+ mWaterTemperature = waterTemperature;
+
+ if (mpWhmInstance != nullptr && mpWhmInstance->HasFeature(Feature::kTankPercent))
+ {
+ mTankPercentage = 100;
+ }
+
+ // See if the heat needs to be turned on or off
+ CheckIfHeatNeedsToBeTurnedOnOrOff();
+}
+
+void WaterHeaterManagementDelegate::SetTargetWaterTemperature(uint16_t targetWaterTemperature)
+{
+ mTargetWaterTemperature = targetWaterTemperature;
+
+ // See if the heat needs to be turned on or off
+ CheckIfHeatNeedsToBeTurnedOnOrOff();
+}
+
+void WaterHeaterManagementDelegate::DrawOffHotWater(Percent percentageReplaced, uint16_t replacedWaterTemperature)
+{
+ // Only supported in the kTankPercent is supported.
+ // Replaces percentageReplaced% of the water in the tank with water of a temperature replacedWaterTemperature
+ if (mpWhmInstance != nullptr && mpWhmInstance->HasFeature(Feature::kTankPercent))
+ {
+ // See if all of the water has now been replaced with replacedWaterTemperature
+ if (mTankPercentage >= percentageReplaced)
+ {
+ mTankPercentage = static_cast(mTankPercentage - percentageReplaced);
+ }
+ else
+ {
+ mTankPercentage = 0;
+ }
+
+ mReplacedWaterTemperature = replacedWaterTemperature;
+
+ CheckIfHeatNeedsToBeTurnedOnOrOff();
+ }
+}
+
+bool WaterHeaterManagementDelegate::HasWaterTemperatureReachedTarget() const
+{
+ // Determine the target temperature. If a boost command is in progress and has a mBoostTemporarySetpoint value use that as the
+ // target temperature.
+ // Note, in practise the actual heating is likely to be controlled by the thermostat's occupiedHeatingSetpoint most of the
+ // time, and the TemporarySetpoint (if not null) would be overiding the thermostat's occupiedHeatingSetpoint.
+ // However, this code doesn't rely upon the thermostat cluster.
+ uint16_t targetTemperature = (mBoostState == BoostStateEnum::kActive && mBoostTemporarySetpoint.HasValue())
+ ? static_cast(mBoostTemporarySetpoint.Value())
+ : mTargetWaterTemperature;
+
+ VerifyOrReturnValue(mWaterTemperature >= targetTemperature, false);
+
+ if (mBoostState == BoostStateEnum::kActive)
+ {
+ if (mBoostTargetTemperatureReached && mBoostTargetReheat.HasValue())
+ {
+ // If the tank supports the TankPercent feature, and the heating by this Boost command has ceased because the
+ // TargetPercentage of the water in the tank has been heated to the set point (or TemporarySetpoint if included),
+ // mBoostTargetReheat indicates the percentage to which the hot water in the tank SHALL be allowed to fall before
+ // again beginning to reheat it.
+ //
+ // For example if the TargetPercentage was 80%, and the TargetReheat was 40%, then after initial heating to 80% hot
+ // water, the tank may have hot water drawn off until only 40% hot water remains. At this point the heater will begin to
+ // heat back up to 80% of hot water. If this field and the OneShot field were both omitted, heating would begin again
+ // after any water draw which reduced the TankPercentage below 80%.
+
+ // If this field is included then the TargetPercentage field SHALL also be included, and the OneShot excluded.
+ VerifyOrReturnValue(mTankPercentage >= mBoostTargetReheat.Value(), false);
+ }
+ else if (mBoostTargetPercentage.HasValue())
+ {
+ // If tank percentage is supported AND the targetPercentage.HasValue() then use target percentage to heat up.
+ VerifyOrReturnValue(mTankPercentage >= mBoostTargetPercentage.Value(), false);
+ }
+ }
+
+ // Must have reached the right temperature
+ return true;
+}
+
+Status WaterHeaterManagementDelegate::CheckIfHeatNeedsToBeTurnedOnOrOff()
+{
+ VerifyOrReturnError(mpWhmManufacturer != nullptr, Status::InvalidInState);
+
+ HeatingOp heatingOp = HeatingOp::LeaveHeatingUnchanged;
+
+ Status status = DetermineIfChangingHeatingState(heatingOp);
+
+ VerifyOrReturnError(status == Status::Success, status);
+
+ if (heatingOp == HeatingOp::TurnHeatingOn)
+ {
+ status = mpWhmManufacturer->TurnHeatingOn(mBoostEmergencyBoost.HasValue() ? mBoostEmergencyBoost.Value() : false);
+ }
+ else if (heatingOp == HeatingOp::TurnHeatingOff)
+ {
+ // If running a boost command with the oneShot parameter and turning heat off, then must have
+ // reached the boost command target temperature -> that's the boost command complete.
+ if (mBoostState == BoostStateEnum::kActive && mBoostOneShot.HasValue() && mBoostOneShot.Value())
+ {
+ SetBoostState(BoostStateEnum::kInactive);
+
+ DeviceLayer::SystemLayer().CancelTimer(BoostTimerExpiry, this);
+
+ mBoostEmergencyBoost.ClearValue();
+
+ status = mpWhmManufacturer->BoostCommandCancelled();
+ }
+
+ // Turn the heating off
+ status = mpWhmManufacturer->TurnHeatingOff();
+ }
+
+ return status;
+}
+
+Status WaterHeaterManagementDelegate::DetermineIfChangingHeatingState(HeatingOp & heatingOp)
+{
+ heatingOp = LeaveHeatingUnchanged;
+
+ if (!HasWaterTemperatureReachedTarget())
+ {
+ VerifyOrReturnError(WaterHeaterMode::Instance() != nullptr, Status::InvalidInState);
+
+ uint8_t mode = WaterHeaterMode::Instance()->GetCurrentMode();
+
+ // The water in the tank is not at the target temperature. See if heating is currently off
+ if (mHeatDemand.Raw() == 0)
+ {
+ // Need to track whether the water temperature has reached the target temperature for the boost
+ // command when a oneShot option has been applied.
+ if (mBoostState == BoostStateEnum::kActive)
+ {
+ mBoostTargetTemperatureReached = false;
+ }
+
+ // If a boost command is in progress or in manual mode, find a heating source and "turn it on".
+ if (mBoostState == BoostStateEnum::kActive || mode == WaterHeaterMode::kModeManual)
+ {
+ heatingOp = HeatingOp::TurnHeatingOn;
+ }
+ }
+ else if (mBoostState == BoostStateEnum::kInactive && mode == WaterHeaterMode::kModeOff)
+ {
+ // The water temperature is not at the target temperature but there is no boost command in progress and the mode is Off
+ // so need to ensure the heating is turned off.
+ ChipLogError(AppServer, "DetermineIfChangingHeatingState turning heating off due to no boost cmd and kModeOff");
+
+ heatingOp = HeatingOp::TurnHeatingOff;
+ }
+ }
+ else if (mHeatDemand.Raw() != 0)
+ {
+ // The water in the tank has reached the target temperature - need to turn the heating off
+ heatingOp = HeatingOp::TurnHeatingOff;
+
+ // If a boost command is in progress, record that the target temperature has been reached.
+ mBoostTargetTemperatureReached = (mBoostState == BoostStateEnum::kActive);
+ }
+
+ return Status::Success;
+}
+
+Status WaterHeaterManagementDelegate::SetWaterHeaterMode(uint8_t modeValue)
+{
+ VerifyOrReturnError(WaterHeaterMode::Instance() != nullptr, Status::InvalidInState);
+
+ if (!WaterHeaterMode::Instance()->IsSupportedMode(modeValue))
+ {
+ ChipLogError(AppServer, "SetWaterHeaterMode bad mode");
+ return Status::ConstraintError;
+ }
+
+ Status status = WaterHeaterMode::Instance()->UpdateCurrentMode(modeValue);
+ if (status != Status::Success)
+ {
+ ChipLogError(AppServer, "SetWaterHeaterMode updateMode failed 0x%02x", to_underlying(status));
+ return status;
+ }
+
+ return CheckIfHeatNeedsToBeTurnedOnOrOff();
+}
diff --git a/examples/all-clusters-app/all-clusters-common/src/WhmInstance.cpp b/examples/all-clusters-app/all-clusters-common/src/WhmInstance.cpp
new file mode 100644
index 00000000000000..9d4ad58fefd976
--- /dev/null
+++ b/examples/all-clusters-app/all-clusters-common/src/WhmInstance.cpp
@@ -0,0 +1,34 @@
+/*
+ *
+ * Copyright (c) 2024 Project CHIP Authors
+ * All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include
+
+using namespace chip::app;
+using namespace chip::app::Clusters;
+using namespace chip::app::Clusters::WaterHeaterManagement;
+
+CHIP_ERROR WaterHeaterManagementInstance::Init()
+{
+ ChipLogDetail(AppServer, "WaterHeaterManagementInstance::Init()");
+ return Instance::Init();
+}
+
+void WaterHeaterManagementInstance::Shutdown()
+{
+ Instance::Shutdown();
+}
diff --git a/examples/all-clusters-app/all-clusters-common/src/WhmMain.cpp b/examples/all-clusters-app/all-clusters-common/src/WhmMain.cpp
new file mode 100644
index 00000000000000..ea59fef2d095f5
--- /dev/null
+++ b/examples/all-clusters-app/all-clusters-common/src/WhmMain.cpp
@@ -0,0 +1,194 @@
+/*
+ *
+ * Copyright (c) 2024 Project CHIP Authors
+ * All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include
+#include
+
+#include
+#include
+#include
+#include
+
+static constexpr int WHM_ENDPOINT = 1;
+
+using namespace chip;
+using namespace chip::app;
+using namespace chip::app::DataModel;
+using namespace chip::app::Clusters;
+
+namespace chip {
+namespace app {
+namespace Clusters {
+namespace WaterHeaterManagement {
+
+static std::unique_ptr gWhmDelegate;
+static std::unique_ptr gWhmInstance;
+
+static std::unique_ptr gWhmManufacturer;
+
+WhmManufacturer * GetWhmManufacturer()
+{
+ return gWhmManufacturer.get();
+}
+
+/*
+ * @brief Creates a Delegate and Instance for Water Heater Management cluster
+ *
+ * The Instance is a container around the Delegate, so
+ * create the Delegate first, then wrap it in the Instance
+ * Then call the Instance->Init() to register the attribute and command handlers
+ */
+CHIP_ERROR WhmInit()
+{
+ CHIP_ERROR err;
+
+ if (gWhmDelegate || gWhmInstance)
+ {
+ ChipLogError(AppServer, "WaterHeaterManager Instance or Delegate already exist.");
+ return CHIP_ERROR_INCORRECT_STATE;
+ }
+
+ gWhmDelegate = std::make_unique(WHM_ENDPOINT);
+ if (!gWhmDelegate)
+ {
+ ChipLogError(AppServer, "Failed to allocate memory for WaterHeaterManagementDelegate");
+ return CHIP_ERROR_NO_MEMORY;
+ }
+
+ /* Manufacturer may optionally not support all features, commands & attributes */
+ gWhmInstance = std::make_unique(
+ EndpointId(WHM_ENDPOINT), *gWhmDelegate, BitMask(Feature::kEnergyManagement, Feature::kTankPercent));
+ if (!gWhmInstance)
+ {
+ ChipLogError(AppServer, "Failed to allocate memory for WaterHeaterManagementInstance");
+ gWhmDelegate.reset();
+ return CHIP_ERROR_NO_MEMORY;
+ }
+
+ /* Register Attribute & Command handlers */
+ err = gWhmInstance->Init();
+ if (err != CHIP_NO_ERROR)
+ {
+ ChipLogError(AppServer, "gWhmInstance->Init failed %s", chip::ErrorStr(err));
+ gWhmInstance.reset();
+ gWhmDelegate.reset();
+ return err;
+ }
+
+ gWhmDelegate->SetWaterHeaterManagementInstance(*gWhmInstance);
+
+ return CHIP_NO_ERROR;
+}
+
+CHIP_ERROR WhmShutdown()
+{
+ /* Do this in the order Instance first, then delegate
+ * Ensure we call the Instance->Shutdown to free attribute & command handlers first
+ */
+ if (gWhmInstance)
+ {
+ /* Deregister attribute & command handlers */
+ gWhmInstance->Shutdown();
+ gWhmInstance.reset();
+ }
+
+ if (gWhmDelegate)
+ {
+ gWhmDelegate.reset();
+ }
+
+ return CHIP_NO_ERROR;
+}
+
+/*
+ * @brief Creates a WhmManufacturer class to hold the Whm cluster
+ *
+ * The Instance is a container around the Delegate, so
+ * create the Delegate first, then wrap it in the Instance
+ * Then call the Instance->Init() to register the attribute and command handlers
+ */
+CHIP_ERROR WhmManufacturerInit()
+{
+ CHIP_ERROR err;
+
+ if (gWhmManufacturer)
+ {
+ ChipLogError(AppServer, "WhmManufacturer already exist.");
+ return CHIP_ERROR_INCORRECT_STATE;
+ }
+
+ /* Now create WhmManufacturer */
+ gWhmManufacturer = std::make_unique(gWhmInstance.get());
+ if (!gWhmManufacturer)
+ {
+ ChipLogError(AppServer, "Failed to allocate memory for WhmManufacturer");
+ return CHIP_ERROR_NO_MEMORY;
+ }
+
+ /* Call Manufacturer specific init */
+ err = gWhmManufacturer->Init();
+ if (err != CHIP_NO_ERROR)
+ {
+ ChipLogError(AppServer, "Init failed on gWhmManufacturer");
+ gWhmManufacturer.reset();
+ return err;
+ }
+
+ // Let the WhmDelegate know about the WhmManufacturer object.
+ gWhmDelegate->SetWhmManufacturer(*gWhmManufacturer);
+
+ return CHIP_NO_ERROR;
+}
+
+CHIP_ERROR WhmManufacturerShutdown()
+{
+ if (gWhmManufacturer)
+ {
+ /* Shutdown the WhmManufacturer */
+ gWhmManufacturer->Shutdown();
+ gWhmManufacturer.reset();
+ }
+
+ return CHIP_NO_ERROR;
+}
+
+void WhmApplicationInit()
+{
+ if (WhmInit() != CHIP_NO_ERROR)
+ {
+ return;
+ }
+
+ /* Do this last so that the instances for other clusters can be wrapped inside */
+ if (WhmManufacturerInit() != CHIP_NO_ERROR)
+ {
+ WhmShutdown();
+ return;
+ }
+}
+
+void WhmApplicationShutdown()
+{
+ /* Shutdown in reverse order that they were created */
+ WhmManufacturerShutdown();
+}
+
+} // namespace WaterHeaterManagement
+} // namespace Clusters
+} // namespace app
+} // namespace chip
diff --git a/examples/all-clusters-app/all-clusters-common/src/WhmManufacturer.cpp b/examples/all-clusters-app/all-clusters-common/src/WhmManufacturer.cpp
new file mode 100644
index 00000000000000..dd8452a5c816ca
--- /dev/null
+++ b/examples/all-clusters-app/all-clusters-common/src/WhmManufacturer.cpp
@@ -0,0 +1,286 @@
+/*
+ *
+ * Copyright (c) 2024 Project CHIP Authors
+ * All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include
+#include
+#include
+
+#include
+#include
+#include
+
+using namespace chip;
+using namespace chip::app::Clusters::WaterHeaterManagement;
+
+using Protocols::InteractionModel::Status;
+
+namespace chip {
+namespace app {
+namespace Clusters {
+namespace WaterHeaterManagement {
+
+CHIP_ERROR WhmManufacturer::Init()
+{
+ WaterHeaterManagementDelegate * dg = GetWhmManufacturer()->GetWhmDelegate();
+ if (dg == nullptr)
+ {
+ ChipLogError(AppServer, "WhmDelegate is not initialized");
+ return CHIP_ERROR_UNINITIALIZED;
+ }
+
+ dg->SetHeaterTypes(BitMask(WaterHeaterTypeBitmap::kImmersionElement1));
+ dg->SetHeatDemand(BitMask(WaterHeaterDemandBitmap::kImmersionElement1));
+ dg->SetEstimatedHeatRequired(10000);
+
+ return CHIP_NO_ERROR;
+}
+
+CHIP_ERROR WhmManufacturer::Shutdown()
+{
+ return CHIP_NO_ERROR;
+}
+
+BitMask WhmManufacturer::DetermineHeatingSources()
+{
+ WaterHeaterManagementDelegate * dg = GetWhmManufacturer()->GetWhmDelegate();
+ if (dg == nullptr)
+ {
+ ChipLogError(AppServer, "WhmDelegate is not initialized");
+ return BitMask(0);
+ }
+
+ // A list of valid heaterTypes
+ uint8_t waterHeaterTypeValues[] = {
+ static_cast(WaterHeaterTypeBitmap::kImmersionElement1),
+ static_cast(WaterHeaterTypeBitmap::kImmersionElement2),
+ static_cast(WaterHeaterTypeBitmap::kHeatPump),
+ static_cast(WaterHeaterTypeBitmap::kBoiler),
+ static_cast(WaterHeaterTypeBitmap::kOther),
+ };
+
+ // The corresponding list of valid headerDemands
+ uint8_t waterHeaterDemandValues[] = {
+ static_cast(WaterHeaterDemandBitmap::kImmersionElement1),
+ static_cast(WaterHeaterDemandBitmap::kImmersionElement2),
+ static_cast(WaterHeaterDemandBitmap::kHeatPump),
+ static_cast(WaterHeaterDemandBitmap::kBoiler),
+ static_cast(WaterHeaterDemandBitmap::kOther),
+ };
+
+ // Iterate across the valid waterHeaterTypes seeing which heating sources are available based on heaterTypes.
+ // Set the corresponding bit in the heaterDemand bitmap.
+ BitMask heaterTypes = dg->GetHeaterTypes();
+
+ uint8_t heaterDemandMask = 0;
+ for (uint16_t idx = 0; idx < static_cast(sizeof(waterHeaterTypeValues) / sizeof(waterHeaterTypeValues[0])); idx++)
+ {
+ // Is this heating source being used?
+ if (heaterTypes.Raw() & waterHeaterTypeValues[idx])
+ {
+ heaterDemandMask |= waterHeaterDemandValues[idx];
+ }
+ }
+
+ return BitMask(heaterDemandMask);
+}
+
+Status WhmManufacturer::TurnHeatingOn(bool emergencyBoost)
+{
+ Status status = Status::Success;
+
+ ChipLogProgress(AppServer, "WhmManufacturer::TurnHeatingOn");
+
+ WaterHeaterManagementDelegate * dg = GetWhmDelegate();
+
+ if (emergencyBoost)
+ {
+ // emergencyBoost that the consumer wants the water to be heated as quickly as practicable.
+ // Thus, cause multiple heat sources to be activated
+ dg->SetHeatDemand(BitMask(WaterHeaterDemandBitmap::kImmersionElement1,
+ WaterHeaterDemandBitmap::kImmersionElement2));
+ }
+ else
+ {
+ dg->SetHeatDemand(BitMask(WaterHeaterDemandBitmap::kImmersionElement1));
+ }
+
+ return status;
+}
+
+Status WhmManufacturer::TurnHeatingOff()
+{
+ Status status = Status::Success;
+
+ ChipLogProgress(AppServer, "WhmManufacturer::TurnHeatingOff");
+
+ WaterHeaterManagementDelegate * dg = GetWhmDelegate();
+
+ dg->SetHeatDemand(BitMask(0));
+
+ return status;
+}
+
+Status WhmManufacturer::BoostCommandStarted(uint32_t duration, Optional oneShot, Optional emergencyBoost,
+ Optional temporarySetpoint, Optional targetPercentage,
+ Optional targetReheat)
+{
+ return Status::Success;
+}
+
+Status WhmManufacturer::BoostCommandCancelled()
+{
+ return Status::Success;
+}
+
+void WhmManufacturer::BoostCommandFinished() {}
+
+WaterHeaterManagementDelegate * GetWhmDelegate()
+{
+ WhmManufacturer * mn = GetWhmManufacturer();
+ VerifyOrDieWithMsg(mn != nullptr, AppServer, "WhmManufacturer is null");
+
+ WaterHeaterManagementDelegate * wg = mn->GetWhmDelegate();
+ VerifyOrDieWithMsg(wg != nullptr, AppServer, "WhmDelegate is null");
+
+ return wg;
+}
+
+void SetTestEventTrigger_BasicInstallationTestEvent()
+{
+ WaterHeaterManagementDelegate * dg = GetWhmDelegate();
+
+ // Simulate installation in a 100L tank full of water at 20C, with a target temperature of 60C, in OFF mode
+ dg->SetTankVolume(100);
+ dg->SetTargetWaterTemperature(6000);
+ dg->SetHeaterTypes(BitMask(WaterHeaterTypeBitmap::kImmersionElement1));
+ dg->DrawOffHotWater(100, 2000);
+}
+
+void SetTestEventTrigger_BasicInstallationTestEventClear() {}
+
+void SetTestEventTrigger_WaterTemperature20CTestEvent()
+{
+ WaterHeaterManagementDelegate * dg = GetWhmDelegate();
+
+ // Simulate 100% of the water in the tank being at 20C
+ dg->SetWaterTemperature(2000);
+}
+
+void SetTestEventTrigger_WaterTemperature61CTestEvent()
+{
+ WaterHeaterManagementDelegate * dg = GetWhmDelegate();
+
+ // Simulate 100% of the water in the tank being at 61C
+ dg->SetWaterTemperature(6100);
+}
+
+void SetTestEventTrigger_WaterTemperature66CTestEvent()
+{
+ WaterHeaterManagementDelegate * dg = GetWhmDelegate();
+
+ // Simulate 100% of the water in the tank being at 66C
+ dg->SetWaterTemperature(6600);
+}
+
+void SetTestEventTrigger_ManualModeTestEvent()
+{
+ WaterHeaterManagementDelegate * dg = GetWhmDelegate();
+
+ // Simulate the Water Heater Mode being set to MANUAL
+ Status status = dg->SetWaterHeaterMode(WaterHeaterMode::kModeManual);
+ if (status != Status::Success)
+ {
+ ChipLogError(Zcl, "SetTestEventTrigger_OffModeTestEvent setting mode -> KModeManual failed 0x%02x", to_underlying(status));
+ }
+}
+
+void SetTestEventTrigger_OffModeTestEvent()
+{
+ WaterHeaterManagementDelegate * dg = GetWhmDelegate();
+
+ // Simulate the Water Heater Mode being set to OFF
+ Status status = dg->SetWaterHeaterMode(WaterHeaterMode::kModeOff);
+ if (status != Status::Success)
+ {
+ ChipLogError(Zcl, "SetTestEventTrigger_OffModeTestEvent setting mode -> KModeOff failed 0x%02x", to_underlying(status));
+ }
+}
+
+void SetTestEventTrigger_DrawOffHotWaterTestEvent()
+{
+ WaterHeaterManagementDelegate * dg = GetWhmDelegate();
+
+ // Simulate drawing off 25% of the tank volume of hot water, replaced with water at 20C
+ dg->DrawOffHotWater(25, 2000);
+}
+
+} // namespace WaterHeaterManagement
+} // namespace Clusters
+} // namespace app
+} // namespace chip
+
+using namespace chip::app::Clusters::WaterHeaterManagement;
+
+bool HandleWaterHeaterManagementTestEventTrigger(uint64_t eventTrigger)
+{
+ WaterHeaterManagementTrigger trigger = static_cast(eventTrigger);
+
+ switch (trigger)
+ {
+ case WaterHeaterManagementTrigger::kBasicInstallationTestEvent:
+ ChipLogProgress(Support,
+ "[Whm::kBasicInstallationTestEvent] => Simulate installation in a 100L tank full of water at 20C, with a "
+ "target temperature of 60C, in OFF mode");
+ SetTestEventTrigger_BasicInstallationTestEvent();
+ break;
+ case WaterHeaterManagementTrigger::kBasicInstallationTestEventClear:
+ ChipLogProgress(Support, "[Whm::kBasicInstallationTestEventClear] => End simulation of installation");
+ SetTestEventTrigger_BasicInstallationTestEventClear();
+ break;
+ case WaterHeaterManagementTrigger::kWaterTemperature20CTestEvent:
+ ChipLogProgress(Support, "[Whm::kWaterTemperature20CTestEvent] => Simulate 100%% of the water in the tank being at 20C");
+ SetTestEventTrigger_WaterTemperature20CTestEvent();
+ break;
+ case WaterHeaterManagementTrigger::kWaterTemperature61CTestEvent:
+ ChipLogProgress(Support, "[Whm::kWaterTemperature61CTestEvent] => Simulate 100%% of the water in the tank being at 61C");
+ SetTestEventTrigger_WaterTemperature61CTestEvent();
+ break;
+ case WaterHeaterManagementTrigger::kWaterTemperature66CTestEvent:
+ ChipLogProgress(Support, "[Whm::kWaterTemperature66CTestEvent] => Simulate 100%% of the water in the tank being at 66C");
+ SetTestEventTrigger_WaterTemperature66CTestEvent();
+ break;
+ case WaterHeaterManagementTrigger::kManualModeTestEvent:
+ ChipLogProgress(Support, "[Whm::kManualModeTestEvent] => Simulate the Water Heater Mode being set to MANUAL");
+ SetTestEventTrigger_ManualModeTestEvent();
+ break;
+ case WaterHeaterManagementTrigger::kOffModeTestEvent:
+ ChipLogProgress(Support, "[Whm::kOffModeTestEvent] => Simulate the Water Heater Mode being set to OFF");
+ SetTestEventTrigger_OffModeTestEvent();
+ break;
+ case WaterHeaterManagementTrigger::kDrawOffHotWaterTestEvent:
+ ChipLogProgress(Support,
+ "[Whm::kDrawOffHotWaterTestEvent] => Simulate drawing off 25%% of the tank volume of hot water, replaced "
+ "with water at 20C");
+ SetTestEventTrigger_DrawOffHotWaterTestEvent();
+ break;
+ default:
+ return false;
+ }
+
+ return true;
+}
diff --git a/examples/all-clusters-app/all-clusters-common/src/occupancy-sensing-stub.cpp b/examples/all-clusters-app/all-clusters-common/src/occupancy-sensing-stub.cpp
new file mode 100644
index 00000000000000..dcbb90ff659bcb
--- /dev/null
+++ b/examples/all-clusters-app/all-clusters-common/src/occupancy-sensing-stub.cpp
@@ -0,0 +1,57 @@
+/*
+ *
+ * Copyright (c) 2024 Project CHIP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include
+#include
+#include
+#include
+
+using namespace chip;
+using namespace chip::app::Clusters;
+using namespace chip::app::Clusters::OccupancySensing;
+using namespace chip::app::Clusters::OccupancySensing::Structs;
+using namespace chip::DeviceLayer;
+
+using chip::Protocols::InteractionModel::Status;
+
+static std::unique_ptr
+ gAttrAccess[MATTER_DM_OCCUPANCY_SENSING_CLUSTER_SERVER_ENDPOINT_COUNT + CHIP_DEVICE_CONFIG_DYNAMIC_ENDPOINT_COUNT];
+
+void emberAfOccupancySensingClusterInitCallback(EndpointId endpointId)
+{
+ VerifyOrDie(!gAttrAccess[endpointId]);
+
+ gAttrAccess[endpointId] = std::make_unique(
+ BitMask(OccupancySensing::Feature::kOther));
+
+ OccupancySensing::Structs::HoldTimeLimitsStruct::Type holdTimeLimits = {
+ .holdTimeMin = 1,
+ .holdTimeMax = 300,
+ .holdTimeDefault = 10,
+ };
+
+ uint16_t holdTime = 10;
+
+ if (gAttrAccess[endpointId])
+ {
+ gAttrAccess[endpointId]->Init();
+
+ SetHoldTimeLimits(endpointId, holdTimeLimits);
+
+ SetHoldTime(endpointId, holdTime);
+ }
+}
diff --git a/examples/all-clusters-app/all-clusters-common/src/water-heater-mode.cpp b/examples/all-clusters-app/all-clusters-common/src/water-heater-mode.cpp
old mode 100644
new mode 100755
diff --git a/examples/all-clusters-app/linux/BUILD.gn b/examples/all-clusters-app/linux/BUILD.gn
index 3564153a482cca..e8671e701a7227 100644
--- a/examples/all-clusters-app/linux/BUILD.gn
+++ b/examples/all-clusters-app/linux/BUILD.gn
@@ -29,6 +29,10 @@ if (chip_enable_pw_rpc) {
source_set("chip-all-clusters-common") {
sources = [
+ "${chip_root}/examples/all-clusters-app/all-clusters-common/src/WhmDelegateImpl.cpp",
+ "${chip_root}/examples/all-clusters-app/all-clusters-common/src/WhmInstance.cpp",
+ "${chip_root}/examples/all-clusters-app/all-clusters-common/src/WhmMain.cpp",
+ "${chip_root}/examples/all-clusters-app/all-clusters-common/src/WhmManufacturer.cpp",
"${chip_root}/examples/all-clusters-app/all-clusters-common/src/air-quality-instance.cpp",
"${chip_root}/examples/all-clusters-app/all-clusters-common/src/binding-handler.cpp",
"${chip_root}/examples/all-clusters-app/all-clusters-common/src/boolcfg-stub.cpp",
@@ -46,6 +50,7 @@ source_set("chip-all-clusters-common") {
"${chip_root}/examples/all-clusters-app/all-clusters-common/src/laundry-washer-controls-delegate-impl.cpp",
"${chip_root}/examples/all-clusters-app/all-clusters-common/src/laundry-washer-mode.cpp",
"${chip_root}/examples/all-clusters-app/all-clusters-common/src/microwave-oven-mode.cpp",
+ "${chip_root}/examples/all-clusters-app/all-clusters-common/src/occupancy-sensing-stub.cpp",
"${chip_root}/examples/all-clusters-app/all-clusters-common/src/operational-state-delegate-impl.cpp",
"${chip_root}/examples/all-clusters-app/all-clusters-common/src/oven-modes.cpp",
"${chip_root}/examples/all-clusters-app/all-clusters-common/src/oven-operational-state-delegate.cpp",
diff --git a/examples/all-clusters-app/linux/args.gni b/examples/all-clusters-app/linux/args.gni
index d414ad5dedaf5d..92d01ea3358b30 100644
--- a/examples/all-clusters-app/linux/args.gni
+++ b/examples/all-clusters-app/linux/args.gni
@@ -29,3 +29,4 @@ matter_log_json_payload_decode_full = true
matter_log_json_payload_hex = true
chip_enable_smoke_co_trigger = true
chip_enable_boolean_state_configuration_trigger = true
+chip_enable_water_heater_management_trigger = true
diff --git a/examples/all-clusters-app/linux/main-common.cpp b/examples/all-clusters-app/linux/main-common.cpp
index ddbcaee06b889c..bc547d5416377c 100644
--- a/examples/all-clusters-app/linux/main-common.cpp
+++ b/examples/all-clusters-app/linux/main-common.cpp
@@ -63,6 +63,8 @@
#include
+#include
+
using namespace chip;
using namespace chip::app;
using namespace chip::DeviceLayer;
@@ -246,6 +248,8 @@ void ApplicationInit()
Clusters::ValveConfigurationAndControl::SetDefaultDelegate(chip::EndpointId(1), &sValveDelegate);
Clusters::TimeSynchronization::SetDefaultDelegate(&sTimeSyncDelegate);
+ Clusters::WaterHeaterManagement::WhmApplicationInit();
+
SetTagList(/* endpoint= */ 0, Span(gEp0TagList));
SetTagList(/* endpoint= */ 1, Span(gEp1TagList));
SetTagList(/* endpoint= */ 2, Span(gEp2TagList));
@@ -275,6 +279,9 @@ void ApplicationShutdown()
Clusters::EnergyEvseMode::Shutdown();
Clusters::WaterHeaterMode::Shutdown();
+ Clusters::WaterHeaterManagement::WhmApplicationShutdown();
+ Clusters::WaterHeaterMode::Shutdown();
+
if (sChipNamedPipeCommands.Stop() != CHIP_NO_ERROR)
{
ChipLogError(NotSpecified, "Failed to stop CHIP NamedPipeCommands");
diff --git a/examples/all-clusters-app/nrfconnect/prj_release.conf b/examples/all-clusters-app/nrfconnect/prj_release.conf
index b98004283b64b9..18685a7488fce5 100644
--- a/examples/all-clusters-app/nrfconnect/prj_release.conf
+++ b/examples/all-clusters-app/nrfconnect/prj_release.conf
@@ -62,3 +62,7 @@ CONFIG_CHIP_FACTORY_DATA_BUILD=y
# Enable the Read Client for binding purposes
CONFIG_CHIP_ENABLE_READ_CLIENT=y
+
+# Enable LTO to reduce the flash usage
+CONFIG_LTO=y
+CONFIG_ISR_TABLES_LOCAL_DECLARATION=y
diff --git a/examples/all-clusters-minimal-app/all-clusters-common/all-clusters-minimal-app.matter b/examples/all-clusters-minimal-app/all-clusters-common/all-clusters-minimal-app.matter
index 946733b5ebe9da..8d8811013165b8 100644
--- a/examples/all-clusters-minimal-app/all-clusters-common/all-clusters-minimal-app.matter
+++ b/examples/all-clusters-minimal-app/all-clusters-common/all-clusters-minimal-app.matter
@@ -401,7 +401,7 @@ cluster Binding = 30 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -417,12 +417,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -458,17 +488,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides a standardized way for a Node (typically a Bridge, but could be any Node) to expose action information. */
@@ -1255,6 +1309,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -1263,6 +1320,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -1273,6 +1334,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -1306,12 +1371,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
@@ -3568,7 +3644,8 @@ cluster Thermostat = 513 {
kSleep = 3;
kWake = 4;
kVacation = 5;
- kUserDefined = 6;
+ kGoingToSleep = 6;
+ kUserDefined = 254;
}
enum SetpointChangeSourceEnum : enum8 {
@@ -3694,11 +3771,6 @@ cluster Thermostat = 513 {
kSupportsOff = 0x8;
}
- bitmap TemperatureSetpointHoldPolicyBitmap : bitmap8 {
- kHoldDurationElapsed = 0x1;
- kHoldDurationElapsedOrPresetChanged = 0x2;
- }
-
struct ScheduleTransitionStruct {
ScheduleDayOfWeekBitmap dayOfWeek = 0;
int16u transitionTime = 1;
@@ -3804,8 +3876,7 @@ cluster Thermostat = 513 {
attribute access(write: manage) optional PresetStruct presets[] = 80;
attribute access(write: manage) optional ScheduleStruct schedules[] = 81;
readonly attribute optional boolean presetsSchedulesEditable = 82;
- readonly attribute optional TemperatureSetpointHoldPolicyBitmap temperatureSetpointHoldPolicy = 83;
- readonly attribute optional nullable epoch_s setpointHoldExpiryTimestamp = 84;
+ readonly attribute optional nullable epoch_s setpointHoldExpiryTimestamp = 83;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -3849,10 +3920,6 @@ cluster Thermostat = 513 {
int16u timeoutSeconds = 0;
}
- request struct SetTemperatureSetpointHoldPolicyRequest {
- TemperatureSetpointHoldPolicyBitmap temperatureSetpointHoldPolicy = 0;
- }
-
/** Command description for SetpointRaiseLower */
command SetpointRaiseLower(SetpointRaiseLowerRequest): DefaultSuccess = 0;
/** Command description for SetWeeklySchedule */
@@ -3871,8 +3938,6 @@ cluster Thermostat = 513 {
command access(invoke: manage) CancelPresetsSchedulesEditRequest(): DefaultSuccess = 8;
/** This command is used to notify the server that all edits are done and should be committed. */
command access(invoke: manage) CommitPresetsSchedulesRequest(): DefaultSuccess = 9;
- /** This command sets the set point hold policy. */
- command SetTemperatureSetpointHoldPolicy(SetTemperatureSetpointHoldPolicyRequest): DefaultSuccess = 11;
}
/** An interface for controlling a fan in a heating/cooling system. */
@@ -6402,7 +6467,7 @@ endpoint 1 {
ram attribute numberOfPositions default = 2;
ram attribute currentPosition;
ram attribute featureMap default = 1;
- ram attribute clusterRevision default = 1;
+ ram attribute clusterRevision default = 2;
}
server cluster FixedLabel {
diff --git a/examples/all-clusters-minimal-app/all-clusters-common/all-clusters-minimal-app.zap b/examples/all-clusters-minimal-app/all-clusters-common/all-clusters-minimal-app.zap
index 8afff9a3507a3c..57f2c0412fca55 100644
--- a/examples/all-clusters-minimal-app/all-clusters-common/all-clusters-minimal-app.zap
+++ b/examples/all-clusters-minimal-app/all-clusters-common/all-clusters-minimal-app.zap
@@ -5593,7 +5593,7 @@
"storageOption": "RAM",
"singleton": 0,
"bounded": 0,
- "defaultValue": "1",
+ "defaultValue": "2",
"reportable": 1,
"minInterval": 0,
"maxInterval": 65344,
@@ -12408,4 +12408,4 @@
"parentEndpointIdentifier": null
}
]
-}
\ No newline at end of file
+}
diff --git a/examples/bridge-app/bridge-common/bridge-app.matter b/examples/bridge-app/bridge-common/bridge-app.matter
index 049e42d6f61e4f..464f3e2f9a513b 100644
--- a/examples/bridge-app/bridge-common/bridge-app.matter
+++ b/examples/bridge-app/bridge-common/bridge-app.matter
@@ -324,7 +324,7 @@ cluster Binding = 30 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -340,12 +340,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -381,17 +411,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** The Access Control Cluster exposes a data model view of a
@@ -399,7 +453,7 @@ cluster AccessControl = 31 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -415,12 +469,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -456,17 +540,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides a standardized way for a Node (typically a Bridge, but could be any Node) to expose action information. */
@@ -840,6 +948,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -848,6 +959,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -858,6 +973,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -891,12 +1010,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/chef/devices/noip_rootnode_dimmablelight_bCwGYSDpoe.matter b/examples/chef/devices/noip_rootnode_dimmablelight_bCwGYSDpoe.matter
index a8de6fab823b82..c32b9263f77fd9 100644
--- a/examples/chef/devices/noip_rootnode_dimmablelight_bCwGYSDpoe.matter
+++ b/examples/chef/devices/noip_rootnode_dimmablelight_bCwGYSDpoe.matter
@@ -401,7 +401,7 @@ cluster Binding = 30 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -417,12 +417,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -458,17 +488,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -793,6 +847,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -801,6 +858,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -811,6 +872,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -844,12 +909,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** The cluster provides commands for retrieving unstructured diagnostic logs from a Node that may be used to aid in diagnostics. */
diff --git a/examples/chef/devices/rootnode_airpurifier_73a6fe2651.matter b/examples/chef/devices/rootnode_airpurifier_73a6fe2651.matter
index f00c909ce0a882..96b3fa5df3f9b5 100644
--- a/examples/chef/devices/rootnode_airpurifier_73a6fe2651.matter
+++ b/examples/chef/devices/rootnode_airpurifier_73a6fe2651.matter
@@ -178,7 +178,7 @@ cluster Descriptor = 29 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -194,12 +194,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -235,17 +265,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -509,6 +563,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -517,6 +574,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -527,6 +588,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -560,12 +625,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/chef/devices/rootnode_airpurifier_airqualitysensor_temperaturesensor_humiditysensor_thermostat_56de3d5f45.matter b/examples/chef/devices/rootnode_airpurifier_airqualitysensor_temperaturesensor_humiditysensor_thermostat_56de3d5f45.matter
index 1976a0d6af169b..915da87f5ec794 100644
--- a/examples/chef/devices/rootnode_airpurifier_airqualitysensor_temperaturesensor_humiditysensor_thermostat_56de3d5f45.matter
+++ b/examples/chef/devices/rootnode_airpurifier_airqualitysensor_temperaturesensor_humiditysensor_thermostat_56de3d5f45.matter
@@ -183,7 +183,7 @@ cluster Descriptor = 29 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -199,12 +199,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -240,17 +270,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -360,6 +414,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -368,6 +425,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -378,6 +439,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -411,12 +476,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
@@ -1217,7 +1293,8 @@ cluster Thermostat = 513 {
kSleep = 3;
kWake = 4;
kVacation = 5;
- kUserDefined = 6;
+ kGoingToSleep = 6;
+ kUserDefined = 254;
}
enum SetpointChangeSourceEnum : enum8 {
@@ -1343,11 +1420,6 @@ cluster Thermostat = 513 {
kSupportsOff = 0x8;
}
- bitmap TemperatureSetpointHoldPolicyBitmap : bitmap8 {
- kHoldDurationElapsed = 0x1;
- kHoldDurationElapsedOrPresetChanged = 0x2;
- }
-
struct ScheduleTransitionStruct {
ScheduleDayOfWeekBitmap dayOfWeek = 0;
int16u transitionTime = 1;
@@ -1453,8 +1525,7 @@ cluster Thermostat = 513 {
attribute access(write: manage) optional PresetStruct presets[] = 80;
attribute access(write: manage) optional ScheduleStruct schedules[] = 81;
readonly attribute optional boolean presetsSchedulesEditable = 82;
- readonly attribute optional TemperatureSetpointHoldPolicyBitmap temperatureSetpointHoldPolicy = 83;
- readonly attribute optional nullable epoch_s setpointHoldExpiryTimestamp = 84;
+ readonly attribute optional nullable epoch_s setpointHoldExpiryTimestamp = 83;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -1498,10 +1569,6 @@ cluster Thermostat = 513 {
int16u timeoutSeconds = 0;
}
- request struct SetTemperatureSetpointHoldPolicyRequest {
- TemperatureSetpointHoldPolicyBitmap temperatureSetpointHoldPolicy = 0;
- }
-
/** Command description for SetpointRaiseLower */
command SetpointRaiseLower(SetpointRaiseLowerRequest): DefaultSuccess = 0;
/** Command description for SetWeeklySchedule */
@@ -1520,8 +1587,6 @@ cluster Thermostat = 513 {
command access(invoke: manage) CancelPresetsSchedulesEditRequest(): DefaultSuccess = 8;
/** This command is used to notify the server that all edits are done and should be committed. */
command access(invoke: manage) CommitPresetsSchedulesRequest(): DefaultSuccess = 9;
- /** This command sets the set point hold policy. */
- command SetTemperatureSetpointHoldPolicy(SetTemperatureSetpointHoldPolicyRequest): DefaultSuccess = 11;
}
/** An interface for controlling a fan in a heating/cooling system. */
diff --git a/examples/chef/devices/rootnode_airqualitysensor_e63187f6c9.matter b/examples/chef/devices/rootnode_airqualitysensor_e63187f6c9.matter
index a6d9cf022022f8..58038e843e97fc 100644
--- a/examples/chef/devices/rootnode_airqualitysensor_e63187f6c9.matter
+++ b/examples/chef/devices/rootnode_airqualitysensor_e63187f6c9.matter
@@ -106,7 +106,7 @@ cluster Descriptor = 29 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -122,12 +122,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -163,17 +193,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -757,6 +811,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -765,6 +822,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -775,6 +836,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -808,12 +873,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/chef/devices/rootnode_basicvideoplayer_0ff86e943b.matter b/examples/chef/devices/rootnode_basicvideoplayer_0ff86e943b.matter
index 961eeaade9e1d6..0ce0bdb04dbfa7 100644
--- a/examples/chef/devices/rootnode_basicvideoplayer_0ff86e943b.matter
+++ b/examples/chef/devices/rootnode_basicvideoplayer_0ff86e943b.matter
@@ -303,7 +303,7 @@ cluster Descriptor = 29 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -319,12 +319,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -360,17 +390,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -651,6 +705,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -659,6 +716,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -669,6 +730,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -702,12 +767,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/chef/devices/rootnode_colortemperaturelight_hbUnzYVeyn.matter b/examples/chef/devices/rootnode_colortemperaturelight_hbUnzYVeyn.matter
index 88ff138f11e1f0..1adf554340e63f 100644
--- a/examples/chef/devices/rootnode_colortemperaturelight_hbUnzYVeyn.matter
+++ b/examples/chef/devices/rootnode_colortemperaturelight_hbUnzYVeyn.matter
@@ -380,7 +380,7 @@ cluster Descriptor = 29 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -396,12 +396,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -437,17 +467,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -711,6 +765,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -719,6 +776,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -729,6 +790,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -762,12 +827,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/chef/devices/rootnode_contactsensor_27f76aeaf5.matter b/examples/chef/devices/rootnode_contactsensor_27f76aeaf5.matter
index 8e62555955a2e1..07b6b96881b48c 100644
--- a/examples/chef/devices/rootnode_contactsensor_27f76aeaf5.matter
+++ b/examples/chef/devices/rootnode_contactsensor_27f76aeaf5.matter
@@ -106,7 +106,7 @@ cluster Descriptor = 29 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -122,12 +122,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -163,17 +193,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -696,6 +750,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -704,6 +761,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -714,6 +775,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -747,12 +812,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/chef/devices/rootnode_contactsensor_lFAGG1bfRO.matter b/examples/chef/devices/rootnode_contactsensor_lFAGG1bfRO.matter
index 9f08c5a23aa601..e132687fc65220 100644
--- a/examples/chef/devices/rootnode_contactsensor_lFAGG1bfRO.matter
+++ b/examples/chef/devices/rootnode_contactsensor_lFAGG1bfRO.matter
@@ -204,7 +204,7 @@ cluster Binding = 30 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -220,12 +220,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -261,17 +291,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -855,6 +909,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -863,6 +920,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -873,6 +934,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -906,12 +971,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/chef/devices/rootnode_dimmablelight_bCwGYSDpoe.matter b/examples/chef/devices/rootnode_dimmablelight_bCwGYSDpoe.matter
index 66c3432e2de60d..17996c2f9bfc42 100644
--- a/examples/chef/devices/rootnode_dimmablelight_bCwGYSDpoe.matter
+++ b/examples/chef/devices/rootnode_dimmablelight_bCwGYSDpoe.matter
@@ -401,7 +401,7 @@ cluster Binding = 30 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -417,12 +417,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -458,17 +488,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -793,6 +847,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -801,6 +858,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -811,6 +872,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -844,12 +909,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/chef/devices/rootnode_dimmablepluginunit_f8a9a0b9d4.matter b/examples/chef/devices/rootnode_dimmablepluginunit_f8a9a0b9d4.matter
index d395b259d4a9d6..f860ab97b90e25 100644
--- a/examples/chef/devices/rootnode_dimmablepluginunit_f8a9a0b9d4.matter
+++ b/examples/chef/devices/rootnode_dimmablepluginunit_f8a9a0b9d4.matter
@@ -401,7 +401,7 @@ cluster Binding = 30 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -417,12 +417,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -458,17 +488,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -793,6 +847,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -801,6 +858,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -811,6 +872,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -844,12 +909,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/chef/devices/rootnode_dishwasher_cc105034fe.matter b/examples/chef/devices/rootnode_dishwasher_cc105034fe.matter
index 62da7396ee7c8f..7f236d311fbef9 100644
--- a/examples/chef/devices/rootnode_dishwasher_cc105034fe.matter
+++ b/examples/chef/devices/rootnode_dishwasher_cc105034fe.matter
@@ -106,7 +106,7 @@ cluster Descriptor = 29 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -122,12 +122,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -163,17 +193,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -370,6 +424,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -378,6 +435,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -388,6 +449,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -421,12 +486,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/chef/devices/rootnode_doorlock_aNKYAreMXE.matter b/examples/chef/devices/rootnode_doorlock_aNKYAreMXE.matter
index d808e2d25f478b..38fa4895bc1e3d 100644
--- a/examples/chef/devices/rootnode_doorlock_aNKYAreMXE.matter
+++ b/examples/chef/devices/rootnode_doorlock_aNKYAreMXE.matter
@@ -106,7 +106,7 @@ cluster Descriptor = 29 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -122,12 +122,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -163,17 +193,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -757,6 +811,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -765,6 +822,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -775,6 +836,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -808,12 +873,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/chef/devices/rootnode_extendedcolorlight_8lcaaYJVAa.matter b/examples/chef/devices/rootnode_extendedcolorlight_8lcaaYJVAa.matter
index 19a62b4feb5e1c..0ae2064972605a 100644
--- a/examples/chef/devices/rootnode_extendedcolorlight_8lcaaYJVAa.matter
+++ b/examples/chef/devices/rootnode_extendedcolorlight_8lcaaYJVAa.matter
@@ -401,7 +401,7 @@ cluster Binding = 30 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -417,12 +417,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -458,17 +488,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -793,6 +847,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -801,6 +858,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -811,6 +872,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -844,12 +909,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/chef/devices/rootnode_fan_7N2TobIlOX.matter b/examples/chef/devices/rootnode_fan_7N2TobIlOX.matter
index 3ff6ab9cd9c23c..8d41f2e9b0197c 100644
--- a/examples/chef/devices/rootnode_fan_7N2TobIlOX.matter
+++ b/examples/chef/devices/rootnode_fan_7N2TobIlOX.matter
@@ -183,7 +183,7 @@ cluster Descriptor = 29 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -199,12 +199,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -240,17 +270,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -575,6 +629,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -583,6 +640,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -593,6 +654,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -626,12 +691,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/chef/devices/rootnode_flowsensor_1zVxHedlaV.matter b/examples/chef/devices/rootnode_flowsensor_1zVxHedlaV.matter
index 73390f105c1b8f..5edf324c8213df 100644
--- a/examples/chef/devices/rootnode_flowsensor_1zVxHedlaV.matter
+++ b/examples/chef/devices/rootnode_flowsensor_1zVxHedlaV.matter
@@ -204,7 +204,7 @@ cluster Binding = 30 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -220,12 +220,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -261,17 +291,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -596,6 +650,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -604,6 +661,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -614,6 +675,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -647,12 +712,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/chef/devices/rootnode_genericswitch_2dfff6e516.matter b/examples/chef/devices/rootnode_genericswitch_2dfff6e516.matter
index 81b9bf1c21cc17..9f18c1eb390f8f 100644
--- a/examples/chef/devices/rootnode_genericswitch_2dfff6e516.matter
+++ b/examples/chef/devices/rootnode_genericswitch_2dfff6e516.matter
@@ -106,7 +106,7 @@ cluster Descriptor = 29 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -122,12 +122,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -163,17 +193,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -542,6 +596,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -550,6 +607,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -560,6 +621,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -593,12 +658,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
@@ -1509,7 +1585,7 @@ endpoint 1 {
callback attribute eventList;
callback attribute attributeList;
ram attribute featureMap default = 0xE;
- ram attribute clusterRevision default = 1;
+ ram attribute clusterRevision default = 2;
}
}
diff --git a/examples/chef/devices/rootnode_genericswitch_2dfff6e516.zap b/examples/chef/devices/rootnode_genericswitch_2dfff6e516.zap
index b8f941b101de57..40df85e6248d6e 100644
--- a/examples/chef/devices/rootnode_genericswitch_2dfff6e516.zap
+++ b/examples/chef/devices/rootnode_genericswitch_2dfff6e516.zap
@@ -2742,7 +2742,7 @@
"storageOption": "RAM",
"singleton": 0,
"bounded": 0,
- "defaultValue": "1",
+ "defaultValue": "2",
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
@@ -2801,4 +2801,4 @@
"parentEndpointIdentifier": null
}
]
-}
\ No newline at end of file
+}
diff --git a/examples/chef/devices/rootnode_genericswitch_9866e35d0b.matter b/examples/chef/devices/rootnode_genericswitch_9866e35d0b.matter
index 11f915e6c4f860..5a506d4c619902 100644
--- a/examples/chef/devices/rootnode_genericswitch_9866e35d0b.matter
+++ b/examples/chef/devices/rootnode_genericswitch_9866e35d0b.matter
@@ -106,7 +106,7 @@ cluster Descriptor = 29 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -122,12 +122,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -163,17 +193,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -542,6 +596,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -550,6 +607,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -560,6 +621,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -593,12 +658,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
@@ -1506,7 +1582,7 @@ endpoint 1 {
callback attribute eventList;
callback attribute attributeList;
ram attribute featureMap default = 1;
- ram attribute clusterRevision default = 1;
+ ram attribute clusterRevision default = 2;
}
}
diff --git a/examples/chef/devices/rootnode_genericswitch_9866e35d0b.zap b/examples/chef/devices/rootnode_genericswitch_9866e35d0b.zap
index ae37c5dbef1732..7404c36bb6a120 100644
--- a/examples/chef/devices/rootnode_genericswitch_9866e35d0b.zap
+++ b/examples/chef/devices/rootnode_genericswitch_9866e35d0b.zap
@@ -2742,7 +2742,7 @@
"storageOption": "RAM",
"singleton": 0,
"bounded": 0,
- "defaultValue": "1",
+ "defaultValue": "2",
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
@@ -2780,4 +2780,4 @@
"parentEndpointIdentifier": null
}
]
-}
\ No newline at end of file
+}
diff --git a/examples/chef/devices/rootnode_heatingcoolingunit_ncdGai1E5a.matter b/examples/chef/devices/rootnode_heatingcoolingunit_ncdGai1E5a.matter
index b0011ffb37983b..06ccc592e9c4d4 100644
--- a/examples/chef/devices/rootnode_heatingcoolingunit_ncdGai1E5a.matter
+++ b/examples/chef/devices/rootnode_heatingcoolingunit_ncdGai1E5a.matter
@@ -401,7 +401,7 @@ cluster Binding = 30 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -417,12 +417,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -458,17 +488,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -793,6 +847,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -801,6 +858,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -811,6 +872,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -844,12 +909,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
@@ -1574,7 +1650,8 @@ cluster Thermostat = 513 {
kSleep = 3;
kWake = 4;
kVacation = 5;
- kUserDefined = 6;
+ kGoingToSleep = 6;
+ kUserDefined = 254;
}
enum SetpointChangeSourceEnum : enum8 {
@@ -1700,11 +1777,6 @@ cluster Thermostat = 513 {
kSupportsOff = 0x8;
}
- bitmap TemperatureSetpointHoldPolicyBitmap : bitmap8 {
- kHoldDurationElapsed = 0x1;
- kHoldDurationElapsedOrPresetChanged = 0x2;
- }
-
struct ScheduleTransitionStruct {
ScheduleDayOfWeekBitmap dayOfWeek = 0;
int16u transitionTime = 1;
@@ -1810,8 +1882,7 @@ cluster Thermostat = 513 {
attribute access(write: manage) optional PresetStruct presets[] = 80;
attribute access(write: manage) optional ScheduleStruct schedules[] = 81;
readonly attribute optional boolean presetsSchedulesEditable = 82;
- readonly attribute optional TemperatureSetpointHoldPolicyBitmap temperatureSetpointHoldPolicy = 83;
- readonly attribute optional nullable epoch_s setpointHoldExpiryTimestamp = 84;
+ readonly attribute optional nullable epoch_s setpointHoldExpiryTimestamp = 83;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -1855,10 +1926,6 @@ cluster Thermostat = 513 {
int16u timeoutSeconds = 0;
}
- request struct SetTemperatureSetpointHoldPolicyRequest {
- TemperatureSetpointHoldPolicyBitmap temperatureSetpointHoldPolicy = 0;
- }
-
/** Command description for SetpointRaiseLower */
command SetpointRaiseLower(SetpointRaiseLowerRequest): DefaultSuccess = 0;
/** Command description for SetWeeklySchedule */
@@ -1877,8 +1944,6 @@ cluster Thermostat = 513 {
command access(invoke: manage) CancelPresetsSchedulesEditRequest(): DefaultSuccess = 8;
/** This command is used to notify the server that all edits are done and should be committed. */
command access(invoke: manage) CommitPresetsSchedulesRequest(): DefaultSuccess = 9;
- /** This command sets the set point hold policy. */
- command SetTemperatureSetpointHoldPolicy(SetTemperatureSetpointHoldPolicyRequest): DefaultSuccess = 11;
}
/** An interface for controlling a fan in a heating/cooling system. */
diff --git a/examples/chef/devices/rootnode_humiditysensor_Xyj4gda6Hb.matter b/examples/chef/devices/rootnode_humiditysensor_Xyj4gda6Hb.matter
index 32ab67c21b8593..39e196626e518a 100644
--- a/examples/chef/devices/rootnode_humiditysensor_Xyj4gda6Hb.matter
+++ b/examples/chef/devices/rootnode_humiditysensor_Xyj4gda6Hb.matter
@@ -204,7 +204,7 @@ cluster Binding = 30 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -220,12 +220,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -261,17 +291,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -596,6 +650,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -604,6 +661,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -614,6 +675,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -647,12 +712,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/chef/devices/rootnode_laundrywasher_fb10d238c8.matter b/examples/chef/devices/rootnode_laundrywasher_fb10d238c8.matter
index 34c4a8284e7851..460d6988c91959 100644
--- a/examples/chef/devices/rootnode_laundrywasher_fb10d238c8.matter
+++ b/examples/chef/devices/rootnode_laundrywasher_fb10d238c8.matter
@@ -106,7 +106,7 @@ cluster Descriptor = 29 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -122,12 +122,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -163,17 +193,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -370,6 +424,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -378,6 +435,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -388,6 +449,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -421,12 +486,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/chef/devices/rootnode_lightsensor_lZQycTFcJK.matter b/examples/chef/devices/rootnode_lightsensor_lZQycTFcJK.matter
index cfa2faa440b95f..705162a8be6fa8 100644
--- a/examples/chef/devices/rootnode_lightsensor_lZQycTFcJK.matter
+++ b/examples/chef/devices/rootnode_lightsensor_lZQycTFcJK.matter
@@ -204,7 +204,7 @@ cluster Binding = 30 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -220,12 +220,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -261,17 +291,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -596,6 +650,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -604,6 +661,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -614,6 +675,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -647,12 +712,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/chef/devices/rootnode_occupancysensor_iHyVgifZuo.matter b/examples/chef/devices/rootnode_occupancysensor_iHyVgifZuo.matter
index 9425ccba0c313a..3a1a98807efe29 100644
--- a/examples/chef/devices/rootnode_occupancysensor_iHyVgifZuo.matter
+++ b/examples/chef/devices/rootnode_occupancysensor_iHyVgifZuo.matter
@@ -204,7 +204,7 @@ cluster Binding = 30 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -220,12 +220,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -261,17 +291,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -596,6 +650,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -604,6 +661,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -614,6 +675,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -647,12 +712,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/chef/devices/rootnode_onofflight_bbs1b7IaOV.matter b/examples/chef/devices/rootnode_onofflight_bbs1b7IaOV.matter
index 7360ede44aff51..9c4ff1c67bc2c0 100644
--- a/examples/chef/devices/rootnode_onofflight_bbs1b7IaOV.matter
+++ b/examples/chef/devices/rootnode_onofflight_bbs1b7IaOV.matter
@@ -401,7 +401,7 @@ cluster Binding = 30 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -417,12 +417,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -458,17 +488,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -793,6 +847,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -801,6 +858,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -811,6 +872,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -844,12 +909,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/chef/devices/rootnode_onofflight_samplemei.matter b/examples/chef/devices/rootnode_onofflight_samplemei.matter
index 58811796ed547a..19d0b2d0dd506e 100644
--- a/examples/chef/devices/rootnode_onofflight_samplemei.matter
+++ b/examples/chef/devices/rootnode_onofflight_samplemei.matter
@@ -401,7 +401,7 @@ cluster Binding = 30 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -417,12 +417,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -458,17 +488,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -793,6 +847,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -801,6 +858,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -811,6 +872,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -844,12 +909,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/chef/devices/rootnode_onofflightswitch_FsPlMr090Q.matter b/examples/chef/devices/rootnode_onofflightswitch_FsPlMr090Q.matter
index b02e20255349fe..ed135332fefbb4 100644
--- a/examples/chef/devices/rootnode_onofflightswitch_FsPlMr090Q.matter
+++ b/examples/chef/devices/rootnode_onofflightswitch_FsPlMr090Q.matter
@@ -348,7 +348,7 @@ cluster Binding = 30 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -364,12 +364,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -405,17 +435,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -740,6 +794,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -748,6 +805,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -758,6 +819,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -791,12 +856,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/chef/devices/rootnode_onoffpluginunit_Wtf8ss5EBY.matter b/examples/chef/devices/rootnode_onoffpluginunit_Wtf8ss5EBY.matter
index 03716c4ce00425..fbc2e10cf430eb 100644
--- a/examples/chef/devices/rootnode_onoffpluginunit_Wtf8ss5EBY.matter
+++ b/examples/chef/devices/rootnode_onoffpluginunit_Wtf8ss5EBY.matter
@@ -276,7 +276,7 @@ cluster Binding = 30 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -292,12 +292,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -333,17 +363,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -668,6 +722,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -676,6 +733,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -686,6 +747,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -719,12 +784,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/chef/devices/rootnode_pressuresensor_s0qC9wLH4k.matter b/examples/chef/devices/rootnode_pressuresensor_s0qC9wLH4k.matter
index 5c413241adced8..002e6fb6ce0f2a 100644
--- a/examples/chef/devices/rootnode_pressuresensor_s0qC9wLH4k.matter
+++ b/examples/chef/devices/rootnode_pressuresensor_s0qC9wLH4k.matter
@@ -204,7 +204,7 @@ cluster Binding = 30 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -220,12 +220,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -261,17 +291,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -596,6 +650,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -604,6 +661,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -614,6 +675,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -647,12 +712,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/chef/devices/rootnode_pump_5f904818cc.matter b/examples/chef/devices/rootnode_pump_5f904818cc.matter
index 9a30a686479625..afa0cd4d471863 100644
--- a/examples/chef/devices/rootnode_pump_5f904818cc.matter
+++ b/examples/chef/devices/rootnode_pump_5f904818cc.matter
@@ -178,7 +178,7 @@ cluster Descriptor = 29 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -194,12 +194,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -235,17 +265,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -442,6 +496,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -450,6 +507,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -460,6 +521,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -493,12 +558,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/chef/devices/rootnode_pump_a811bb33a0.matter b/examples/chef/devices/rootnode_pump_a811bb33a0.matter
index 10c5bd7aa2cd59..6b61dae69dd48c 100644
--- a/examples/chef/devices/rootnode_pump_a811bb33a0.matter
+++ b/examples/chef/devices/rootnode_pump_a811bb33a0.matter
@@ -178,7 +178,7 @@ cluster Descriptor = 29 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -194,12 +194,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -235,17 +265,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -442,6 +496,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -450,6 +507,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -460,6 +521,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -493,12 +558,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/chef/devices/rootnode_refrigerator_temperaturecontrolledcabinet_temperaturecontrolledcabinet_ffdb696680.matter b/examples/chef/devices/rootnode_refrigerator_temperaturecontrolledcabinet_temperaturecontrolledcabinet_ffdb696680.matter
index 2d046beded5e96..6aca563a77d49c 100644
--- a/examples/chef/devices/rootnode_refrigerator_temperaturecontrolledcabinet_temperaturecontrolledcabinet_ffdb696680.matter
+++ b/examples/chef/devices/rootnode_refrigerator_temperaturecontrolledcabinet_temperaturecontrolledcabinet_ffdb696680.matter
@@ -106,7 +106,7 @@ cluster Descriptor = 29 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -122,12 +122,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -163,17 +193,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -370,6 +424,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -378,6 +435,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -388,6 +449,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -421,12 +486,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/chef/devices/rootnode_roboticvacuumcleaner_1807ff0c49.matter b/examples/chef/devices/rootnode_roboticvacuumcleaner_1807ff0c49.matter
index 3285f99388b3c5..bb860795e719bf 100644
--- a/examples/chef/devices/rootnode_roboticvacuumcleaner_1807ff0c49.matter
+++ b/examples/chef/devices/rootnode_roboticvacuumcleaner_1807ff0c49.matter
@@ -183,7 +183,7 @@ cluster Descriptor = 29 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -199,12 +199,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -240,17 +270,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -619,6 +673,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -627,6 +684,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -637,6 +698,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -670,12 +735,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/chef/devices/rootnode_roomairconditioner_9cf3607804.matter b/examples/chef/devices/rootnode_roomairconditioner_9cf3607804.matter
index 5a8aefa22762f6..0f6984304d7da9 100644
--- a/examples/chef/devices/rootnode_roomairconditioner_9cf3607804.matter
+++ b/examples/chef/devices/rootnode_roomairconditioner_9cf3607804.matter
@@ -255,7 +255,7 @@ cluster Descriptor = 29 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -271,12 +271,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -312,17 +342,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -432,6 +486,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -440,6 +497,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -450,6 +511,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -483,12 +548,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
@@ -1157,7 +1233,8 @@ cluster Thermostat = 513 {
kSleep = 3;
kWake = 4;
kVacation = 5;
- kUserDefined = 6;
+ kGoingToSleep = 6;
+ kUserDefined = 254;
}
enum SetpointChangeSourceEnum : enum8 {
@@ -1283,11 +1360,6 @@ cluster Thermostat = 513 {
kSupportsOff = 0x8;
}
- bitmap TemperatureSetpointHoldPolicyBitmap : bitmap8 {
- kHoldDurationElapsed = 0x1;
- kHoldDurationElapsedOrPresetChanged = 0x2;
- }
-
struct ScheduleTransitionStruct {
ScheduleDayOfWeekBitmap dayOfWeek = 0;
int16u transitionTime = 1;
@@ -1393,8 +1465,7 @@ cluster Thermostat = 513 {
attribute access(write: manage) optional PresetStruct presets[] = 80;
attribute access(write: manage) optional ScheduleStruct schedules[] = 81;
readonly attribute optional boolean presetsSchedulesEditable = 82;
- readonly attribute optional TemperatureSetpointHoldPolicyBitmap temperatureSetpointHoldPolicy = 83;
- readonly attribute optional nullable epoch_s setpointHoldExpiryTimestamp = 84;
+ readonly attribute optional nullable epoch_s setpointHoldExpiryTimestamp = 83;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -1438,10 +1509,6 @@ cluster Thermostat = 513 {
int16u timeoutSeconds = 0;
}
- request struct SetTemperatureSetpointHoldPolicyRequest {
- TemperatureSetpointHoldPolicyBitmap temperatureSetpointHoldPolicy = 0;
- }
-
/** Command description for SetpointRaiseLower */
command SetpointRaiseLower(SetpointRaiseLowerRequest): DefaultSuccess = 0;
/** Command description for SetWeeklySchedule */
@@ -1460,8 +1527,6 @@ cluster Thermostat = 513 {
command access(invoke: manage) CancelPresetsSchedulesEditRequest(): DefaultSuccess = 8;
/** This command is used to notify the server that all edits are done and should be committed. */
command access(invoke: manage) CommitPresetsSchedulesRequest(): DefaultSuccess = 9;
- /** This command sets the set point hold policy. */
- command SetTemperatureSetpointHoldPolicy(SetTemperatureSetpointHoldPolicyRequest): DefaultSuccess = 11;
}
/** An interface for controlling a fan in a heating/cooling system. */
diff --git a/examples/chef/devices/rootnode_smokecoalarm_686fe0dcb8.matter b/examples/chef/devices/rootnode_smokecoalarm_686fe0dcb8.matter
index 28669954fab360..98492723016c84 100644
--- a/examples/chef/devices/rootnode_smokecoalarm_686fe0dcb8.matter
+++ b/examples/chef/devices/rootnode_smokecoalarm_686fe0dcb8.matter
@@ -183,7 +183,7 @@ cluster Descriptor = 29 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -199,12 +199,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -240,17 +270,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -619,6 +673,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -627,6 +684,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -637,6 +698,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -670,12 +735,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/chef/devices/rootnode_speaker_RpzeXdimqA.matter b/examples/chef/devices/rootnode_speaker_RpzeXdimqA.matter
index b6898778855ad6..24e0be3745fefe 100644
--- a/examples/chef/devices/rootnode_speaker_RpzeXdimqA.matter
+++ b/examples/chef/devices/rootnode_speaker_RpzeXdimqA.matter
@@ -324,7 +324,7 @@ cluster Binding = 30 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -340,12 +340,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -381,17 +411,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -716,6 +770,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -724,6 +781,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -734,6 +795,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -767,12 +832,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/chef/devices/rootnode_temperaturesensor_Qy1zkNW7c3.matter b/examples/chef/devices/rootnode_temperaturesensor_Qy1zkNW7c3.matter
index f91f03cc02ffad..d5abd097d394a8 100644
--- a/examples/chef/devices/rootnode_temperaturesensor_Qy1zkNW7c3.matter
+++ b/examples/chef/devices/rootnode_temperaturesensor_Qy1zkNW7c3.matter
@@ -204,7 +204,7 @@ cluster Binding = 30 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -220,12 +220,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -261,17 +291,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -596,6 +650,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -604,6 +661,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -614,6 +675,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -647,12 +712,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/chef/devices/rootnode_thermostat_bm3fb8dhYi.matter b/examples/chef/devices/rootnode_thermostat_bm3fb8dhYi.matter
index f7ff21337d4e96..baa51be533f251 100644
--- a/examples/chef/devices/rootnode_thermostat_bm3fb8dhYi.matter
+++ b/examples/chef/devices/rootnode_thermostat_bm3fb8dhYi.matter
@@ -204,7 +204,7 @@ cluster Binding = 30 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -220,12 +220,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -261,17 +291,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -596,6 +650,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -604,6 +661,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -614,6 +675,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -647,12 +712,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
@@ -1377,7 +1453,8 @@ cluster Thermostat = 513 {
kSleep = 3;
kWake = 4;
kVacation = 5;
- kUserDefined = 6;
+ kGoingToSleep = 6;
+ kUserDefined = 254;
}
enum SetpointChangeSourceEnum : enum8 {
@@ -1503,11 +1580,6 @@ cluster Thermostat = 513 {
kSupportsOff = 0x8;
}
- bitmap TemperatureSetpointHoldPolicyBitmap : bitmap8 {
- kHoldDurationElapsed = 0x1;
- kHoldDurationElapsedOrPresetChanged = 0x2;
- }
-
struct ScheduleTransitionStruct {
ScheduleDayOfWeekBitmap dayOfWeek = 0;
int16u transitionTime = 1;
@@ -1613,8 +1685,7 @@ cluster Thermostat = 513 {
attribute access(write: manage) optional PresetStruct presets[] = 80;
attribute access(write: manage) optional ScheduleStruct schedules[] = 81;
readonly attribute optional boolean presetsSchedulesEditable = 82;
- readonly attribute optional TemperatureSetpointHoldPolicyBitmap temperatureSetpointHoldPolicy = 83;
- readonly attribute optional nullable epoch_s setpointHoldExpiryTimestamp = 84;
+ readonly attribute optional nullable epoch_s setpointHoldExpiryTimestamp = 83;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -1658,10 +1729,6 @@ cluster Thermostat = 513 {
int16u timeoutSeconds = 0;
}
- request struct SetTemperatureSetpointHoldPolicyRequest {
- TemperatureSetpointHoldPolicyBitmap temperatureSetpointHoldPolicy = 0;
- }
-
/** Command description for SetpointRaiseLower */
command SetpointRaiseLower(SetpointRaiseLowerRequest): DefaultSuccess = 0;
/** Command description for SetWeeklySchedule */
@@ -1680,8 +1747,6 @@ cluster Thermostat = 513 {
command access(invoke: manage) CancelPresetsSchedulesEditRequest(): DefaultSuccess = 8;
/** This command is used to notify the server that all edits are done and should be committed. */
command access(invoke: manage) CommitPresetsSchedulesRequest(): DefaultSuccess = 9;
- /** This command sets the set point hold policy. */
- command SetTemperatureSetpointHoldPolicy(SetTemperatureSetpointHoldPolicyRequest): DefaultSuccess = 11;
}
/** An interface for controlling a fan in a heating/cooling system. */
diff --git a/examples/chef/devices/rootnode_windowcovering_RLCxaGi9Yx.matter b/examples/chef/devices/rootnode_windowcovering_RLCxaGi9Yx.matter
index aaf2dca3c3fbb7..ecb45e1eea68e0 100644
--- a/examples/chef/devices/rootnode_windowcovering_RLCxaGi9Yx.matter
+++ b/examples/chef/devices/rootnode_windowcovering_RLCxaGi9Yx.matter
@@ -204,7 +204,7 @@ cluster Binding = 30 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -220,12 +220,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -261,17 +291,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -596,6 +650,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -604,6 +661,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -614,6 +675,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -647,12 +712,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/chip-tool/commands/pairing/Commands.h b/examples/chip-tool/commands/pairing/Commands.h
index 41a35bb6bae6ad..c202178657df7b 100644
--- a/examples/chip-tool/commands/pairing/Commands.h
+++ b/examples/chip-tool/commands/pairing/Commands.h
@@ -181,6 +181,16 @@ class PairSoftAP : public PairingCommand
{}
};
+#if CHIP_DEVICE_CONFIG_ENABLE_WIFIPAF
+class PairWiFiPAF : public PairingCommand
+{
+public:
+ PairWiFiPAF(CredentialIssuerCommands * credsIssuerConfig) :
+ PairingCommand("wifipaf-wifi", PairingMode::WiFiPAF, PairingNetworkType::WiFi, credsIssuerConfig)
+ {}
+};
+#endif
+
class PairAlreadyDiscovered : public PairingCommand
{
public:
@@ -243,6 +253,9 @@ void registerCommandsPairing(Commands & commands, CredentialIssuerCommands * cre
make_unique(credsIssuerConfig),
make_unique(credsIssuerConfig),
make_unique(credsIssuerConfig),
+#if CHIP_DEVICE_CONFIG_ENABLE_WIFIPAF
+ make_unique(credsIssuerConfig),
+#endif
make_unique(credsIssuerConfig),
make_unique(credsIssuerConfig),
make_unique(credsIssuerConfig),
diff --git a/examples/chip-tool/commands/pairing/PairingCommand.cpp b/examples/chip-tool/commands/pairing/PairingCommand.cpp
index 35ce2ba1cc7aaa..245c9ed57ff82c 100644
--- a/examples/chip-tool/commands/pairing/PairingCommand.cpp
+++ b/examples/chip-tool/commands/pairing/PairingCommand.cpp
@@ -80,6 +80,11 @@ CHIP_ERROR PairingCommand::RunInternal(NodeId remoteId)
case PairingMode::SoftAP:
err = Pair(remoteId, PeerAddress::UDP(mRemoteAddr.address, mRemotePort, mRemoteAddr.interfaceId));
break;
+#if CHIP_DEVICE_CONFIG_ENABLE_WIFIPAF
+ case PairingMode::WiFiPAF:
+ err = Pair(remoteId, PeerAddress::WiFiPAF(remoteId));
+ break;
+#endif
case PairingMode::AlreadyDiscovered:
err = Pair(remoteId, PeerAddress::UDP(mRemoteAddr.address, mRemotePort, mRemoteAddr.interfaceId));
break;
diff --git a/examples/chip-tool/commands/pairing/PairingCommand.h b/examples/chip-tool/commands/pairing/PairingCommand.h
index 0cf4e1de2de713..9965b663ec111c 100644
--- a/examples/chip-tool/commands/pairing/PairingCommand.h
+++ b/examples/chip-tool/commands/pairing/PairingCommand.h
@@ -35,6 +35,9 @@ enum class PairingMode
CodePaseOnly,
Ble,
SoftAP,
+#if CHIP_DEVICE_CONFIG_ENABLE_WIFIPAF
+ WiFiPAF,
+#endif
AlreadyDiscovered,
AlreadyDiscoveredByIndex,
AlreadyDiscoveredByIndexWithCode,
@@ -127,6 +130,13 @@ class PairingCommand : public CHIPCommand,
AddArgument("device-remote-port", 0, UINT16_MAX, &mRemotePort);
AddArgument("pase-only", 0, 1, &mPaseOnly);
break;
+#if CHIP_DEVICE_CONFIG_ENABLE_WIFIPAF
+ case PairingMode::WiFiPAF:
+ AddArgument("skip-commissioning-complete", 0, 1, &mSkipCommissioningComplete);
+ AddArgument("setup-pin-code", 0, 134217727, &mSetupPINCode.emplace());
+ AddArgument("discriminator", 0, 4096, &mDiscriminator.emplace());
+ break;
+#endif
case PairingMode::AlreadyDiscovered:
AddArgument("skip-commissioning-complete", 0, 1, &mSkipCommissioningComplete);
AddArgument("setup-pin-code", 0, 134217727, &mSetupPINCode.emplace());
diff --git a/examples/chip-tool/commands/payload/SetupPayloadParseCommand.cpp b/examples/chip-tool/commands/payload/SetupPayloadParseCommand.cpp
index 7ab62c7da5101d..de1afad1835385 100644
--- a/examples/chip-tool/commands/payload/SetupPayloadParseCommand.cpp
+++ b/examples/chip-tool/commands/payload/SetupPayloadParseCommand.cpp
@@ -108,6 +108,14 @@ CHIP_ERROR SetupPayloadParseCommand::Print(chip::SetupPayload payload)
}
humanFlags.Add("On IP network");
}
+ if (payload.rendezvousInformation.Value().Has(RendezvousInformationFlag::kWiFiPAF))
+ {
+ if (!humanFlags.Empty())
+ {
+ humanFlags.Add(", ");
+ }
+ humanFlags.Add("Wi-Fi PAF");
+ }
}
else
{
diff --git a/examples/chip-tool/py_matter_chip_tool_adapter/matter_chip_tool_adapter/decoder.py b/examples/chip-tool/py_matter_chip_tool_adapter/matter_chip_tool_adapter/decoder.py
index cd77147fff40d6..68effa7bb30dbc 100644
--- a/examples/chip-tool/py_matter_chip_tool_adapter/matter_chip_tool_adapter/decoder.py
+++ b/examples/chip-tool/py_matter_chip_tool_adapter/matter_chip_tool_adapter/decoder.py
@@ -322,7 +322,7 @@ def run(self, specs, value, cluster_name: str, typename: str, array: bool):
provided_field_name = provided_field_name[0].lower(
) + provided_field_name[1:]
- if provided_field_name in value and provided_field_name != field_name:
+ if provided_field_name in value:
value[field_name] = self.run(
specs,
value[provided_field_name],
@@ -330,7 +330,8 @@ def run(self, specs, value, cluster_name: str, typename: str, array: bool):
field_type,
field_array
)
- del value[provided_field_name]
+ if provided_field_name != field_name:
+ del value[provided_field_name]
if specs.is_fabric_scoped(struct):
if _FABRIC_INDEX_FIELD_CODE in value:
diff --git a/examples/contact-sensor-app/contact-sensor-common/contact-sensor-app.matter b/examples/contact-sensor-app/contact-sensor-common/contact-sensor-app.matter
index 5c2830b39540bb..ed76b4fe052c54 100644
--- a/examples/contact-sensor-app/contact-sensor-common/contact-sensor-app.matter
+++ b/examples/contact-sensor-app/contact-sensor-common/contact-sensor-app.matter
@@ -183,7 +183,7 @@ cluster Descriptor = 29 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -199,12 +199,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -240,17 +270,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -575,6 +629,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -583,6 +640,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -593,6 +654,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -626,12 +691,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/contact-sensor-app/nxp/zap-lit/contact-sensor-app.matter b/examples/contact-sensor-app/nxp/zap-lit/contact-sensor-app.matter
index 2606c314ff1581..cb540a4824742d 100644
--- a/examples/contact-sensor-app/nxp/zap-lit/contact-sensor-app.matter
+++ b/examples/contact-sensor-app/nxp/zap-lit/contact-sensor-app.matter
@@ -106,7 +106,7 @@ cluster Descriptor = 29 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -122,12 +122,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -163,17 +193,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -437,6 +491,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -445,6 +502,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -455,6 +516,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -488,12 +553,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/contact-sensor-app/nxp/zap-sit/contact-sensor-app.matter b/examples/contact-sensor-app/nxp/zap-sit/contact-sensor-app.matter
index afb602e1abc18d..f7c07ff849ab2f 100644
--- a/examples/contact-sensor-app/nxp/zap-sit/contact-sensor-app.matter
+++ b/examples/contact-sensor-app/nxp/zap-sit/contact-sensor-app.matter
@@ -106,7 +106,7 @@ cluster Descriptor = 29 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -122,12 +122,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -163,17 +193,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -437,6 +491,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -445,6 +502,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -455,6 +516,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -488,12 +553,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/dishwasher-app/dishwasher-common/dishwasher-app.matter b/examples/dishwasher-app/dishwasher-common/dishwasher-app.matter
index 6ed8e87a7e75d1..81763a112ac05c 100644
--- a/examples/dishwasher-app/dishwasher-common/dishwasher-app.matter
+++ b/examples/dishwasher-app/dishwasher-common/dishwasher-app.matter
@@ -204,7 +204,7 @@ cluster Binding = 30 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -220,12 +220,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -261,17 +291,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -468,6 +522,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -476,6 +533,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -486,6 +547,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -519,12 +584,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/energy-management-app/energy-management-common/energy-management-app.matter b/examples/energy-management-app/energy-management-common/energy-management-app.matter
index eae8f9991fa967..9abd126fa1c683 100644
--- a/examples/energy-management-app/energy-management-common/energy-management-app.matter
+++ b/examples/energy-management-app/energy-management-common/energy-management-app.matter
@@ -106,7 +106,7 @@ cluster Descriptor = 29 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -122,12 +122,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -163,17 +193,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -629,6 +683,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -637,6 +694,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -647,6 +708,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -680,12 +745,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/energy-management-app/esp32/main/CMakeLists.txt b/examples/energy-management-app/esp32/main/CMakeLists.txt
index 15c1f99a6982aa..cce09303b58d72 100644
--- a/examples/energy-management-app/esp32/main/CMakeLists.txt
+++ b/examples/energy-management-app/esp32/main/CMakeLists.txt
@@ -54,7 +54,6 @@ set(SRC_DIRS_LIST
"${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/energy-evse-server"
"${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/device-energy-management-server"
"${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/network-commissioning"
- "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/occupancy-sensor-server"
"${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/operational-credentials-server"
"${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/ota-requestor"
"${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/power-source-server"
diff --git a/examples/fabric-bridge-app/fabric-bridge-common/fabric-bridge-app.matter b/examples/fabric-bridge-app/fabric-bridge-common/fabric-bridge-app.matter
index b0f11a4039aa18..ca331adef8b9c5 100644
--- a/examples/fabric-bridge-app/fabric-bridge-common/fabric-bridge-app.matter
+++ b/examples/fabric-bridge-app/fabric-bridge-common/fabric-bridge-app.matter
@@ -106,7 +106,7 @@ cluster Descriptor = 29 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -122,12 +122,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -163,17 +193,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** The Access Control Cluster exposes a data model view of a
@@ -181,7 +235,7 @@ cluster AccessControl = 31 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -197,12 +251,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -238,17 +322,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -358,6 +466,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -366,6 +477,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -376,6 +491,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -409,12 +528,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/laundry-washer-app/nxp/zap/laundry-washer-app.matter b/examples/laundry-washer-app/nxp/zap/laundry-washer-app.matter
index e8913aeb7e11b3..fb8a8c6f57533a 100644
--- a/examples/laundry-washer-app/nxp/zap/laundry-washer-app.matter
+++ b/examples/laundry-washer-app/nxp/zap/laundry-washer-app.matter
@@ -276,7 +276,7 @@ cluster Binding = 30 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -292,12 +292,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -333,17 +363,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -953,6 +1007,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -961,6 +1018,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -971,6 +1032,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -1004,12 +1069,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/light-switch-app/esp32/main/CMakeLists.txt b/examples/light-switch-app/esp32/main/CMakeLists.txt
index e2600438b55346..b4b6f5946eb2f9 100644
--- a/examples/light-switch-app/esp32/main/CMakeLists.txt
+++ b/examples/light-switch-app/esp32/main/CMakeLists.txt
@@ -46,7 +46,6 @@ idf_component_register(PRIV_INCLUDE_DIRS
"${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/localization-configuration-server"
"${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/time-format-localization-server"
"${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/network-commissioning"
- "${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/occupancy-sensor-server"
"${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/operational-credentials-server"
"${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/ota-requestor"
"${CMAKE_SOURCE_DIR}/third_party/connectedhomeip/src/app/clusters/power-source-configuration-server"
diff --git a/examples/light-switch-app/light-switch-common/light-switch-app.matter b/examples/light-switch-app/light-switch-common/light-switch-app.matter
index 65796ceebd4063..33b949817a0e05 100644
--- a/examples/light-switch-app/light-switch-common/light-switch-app.matter
+++ b/examples/light-switch-app/light-switch-common/light-switch-app.matter
@@ -326,7 +326,7 @@ cluster Binding = 30 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -342,12 +342,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -383,17 +413,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -718,6 +772,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -726,6 +783,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -736,6 +797,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -769,12 +834,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
@@ -2996,7 +3072,7 @@ endpoint 2 {
callback attribute acceptedCommandList;
callback attribute attributeList;
ram attribute featureMap default = 2;
- ram attribute clusterRevision default = 1;
+ ram attribute clusterRevision default = 2;
}
}
diff --git a/examples/light-switch-app/light-switch-common/light-switch-app.zap b/examples/light-switch-app/light-switch-common/light-switch-app.zap
index ad7f46df3bc97d..80a6d6dc6a7602 100644
--- a/examples/light-switch-app/light-switch-common/light-switch-app.zap
+++ b/examples/light-switch-app/light-switch-common/light-switch-app.zap
@@ -5857,7 +5857,7 @@
"storageOption": "RAM",
"singleton": 0,
"bounded": 0,
- "defaultValue": "1",
+ "defaultValue": "2",
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
@@ -5903,4 +5903,4 @@
"parentEndpointIdentifier": null
}
]
-}
\ No newline at end of file
+}
diff --git a/examples/light-switch-app/qpg/zap/switch.matter b/examples/light-switch-app/qpg/zap/switch.matter
index 58459bccdd7a50..6394b5b78b8c93 100644
--- a/examples/light-switch-app/qpg/zap/switch.matter
+++ b/examples/light-switch-app/qpg/zap/switch.matter
@@ -451,7 +451,7 @@ cluster Binding = 30 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -467,12 +467,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -508,17 +538,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -1041,6 +1095,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -1049,6 +1106,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -1059,6 +1120,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -1092,12 +1157,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
@@ -3080,7 +3156,7 @@ endpoint 2 {
callback attribute eventList;
callback attribute attributeList;
ram attribute featureMap default = 30;
- ram attribute clusterRevision default = 1;
+ ram attribute clusterRevision default = 2;
}
}
diff --git a/examples/light-switch-app/qpg/zap/switch.zap b/examples/light-switch-app/qpg/zap/switch.zap
index 5578a0ff63b5e8..4509b773fac6ee 100644
--- a/examples/light-switch-app/qpg/zap/switch.zap
+++ b/examples/light-switch-app/qpg/zap/switch.zap
@@ -6488,7 +6488,7 @@
"storageOption": "RAM",
"singleton": 0,
"bounded": 0,
- "defaultValue": "1",
+ "defaultValue": "2",
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
@@ -6569,4 +6569,4 @@
"parentEndpointIdentifier": null
}
]
-}
\ No newline at end of file
+}
diff --git a/examples/lighting-app/bouffalolab/data_model/lighting-app-ethernet.matter b/examples/lighting-app/bouffalolab/data_model/lighting-app-ethernet.matter
index 0197bf3889fdea..24a8a6e04eba0e 100644
--- a/examples/lighting-app/bouffalolab/data_model/lighting-app-ethernet.matter
+++ b/examples/lighting-app/bouffalolab/data_model/lighting-app-ethernet.matter
@@ -380,7 +380,7 @@ cluster Descriptor = 29 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -396,12 +396,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -437,17 +467,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -772,6 +826,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -780,6 +837,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -790,6 +851,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -823,12 +888,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/lighting-app/bouffalolab/data_model/lighting-app-thread.matter b/examples/lighting-app/bouffalolab/data_model/lighting-app-thread.matter
index d7b7fe74b541f5..eff1ba235adbcf 100644
--- a/examples/lighting-app/bouffalolab/data_model/lighting-app-thread.matter
+++ b/examples/lighting-app/bouffalolab/data_model/lighting-app-thread.matter
@@ -380,7 +380,7 @@ cluster Descriptor = 29 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -396,12 +396,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -437,17 +467,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -772,6 +826,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -780,6 +837,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -790,6 +851,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -823,12 +888,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/lighting-app/bouffalolab/data_model/lighting-app-wifi.matter b/examples/lighting-app/bouffalolab/data_model/lighting-app-wifi.matter
index 3f36ce92b119da..38e9e739f88365 100644
--- a/examples/lighting-app/bouffalolab/data_model/lighting-app-wifi.matter
+++ b/examples/lighting-app/bouffalolab/data_model/lighting-app-wifi.matter
@@ -380,7 +380,7 @@ cluster Descriptor = 29 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -396,12 +396,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -437,17 +467,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -772,6 +826,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -780,6 +837,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -790,6 +851,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -823,12 +888,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/lighting-app/lighting-common/lighting-app.matter b/examples/lighting-app/lighting-common/lighting-app.matter
index 32c4eaa0dc80cb..1ef35f4d106c73 100644
--- a/examples/lighting-app/lighting-common/lighting-app.matter
+++ b/examples/lighting-app/lighting-common/lighting-app.matter
@@ -380,7 +380,7 @@ cluster Descriptor = 29 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -396,12 +396,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -437,17 +467,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -772,6 +826,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -780,6 +837,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -790,6 +851,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -823,12 +888,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
@@ -2673,7 +2749,7 @@ endpoint 0 {
ram attribute numberOfPositions default = 2;
ram attribute currentPosition;
ram attribute featureMap default = 0;
- ram attribute clusterRevision default = 1;
+ ram attribute clusterRevision default = 2;
}
server cluster AdministratorCommissioning {
diff --git a/examples/lighting-app/lighting-common/lighting-app.zap b/examples/lighting-app/lighting-common/lighting-app.zap
index 730b68027a4cb1..04abf7714a1a9c 100644
--- a/examples/lighting-app/lighting-common/lighting-app.zap
+++ b/examples/lighting-app/lighting-common/lighting-app.zap
@@ -3524,7 +3524,7 @@
"storageOption": "RAM",
"singleton": 0,
"bounded": 0,
- "defaultValue": "1",
+ "defaultValue": "2",
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
@@ -5932,4 +5932,4 @@
"parentEndpointIdentifier": null
}
]
-}
\ No newline at end of file
+}
diff --git a/examples/lighting-app/nxp/zap/lighting-on-off.matter b/examples/lighting-app/nxp/zap/lighting-on-off.matter
index da5e202dd6f39e..c6d8d4cd548a24 100644
--- a/examples/lighting-app/nxp/zap/lighting-on-off.matter
+++ b/examples/lighting-app/nxp/zap/lighting-on-off.matter
@@ -380,7 +380,7 @@ cluster Descriptor = 29 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -396,12 +396,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -437,17 +467,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -711,6 +765,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -719,6 +776,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -729,6 +790,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -762,12 +827,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/lighting-app/qpg/zap/light.matter b/examples/lighting-app/qpg/zap/light.matter
index 78c8e02efd12fe..82fe03d0f2f725 100644
--- a/examples/lighting-app/qpg/zap/light.matter
+++ b/examples/lighting-app/qpg/zap/light.matter
@@ -380,7 +380,7 @@ cluster Descriptor = 29 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -396,12 +396,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -437,17 +467,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -711,6 +765,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -719,6 +776,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -729,6 +790,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -762,12 +827,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/lighting-app/silabs/data_model/lighting-thread-app.matter b/examples/lighting-app/silabs/data_model/lighting-thread-app.matter
index 0974c4e01cd111..e641e8276d81c1 100644
--- a/examples/lighting-app/silabs/data_model/lighting-thread-app.matter
+++ b/examples/lighting-app/silabs/data_model/lighting-thread-app.matter
@@ -380,7 +380,7 @@ cluster Descriptor = 29 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -396,12 +396,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -437,17 +467,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -772,6 +826,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -780,6 +837,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -790,6 +851,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -823,12 +888,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/lighting-app/silabs/data_model/lighting-wifi-app.matter b/examples/lighting-app/silabs/data_model/lighting-wifi-app.matter
index 7f4ad51da871b3..4ae7efa1522d83 100644
--- a/examples/lighting-app/silabs/data_model/lighting-wifi-app.matter
+++ b/examples/lighting-app/silabs/data_model/lighting-wifi-app.matter
@@ -380,7 +380,7 @@ cluster Descriptor = 29 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -396,12 +396,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -437,17 +467,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -1031,6 +1085,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -1039,6 +1096,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -1049,6 +1110,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -1082,12 +1147,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/lit-icd-app/lit-icd-common/lit-icd-server-app.matter b/examples/lit-icd-app/lit-icd-common/lit-icd-server-app.matter
index 7c6ef7908ad7d6..0f0907e3c1a444 100644
--- a/examples/lit-icd-app/lit-icd-common/lit-icd-server-app.matter
+++ b/examples/lit-icd-app/lit-icd-common/lit-icd-server-app.matter
@@ -106,7 +106,7 @@ cluster Descriptor = 29 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -122,12 +122,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -163,17 +193,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -463,6 +517,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -471,6 +528,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -481,6 +542,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -514,12 +579,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/lock-app/lock-common/lock-app.matter b/examples/lock-app/lock-common/lock-app.matter
index a1eb98313bcfa9..c194f5a6983f05 100644
--- a/examples/lock-app/lock-common/lock-app.matter
+++ b/examples/lock-app/lock-common/lock-app.matter
@@ -106,7 +106,7 @@ cluster Descriptor = 29 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -122,12 +122,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -163,17 +193,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -739,6 +793,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -747,6 +804,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -757,6 +818,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -790,12 +855,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
@@ -2549,7 +2625,7 @@ endpoint 0 {
callback attribute acceptedCommandList;
callback attribute eventList;
callback attribute attributeList;
- ram attribute featureMap default = 0;
+ ram attribute featureMap default = 1;
callback attribute clusterRevision;
}
diff --git a/examples/lock-app/lock-common/lock-app.zap b/examples/lock-app/lock-common/lock-app.zap
index 605da39d72da56..8e25d9248c1429 100644
--- a/examples/lock-app/lock-common/lock-app.zap
+++ b/examples/lock-app/lock-common/lock-app.zap
@@ -401,7 +401,7 @@
"storageOption": "RAM",
"singleton": 0,
"bounded": 0,
- "defaultValue": "0",
+ "defaultValue": "1",
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
diff --git a/examples/lock-app/nxp/zap/lock-app.matter b/examples/lock-app/nxp/zap/lock-app.matter
index 047f200ffb6f4d..5684fdc46361b8 100644
--- a/examples/lock-app/nxp/zap/lock-app.matter
+++ b/examples/lock-app/nxp/zap/lock-app.matter
@@ -106,7 +106,7 @@ cluster Descriptor = 29 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -122,12 +122,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -163,17 +193,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -283,6 +337,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -291,6 +348,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -301,6 +362,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -334,12 +399,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/lock-app/qpg/zap/lock.matter b/examples/lock-app/qpg/zap/lock.matter
index 4a067071261767..5cc5f6f354e883 100644
--- a/examples/lock-app/qpg/zap/lock.matter
+++ b/examples/lock-app/qpg/zap/lock.matter
@@ -183,7 +183,7 @@ cluster Descriptor = 29 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -199,12 +199,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -240,17 +270,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -514,6 +568,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -522,6 +579,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -532,6 +593,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -565,12 +630,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/log-source-app/log-source-common/log-source-app.matter b/examples/log-source-app/log-source-common/log-source-app.matter
index b4ae99ffdb58bb..c368032f696621 100644
--- a/examples/log-source-app/log-source-common/log-source-app.matter
+++ b/examples/log-source-app/log-source-common/log-source-app.matter
@@ -23,7 +23,7 @@ struct TestGlobalStruct {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -39,12 +39,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -80,17 +110,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster is used to manage global aspects of the Commissioning flow. */
@@ -103,6 +157,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -111,6 +168,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -121,6 +182,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -154,12 +219,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/microwave-oven-app/microwave-oven-common/microwave-oven-app.matter b/examples/microwave-oven-app/microwave-oven-common/microwave-oven-app.matter
index 3d03cf5fffcdca..3c686228138dfb 100644
--- a/examples/microwave-oven-app/microwave-oven-common/microwave-oven-app.matter
+++ b/examples/microwave-oven-app/microwave-oven-common/microwave-oven-app.matter
@@ -106,7 +106,7 @@ cluster Descriptor = 29 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -122,12 +122,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -163,17 +193,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -327,6 +381,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -335,6 +392,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -345,6 +406,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -378,12 +443,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/network-manager-app/linux/BUILD.gn b/examples/network-manager-app/linux/BUILD.gn
index 1dee694c38616e..ea973edfbfd15c 100644
--- a/examples/network-manager-app/linux/BUILD.gn
+++ b/examples/network-manager-app/linux/BUILD.gn
@@ -15,7 +15,7 @@
import("//build_overrides/build.gni")
import("//build_overrides/chip.gni")
-executable("network-manager-app") {
+executable("matter-network-manager-app") {
sources = [
"include/CHIPProjectAppConfig.h",
"main.cpp",
@@ -32,7 +32,7 @@ executable("network-manager-app") {
}
group("linux") {
- deps = [ ":network-manager-app" ]
+ deps = [ ":matter-network-manager-app" ]
}
group("default") {
diff --git a/examples/network-manager-app/network-manager-common/network-manager-app.matter b/examples/network-manager-app/network-manager-common/network-manager-app.matter
index dd37ffc02a635c..829518c00e24b0 100644
--- a/examples/network-manager-app/network-manager-common/network-manager-app.matter
+++ b/examples/network-manager-app/network-manager-common/network-manager-app.matter
@@ -106,7 +106,7 @@ cluster Descriptor = 29 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -122,12 +122,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -163,17 +193,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -283,6 +337,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -291,6 +348,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -301,6 +362,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -334,12 +399,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
@@ -1193,10 +1269,11 @@ cluster GroupKeyManagement = 63 {
}
/** Functionality to retrieve operational information about a managed Wi-Fi network. */
-cluster WiFiNetworkManagement = 1105 {
+provisional cluster WiFiNetworkManagement = 1105 {
revision 1;
- readonly attribute nullable octet_string<32> ssid = 1;
+ readonly attribute nullable octet_string<32> ssid = 0;
+ readonly attribute access(read: manage) nullable int64u passphraseSurrogate = 1;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -1209,11 +1286,11 @@ cluster WiFiNetworkManagement = 1105 {
}
/** Request the current WPA-Personal passphrase or PSK associated with the managed Wi-Fi network. */
- command access(invoke: administer) NetworkPassphraseRequest(): NetworkPassphraseResponse = 0;
+ command access(invoke: manage) NetworkPassphraseRequest(): NetworkPassphraseResponse = 0;
}
/** Manages the names and credentials of Thread networks visible to the user. */
-cluster ThreadNetworkDirectory = 1107 {
+provisional cluster ThreadNetworkDirectory = 1107 {
revision 1;
struct ThreadNetworkStruct {
@@ -1254,7 +1331,7 @@ cluster ThreadNetworkDirectory = 1107 {
/** Removes an entry from the ThreadNetworks list. */
timed command access(invoke: manage) RemoveNetwork(RemoveNetworkRequest): DefaultSuccess = 1;
/** Retrieves a Thread Operational Dataset from the ThreadNetworks list. */
- timed command GetOperationalDataset(GetOperationalDatasetRequest): OperationalDatasetResponse = 2;
+ command GetOperationalDataset(GetOperationalDatasetRequest): OperationalDatasetResponse = 2;
}
endpoint 0 {
@@ -1525,6 +1602,7 @@ endpoint 1 {
server cluster WiFiNetworkManagement {
callback attribute ssid;
+ callback attribute passphraseSurrogate;
callback attribute generatedCommandList;
callback attribute acceptedCommandList;
callback attribute eventList;
diff --git a/examples/network-manager-app/network-manager-common/network-manager-app.zap b/examples/network-manager-app/network-manager-common/network-manager-app.zap
index ec8316ce2ad3c0..64113c969dd774 100644
--- a/examples/network-manager-app/network-manager-common/network-manager-app.zap
+++ b/examples/network-manager-app/network-manager-common/network-manager-app.zap
@@ -3238,7 +3238,7 @@
"attributes": [
{
"name": "SSID",
- "code": 1,
+ "code": 0,
"mfgCode": null,
"side": "server",
"type": "octet_string",
@@ -3252,6 +3252,22 @@
"maxInterval": 65534,
"reportableChange": 0
},
+ {
+ "name": "PassphraseSurrogate",
+ "code": 1,
+ "mfgCode": null,
+ "side": "server",
+ "type": "int64u",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": null,
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
{
"name": "GeneratedCommandList",
"code": 65528,
diff --git a/examples/ota-provider-app/ota-provider-common/ota-provider-app.matter b/examples/ota-provider-app/ota-provider-common/ota-provider-app.matter
index 4f298e5d5ab176..52d40b55ac08d6 100644
--- a/examples/ota-provider-app/ota-provider-common/ota-provider-app.matter
+++ b/examples/ota-provider-app/ota-provider-common/ota-provider-app.matter
@@ -56,7 +56,7 @@ cluster Descriptor = 29 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -72,12 +72,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -113,17 +143,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** The Access Control Cluster exposes a data model view of a
@@ -131,7 +185,7 @@ cluster AccessControl = 31 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -147,12 +201,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -188,17 +272,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -445,6 +553,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -453,6 +564,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -463,6 +578,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -496,12 +615,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/ota-requestor-app/ota-requestor-common/ota-requestor-app.matter b/examples/ota-requestor-app/ota-requestor-common/ota-requestor-app.matter
index dfc59294f9c43a..f0afcf21730ee4 100644
--- a/examples/ota-requestor-app/ota-requestor-common/ota-requestor-app.matter
+++ b/examples/ota-requestor-app/ota-requestor-common/ota-requestor-app.matter
@@ -255,7 +255,7 @@ cluster Descriptor = 29 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -271,12 +271,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -312,17 +342,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -647,6 +701,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -655,6 +712,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -665,6 +726,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -698,12 +763,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/placeholder/linux/apps/app1/config.matter b/examples/placeholder/linux/apps/app1/config.matter
index 9c1a05687d3c6a..721a1be46b1540 100644
--- a/examples/placeholder/linux/apps/app1/config.matter
+++ b/examples/placeholder/linux/apps/app1/config.matter
@@ -627,7 +627,7 @@ cluster Descriptor = 29 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -643,12 +643,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -684,17 +714,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides a standardized way for a Node (typically a Bridge, but could be any Node) to expose action information. */
@@ -1370,6 +1424,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -1378,6 +1435,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -1388,6 +1449,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -1421,12 +1486,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** This cluster is used to manage global aspects of the Commissioning flow. */
@@ -1439,6 +1515,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -1447,6 +1526,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -1457,6 +1540,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -1490,12 +1577,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
@@ -2387,8 +2485,12 @@ cluster BridgedDeviceBasicInformation = 57 {
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+ request struct KeepActiveRequest {
+ int32u stayActiveDuration = 0;
+ }
+
/** The server SHALL attempt to keep the devices specified active for StayActiveDuration milliseconds when they are next active. */
- command KeepActive(): DefaultSuccess = 128;
+ command KeepActive(KeepActiveRequest): DefaultSuccess = 128;
}
/** This cluster exposes interactions with a switch device, for the purpose of using those interactions by other devices.
@@ -4825,7 +4927,8 @@ cluster Thermostat = 513 {
kSleep = 3;
kWake = 4;
kVacation = 5;
- kUserDefined = 6;
+ kGoingToSleep = 6;
+ kUserDefined = 254;
}
enum SetpointChangeSourceEnum : enum8 {
@@ -4951,11 +5054,6 @@ cluster Thermostat = 513 {
kSupportsOff = 0x8;
}
- bitmap TemperatureSetpointHoldPolicyBitmap : bitmap8 {
- kHoldDurationElapsed = 0x1;
- kHoldDurationElapsedOrPresetChanged = 0x2;
- }
-
struct ScheduleTransitionStruct {
ScheduleDayOfWeekBitmap dayOfWeek = 0;
int16u transitionTime = 1;
@@ -5061,8 +5159,7 @@ cluster Thermostat = 513 {
attribute access(write: manage) optional PresetStruct presets[] = 80;
attribute access(write: manage) optional ScheduleStruct schedules[] = 81;
readonly attribute optional boolean presetsSchedulesEditable = 82;
- readonly attribute optional TemperatureSetpointHoldPolicyBitmap temperatureSetpointHoldPolicy = 83;
- readonly attribute optional nullable epoch_s setpointHoldExpiryTimestamp = 84;
+ readonly attribute optional nullable epoch_s setpointHoldExpiryTimestamp = 83;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -5106,10 +5203,6 @@ cluster Thermostat = 513 {
int16u timeoutSeconds = 0;
}
- request struct SetTemperatureSetpointHoldPolicyRequest {
- TemperatureSetpointHoldPolicyBitmap temperatureSetpointHoldPolicy = 0;
- }
-
/** Command description for SetpointRaiseLower */
command SetpointRaiseLower(SetpointRaiseLowerRequest): DefaultSuccess = 0;
/** Command description for SetWeeklySchedule */
@@ -5128,8 +5221,6 @@ cluster Thermostat = 513 {
command access(invoke: manage) CancelPresetsSchedulesEditRequest(): DefaultSuccess = 8;
/** This command is used to notify the server that all edits are done and should be committed. */
command access(invoke: manage) CommitPresetsSchedulesRequest(): DefaultSuccess = 9;
- /** This command sets the set point hold policy. */
- command SetTemperatureSetpointHoldPolicy(SetTemperatureSetpointHoldPolicyRequest): DefaultSuccess = 11;
}
/** An interface for configuring and controlling the functionality of a thermostat. */
@@ -5186,7 +5277,8 @@ cluster Thermostat = 513 {
kSleep = 3;
kWake = 4;
kVacation = 5;
- kUserDefined = 6;
+ kGoingToSleep = 6;
+ kUserDefined = 254;
}
enum SetpointChangeSourceEnum : enum8 {
@@ -5312,11 +5404,6 @@ cluster Thermostat = 513 {
kSupportsOff = 0x8;
}
- bitmap TemperatureSetpointHoldPolicyBitmap : bitmap8 {
- kHoldDurationElapsed = 0x1;
- kHoldDurationElapsedOrPresetChanged = 0x2;
- }
-
struct ScheduleTransitionStruct {
ScheduleDayOfWeekBitmap dayOfWeek = 0;
int16u transitionTime = 1;
@@ -5422,8 +5509,7 @@ cluster Thermostat = 513 {
attribute access(write: manage) optional PresetStruct presets[] = 80;
attribute access(write: manage) optional ScheduleStruct schedules[] = 81;
readonly attribute optional boolean presetsSchedulesEditable = 82;
- readonly attribute optional TemperatureSetpointHoldPolicyBitmap temperatureSetpointHoldPolicy = 83;
- readonly attribute optional nullable epoch_s setpointHoldExpiryTimestamp = 84;
+ readonly attribute optional nullable epoch_s setpointHoldExpiryTimestamp = 83;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -5467,10 +5553,6 @@ cluster Thermostat = 513 {
int16u timeoutSeconds = 0;
}
- request struct SetTemperatureSetpointHoldPolicyRequest {
- TemperatureSetpointHoldPolicyBitmap temperatureSetpointHoldPolicy = 0;
- }
-
/** Command description for SetpointRaiseLower */
command SetpointRaiseLower(SetpointRaiseLowerRequest): DefaultSuccess = 0;
/** Command description for SetWeeklySchedule */
@@ -5489,8 +5571,6 @@ cluster Thermostat = 513 {
command access(invoke: manage) CancelPresetsSchedulesEditRequest(): DefaultSuccess = 8;
/** This command is used to notify the server that all edits are done and should be committed. */
command access(invoke: manage) CommitPresetsSchedulesRequest(): DefaultSuccess = 9;
- /** This command sets the set point hold policy. */
- command SetTemperatureSetpointHoldPolicy(SetTemperatureSetpointHoldPolicyRequest): DefaultSuccess = 11;
}
/** An interface for configuring the user interface of a thermostat (which may be remote from the thermostat). */
@@ -8573,7 +8653,7 @@ endpoint 0 {
callback attribute acceptedCommandList;
callback attribute attributeList;
ram attribute featureMap default = 0;
- ram attribute clusterRevision default = 1;
+ ram attribute clusterRevision default = 2;
}
server cluster AdministratorCommissioning {
diff --git a/examples/placeholder/linux/apps/app1/config.zap b/examples/placeholder/linux/apps/app1/config.zap
index 090e4f74c60881..e16b695e63f9e4 100644
--- a/examples/placeholder/linux/apps/app1/config.zap
+++ b/examples/placeholder/linux/apps/app1/config.zap
@@ -4890,7 +4890,7 @@
"storageOption": "RAM",
"singleton": 0,
"bounded": 0,
- "defaultValue": "1",
+ "defaultValue": "2",
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
@@ -5028,7 +5028,7 @@
"storageOption": "RAM",
"singleton": 0,
"bounded": 0,
- "defaultValue": "1",
+ "defaultValue": "2",
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
@@ -15129,4 +15129,4 @@
"parentEndpointIdentifier": null
}
]
-}
\ No newline at end of file
+}
diff --git a/examples/placeholder/linux/apps/app2/config.matter b/examples/placeholder/linux/apps/app2/config.matter
index a48b8accff55c5..8b6f16cd07c5d0 100644
--- a/examples/placeholder/linux/apps/app2/config.matter
+++ b/examples/placeholder/linux/apps/app2/config.matter
@@ -627,7 +627,7 @@ cluster Descriptor = 29 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -643,12 +643,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -684,17 +714,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides a standardized way for a Node (typically a Bridge, but could be any Node) to expose action information. */
@@ -1327,6 +1381,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -1335,6 +1392,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -1345,6 +1406,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -1378,12 +1443,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** This cluster is used to manage global aspects of the Commissioning flow. */
@@ -1396,6 +1472,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -1404,6 +1483,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -1414,6 +1497,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -1447,12 +1534,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
@@ -2344,8 +2442,12 @@ cluster BridgedDeviceBasicInformation = 57 {
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+ request struct KeepActiveRequest {
+ int32u stayActiveDuration = 0;
+ }
+
/** The server SHALL attempt to keep the devices specified active for StayActiveDuration milliseconds when they are next active. */
- command KeepActive(): DefaultSuccess = 128;
+ command KeepActive(KeepActiveRequest): DefaultSuccess = 128;
}
/** This cluster exposes interactions with a switch device, for the purpose of using those interactions by other devices.
@@ -4782,7 +4884,8 @@ cluster Thermostat = 513 {
kSleep = 3;
kWake = 4;
kVacation = 5;
- kUserDefined = 6;
+ kGoingToSleep = 6;
+ kUserDefined = 254;
}
enum SetpointChangeSourceEnum : enum8 {
@@ -4908,11 +5011,6 @@ cluster Thermostat = 513 {
kSupportsOff = 0x8;
}
- bitmap TemperatureSetpointHoldPolicyBitmap : bitmap8 {
- kHoldDurationElapsed = 0x1;
- kHoldDurationElapsedOrPresetChanged = 0x2;
- }
-
struct ScheduleTransitionStruct {
ScheduleDayOfWeekBitmap dayOfWeek = 0;
int16u transitionTime = 1;
@@ -5018,8 +5116,7 @@ cluster Thermostat = 513 {
attribute access(write: manage) optional PresetStruct presets[] = 80;
attribute access(write: manage) optional ScheduleStruct schedules[] = 81;
readonly attribute optional boolean presetsSchedulesEditable = 82;
- readonly attribute optional TemperatureSetpointHoldPolicyBitmap temperatureSetpointHoldPolicy = 83;
- readonly attribute optional nullable epoch_s setpointHoldExpiryTimestamp = 84;
+ readonly attribute optional nullable epoch_s setpointHoldExpiryTimestamp = 83;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -5063,10 +5160,6 @@ cluster Thermostat = 513 {
int16u timeoutSeconds = 0;
}
- request struct SetTemperatureSetpointHoldPolicyRequest {
- TemperatureSetpointHoldPolicyBitmap temperatureSetpointHoldPolicy = 0;
- }
-
/** Command description for SetpointRaiseLower */
command SetpointRaiseLower(SetpointRaiseLowerRequest): DefaultSuccess = 0;
/** Command description for SetWeeklySchedule */
@@ -5085,8 +5178,6 @@ cluster Thermostat = 513 {
command access(invoke: manage) CancelPresetsSchedulesEditRequest(): DefaultSuccess = 8;
/** This command is used to notify the server that all edits are done and should be committed. */
command access(invoke: manage) CommitPresetsSchedulesRequest(): DefaultSuccess = 9;
- /** This command sets the set point hold policy. */
- command SetTemperatureSetpointHoldPolicy(SetTemperatureSetpointHoldPolicyRequest): DefaultSuccess = 11;
}
/** An interface for configuring and controlling the functionality of a thermostat. */
@@ -5143,7 +5234,8 @@ cluster Thermostat = 513 {
kSleep = 3;
kWake = 4;
kVacation = 5;
- kUserDefined = 6;
+ kGoingToSleep = 6;
+ kUserDefined = 254;
}
enum SetpointChangeSourceEnum : enum8 {
@@ -5269,11 +5361,6 @@ cluster Thermostat = 513 {
kSupportsOff = 0x8;
}
- bitmap TemperatureSetpointHoldPolicyBitmap : bitmap8 {
- kHoldDurationElapsed = 0x1;
- kHoldDurationElapsedOrPresetChanged = 0x2;
- }
-
struct ScheduleTransitionStruct {
ScheduleDayOfWeekBitmap dayOfWeek = 0;
int16u transitionTime = 1;
@@ -5379,8 +5466,7 @@ cluster Thermostat = 513 {
attribute access(write: manage) optional PresetStruct presets[] = 80;
attribute access(write: manage) optional ScheduleStruct schedules[] = 81;
readonly attribute optional boolean presetsSchedulesEditable = 82;
- readonly attribute optional TemperatureSetpointHoldPolicyBitmap temperatureSetpointHoldPolicy = 83;
- readonly attribute optional nullable epoch_s setpointHoldExpiryTimestamp = 84;
+ readonly attribute optional nullable epoch_s setpointHoldExpiryTimestamp = 83;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -5424,10 +5510,6 @@ cluster Thermostat = 513 {
int16u timeoutSeconds = 0;
}
- request struct SetTemperatureSetpointHoldPolicyRequest {
- TemperatureSetpointHoldPolicyBitmap temperatureSetpointHoldPolicy = 0;
- }
-
/** Command description for SetpointRaiseLower */
command SetpointRaiseLower(SetpointRaiseLowerRequest): DefaultSuccess = 0;
/** Command description for SetWeeklySchedule */
@@ -5446,8 +5528,6 @@ cluster Thermostat = 513 {
command access(invoke: manage) CancelPresetsSchedulesEditRequest(): DefaultSuccess = 8;
/** This command is used to notify the server that all edits are done and should be committed. */
command access(invoke: manage) CommitPresetsSchedulesRequest(): DefaultSuccess = 9;
- /** This command sets the set point hold policy. */
- command SetTemperatureSetpointHoldPolicy(SetTemperatureSetpointHoldPolicyRequest): DefaultSuccess = 11;
}
/** An interface for configuring the user interface of a thermostat (which may be remote from the thermostat). */
@@ -8531,7 +8611,7 @@ endpoint 0 {
callback attribute acceptedCommandList;
callback attribute attributeList;
ram attribute featureMap default = 0;
- ram attribute clusterRevision default = 1;
+ ram attribute clusterRevision default = 2;
}
server cluster AdministratorCommissioning {
diff --git a/examples/placeholder/linux/apps/app2/config.zap b/examples/placeholder/linux/apps/app2/config.zap
index bcd64d2189d645..56e97fa89a0ab1 100644
--- a/examples/placeholder/linux/apps/app2/config.zap
+++ b/examples/placeholder/linux/apps/app2/config.zap
@@ -4906,7 +4906,7 @@
"storageOption": "RAM",
"singleton": 0,
"bounded": 0,
- "defaultValue": "1",
+ "defaultValue": "2",
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
@@ -5044,7 +5044,7 @@
"storageOption": "RAM",
"singleton": 0,
"bounded": 0,
- "defaultValue": "1",
+ "defaultValue": "2",
"reportable": 1,
"minInterval": 1,
"maxInterval": 65534,
@@ -14889,4 +14889,4 @@
"parentEndpointIdentifier": null
}
]
-}
\ No newline at end of file
+}
diff --git a/examples/platform/esp32/external_platform/ESP32_custom/BUILD.gn b/examples/platform/esp32/external_platform/ESP32_custom/BUILD.gn
index d8d2f92b542ac7..93b00ef8f81617 100644
--- a/examples/platform/esp32/external_platform/ESP32_custom/BUILD.gn
+++ b/examples/platform/esp32/external_platform/ESP32_custom/BUILD.gn
@@ -29,6 +29,7 @@ declare_args() {
chip_bt_bluedroid_enabled = true
chip_max_discovered_ip_addresses = 5
chip_enable_route_hook = false
+ chip_enable_thread_border_router = false
}
buildconfig_header("custom_buildconfig") {
diff --git a/examples/platform/linux/AppMain.cpp b/examples/platform/linux/AppMain.cpp
index 6a6deae1473084..307b3428126db2 100644
--- a/examples/platform/linux/AppMain.cpp
+++ b/examples/platform/linux/AppMain.cpp
@@ -367,12 +367,15 @@ int ChipLinuxAppInit(int argc, char * const argv[], OptionSet * customOptions,
#if CONFIG_NETWORK_LAYER_BLE
RendezvousInformationFlags rendezvousFlags = RendezvousInformationFlag::kBLE;
#else // CONFIG_NETWORK_LAYER_BLE
- RendezvousInformationFlag rendezvousFlags = RendezvousInformationFlag::kOnNetwork;
+ RendezvousInformationFlags rendezvousFlags = RendezvousInformationFlag::kOnNetwork;
#endif // CONFIG_NETWORK_LAYER_BLE
#ifdef CONFIG_RENDEZVOUS_MODE
rendezvousFlags = static_cast(CONFIG_RENDEZVOUS_MODE);
#endif
+#if CHIP_DEVICE_CONFIG_ENABLE_WIFIPAF
+ rendezvousFlags.Set(RendezvousInformationFlag::kWiFiPAF);
+#endif
err = Platform::MemoryInit();
SuccessOrExit(err);
@@ -471,6 +474,20 @@ int ChipLinuxAppInit(int argc, char * const argv[], OptionSet * customOptions,
}
}
#endif // CHIP_DEVICE_CONFIG_ENABLE_WPA
+#if CHIP_DEVICE_CONFIG_ENABLE_WPA && CHIP_DEVICE_CONFIG_ENABLE_WIFIPAF
+ ChipLogProgress(NotSpecified, "WiFi-PAF: initialzing");
+ if (LinuxDeviceOptions::GetInstance().mWiFi)
+ {
+ if (EnsureWiFiIsStarted())
+ {
+ ChipLogProgress(NotSpecified, "Wi-Fi Management started");
+ DeviceLayer::ConnectivityManager::WiFiPAFAdvertiseParam args;
+ args.enable = LinuxDeviceOptions::GetInstance().mWiFiPAF;
+ args.ExtCmds = LinuxDeviceOptions::GetInstance().mWiFiPAFExtCmds;
+ DeviceLayer::ConnectivityMgr().SetWiFiPAFAdvertisingEnabled(args);
+ }
+ }
+#endif
#if CHIP_ENABLE_OPENTHREAD
if (LinuxDeviceOptions::GetInstance().mThread)
diff --git a/examples/platform/linux/BUILD.gn b/examples/platform/linux/BUILD.gn
index a63175b51200eb..410b1a189245d2 100644
--- a/examples/platform/linux/BUILD.gn
+++ b/examples/platform/linux/BUILD.gn
@@ -54,6 +54,10 @@ source_set("energy-reporting-test-event-trigger") {
sources = [ "${chip_root}/src/app/clusters/electrical-energy-measurement-server/EnergyReportingTestEventTriggerHandler.h" ]
}
+source_set("water-heater-management-test-event-trigger") {
+ sources = [ "${chip_root}/src/app/clusters/water-heater-management-server/WaterHeaterManagementTestEventTriggerHandler.h" ]
+}
+
source_set("device-energy-management-test-event-trigger") {
sources = [ "${chip_root}/src/app/clusters/device-energy-management-server/DeviceEnergyManagementTestEventTriggerHandler.h" ]
}
@@ -85,6 +89,7 @@ source_set("app-main") {
":energy-evse-test-event-trigger",
":energy-reporting-test-event-trigger",
":smco-test-event-trigger",
+ ":water-heater-management-test-event-trigger",
"${chip_root}/src/controller:controller",
"${chip_root}/src/controller:gen_check_chip_controller_headers",
"${chip_root}/src/lib",
diff --git a/examples/platform/linux/Options.cpp b/examples/platform/linux/Options.cpp
index 9d6edc8bc43846..9b83d126c1f495 100644
--- a/examples/platform/linux/Options.cpp
+++ b/examples/platform/linux/Options.cpp
@@ -106,6 +106,9 @@ enum
#if CHIP_WITH_NLFAULTINJECTION
kDeviceOption_FaultInjection,
#endif
+#if CHIP_DEVICE_CONFIG_ENABLE_WIFIPAF
+ kDeviceOption_WiFi_PAF,
+#endif
};
constexpr unsigned kAppUsageLength = 64;
@@ -117,6 +120,9 @@ OptionDef sDeviceOptionDefs[] = {
#if CHIP_DEVICE_CONFIG_ENABLE_WIFI
{ "wifi", kNoArgument, kDeviceOption_WiFi },
{ "wifi-supports-5g", kNoArgument, kDeviceOption_WiFiSupports5g },
+#if CHIP_DEVICE_CONFIG_ENABLE_WIFIPAF
+ { "wifipaf", kArgumentRequired, kDeviceOption_WiFi_PAF },
+#endif // CHIP_DEVICE_CONFIG_ENABLE_WIFIPAF
#endif // CHIP_DEVICE_CONFIG_ENABLE_WPA
#if CHIP_ENABLE_OPENTHREAD
{ "thread", kNoArgument, kDeviceOption_Thread },
@@ -189,6 +195,12 @@ const char * sDeviceOptionHelp =
" --wifi-supports-5g\n"
" Indicate that local Wi-Fi hardware should report 5GHz support.\n"
#endif // CHIP_DEVICE_CONFIG_ENABLE_WIFI
+#if CHIP_DEVICE_CONFIG_ENABLE_WIFIPAF
+ "\n"
+ " --wifipaf freq_list=,... \n"
+ " Enable Wi-Fi PAF via wpa_supplicant.\n"
+ " Give an empty string if not setting freq_list: \"\"\n"
+#endif // CHIP_DEVICE_CONFIG_ENABLE_WIFIPAFs
#if CHIP_ENABLE_OPENTHREAD
"\n"
" --thread\n"
@@ -588,6 +600,13 @@ bool HandleOption(const char * aProgram, OptionSet * aOptions, int aIdentifier,
}
break;
}
+#endif
+#if CHIP_DEVICE_CONFIG_ENABLE_WIFIPAF
+ case kDeviceOption_WiFi_PAF: {
+ LinuxDeviceOptions::GetInstance().mWiFiPAF = true;
+ LinuxDeviceOptions::GetInstance().mWiFiPAFExtCmds = aValue;
+ break;
+ }
#endif
default:
PrintArgError("%s: INTERNAL ERROR: Unhandled option: %s\n", aProgram, aName);
diff --git a/examples/platform/linux/Options.h b/examples/platform/linux/Options.h
index 51e60f0ab63eca..f921bee4ced554 100644
--- a/examples/platform/linux/Options.h
+++ b/examples/platform/linux/Options.h
@@ -49,6 +49,10 @@ struct LinuxDeviceOptions
bool wifiSupports5g = false;
bool mWiFi = false;
bool mThread = false;
+#if CHIP_DEVICE_CONFIG_ENABLE_WIFIPAF
+ bool mWiFiPAF = false;
+ const char * mWiFiPAFExtCmds = nullptr;
+#endif
#if CHIP_DEVICE_CONFIG_ENABLE_BOTH_COMMISSIONER_AND_COMMISSIONEE || CHIP_DEVICE_ENABLE_PORT_PARAMS
uint16_t securedDevicePort = CHIP_PORT;
uint16_t unsecuredCommissionerPort = CHIP_UDC_PORT;
diff --git a/examples/pump-app/pump-common/pump-app.matter b/examples/pump-app/pump-common/pump-app.matter
index 8fe8106230ba4a..bb24649e1d5373 100644
--- a/examples/pump-app/pump-common/pump-app.matter
+++ b/examples/pump-app/pump-common/pump-app.matter
@@ -324,7 +324,7 @@ cluster Binding = 30 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -340,12 +340,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -381,17 +411,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -655,6 +709,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -663,6 +720,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -673,6 +734,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -706,12 +771,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/pump-app/silabs/data_model/pump-thread-app.matter b/examples/pump-app/silabs/data_model/pump-thread-app.matter
index 5284799e2c4bdb..98d3fdbfaa2bee 100644
--- a/examples/pump-app/silabs/data_model/pump-thread-app.matter
+++ b/examples/pump-app/silabs/data_model/pump-thread-app.matter
@@ -324,7 +324,7 @@ cluster Binding = 30 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -340,12 +340,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -381,17 +411,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -655,6 +709,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -663,6 +720,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -673,6 +734,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -706,12 +771,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/pump-app/silabs/data_model/pump-wifi-app.matter b/examples/pump-app/silabs/data_model/pump-wifi-app.matter
index 5284799e2c4bdb..98d3fdbfaa2bee 100644
--- a/examples/pump-app/silabs/data_model/pump-wifi-app.matter
+++ b/examples/pump-app/silabs/data_model/pump-wifi-app.matter
@@ -324,7 +324,7 @@ cluster Binding = 30 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -340,12 +340,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -381,17 +411,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -655,6 +709,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -663,6 +720,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -673,6 +734,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -706,12 +771,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/pump-controller-app/pump-controller-common/pump-controller-app.matter b/examples/pump-controller-app/pump-controller-common/pump-controller-app.matter
index b7a8759d59b2ba..58187538be5ba6 100644
--- a/examples/pump-controller-app/pump-controller-common/pump-controller-app.matter
+++ b/examples/pump-controller-app/pump-controller-common/pump-controller-app.matter
@@ -199,7 +199,7 @@ cluster Binding = 30 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -215,12 +215,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -256,17 +286,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -530,6 +584,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -538,6 +595,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -548,6 +609,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -581,12 +646,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/refrigerator-app/refrigerator-common/refrigerator-app.matter b/examples/refrigerator-app/refrigerator-common/refrigerator-app.matter
index d79448d76f5c6e..d997c589b9e467 100644
--- a/examples/refrigerator-app/refrigerator-common/refrigerator-app.matter
+++ b/examples/refrigerator-app/refrigerator-common/refrigerator-app.matter
@@ -56,7 +56,7 @@ cluster Descriptor = 29 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -72,12 +72,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -113,17 +143,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -320,6 +374,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -328,6 +385,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -338,6 +399,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -371,12 +436,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/rvc-app/rvc-common/rvc-app.matter b/examples/rvc-app/rvc-common/rvc-app.matter
index 3887f9c2abcbe2..c22e5758ba17c1 100644
--- a/examples/rvc-app/rvc-common/rvc-app.matter
+++ b/examples/rvc-app/rvc-common/rvc-app.matter
@@ -106,7 +106,7 @@ cluster Descriptor = 29 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -122,12 +122,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -163,17 +193,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -283,6 +337,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -291,6 +348,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -301,6 +362,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -334,12 +399,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/smoke-co-alarm-app/smoke-co-alarm-common/smoke-co-alarm-app.matter b/examples/smoke-co-alarm-app/smoke-co-alarm-common/smoke-co-alarm-app.matter
index 84c9d0e8eb2831..1cfed0b8ce8edc 100644
--- a/examples/smoke-co-alarm-app/smoke-co-alarm-common/smoke-co-alarm-app.matter
+++ b/examples/smoke-co-alarm-app/smoke-co-alarm-common/smoke-co-alarm-app.matter
@@ -183,7 +183,7 @@ cluster Descriptor = 29 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -199,12 +199,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -240,17 +270,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -834,6 +888,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -842,6 +899,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -852,6 +913,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -885,12 +950,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/temperature-measurement-app/temperature-measurement-common/temperature-measurement.matter b/examples/temperature-measurement-app/temperature-measurement-common/temperature-measurement.matter
index e34c00dfd2e2eb..f3dec72d7d33c9 100644
--- a/examples/temperature-measurement-app/temperature-measurement-common/temperature-measurement.matter
+++ b/examples/temperature-measurement-app/temperature-measurement-common/temperature-measurement.matter
@@ -56,7 +56,7 @@ cluster Descriptor = 29 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -72,12 +72,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -113,17 +143,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -474,6 +528,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -482,6 +539,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -492,6 +553,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -525,12 +590,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/thermostat/linux/BUILD.gn b/examples/thermostat/linux/BUILD.gn
index 89d24bff8a0835..71c0eccfcfae50 100644
--- a/examples/thermostat/linux/BUILD.gn
+++ b/examples/thermostat/linux/BUILD.gn
@@ -20,6 +20,8 @@ executable("thermostat-app") {
"include/low-power/LowPowerManager.cpp",
"include/low-power/LowPowerManager.h",
"main.cpp",
+ "thermostat-delegate-impl.cpp",
+ "thermostat-manager.cpp",
]
deps = [
@@ -28,6 +30,8 @@ executable("thermostat-app") {
"${chip_root}/src/lib",
]
+ include_dirs = [ "include" ]
+
cflags = [ "-Wconversion" ]
output_dir = root_out_dir
diff --git a/examples/thermostat/linux/include/thermostat-delegate-impl.h b/examples/thermostat/linux/include/thermostat-delegate-impl.h
new file mode 100644
index 00000000000000..c4daef5fde1d6a
--- /dev/null
+++ b/examples/thermostat/linux/include/thermostat-delegate-impl.h
@@ -0,0 +1,100 @@
+/*
+ *
+ * Copyright (c) 2024 Project CHIP Authors
+ * All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include
+
+namespace chip {
+namespace app {
+namespace Clusters {
+namespace Thermostat {
+
+/**
+ * The ThermostatDelegate class serves as the instance delegate for storing Presets related information and providing it to the
+ * Thermostat server code. It also manages the presets attribute and provides methods to write to presets, edit presets, maintain a
+ * pending presets list and either commit the presets when requested or discard the changes. It also provides APIs to get and set
+ * the attribute values.
+ *
+ */
+
+static constexpr uint8_t kMaxNumberOfPresetTypes = 6;
+
+// TODO: #34556 Support multiple presets of each type.
+// We will support only one preset of each preset type.
+static constexpr uint8_t kMaxNumberOfPresetsOfEachType = 1;
+
+class ThermostatDelegate : public Delegate
+{
+public:
+ static inline ThermostatDelegate & GetInstance() { return sInstance; }
+
+ CHIP_ERROR GetPresetTypeAtIndex(size_t index, Structs::PresetTypeStruct::Type & presetType) override;
+
+ uint8_t GetNumberOfPresets() override;
+
+ CHIP_ERROR GetPresetAtIndex(size_t index, PresetStructWithOwnedMembers & preset) override;
+
+ CHIP_ERROR GetActivePresetHandle(MutableByteSpan & activePresetHandle) override;
+
+ CHIP_ERROR SetActivePresetHandle(const DataModel::Nullable & newActivePresetHandle) override;
+
+ CHIP_ERROR AppendToPendingPresetList(const Structs::PresetStruct::Type & preset) override;
+
+ CHIP_ERROR GetPendingPresetAtIndex(size_t index, PresetStructWithOwnedMembers & preset) override;
+
+ CHIP_ERROR ApplyPendingPresets() override;
+
+ void ClearPendingPresetList() override;
+
+private:
+ static ThermostatDelegate sInstance;
+
+ ThermostatDelegate();
+ ~ThermostatDelegate() = default;
+
+ ThermostatDelegate(const ThermostatDelegate &) = delete;
+ ThermostatDelegate & operator=(const ThermostatDelegate &) = delete;
+
+ /**
+ * @brief Initializes the preset types array with all preset types corresponding to PresetScenarioEnum.
+ */
+ void InitializePresetTypes();
+
+ /**
+ * @brief Initializes the presets array with some sample presets for testing.
+ */
+ void InitializePresets();
+
+ uint8_t mNumberOfPresets;
+
+ Structs::PresetTypeStruct::Type mPresetTypes[kMaxNumberOfPresetTypes];
+ PresetStructWithOwnedMembers mPresets[kMaxNumberOfPresetTypes * kMaxNumberOfPresetsOfEachType];
+ PresetStructWithOwnedMembers mPendingPresets[kMaxNumberOfPresetTypes * kMaxNumberOfPresetsOfEachType];
+
+ uint8_t mNextFreeIndexInPendingPresetsList;
+ uint8_t mNextFreeIndexInPresetsList;
+
+ uint8_t mActivePresetHandleData[kPresetHandleSize];
+ size_t mActivePresetHandleDataSize;
+};
+
+} // namespace Thermostat
+} // namespace Clusters
+} // namespace app
+} // namespace chip
diff --git a/examples/thermostat/linux/include/thermostat-manager.h b/examples/thermostat/linux/include/thermostat-manager.h
new file mode 100644
index 00000000000000..274f66c66917cf
--- /dev/null
+++ b/examples/thermostat/linux/include/thermostat-manager.h
@@ -0,0 +1,73 @@
+/*
+ *
+ * Copyright (c) 2024 Project CHIP Authors
+ * All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include
+
+class ThermostatManager
+{
+public:
+ CHIP_ERROR Init();
+
+ /// @brief Callback called when any attribute changed on the device
+ void AttributeChangeHandler(chip::EndpointId endpointId, chip::ClusterId clusterId, chip::AttributeId attributeId,
+ uint8_t * value, uint16_t size);
+
+ chip::app::Clusters::Thermostat::SystemModeEnum GetSystemMode();
+ chip::app::Clusters::Thermostat::ThermostatRunningModeEnum GetRunningMode();
+ int16_t GetCurrentTemperature();
+ int16_t GetCurrentHeatingSetPoint();
+ int16_t GetCurrentCoolingSetPoint();
+ uint8_t GetNumberOfPresets();
+ CHIP_ERROR SetSystemMode(chip::app::Clusters::Thermostat::SystemModeEnum systemMode);
+ CHIP_ERROR SetRunningMode(chip::app::Clusters::Thermostat::ThermostatRunningModeEnum runningMode);
+ CHIP_ERROR SetCurrentTemperature(int16_t temperature);
+ CHIP_ERROR SetCurrentHeatingSetPoint(int16_t heatingSetpoint);
+ CHIP_ERROR SetCurrentCoolingSetPoint(int16_t coolingSetpoint);
+
+private:
+ friend ThermostatManager & ThermostatMgr();
+
+ chip::app::Clusters::Thermostat::SystemModeEnum mSystemMode;
+ chip::app::Clusters::Thermostat::ThermostatRunningModeEnum mRunningMode;
+ int16_t mLocalTemperature;
+ int16_t mOccupiedCoolingSetpoint;
+ int16_t mOccupiedHeatingSetpoint;
+ uint8_t mOccupiedSetback;
+
+ static ThermostatManager sThermostatMgr;
+
+ /// @brief attribute handler for the thermostat endpoint
+ void ThermostatEndpointAttributeChangeHandler(chip::ClusterId clusterId, chip::AttributeId attributeId, uint8_t * value,
+ uint16_t size);
+ void ThermostatClusterAttributeChangeHandler(chip::AttributeId attributeId, uint8_t * value, uint16_t size);
+ void LocalTemperatureMeasurementEndpointAttributeChangeHandler(chip::ClusterId clusterId, chip::AttributeId attributeId,
+ uint8_t * value, uint16_t size);
+ void LocalTemperatureMeasurementClusterAttributeChangeHandler(chip::AttributeId attributeId, uint8_t * value, uint16_t size);
+
+ /// @brief Main method that evaluates the current thermostat state and updates attributes
+ void EvalThermostatState();
+ void UpdateRunningModeForHeating();
+ void UpdateRunningModeForCooling();
+};
+
+inline ThermostatManager & ThermostatMgr()
+{
+ return ThermostatManager::sThermostatMgr;
+}
diff --git a/examples/thermostat/linux/main.cpp b/examples/thermostat/linux/main.cpp
index b9f82696e8ce79..2279f02bef3963 100644
--- a/examples/thermostat/linux/main.cpp
+++ b/examples/thermostat/linux/main.cpp
@@ -22,6 +22,8 @@
#include
#include
+#include "thermostat-manager.h"
+
using namespace chip;
using namespace chip::app;
// using namespace chip::app::Clusters;
@@ -74,7 +76,19 @@ void ApplicationShutdown() {}
int main(int argc, char * argv[])
{
- VerifyOrDie(ChipLinuxAppInit(argc, argv) == 0);
+ if (ChipLinuxAppInit(argc, argv) != 0)
+ {
+ return -1;
+ }
+ ChipLogProgress(Zcl, "Starting Thermostat Manager");
+ CHIP_ERROR err = ThermostatManager().Init();
+
+ if (err != CHIP_NO_ERROR)
+ {
+ ChipLogError(AppServer, "Failed to initialize thermostat manager: %" CHIP_ERROR_FORMAT, err.Format());
+ chip::DeviceLayer::PlatformMgr().Shutdown();
+ return -1;
+ }
ChipLinuxAppMainLoop();
return 0;
}
diff --git a/examples/thermostat/linux/thermostat-delegate-impl.cpp b/examples/thermostat/linux/thermostat-delegate-impl.cpp
new file mode 100644
index 00000000000000..491e44a311c3e8
--- /dev/null
+++ b/examples/thermostat/linux/thermostat-delegate-impl.cpp
@@ -0,0 +1,234 @@
+/*
+ *
+ * Copyright (c) 2024 Project CHIP Authors
+ * All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "include/thermostat-delegate-impl.h"
+
+#include
+#include
+#include
+
+using namespace chip;
+using namespace chip::app;
+using namespace chip::app::Clusters::Thermostat;
+using namespace chip::app::Clusters::Thermostat::Structs;
+
+ThermostatDelegate ThermostatDelegate::sInstance;
+
+namespace {
+
+/**
+ * @brief Checks if the presets are matching i.e the presetHandles are the same.
+ *
+ * @param[in] preset The preset to check.
+ * @param[in] presetToMatch The preset to match with.
+ *
+ * @return true If the presets match, false otherwise. If both preset handles are null, returns false
+ */
+bool PresetHandlesExistAndMatch(const PresetStructWithOwnedMembers & preset, const PresetStructWithOwnedMembers & presetToMatch)
+{
+ return !preset.GetPresetHandle().IsNull() && !presetToMatch.GetPresetHandle().IsNull() &&
+ preset.GetPresetHandle().Value().data_equal(presetToMatch.GetPresetHandle().Value());
+}
+
+} // anonymous namespace
+
+ThermostatDelegate::ThermostatDelegate()
+{
+ mNumberOfPresets = kMaxNumberOfPresetTypes * kMaxNumberOfPresetsOfEachType;
+ mNextFreeIndexInPresetsList = 0;
+ mNextFreeIndexInPendingPresetsList = 0;
+
+ InitializePresetTypes();
+ InitializePresets();
+
+ memset(mActivePresetHandleData, 0, sizeof(mActivePresetHandleData));
+ mActivePresetHandleDataSize = 0;
+}
+
+void ThermostatDelegate::InitializePresetTypes()
+{
+ PresetScenarioEnum presetScenarioEnumArray[kMaxNumberOfPresetTypes] = {
+ PresetScenarioEnum::kOccupied, PresetScenarioEnum::kUnoccupied, PresetScenarioEnum::kSleep,
+ PresetScenarioEnum::kWake, PresetScenarioEnum::kVacation, PresetScenarioEnum::kGoingToSleep
+ };
+ static_assert(ArraySize(presetScenarioEnumArray) <= ArraySize(mPresetTypes));
+
+ uint8_t index = 0;
+ for (PresetScenarioEnum presetScenario : presetScenarioEnumArray)
+ {
+ mPresetTypes[index].presetScenario = presetScenario;
+ mPresetTypes[index].numberOfPresets = kMaxNumberOfPresetsOfEachType;
+ mPresetTypes[index].presetTypeFeatures =
+ (presetScenario == PresetScenarioEnum::kOccupied || presetScenario == PresetScenarioEnum::kUnoccupied)
+ ? PresetTypeFeaturesBitmap::kAutomatic
+ : PresetTypeFeaturesBitmap::kSupportsNames;
+ index++;
+ }
+}
+
+void ThermostatDelegate::InitializePresets()
+{
+ // Initialize the presets with 2 built in presets - occupied and unoccupied.
+ PresetScenarioEnum presetScenarioEnumArray[2] = { PresetScenarioEnum::kOccupied, PresetScenarioEnum::kUnoccupied };
+ static_assert(ArraySize(presetScenarioEnumArray) <= ArraySize(mPresets));
+
+ uint8_t index = 0;
+ for (PresetScenarioEnum presetScenario : presetScenarioEnumArray)
+ {
+ mPresets[index].SetPresetScenario(presetScenario);
+
+ // Set the preset handle to the preset scenario value as a unique id.
+ const uint8_t handle[] = { static_cast(presetScenario) };
+ mPresets[index].SetPresetHandle(DataModel::MakeNullable(ByteSpan(handle)));
+ mPresets[index].SetName(NullOptional);
+ int16_t coolingSetpointValue = static_cast(2500 + (index * 100));
+ mPresets[index].SetCoolingSetpoint(MakeOptional(coolingSetpointValue));
+
+ int16_t heatingSetpointValue = static_cast(2100 - (index * 100));
+ mPresets[index].SetHeatingSetpoint(MakeOptional(heatingSetpointValue));
+ mPresets[index].SetBuiltIn(DataModel::MakeNullable(true));
+ index++;
+ }
+
+ // Set the value of the next free index in the presets list.
+ mNextFreeIndexInPresetsList = index;
+}
+
+CHIP_ERROR ThermostatDelegate::GetPresetTypeAtIndex(size_t index, PresetTypeStruct::Type & presetType)
+{
+ if (index < ArraySize(mPresetTypes))
+ {
+ presetType = mPresetTypes[index];
+ return CHIP_NO_ERROR;
+ }
+ return CHIP_ERROR_PROVIDER_LIST_EXHAUSTED;
+}
+
+uint8_t ThermostatDelegate::GetNumberOfPresets()
+{
+ return mNumberOfPresets;
+}
+
+CHIP_ERROR ThermostatDelegate::GetPresetAtIndex(size_t index, PresetStructWithOwnedMembers & preset)
+{
+ if (index < mNextFreeIndexInPresetsList)
+ {
+ preset = mPresets[index];
+ return CHIP_NO_ERROR;
+ }
+ return CHIP_ERROR_PROVIDER_LIST_EXHAUSTED;
+}
+
+CHIP_ERROR ThermostatDelegate::GetActivePresetHandle(MutableByteSpan & activePresetHandle)
+{
+ return CopySpanToMutableSpan(ByteSpan(mActivePresetHandleData, mActivePresetHandleDataSize), activePresetHandle);
+}
+
+CHIP_ERROR ThermostatDelegate::SetActivePresetHandle(const DataModel::Nullable & newActivePresetHandle)
+{
+ if (!newActivePresetHandle.IsNull())
+ {
+ size_t newActivePresetHandleSize = newActivePresetHandle.Value().size();
+ if (newActivePresetHandleSize > sizeof(mActivePresetHandleData))
+ {
+ ChipLogError(NotSpecified,
+ "Failed to set ActivePresetHandle. newActivePresetHandle size %u is larger than preset handle size %u",
+ static_cast(newActivePresetHandleSize), static_cast(kPresetHandleSize));
+ return CHIP_ERROR_NO_MEMORY;
+ }
+ memcpy(mActivePresetHandleData, newActivePresetHandle.Value().data(), newActivePresetHandleSize);
+ mActivePresetHandleDataSize = newActivePresetHandleSize;
+ ChipLogDetail(NotSpecified, "Set ActivePresetHandle to ");
+ ChipLogByteSpan(NotSpecified, newActivePresetHandle.Value());
+ }
+ else
+ {
+ memset(mActivePresetHandleData, 0, sizeof(mActivePresetHandleData));
+ mActivePresetHandleDataSize = 0;
+ ChipLogDetail(NotSpecified, "Clear ActivePresetHandle");
+ }
+ return CHIP_NO_ERROR;
+}
+
+CHIP_ERROR ThermostatDelegate::AppendToPendingPresetList(const PresetStruct::Type & preset)
+{
+ if (mNextFreeIndexInPendingPresetsList < ArraySize(mPendingPresets))
+ {
+ mPendingPresets[mNextFreeIndexInPendingPresetsList].SetPresetScenario(preset.presetScenario);
+ mPendingPresets[mNextFreeIndexInPendingPresetsList].SetPresetHandle(preset.presetHandle);
+ mPendingPresets[mNextFreeIndexInPendingPresetsList].SetName(preset.name);
+ mPendingPresets[mNextFreeIndexInPendingPresetsList].SetCoolingSetpoint(preset.coolingSetpoint);
+ mPendingPresets[mNextFreeIndexInPendingPresetsList].SetHeatingSetpoint(preset.heatingSetpoint);
+ mPendingPresets[mNextFreeIndexInPendingPresetsList].SetBuiltIn(preset.builtIn);
+ mNextFreeIndexInPendingPresetsList++;
+ return CHIP_NO_ERROR;
+ }
+ return CHIP_ERROR_WRITE_FAILED;
+}
+
+CHIP_ERROR ThermostatDelegate::GetPendingPresetAtIndex(size_t index, PresetStructWithOwnedMembers & preset)
+{
+ if (index < mNextFreeIndexInPendingPresetsList)
+ {
+ preset = mPendingPresets[index];
+ return CHIP_NO_ERROR;
+ }
+ return CHIP_ERROR_PROVIDER_LIST_EXHAUSTED;
+}
+
+CHIP_ERROR ThermostatDelegate::ApplyPendingPresets()
+{
+
+ // TODO: #34546 - Need to support deletion of presets that are removed from Presets.
+ for (uint8_t indexInPendingPresets = 0; indexInPendingPresets < mNextFreeIndexInPendingPresetsList; indexInPendingPresets++)
+ {
+ const PresetStructWithOwnedMembers & pendingPreset = mPendingPresets[indexInPendingPresets];
+
+ bool found = false;
+ for (uint8_t indexInPresets = 0; indexInPresets < mNextFreeIndexInPresetsList; indexInPresets++)
+ {
+ if (PresetHandlesExistAndMatch(mPresets[indexInPresets], pendingPreset))
+ {
+ found = true;
+
+ // Replace the preset with the pending preset
+ mPresets[indexInPresets] = pendingPreset;
+ }
+ }
+
+ // If pending preset was not found in the Presets list, append to the Presets list.
+ if (!found)
+ {
+
+ mPresets[mNextFreeIndexInPresetsList] = pendingPreset;
+
+ // TODO: #34556 Since we support only one preset of each type, using the octet string containing the preset scenario
+ // suffices as the unique preset handle. Need to fix this to actually provide unique handles once multiple presets of
+ // each type are supported.
+ const uint8_t handle[] = { static_cast(pendingPreset.GetPresetScenario()) };
+ mPresets[mNextFreeIndexInPresetsList].SetPresetHandle(DataModel::MakeNullable(ByteSpan(handle)));
+ mNextFreeIndexInPresetsList++;
+ }
+ }
+ return CHIP_NO_ERROR;
+}
+
+void ThermostatDelegate::ClearPendingPresetList()
+{
+ mNextFreeIndexInPendingPresetsList = 0;
+}
diff --git a/examples/thermostat/linux/thermostat-manager.cpp b/examples/thermostat/linux/thermostat-manager.cpp
new file mode 100644
index 00000000000000..e96f04a78d49e9
--- /dev/null
+++ b/examples/thermostat/linux/thermostat-manager.cpp
@@ -0,0 +1,515 @@
+/*
+ *
+ * Copyright (c) 2024 Project CHIP Authors
+ * All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**********************************************************
+ * Includes
+ *********************************************************/
+
+#include "include/thermostat-manager.h"
+#include "include/thermostat-delegate-impl.h"
+
+#include
+#include
+#include
+#include
+
+/**********************************************************
+ * Defines and Constants
+ *********************************************************/
+
+using namespace chip;
+using namespace chip::app;
+using namespace chip::app::DataModel;
+using namespace chip::Controller;
+using namespace chip::app::Clusters;
+using namespace chip::app::Clusters::Thermostat;
+using namespace chip::app::Clusters::Thermostat::Structs;
+using namespace chip::app::Clusters::Thermostat::Attributes;
+using namespace chip::app::Clusters::TemperatureMeasurement;
+using namespace chip::app::Clusters::TemperatureMeasurement::Attributes;
+using namespace Protocols::InteractionModel;
+
+using namespace chip::DeviceLayer;
+
+static constexpr EndpointId kThermostatEndpoint = 1;
+
+static constexpr uint16_t kMaxIntervalCeilingSeconds = 3600;
+
+static const char * SystemModeString(SystemModeEnum systemMode);
+static const char * RunningModeString(ThermostatRunningModeEnum runningMode);
+
+/**********************************************************
+ * Variable declarations
+ *********************************************************/
+
+ThermostatManager ThermostatManager::sThermostatMgr;
+
+namespace {
+
+CHIP_ERROR ChipErrorFromStatusCode(Status status)
+{
+ StatusIB statusIB(status);
+ return statusIB.ToChipError();
+}
+
+template
+static void OnAttributeChangeReported(const ConcreteDataAttributePath & path, const DecodableAttributeType & value);
+
+template <>
+void OnAttributeChangeReported(const ConcreteDataAttributePath & path,
+ const MeasuredValue::TypeInfo::DecodableType & value)
+{
+ ClusterId clusterId = path.mClusterId;
+ if (clusterId != TemperatureMeasurement::Id)
+ {
+ ChipLogError(AppServer,
+ "Attribute change reported for TemperatureMeasurement cluster on incorrect cluster id " ChipLogFormatMEI,
+ ChipLogValueMEI(clusterId));
+ return;
+ }
+
+ AttributeId attributeId = path.mAttributeId;
+ if (attributeId != MeasuredValue::Id)
+ {
+ ChipLogError(AppServer,
+ "Attribute change reported for TemperatureMeasurement cluster for incorrect attribute" ChipLogFormatMEI,
+ ChipLogValueMEI(attributeId));
+ return;
+ }
+
+ if (!value.IsNull())
+ {
+ ChipLogDetail(AppServer, "Attribute change reported for TemperatureMeasurement cluster - MeasuredValue is %d",
+ value.Value());
+ }
+}
+
+static void OnError(const ConcreteDataAttributePath * path, ChipError err)
+{
+ ChipLogError(AppServer,
+ "Subscribing to cluster Id " ChipLogFormatMEI " and attribute Id " ChipLogFormatMEI
+ " failed with error %" CHIP_ERROR_FORMAT,
+ ChipLogValueMEI(path->mClusterId), ChipLogValueMEI(path->mAttributeId), err.Format());
+}
+
+static void OnSubscriptionEstablished(const ReadClient & client, unsigned int value)
+{
+ ChipLogDetail(AppServer, "OnSubscriptionEstablished with subscription Id: %d", value);
+}
+
+template
+void SubscribeToAttribute(ClusterId clusterId, AttributeId attributeId, const EmberBindingTableEntry & binding,
+ OperationalDeviceProxy * peer_device)
+{
+ VerifyOrReturn(peer_device->GetSecureSession().HasValue(),
+ ChipLogError(AppServer, "SubscribeToAttribute failed. Secure session is null"));
+
+ SubscribeAttribute(
+ peer_device->GetExchangeManager(), peer_device->GetSecureSession().Value(), binding.remote, clusterId, attributeId,
+ &OnAttributeChangeReported, &OnError, 0, kMaxIntervalCeilingSeconds, &OnSubscriptionEstablished,
+ nullptr, true /* fabricFiltered */, false /* keepExistingSubscription */);
+}
+
+static void ThermostatBoundDeviceChangedHandler(const EmberBindingTableEntry & binding, OperationalDeviceProxy * peer_device,
+ void * context)
+{
+ VerifyOrReturn(binding.clusterId.has_value(), ChipLogError(AppServer, "Cluster Id is null"));
+ ClusterId clusterId = binding.clusterId.value();
+
+ switch (clusterId)
+ {
+ case TemperatureMeasurement::Id:
+
+ // Subscribe to the MeasuredValue attribute
+ SubscribeToAttribute(clusterId, MeasuredValue::Id, binding, peer_device);
+ break;
+ default:
+ ChipLogError(AppServer, "Unsupported Cluster Id");
+ break;
+ }
+}
+
+void NotifyBoundClusterChangedForAllClusters()
+{
+ BindingManager::GetInstance().NotifyBoundClusterChanged(kThermostatEndpoint, TemperatureMeasurement::Id, nullptr);
+}
+
+static void OnPlatformChipDeviceEvent(const DeviceLayer::ChipDeviceEvent * event, intptr_t arg)
+{
+ if (event->Type == DeviceLayer::DeviceEventType::kBindingsChangedViaCluster)
+ {
+ NotifyBoundClusterChangedForAllClusters();
+ }
+}
+
+void InitBindingManager(intptr_t context)
+{
+ auto & server = Server::GetInstance();
+ CHIP_ERROR error = BindingManager::GetInstance().Init(
+ { &server.GetFabricTable(), server.GetCASESessionManager(), &server.GetPersistentStorage() });
+
+ if (error != CHIP_NO_ERROR)
+ {
+ ChipLogError(AppServer, "Failed to init binding manager");
+ }
+
+ BindingManager::GetInstance().RegisterBoundDeviceChangedHandler(ThermostatBoundDeviceChangedHandler);
+ NotifyBoundClusterChangedForAllClusters();
+}
+
+} // anonymous namespace
+
+CHIP_ERROR ThermostatManager::Init()
+{
+ // Init binding manager
+
+ DeviceLayer::PlatformMgr().AddEventHandler(OnPlatformChipDeviceEvent, reinterpret_cast(this));
+ DeviceLayer::PlatformMgr().ScheduleWork(InitBindingManager);
+
+ mLocalTemperature = GetCurrentTemperature();
+ mSystemMode = GetSystemMode();
+ mRunningMode = GetRunningMode();
+ mOccupiedCoolingSetpoint = GetCurrentCoolingSetPoint();
+ mOccupiedHeatingSetpoint = GetCurrentHeatingSetPoint();
+ // TODO: Gotta expose this properly on attribute
+ mOccupiedSetback = 5; // 0.5 C
+
+ ChipLogError(AppServer,
+ "Initialized a thermostat with \n "
+ "mSystemMode: %u (%s) \n mRunningMode: %u (%s) \n mLocalTemperature: %d \n mOccupiedHeatingSetpoint: %d \n "
+ "mOccupiedCoolingSetpoint: %d"
+ "NumberOfPresets: %d",
+ to_underlying(mSystemMode), SystemModeString(mSystemMode), to_underlying(mRunningMode),
+ RunningModeString(mRunningMode), mLocalTemperature, mOccupiedHeatingSetpoint, mOccupiedCoolingSetpoint,
+ GetNumberOfPresets());
+
+ // TODO: Should this be called later?
+ EvalThermostatState();
+
+ return CHIP_NO_ERROR;
+}
+
+void ThermostatManager::AttributeChangeHandler(EndpointId endpointId, ClusterId clusterId, AttributeId attributeId, uint8_t * value,
+ uint16_t size)
+{
+ switch (endpointId)
+ {
+ case kThermostatEndpoint:
+ ThermostatEndpointAttributeChangeHandler(clusterId, attributeId, value, size);
+ break;
+
+ default:
+ ChipLogError(AppServer, "Attribute change reported for Thermostat on incorrect endpoint. Ignoring.");
+ break;
+ }
+}
+
+void ThermostatManager::ThermostatEndpointAttributeChangeHandler(ClusterId clusterId, AttributeId attributeId, uint8_t * value,
+ uint16_t size)
+{
+ switch (clusterId)
+ {
+ case Thermostat::Id:
+ ThermostatClusterAttributeChangeHandler(attributeId, value, size);
+ break;
+
+ default:
+ ChipLogError(AppServer,
+ "Attribute change reported for Thermostat on incorrect cluster for the thermostat endpoint. Ignoring.");
+ break;
+ }
+}
+
+void ThermostatManager::ThermostatClusterAttributeChangeHandler(AttributeId attributeId, uint8_t * value, uint16_t size)
+{
+ switch (attributeId)
+ {
+ case LocalTemperature::Id: {
+ memcpy(&mLocalTemperature, value, size);
+ ChipLogError(AppServer, "Local temperature changed to %d", mLocalTemperature);
+ EvalThermostatState();
+ }
+ break;
+
+ case OccupiedCoolingSetpoint::Id: {
+ memcpy(&mOccupiedCoolingSetpoint, value, size);
+ ChipLogError(AppServer, "Cooling temperature changed to %d", mOccupiedCoolingSetpoint);
+ EvalThermostatState();
+ }
+ break;
+
+ case OccupiedHeatingSetpoint::Id: {
+ memcpy(&mOccupiedHeatingSetpoint, value, size);
+ ChipLogError(AppServer, "Heating temperature changed to %d", mOccupiedHeatingSetpoint);
+ EvalThermostatState();
+ }
+ break;
+
+ case SystemMode::Id: {
+ mSystemMode = static_cast(*value);
+ ChipLogError(AppServer, "System mode changed to %u (%s)", *value, SystemModeString(mSystemMode));
+ EvalThermostatState();
+ }
+ break;
+
+ case ThermostatRunningMode::Id: {
+ mRunningMode = static_cast(*value);
+ ChipLogError(AppServer, "Running mode changed to %u (%s)", *value, RunningModeString(mRunningMode));
+ }
+ break;
+
+ default: {
+ ChipLogError(AppServer, "Unhandled thermostat attribute %x", attributeId);
+ return;
+ }
+ break;
+ }
+}
+
+SystemModeEnum ThermostatManager::GetSystemMode()
+{
+ SystemModeEnum systemMode;
+ SystemMode::Get(kThermostatEndpoint, &systemMode);
+ return systemMode;
+}
+
+ThermostatRunningModeEnum ThermostatManager::GetRunningMode()
+{
+ ThermostatRunningModeEnum runningMode;
+ ThermostatRunningMode::Get(kThermostatEndpoint, &runningMode);
+ return runningMode;
+}
+
+int16_t ThermostatManager::GetCurrentTemperature()
+{
+ DataModel::Nullable currentTemperature;
+ currentTemperature.SetNull();
+ LocalTemperature::Get(kThermostatEndpoint, currentTemperature);
+ return currentTemperature.ValueOr(0);
+}
+
+int16_t ThermostatManager::GetCurrentHeatingSetPoint()
+{
+ int16_t heatingSetpoint;
+ OccupiedHeatingSetpoint::Get(kThermostatEndpoint, &heatingSetpoint);
+ return heatingSetpoint;
+}
+
+int16_t ThermostatManager::GetCurrentCoolingSetPoint()
+{
+ int16_t coolingSetpoint;
+ OccupiedCoolingSetpoint::Get(kThermostatEndpoint, &coolingSetpoint);
+ return coolingSetpoint;
+}
+
+uint8_t ThermostatManager::GetNumberOfPresets()
+{
+ return ThermostatDelegate::GetInstance().GetNumberOfPresets();
+}
+
+CHIP_ERROR ThermostatManager::SetSystemMode(SystemModeEnum systemMode)
+{
+ uint8_t systemModeValue = to_underlying(systemMode);
+ if (mSystemMode == systemMode)
+ {
+ ChipLogDetail(AppServer, "Already in system mode: %u (%s)", systemModeValue, SystemModeString(systemMode));
+ return CHIP_NO_ERROR;
+ }
+
+ ChipLogError(AppServer, "Setting system mode: %u (%s)", systemModeValue, SystemModeString(systemMode));
+ return ChipErrorFromStatusCode(SystemMode::Set(kThermostatEndpoint, systemMode));
+}
+
+CHIP_ERROR ThermostatManager::SetRunningMode(ThermostatRunningModeEnum runningMode)
+{
+ uint8_t runningModeValue = to_underlying(runningMode);
+ if (mRunningMode == runningMode)
+ {
+ ChipLogDetail(AppServer, "Already in running mode: %u (%s)", runningModeValue, RunningModeString(runningMode));
+ return CHIP_NO_ERROR;
+ }
+
+ ChipLogError(AppServer, "Setting running mode: %u (%s)", runningModeValue, RunningModeString(runningMode));
+ return ChipErrorFromStatusCode(ThermostatRunningMode::Set(kThermostatEndpoint, runningMode));
+}
+
+CHIP_ERROR ThermostatManager::SetCurrentTemperature(int16_t temperature)
+{
+ return ChipErrorFromStatusCode(LocalTemperature::Set(kThermostatEndpoint, temperature));
+}
+
+CHIP_ERROR ThermostatManager::SetCurrentHeatingSetPoint(int16_t heatingSetpoint)
+{
+ return ChipErrorFromStatusCode(OccupiedHeatingSetpoint::Set(kThermostatEndpoint, heatingSetpoint));
+}
+
+CHIP_ERROR ThermostatManager::SetCurrentCoolingSetPoint(int16_t coolingSetpoint)
+{
+ return ChipErrorFromStatusCode(OccupiedCoolingSetpoint::Set(kThermostatEndpoint, coolingSetpoint));
+}
+
+void ThermostatManager::EvalThermostatState()
+{
+ ChipLogError(AppServer,
+ "Eval Thermostat Running Mode \n "
+ "mSystemMode: %u (%s) \n mRunningMode: %u (%s) \n mLocalTemperature: %d \n mOccupiedHeatingSetpoint: %d \n "
+ "mOccupiedCoolingSetpoint: %d",
+ to_underlying(mSystemMode), SystemModeString(mSystemMode), to_underlying(mRunningMode),
+ RunningModeString(mRunningMode), mLocalTemperature, mOccupiedHeatingSetpoint, mOccupiedCoolingSetpoint);
+
+ switch (mSystemMode)
+ {
+ case SystemModeEnum::kOff: {
+ SetRunningMode(ThermostatRunningModeEnum::kOff);
+ break;
+ }
+ case SystemModeEnum::kHeat: {
+ UpdateRunningModeForHeating();
+ break;
+ }
+ case SystemModeEnum::kCool: {
+ UpdateRunningModeForCooling();
+ break;
+ }
+ case SystemModeEnum::kAuto: {
+ UpdateRunningModeForHeating();
+ UpdateRunningModeForCooling();
+ break;
+ }
+ default:
+ break;
+ }
+}
+
+void ThermostatManager::UpdateRunningModeForHeating()
+{
+ const int16_t heatingOnThreshold = mOccupiedHeatingSetpoint - static_cast(mOccupiedSetback * 10);
+ const int16_t heatingOffThreshold = mOccupiedHeatingSetpoint + static_cast(mOccupiedSetback * 10);
+
+ if (mRunningMode == ThermostatRunningModeEnum::kHeat)
+ {
+ if (mLocalTemperature >= heatingOffThreshold)
+ {
+ ChipLogDetail(AppServer, "Eval Heat - Turning off");
+ SetRunningMode(ThermostatRunningModeEnum::kOff);
+ }
+ else
+ {
+ ChipLogDetail(AppServer, "Eval Heat - Keep Heating");
+ }
+ }
+ else
+ {
+ if (mLocalTemperature <= heatingOnThreshold)
+ {
+ ChipLogDetail(AppServer, "Eval Heat - Turn on");
+ SetRunningMode(ThermostatRunningModeEnum::kHeat);
+ }
+ else
+ {
+ ChipLogDetail(AppServer, "Eval Heat - Nothing to do");
+ }
+ }
+}
+
+void ThermostatManager::UpdateRunningModeForCooling()
+{
+ const int16_t coolingOffThreshold = mOccupiedCoolingSetpoint - static_cast(mOccupiedSetback * 10);
+ const int16_t coolingOnThreshold = mOccupiedCoolingSetpoint + static_cast(mOccupiedSetback * 10);
+
+ if (mRunningMode == ThermostatRunningModeEnum::kCool)
+ {
+ if (mLocalTemperature <= coolingOffThreshold)
+ {
+ ChipLogDetail(AppServer, "Eval Cool - Turning off");
+ SetRunningMode(ThermostatRunningModeEnum::kOff);
+ }
+ else
+ {
+ ChipLogDetail(AppServer, "Eval Cool - Keep Cooling");
+ }
+ }
+ else
+ {
+ if (mLocalTemperature >= coolingOnThreshold)
+ {
+ ChipLogDetail(AppServer, "Eval Cool - Turn on");
+ SetRunningMode(ThermostatRunningModeEnum::kCool);
+ }
+ else
+ {
+ ChipLogDetail(AppServer, "Eval Cool - Nothing to do");
+ }
+ }
+}
+
+static const char * SystemModeString(SystemModeEnum systemMode)
+{
+ switch (systemMode)
+ {
+ case SystemModeEnum::kOff:
+ return "Off";
+ case SystemModeEnum::kAuto:
+ return "Auto";
+ case SystemModeEnum::kCool:
+ return "Cool";
+ case SystemModeEnum::kHeat:
+ return "Heat";
+ default:
+ return "Unknown";
+ }
+}
+
+static const char * RunningModeString(ThermostatRunningModeEnum runningMode)
+{
+ switch (runningMode)
+ {
+ case ThermostatRunningModeEnum::kOff:
+ return "Off";
+ case ThermostatRunningModeEnum::kCool:
+ return "Cool";
+ case ThermostatRunningModeEnum::kHeat:
+ return "Heat";
+ default:
+ return "Unknown";
+ }
+}
+
+void MatterPostAttributeChangeCallback(const ConcreteAttributePath & attributePath, uint8_t type, uint16_t size, uint8_t * value)
+{
+ ClusterId clusterId = attributePath.mClusterId;
+ AttributeId attributeId = attributePath.mAttributeId;
+ ChipLogProgress(AppServer, "Cluster callback: " ChipLogFormatMEI, ChipLogValueMEI(clusterId));
+
+ ChipLogProgress(AppServer,
+ "Attribute ID changed: " ChipLogFormatMEI " Endpoint: %d ClusterId: " ChipLogFormatMEI
+ " Type: %u Value: %u, length %u",
+ ChipLogValueMEI(attributeId), attributePath.mEndpointId, ChipLogValueMEI(clusterId), type, *value, size);
+
+ ThermostatMgr().AttributeChangeHandler(attributePath.mEndpointId, clusterId, attributeId, value, size);
+}
+
+void emberAfThermostatClusterInitCallback(EndpointId endpoint)
+{
+ // Register the delegate for the Thermostat
+ auto & delegate = ThermostatDelegate::GetInstance();
+
+ // Set the default delegate for endpoint kThermostatEndpoint.
+ VerifyOrDie(endpoint == kThermostatEndpoint);
+ SetDefaultDelegate(endpoint, &delegate);
+}
diff --git a/examples/thermostat/nxp/zap/thermostat_matter_thread.matter b/examples/thermostat/nxp/zap/thermostat_matter_thread.matter
index 00917f2d9a593e..6d322db15086c3 100644
--- a/examples/thermostat/nxp/zap/thermostat_matter_thread.matter
+++ b/examples/thermostat/nxp/zap/thermostat_matter_thread.matter
@@ -254,7 +254,7 @@ cluster Binding = 30 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -270,12 +270,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -311,17 +341,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -931,6 +985,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -939,6 +996,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -949,6 +1010,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -982,12 +1047,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
@@ -1968,7 +2044,8 @@ cluster Thermostat = 513 {
kSleep = 3;
kWake = 4;
kVacation = 5;
- kUserDefined = 6;
+ kGoingToSleep = 6;
+ kUserDefined = 254;
}
enum SetpointChangeSourceEnum : enum8 {
@@ -2094,11 +2171,6 @@ cluster Thermostat = 513 {
kSupportsOff = 0x8;
}
- bitmap TemperatureSetpointHoldPolicyBitmap : bitmap8 {
- kHoldDurationElapsed = 0x1;
- kHoldDurationElapsedOrPresetChanged = 0x2;
- }
-
struct ScheduleTransitionStruct {
ScheduleDayOfWeekBitmap dayOfWeek = 0;
int16u transitionTime = 1;
@@ -2204,8 +2276,7 @@ cluster Thermostat = 513 {
attribute access(write: manage) optional PresetStruct presets[] = 80;
attribute access(write: manage) optional ScheduleStruct schedules[] = 81;
readonly attribute optional boolean presetsSchedulesEditable = 82;
- readonly attribute optional TemperatureSetpointHoldPolicyBitmap temperatureSetpointHoldPolicy = 83;
- readonly attribute optional nullable epoch_s setpointHoldExpiryTimestamp = 84;
+ readonly attribute optional nullable epoch_s setpointHoldExpiryTimestamp = 83;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -2249,10 +2320,6 @@ cluster Thermostat = 513 {
int16u timeoutSeconds = 0;
}
- request struct SetTemperatureSetpointHoldPolicyRequest {
- TemperatureSetpointHoldPolicyBitmap temperatureSetpointHoldPolicy = 0;
- }
-
/** Command description for SetpointRaiseLower */
command SetpointRaiseLower(SetpointRaiseLowerRequest): DefaultSuccess = 0;
/** Command description for SetWeeklySchedule */
@@ -2271,8 +2338,6 @@ cluster Thermostat = 513 {
command access(invoke: manage) CancelPresetsSchedulesEditRequest(): DefaultSuccess = 8;
/** This command is used to notify the server that all edits are done and should be committed. */
command access(invoke: manage) CommitPresetsSchedulesRequest(): DefaultSuccess = 9;
- /** This command sets the set point hold policy. */
- command SetTemperatureSetpointHoldPolicy(SetTemperatureSetpointHoldPolicyRequest): DefaultSuccess = 11;
}
endpoint 0 {
diff --git a/examples/thermostat/nxp/zap/thermostat_matter_wifi.matter b/examples/thermostat/nxp/zap/thermostat_matter_wifi.matter
index a8a65c2c4ad611..2c68853b854ad9 100644
--- a/examples/thermostat/nxp/zap/thermostat_matter_wifi.matter
+++ b/examples/thermostat/nxp/zap/thermostat_matter_wifi.matter
@@ -254,7 +254,7 @@ cluster Binding = 30 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -270,12 +270,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -311,17 +341,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -931,6 +985,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -939,6 +996,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -949,6 +1010,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -982,12 +1047,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
@@ -1879,7 +1955,8 @@ cluster Thermostat = 513 {
kSleep = 3;
kWake = 4;
kVacation = 5;
- kUserDefined = 6;
+ kGoingToSleep = 6;
+ kUserDefined = 254;
}
enum SetpointChangeSourceEnum : enum8 {
@@ -2005,11 +2082,6 @@ cluster Thermostat = 513 {
kSupportsOff = 0x8;
}
- bitmap TemperatureSetpointHoldPolicyBitmap : bitmap8 {
- kHoldDurationElapsed = 0x1;
- kHoldDurationElapsedOrPresetChanged = 0x2;
- }
-
struct ScheduleTransitionStruct {
ScheduleDayOfWeekBitmap dayOfWeek = 0;
int16u transitionTime = 1;
@@ -2115,8 +2187,7 @@ cluster Thermostat = 513 {
attribute access(write: manage) optional PresetStruct presets[] = 80;
attribute access(write: manage) optional ScheduleStruct schedules[] = 81;
readonly attribute optional boolean presetsSchedulesEditable = 82;
- readonly attribute optional TemperatureSetpointHoldPolicyBitmap temperatureSetpointHoldPolicy = 83;
- readonly attribute optional nullable epoch_s setpointHoldExpiryTimestamp = 84;
+ readonly attribute optional nullable epoch_s setpointHoldExpiryTimestamp = 83;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -2160,10 +2231,6 @@ cluster Thermostat = 513 {
int16u timeoutSeconds = 0;
}
- request struct SetTemperatureSetpointHoldPolicyRequest {
- TemperatureSetpointHoldPolicyBitmap temperatureSetpointHoldPolicy = 0;
- }
-
/** Command description for SetpointRaiseLower */
command SetpointRaiseLower(SetpointRaiseLowerRequest): DefaultSuccess = 0;
/** Command description for SetWeeklySchedule */
@@ -2182,8 +2249,6 @@ cluster Thermostat = 513 {
command access(invoke: manage) CancelPresetsSchedulesEditRequest(): DefaultSuccess = 8;
/** This command is used to notify the server that all edits are done and should be committed. */
command access(invoke: manage) CommitPresetsSchedulesRequest(): DefaultSuccess = 9;
- /** This command sets the set point hold policy. */
- command SetTemperatureSetpointHoldPolicy(SetTemperatureSetpointHoldPolicyRequest): DefaultSuccess = 11;
}
endpoint 0 {
diff --git a/examples/thermostat/qpg/zap/thermostaticRadiatorValve.matter b/examples/thermostat/qpg/zap/thermostaticRadiatorValve.matter
index a775e536ac841e..609460644955c3 100644
--- a/examples/thermostat/qpg/zap/thermostaticRadiatorValve.matter
+++ b/examples/thermostat/qpg/zap/thermostaticRadiatorValve.matter
@@ -254,7 +254,7 @@ cluster Binding = 30 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -270,12 +270,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -311,17 +341,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -611,6 +665,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -619,6 +676,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -629,6 +690,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -662,12 +727,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
@@ -1576,7 +1652,8 @@ cluster Thermostat = 513 {
kSleep = 3;
kWake = 4;
kVacation = 5;
- kUserDefined = 6;
+ kGoingToSleep = 6;
+ kUserDefined = 254;
}
enum SetpointChangeSourceEnum : enum8 {
@@ -1702,11 +1779,6 @@ cluster Thermostat = 513 {
kSupportsOff = 0x8;
}
- bitmap TemperatureSetpointHoldPolicyBitmap : bitmap8 {
- kHoldDurationElapsed = 0x1;
- kHoldDurationElapsedOrPresetChanged = 0x2;
- }
-
struct ScheduleTransitionStruct {
ScheduleDayOfWeekBitmap dayOfWeek = 0;
int16u transitionTime = 1;
@@ -1812,8 +1884,7 @@ cluster Thermostat = 513 {
attribute access(write: manage) optional PresetStruct presets[] = 80;
attribute access(write: manage) optional ScheduleStruct schedules[] = 81;
readonly attribute optional boolean presetsSchedulesEditable = 82;
- readonly attribute optional TemperatureSetpointHoldPolicyBitmap temperatureSetpointHoldPolicy = 83;
- readonly attribute optional nullable epoch_s setpointHoldExpiryTimestamp = 84;
+ readonly attribute optional nullable epoch_s setpointHoldExpiryTimestamp = 83;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -1857,10 +1928,6 @@ cluster Thermostat = 513 {
int16u timeoutSeconds = 0;
}
- request struct SetTemperatureSetpointHoldPolicyRequest {
- TemperatureSetpointHoldPolicyBitmap temperatureSetpointHoldPolicy = 0;
- }
-
/** Command description for SetpointRaiseLower */
command SetpointRaiseLower(SetpointRaiseLowerRequest): DefaultSuccess = 0;
/** Command description for SetWeeklySchedule */
@@ -1879,8 +1946,6 @@ cluster Thermostat = 513 {
command access(invoke: manage) CancelPresetsSchedulesEditRequest(): DefaultSuccess = 8;
/** This command is used to notify the server that all edits are done and should be committed. */
command access(invoke: manage) CommitPresetsSchedulesRequest(): DefaultSuccess = 9;
- /** This command sets the set point hold policy. */
- command SetTemperatureSetpointHoldPolicy(SetTemperatureSetpointHoldPolicyRequest): DefaultSuccess = 11;
}
/** An interface for configuring the user interface of a thermostat (which may be remote from the thermostat). */
diff --git a/examples/thermostat/thermostat-common/thermostat.matter b/examples/thermostat/thermostat-common/thermostat.matter
index 2312df8c61fdc1..800182f38d0c67 100644
--- a/examples/thermostat/thermostat-common/thermostat.matter
+++ b/examples/thermostat/thermostat-common/thermostat.matter
@@ -254,7 +254,7 @@ cluster Binding = 30 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -270,12 +270,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -311,17 +341,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -672,6 +726,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -680,6 +737,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -690,6 +751,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -723,12 +788,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
@@ -1756,7 +1832,8 @@ cluster Thermostat = 513 {
kSleep = 3;
kWake = 4;
kVacation = 5;
- kUserDefined = 6;
+ kGoingToSleep = 6;
+ kUserDefined = 254;
}
enum SetpointChangeSourceEnum : enum8 {
@@ -1882,11 +1959,6 @@ cluster Thermostat = 513 {
kSupportsOff = 0x8;
}
- bitmap TemperatureSetpointHoldPolicyBitmap : bitmap8 {
- kHoldDurationElapsed = 0x1;
- kHoldDurationElapsedOrPresetChanged = 0x2;
- }
-
struct ScheduleTransitionStruct {
ScheduleDayOfWeekBitmap dayOfWeek = 0;
int16u transitionTime = 1;
@@ -1992,8 +2064,7 @@ cluster Thermostat = 513 {
attribute access(write: manage) optional PresetStruct presets[] = 80;
attribute access(write: manage) optional ScheduleStruct schedules[] = 81;
readonly attribute optional boolean presetsSchedulesEditable = 82;
- readonly attribute optional TemperatureSetpointHoldPolicyBitmap temperatureSetpointHoldPolicy = 83;
- readonly attribute optional nullable epoch_s setpointHoldExpiryTimestamp = 84;
+ readonly attribute optional nullable epoch_s setpointHoldExpiryTimestamp = 83;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -2037,10 +2108,6 @@ cluster Thermostat = 513 {
int16u timeoutSeconds = 0;
}
- request struct SetTemperatureSetpointHoldPolicyRequest {
- TemperatureSetpointHoldPolicyBitmap temperatureSetpointHoldPolicy = 0;
- }
-
/** Command description for SetpointRaiseLower */
command SetpointRaiseLower(SetpointRaiseLowerRequest): DefaultSuccess = 0;
/** Command description for SetWeeklySchedule */
@@ -2059,8 +2126,6 @@ cluster Thermostat = 513 {
command access(invoke: manage) CancelPresetsSchedulesEditRequest(): DefaultSuccess = 8;
/** This command is used to notify the server that all edits are done and should be committed. */
command access(invoke: manage) CommitPresetsSchedulesRequest(): DefaultSuccess = 9;
- /** This command sets the set point hold policy. */
- command SetTemperatureSetpointHoldPolicy(SetTemperatureSetpointHoldPolicyRequest): DefaultSuccess = 11;
}
/** An interface for configuring the user interface of a thermostat (which may be remote from the thermostat). */
@@ -2505,13 +2570,22 @@ endpoint 1 {
ram attribute minSetpointDeadBand default = 0x19;
ram attribute controlSequenceOfOperation default = 0x04;
persist attribute systemMode default = 0x01;
+ callback attribute presetTypes;
+ ram attribute numberOfPresets default = 0;
+ ram attribute activePresetHandle;
+ callback attribute presets;
+ ram attribute presetsSchedulesEditable;
callback attribute generatedCommandList;
callback attribute acceptedCommandList;
callback attribute attributeList;
- ram attribute featureMap default = 0x23;
+ ram attribute featureMap default = 0x123;
ram attribute clusterRevision default = 6;
handle command SetpointRaiseLower;
+ handle command SetActivePresetRequest;
+ handle command StartPresetsSchedulesEditRequest;
+ handle command CancelPresetsSchedulesEditRequest;
+ handle command CommitPresetsSchedulesRequest;
}
server cluster ThermostatUserInterfaceConfiguration {
diff --git a/examples/thermostat/thermostat-common/thermostat.zap b/examples/thermostat/thermostat-common/thermostat.zap
index 288a84a921636c..483b79d7d434f5 100644
--- a/examples/thermostat/thermostat-common/thermostat.zap
+++ b/examples/thermostat/thermostat-common/thermostat.zap
@@ -4659,6 +4659,38 @@
"source": "client",
"isIncoming": 1,
"isEnabled": 1
+ },
+ {
+ "name": "SetActivePresetRequest",
+ "code": 6,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 1,
+ "isEnabled": 1
+ },
+ {
+ "name": "StartPresetsSchedulesEditRequest",
+ "code": 7,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 1,
+ "isEnabled": 1
+ },
+ {
+ "name": "CancelPresetsSchedulesEditRequest",
+ "code": 8,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 1,
+ "isEnabled": 1
+ },
+ {
+ "name": "CommitPresetsSchedulesRequest",
+ "code": 9,
+ "mfgCode": null,
+ "source": "client",
+ "isIncoming": 1,
+ "isEnabled": 1
}
],
"attributes": [
@@ -4886,6 +4918,86 @@
"maxInterval": 65344,
"reportableChange": 0
},
+ {
+ "name": "PresetTypes",
+ "code": 72,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": null,
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "NumberOfPresets",
+ "code": 74,
+ "mfgCode": null,
+ "side": "server",
+ "type": "int8u",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "0",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "ActivePresetHandle",
+ "code": 78,
+ "mfgCode": null,
+ "side": "server",
+ "type": "octet_string",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "Presets",
+ "code": 80,
+ "mfgCode": null,
+ "side": "server",
+ "type": "array",
+ "included": 1,
+ "storageOption": "External",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": null,
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
+ {
+ "name": "PresetsSchedulesEditable",
+ "code": 82,
+ "mfgCode": null,
+ "side": "server",
+ "type": "boolean",
+ "included": 1,
+ "storageOption": "RAM",
+ "singleton": 0,
+ "bounded": 0,
+ "defaultValue": "",
+ "reportable": 1,
+ "minInterval": 1,
+ "maxInterval": 65534,
+ "reportableChange": 0
+ },
{
"name": "GeneratedCommandList",
"code": 65528,
@@ -4944,7 +5056,7 @@
"storageOption": "RAM",
"singleton": 0,
"bounded": 0,
- "defaultValue": "0x23",
+ "defaultValue": "0x123",
"reportable": 1,
"minInterval": 0,
"maxInterval": 65344,
diff --git a/examples/tv-app/tv-common/tv-app.matter b/examples/tv-app/tv-common/tv-app.matter
index 5f9fa9c0ab2b1a..7c50f77e8647ab 100644
--- a/examples/tv-app/tv-common/tv-app.matter
+++ b/examples/tv-app/tv-common/tv-app.matter
@@ -295,7 +295,7 @@ cluster Binding = 30 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -311,12 +311,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -352,17 +382,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -635,6 +689,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -643,6 +700,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -653,6 +714,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -686,12 +751,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** This cluster is used to manage global aspects of the Commissioning flow. */
@@ -704,6 +780,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -712,6 +791,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -722,6 +805,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -755,12 +842,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/tv-casting-app/tv-casting-common/tv-casting-app.matter b/examples/tv-casting-app/tv-casting-common/tv-casting-app.matter
index 910beaa7eedf7b..5dad7807038b48 100644
--- a/examples/tv-casting-app/tv-casting-common/tv-casting-app.matter
+++ b/examples/tv-casting-app/tv-casting-common/tv-casting-app.matter
@@ -455,7 +455,7 @@ cluster Binding = 30 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -471,12 +471,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -512,17 +542,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -719,6 +773,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -727,6 +784,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -737,6 +798,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -770,12 +835,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/virtual-device-app/virtual-device-common/virtual-device-app.matter b/examples/virtual-device-app/virtual-device-common/virtual-device-app.matter
index 95aa68635b91ed..cc933041a0b6d5 100644
--- a/examples/virtual-device-app/virtual-device-common/virtual-device-app.matter
+++ b/examples/virtual-device-app/virtual-device-common/virtual-device-app.matter
@@ -276,7 +276,7 @@ cluster Binding = 30 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -292,12 +292,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -333,17 +363,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -875,6 +929,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -883,6 +940,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -893,6 +954,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -926,12 +991,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/examples/window-app/common/window-app.matter b/examples/window-app/common/window-app.matter
index d0b9d9a24608a8..f95b050278e64b 100644
--- a/examples/window-app/common/window-app.matter
+++ b/examples/window-app/common/window-app.matter
@@ -183,7 +183,7 @@ cluster Descriptor = 29 {
and enforce Access Control for the Node's endpoints and their associated
cluster instances. */
cluster AccessControl = 31 {
- revision 1; // NOTE: Default/not specifically set
+ revision 2;
enum AccessControlEntryAuthModeEnum : enum8 {
kPASE = 1;
@@ -199,12 +199,42 @@ cluster AccessControl = 31 {
kAdminister = 5;
}
+ enum AccessRestrictionTypeEnum : enum8 {
+ kAttributeAccessForbidden = 0;
+ kAttributeWriteForbidden = 1;
+ kCommandForbidden = 2;
+ kEventForbidden = 3;
+ }
+
enum ChangeTypeEnum : enum8 {
kChanged = 0;
kAdded = 1;
kRemoved = 2;
}
+ bitmap Feature : bitmap32 {
+ kExtension = 0x1;
+ kManagedDevice = 0x2;
+ }
+
+ struct AccessRestrictionStruct {
+ AccessRestrictionTypeEnum type = 0;
+ nullable int32u id = 1;
+ }
+
+ struct CommissioningAccessRestrictionEntryStruct {
+ endpoint_no endpoint = 0;
+ cluster_id cluster = 1;
+ AccessRestrictionStruct restrictions[] = 2;
+ }
+
+ fabric_scoped struct AccessRestrictionEntryStruct {
+ fabric_sensitive endpoint_no endpoint = 0;
+ fabric_sensitive cluster_id cluster = 1;
+ fabric_sensitive AccessRestrictionStruct restrictions[] = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
struct AccessControlTargetStruct {
nullable cluster_id cluster = 0;
nullable endpoint_no endpoint = 1;
@@ -240,17 +270,41 @@ cluster AccessControl = 31 {
fabric_idx fabricIndex = 254;
}
+ fabric_sensitive info event access(read: administer) AccessRestrictionEntryChanged = 2 {
+ fabric_idx fabricIndex = 254;
+ }
+
+ fabric_sensitive info event access(read: administer) FabricRestrictionReviewUpdate = 3 {
+ int64u token = 0;
+ nullable long_char_string instruction = 1;
+ nullable long_char_string redirectURL = 2;
+ fabric_idx fabricIndex = 254;
+ }
+
attribute access(read: administer, write: administer) AccessControlEntryStruct acl[] = 0;
attribute access(read: administer, write: administer) optional AccessControlExtensionStruct extension[] = 1;
readonly attribute int16u subjectsPerAccessControlEntry = 2;
readonly attribute int16u targetsPerAccessControlEntry = 3;
readonly attribute int16u accessControlEntriesPerFabric = 4;
+ readonly attribute optional CommissioningAccessRestrictionEntryStruct commissioningARL[] = 5;
+ readonly attribute optional AccessRestrictionEntryStruct arl[] = 6;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
readonly attribute attrib_id attributeList[] = 65531;
readonly attribute bitmap32 featureMap = 65532;
readonly attribute int16u clusterRevision = 65533;
+
+ request struct ReviewFabricRestrictionsRequest {
+ AccessRestrictionStruct arl[] = 0;
+ }
+
+ response struct ReviewFabricRestrictionsResponse = 1 {
+ int64u token = 0;
+ }
+
+ /** This command signals to the service associated with the device vendor that the fabric administrator would like a review of the current restrictions on the accessing fabric. */
+ fabric command access(invoke: administer) ReviewFabricRestrictions(ReviewFabricRestrictionsRequest): DefaultSuccess = 0;
}
/** This cluster provides attributes and events for determining basic information about Nodes, which supports both
@@ -860,6 +914,9 @@ cluster GeneralCommissioning = 48 {
kInvalidAuthentication = 2;
kNoFailSafe = 3;
kBusyWithOtherAdmin = 4;
+ kRequiredTCNotAccepted = 5;
+ kTCAcknowledgementsNotReceived = 6;
+ kTCMinVersionNotMet = 7;
}
enum RegulatoryLocationTypeEnum : enum8 {
@@ -868,6 +925,10 @@ cluster GeneralCommissioning = 48 {
kIndoorOutdoor = 2;
}
+ bitmap Feature : bitmap32 {
+ kTermsAndConditions = 0x1;
+ }
+
struct BasicCommissioningInfo {
int16u failSafeExpiryLengthSeconds = 0;
int16u maxCumulativeFailsafeSeconds = 1;
@@ -878,6 +939,10 @@ cluster GeneralCommissioning = 48 {
readonly attribute RegulatoryLocationTypeEnum regulatoryConfig = 2;
readonly attribute RegulatoryLocationTypeEnum locationCapability = 3;
readonly attribute boolean supportsConcurrentConnection = 4;
+ provisional readonly attribute access(read: administer) optional int16u TCAcceptedVersion = 5;
+ provisional readonly attribute access(read: administer) optional int16u TCMinRequiredVersion = 6;
+ provisional readonly attribute access(read: administer) optional bitmap16 TCAcknowledgements = 7;
+ provisional readonly attribute access(read: administer) optional boolean TCAcknowledgementsRequired = 8;
readonly attribute command_id generatedCommandList[] = 65528;
readonly attribute command_id acceptedCommandList[] = 65529;
readonly attribute event_id eventList[] = 65530;
@@ -911,12 +976,23 @@ cluster GeneralCommissioning = 48 {
char_string debugText = 1;
}
+ request struct SetTCAcknowledgementsRequest {
+ int16u TCVersion = 0;
+ bitmap16 TCUserResponse = 1;
+ }
+
+ response struct SetTCAcknowledgementsResponse = 7 {
+ CommissioningErrorEnum errorCode = 0;
+ }
+
/** Arm the persistent fail-safe timer with an expiry time of now + ExpiryLengthSeconds using device clock */
command access(invoke: administer) ArmFailSafe(ArmFailSafeRequest): ArmFailSafeResponse = 0;
/** Set the regulatory configuration to be used during commissioning */
command access(invoke: administer) SetRegulatoryConfig(SetRegulatoryConfigRequest): SetRegulatoryConfigResponse = 2;
/** Signals the Server that the Client has successfully completed all steps of Commissioning/Recofiguration needed during fail-safe period. */
fabric command access(invoke: administer) CommissioningComplete(): CommissioningCompleteResponse = 4;
+ /** This command sets the user acknowledgements received in the Enhanced Setup Flow Terms and Conditions into the node. */
+ command access(invoke: administer) SetTCAcknowledgements(SetTCAcknowledgementsRequest): SetTCAcknowledgementsResponse = 6;
}
/** Functionality to configure, enable, disable network credentials and access on a Matter device. */
diff --git a/integrations/docker/images/base/chip-build/version b/integrations/docker/images/base/chip-build/version
index ba77442b28dc23..9f538399a5cf06 100644
--- a/integrations/docker/images/base/chip-build/version
+++ b/integrations/docker/images/base/chip-build/version
@@ -1 +1 @@
-66 : [Telink] Update Docker image (Zephyr update)
+67 : [ESP32] Update esp-idf to v5.3
diff --git a/integrations/docker/images/stage-2/chip-build-esp32/Dockerfile b/integrations/docker/images/stage-2/chip-build-esp32/Dockerfile
index 2e41b6b3466e27..b50189201598e1 100644
--- a/integrations/docker/images/stage-2/chip-build-esp32/Dockerfile
+++ b/integrations/docker/images/stage-2/chip-build-esp32/Dockerfile
@@ -12,7 +12,7 @@ RUN set -x \
&& : # last line
RUN set -x \
- && git clone --recursive -b v5.1.2 --depth 1 --shallow-submodule https://github.com/espressif/esp-idf.git /tmp/esp-idf \
+ && git clone --recursive -b v5.3 --depth 1 --shallow-submodule https://github.com/espressif/esp-idf.git /tmp/esp-idf \
&& : # last line
FROM ghcr.io/project-chip/chip-build:${VERSION}
diff --git a/scripts/build/builders/host.py b/scripts/build/builders/host.py
index 50695772fff354..4ea5a9aae0f836 100644
--- a/scripts/build/builders/host.py
+++ b/scripts/build/builders/host.py
@@ -256,6 +256,9 @@ def OutputNames(self):
elif self == HostApp.LIT_ICD:
yield 'lit-icd-app'
yield 'lit-icd-app.map'
+ elif self == HostApp.NETWORK_MANAGER:
+ yield 'matter-network-manager-app'
+ yield 'matter-network-manager-app.map'
elif self == HostApp.ENERGY_MANAGEMENT:
yield 'chip-energy-management-app'
yield 'chip-energy-management-app.map'
diff --git a/scripts/helpers/restyle-diff.sh b/scripts/helpers/restyle-diff.sh
index 21c01011a7c60c..5cc9ffa6b081fc 100755
--- a/scripts/helpers/restyle-diff.sh
+++ b/scripts/helpers/restyle-diff.sh
@@ -21,9 +21,10 @@
# you've written is kosher to CI
#
# Usage:
-# restyle-diff.sh [ref]
+# restyle-diff.sh [-d] [ref]
#
# if unspecified, ref defaults to upstream/master (or master)
+# -d sets container's log level to DEBUG, if unspecified the default log level will remain (info level)
#
here=${0%/*}
@@ -33,20 +34,55 @@ set -e
CHIP_ROOT=$(cd "$here/../.." && pwd)
cd "$CHIP_ROOT"
-restyle-paths() {
- if hash restyle-path 2>/dev/null; then
- echo "$@" | xargs restyle-path
+docker_run() {
+ if [ -t 0 ]; then
+ exec docker run --tty "$@"
+
else
- url=https://github.com/restyled-io/restyler/raw/main/bin/restyle-path
- echo "$@" | xargs sh <(curl --location --proto "=https" --tlsv1.2 "$url" -sSf)
+ exec docker run "$@"
+
fi
}
-ref="$1"
+restyle-paths() {
+
+ image=restyled/restyler:edge
+
+ for path in "$@"; do
+ (
+ docker_run --tty --interactive --rm \
+ --env LOG_LEVEL \
+ --env LOG_DESTINATION \
+ --env LOG_FORMAT \
+ --env LOG_COLOR \
+ --env HOST_DIRECTORY="$PWD" \
+ --env UNRESTRICTED=1 \
+ --volume "$PWD":/code \
+ --volume /tmp:/tmp \
+ --volume /var/run/docker.sock:/var/run/docker.sock \
+ --entrypoint restyle-path \
+ "$image" "$path"
+ )
+ done
+}
+
+while [[ $# -gt 0 ]]; do
+ case "$1" in
+ -d)
+ export LOG_LEVEL="DEBUG"
+ shift
+ ;;
+ *)
+ ref="$1"
+ shift
+ ;;
+ esac
+done
+
if [[ -z "$ref" ]]; then
ref="master"
git remote | grep -qxF upstream && ref="upstream/master"
fi
-declare -a paths=("$(git diff --ignore-submodules --name-only --merge-base "$ref")")
+mapfile -t paths < <(git diff --ignore-submodules --name-only --merge-base "$ref")
restyle-paths "${paths[@]}"
diff --git a/scripts/py_matter_yamltests/matter_yamltests/definitions.py b/scripts/py_matter_yamltests/matter_yamltests/definitions.py
index 1e4b3635200bb8..bc77e913dd4cbc 100644
--- a/scripts/py_matter_yamltests/matter_yamltests/definitions.py
+++ b/scripts/py_matter_yamltests/matter_yamltests/definitions.py
@@ -88,6 +88,10 @@ def __init__(self, sources: List[ParseSource]):
self.__responses_by_id[code][struct.code] = struct
self.__responses_by_name[name][struct.name] = struct.code
+ self.__global_bitmaps: dict[str, Bitmap] = {b.name: b for b in idl.global_bitmaps}
+ self.__global_enums: dict[str, Bitmap] = {e.name: e for e in idl.global_enums}
+ self.__global_structs: dict[str, Bitmap] = {s.name: s for s in idl.global_structs}
+
def get_cluster_names(self) -> List[str]:
return [name for name, _ in self.__clusters_by_name.items()]
@@ -257,9 +261,26 @@ def __get_targets_by_cluster_name(self, cluster_name: str, target_type: _ItemTyp
_ItemType.Struct: self.__structs_by_name,
}
+ global_target_mapping = {
+ _ItemType.Request: None,
+ _ItemType.Response: None,
+ _ItemType.Attribute: None,
+ _ItemType.Event: None,
+ _ItemType.Bitmap: self.__global_bitmaps,
+ _ItemType.Enum: self.__global_enums,
+ _ItemType.Struct: self.__global_structs,
+ }
+
# The idl parser remove spaces
cluster_name = cluster_name.replace(' ', '')
- return target_mapping[target_type].get(cluster_name)
+ global_target = global_target_mapping[target_type]
+ target = target_mapping[target_type].get(cluster_name)
+
+ if target is None:
+ return global_target
+ if global_target is None:
+ return target
+ return target | global_target
def SpecDefinitionsFromPaths(paths: str, pseudo_clusters: Optional[PseudoClusters] = PseudoClusters([])):
diff --git a/scripts/py_matter_yamltests/test_spec_definitions.py b/scripts/py_matter_yamltests/test_spec_definitions.py
index a1cce4833ac075..4dd776bf520bcb 100644
--- a/scripts/py_matter_yamltests/test_spec_definitions.py
+++ b/scripts/py_matter_yamltests/test_spec_definitions.py
@@ -102,6 +102,10 @@
source_bitmap = '''
+
+
+
+
@@ -126,6 +130,10 @@
source_enum = '''
+
+
+
+
@@ -150,6 +158,10 @@
source_struct = '''
+
+
+
+
@@ -310,10 +322,16 @@ def test_get_bitmap_by_name(self):
[ParseSource(source=io.StringIO(source_bitmap), name='source_bitmap')])
self.assertIsNone(definitions.get_bitmap_by_name(
'WrongName', 'TestBitmap'))
+ self.assertIsNone(definitions.get_bitmap_by_name(
+ 'TestWrong', 'TestBitmap'))
self.assertIsNone(definitions.get_bitmap_by_name(
'Test', 'TestWrongBitmap'))
self.assertIsInstance(definitions.get_bitmap_by_name(
'Test', 'TestBitmap'), Bitmap)
+ self.assertIsInstance(definitions.get_bitmap_by_name(
+ 'Test', 'TestGlobalBitmap'), Bitmap)
+ self.assertIsInstance(definitions.get_bitmap_by_name(
+ 'TestWrong', 'TestGlobalBitmap'), Bitmap)
self.assertIsNone(definitions.get_bitmap_by_name('test', 'TestBitmap'))
self.assertIsNone(definitions.get_bitmap_by_name('Test', 'testbitmap'))
@@ -322,10 +340,16 @@ def test_get_enum_by_name(self):
[ParseSource(source=io.StringIO(source_enum), name='source_enum')])
self.assertIsNone(definitions.get_enum_by_name(
'WrongName', 'TestEnum'))
+ self.assertIsNone(definitions.get_enum_by_name(
+ 'TestWrong', 'TestEnum'))
self.assertIsNone(definitions.get_enum_by_name(
'Test', 'TestWrongEnum'))
self.assertIsInstance(
definitions.get_enum_by_name('Test', 'TestEnum'), Enum)
+ self.assertIsInstance(
+ definitions.get_enum_by_name('Test', 'TestGlobalEnum'), Enum)
+ self.assertIsInstance(
+ definitions.get_enum_by_name('TestWrong', 'TestGlobalEnum'), Enum)
self.assertIsNone(definitions.get_enum_by_name('test', 'TestEnum'))
self.assertIsNone(definitions.get_enum_by_name('Test', 'testenum'))
@@ -334,10 +358,16 @@ def test_get_struct_by_name(self):
[ParseSource(source=io.StringIO(source_struct), name='source_struct')])
self.assertIsNone(definitions.get_struct_by_name(
'WrongName', 'TestStruct'))
+ self.assertIsNone(definitions.get_struct_by_name(
+ 'TestWrong', 'TestStruct'))
self.assertIsNone(definitions.get_struct_by_name(
'Test', 'TestWrongStruct'))
self.assertIsInstance(definitions.get_struct_by_name(
'Test', 'TestStruct'), Struct)
+ self.assertIsInstance(definitions.get_struct_by_name(
+ 'Test', 'TestGlobalStruct'), Struct)
+ self.assertIsInstance(definitions.get_struct_by_name(
+ 'TestWrong', 'TestGlobalStruct'), Struct)
self.assertIsNone(definitions.get_struct_by_name('test', 'TestStruct'))
self.assertIsNone(definitions.get_struct_by_name('Test', 'teststruct'))
@@ -365,16 +395,22 @@ def test_get_type_by_name(self):
[ParseSource(source=io.StringIO(source_bitmap), name='source_bitmap')])
self.assertIsInstance(definitions.get_type_by_name(
'Test', 'TestBitmap'), Bitmap)
+ self.assertIsInstance(definitions.get_type_by_name(
+ 'Test', 'TestGlobalBitmap'), Bitmap)
definitions = SpecDefinitions(
[ParseSource(source=io.StringIO(source_enum), name='source_enum')])
self.assertIsInstance(
definitions.get_type_by_name('Test', 'TestEnum'), Enum)
+ self.assertIsInstance(
+ definitions.get_type_by_name('Test', 'TestGlobalEnum'), Enum)
definitions = SpecDefinitions(
[ParseSource(source=io.StringIO(source_struct), name='source_struct')])
self.assertIsInstance(definitions.get_type_by_name(
'Test', 'TestStruct'), Struct)
+ self.assertIsInstance(definitions.get_type_by_name(
+ 'Test', 'TestGlobalStruct'), Struct)
def test_struct_is_fabric_scoped(self):
definitions = SpecDefinitions(
diff --git a/scripts/tests/chiptest/__init__.py b/scripts/tests/chiptest/__init__.py
index a250bab52e9de4..29aa9d47dce42d 100644
--- a/scripts/tests/chiptest/__init__.py
+++ b/scripts/tests/chiptest/__init__.py
@@ -157,6 +157,7 @@ def _GetInDevelopmentTests() -> Set[str]:
# TestEventTriggersEnabled is true, which it's not in CI.
"Test_TC_SMOKECO_2_6.yaml", # chip-repl does not support local timeout (07/20/2023) and test assumes
# TestEventTriggersEnabled is true, which it's not in CI.
+ "TestFabricSyncBridgedNode.yaml", # [TODO] fabric-bridge-app lacks some feature so this test currently fails
}
@@ -276,6 +277,8 @@ def target_for_name(name: str):
return TestTarget.TV
if name.startswith("DL_") or name.startswith("Test_TC_DRLK_"):
return TestTarget.LOCK
+ if name.startswith("TestFabricSync"):
+ return TestTarget.FABRIC_SYNC
if name.startswith("OTA_"):
return TestTarget.OTA
if name.startswith("Test_TC_BRBINFO_") or name.startswith("Test_TC_ACT_"):
@@ -286,6 +289,8 @@ def target_for_name(name: str):
return TestTarget.MWO
if name.startswith("Test_TC_RVCRUNM_") or name.startswith("Test_TC_RVCCLEANM_") or name.startswith("Test_TC_RVCOPSTATE_"):
return TestTarget.RVC
+ if name.startswith("Test_TC_THNETDIR_") or name.startswith("Test_TC_WIFINM_"):
+ return TestTarget.NETWORK_MANAGER
return TestTarget.ALL_CLUSTERS
diff --git a/scripts/tests/chiptest/linux.py b/scripts/tests/chiptest/linux.py
index 3dbd851be26b47..bf3e140981d3a7 100644
--- a/scripts/tests/chiptest/linux.py
+++ b/scripts/tests/chiptest/linux.py
@@ -178,12 +178,14 @@ def PathsWithNetworkNamespaces(paths: ApplicationPaths) -> ApplicationPaths:
chip_tool='ip netns exec tool'.split() + paths.chip_tool,
all_clusters_app='ip netns exec app'.split() + paths.all_clusters_app,
lock_app='ip netns exec app'.split() + paths.lock_app,
+ fabric_bridge_app='ip netns exec app'.split() + paths.fabric_bridge_app,
ota_provider_app='ip netns exec app'.split() + paths.ota_provider_app,
ota_requestor_app='ip netns exec app'.split() + paths.ota_requestor_app,
tv_app='ip netns exec app'.split() + paths.tv_app,
lit_icd_app='ip netns exec app'.split() + paths.lit_icd_app,
microwave_oven_app='ip netns exec app'.split() + paths.microwave_oven_app,
rvc_app='ip netns exec app'.split() + paths.rvc_app,
+ network_manager_app='ip netns exec app'.split() + paths.network_manager_app,
bridge_app='ip netns exec app'.split() + paths.bridge_app,
chip_repl_yaml_tester_cmd='ip netns exec tool'.split() + paths.chip_repl_yaml_tester_cmd,
chip_tool_with_python_cmd='ip netns exec tool'.split() + paths.chip_tool_with_python_cmd,
diff --git a/scripts/tests/chiptest/test_definition.py b/scripts/tests/chiptest/test_definition.py
index 970c098f1354bb..484f247f70b1b2 100644
--- a/scripts/tests/chiptest/test_definition.py
+++ b/scripts/tests/chiptest/test_definition.py
@@ -175,8 +175,10 @@ class TestTarget(Enum):
OTA = auto()
BRIDGE = auto()
LIT_ICD = auto()
+ FABRIC_SYNC = auto()
MWO = auto()
RVC = auto()
+ NETWORK_MANAGER = auto()
@dataclass
@@ -184,6 +186,7 @@ class ApplicationPaths:
chip_tool: typing.List[str]
all_clusters_app: typing.List[str]
lock_app: typing.List[str]
+ fabric_bridge_app: typing.List[str]
ota_provider_app: typing.List[str]
ota_requestor_app: typing.List[str]
tv_app: typing.List[str]
@@ -193,10 +196,14 @@ class ApplicationPaths:
chip_repl_yaml_tester_cmd: typing.List[str]
chip_tool_with_python_cmd: typing.List[str]
rvc_app: typing.List[str]
+ network_manager_app: typing.List[str]
def items(self):
- return [self.chip_tool, self.all_clusters_app, self.lock_app, self.ota_provider_app, self.ota_requestor_app,
- self.tv_app, self.bridge_app, self.lit_icd_app, self.microwave_oven_app, self.chip_repl_yaml_tester_cmd, self.chip_tool_with_python_cmd, self.rvc_app]
+ return [self.chip_tool, self.all_clusters_app, self.lock_app,
+ self.fabric_bridge_app, self.ota_provider_app, self.ota_requestor_app,
+ self.tv_app, self.bridge_app, self.lit_icd_app,
+ self.microwave_oven_app, self.chip_repl_yaml_tester_cmd,
+ self.chip_tool_with_python_cmd, self.rvc_app, self.network_manager_app]
@dataclass
@@ -299,6 +306,8 @@ def Run(self, runner, apps_register, paths: ApplicationPaths, pics_file: str,
target_app = paths.tv_app
elif self.target == TestTarget.LOCK:
target_app = paths.lock_app
+ elif self.target == TestTarget.FABRIC_SYNC:
+ target_app = paths.fabric_bridge_app
elif self.target == TestTarget.OTA:
target_app = paths.ota_requestor_app
elif self.target == TestTarget.BRIDGE:
@@ -309,6 +318,8 @@ def Run(self, runner, apps_register, paths: ApplicationPaths, pics_file: str,
target_app = paths.microwave_oven_app
elif self.target == TestTarget.RVC:
target_app = paths.rvc_app
+ elif self.target == TestTarget.NETWORK_MANAGER:
+ target_app = paths.network_manager_app
else:
raise Exception("Unknown test target - "
"don't know which application to run")
diff --git a/scripts/tests/run_test_suite.py b/scripts/tests/run_test_suite.py
index c22b4abff92f09..41b7b540a6dd50 100755
--- a/scripts/tests/run_test_suite.py
+++ b/scripts/tests/run_test_suite.py
@@ -239,6 +239,9 @@ def cmd_list(context):
@click.option(
'--lock-app',
help='what lock app to use')
+@click.option(
+ '--fabric-bridge-app',
+ help='what fabric bridge app to use')
@click.option(
'--ota-provider-app',
help='what ota provider app to use')
@@ -260,6 +263,9 @@ def cmd_list(context):
@click.option(
'--rvc-app',
help='what rvc app to use')
+@click.option(
+ '--network-manager-app',
+ help='what network-manager app to use')
@click.option(
'--chip-repl-yaml-tester',
help='what python script to use for running yaml tests using chip-repl as controller')
@@ -291,7 +297,8 @@ def cmd_list(context):
help='Number of tests that are expected to fail in each iteration. Overall test will pass if the number of failures matches this. Nonzero values require --keep-going')
@click.pass_context
def cmd_run(context, iterations, all_clusters_app, lock_app, ota_provider_app, ota_requestor_app,
- tv_app, bridge_app, lit_icd_app, microwave_oven_app, rvc_app, chip_repl_yaml_tester, chip_tool_with_python, pics_file, keep_going, test_timeout_seconds, expected_failures):
+ fabric_bridge_app, tv_app, bridge_app, lit_icd_app, microwave_oven_app, rvc_app, network_manager_app, chip_repl_yaml_tester,
+ chip_tool_with_python, pics_file, keep_going, test_timeout_seconds, expected_failures):
if expected_failures != 0 and not keep_going:
logging.exception(f"'--expected-failures {expected_failures}' used without '--keep-going'")
sys.exit(2)
@@ -306,6 +313,9 @@ def cmd_run(context, iterations, all_clusters_app, lock_app, ota_provider_app, o
if lock_app is None:
lock_app = paths_finder.get('chip-lock-app')
+ if fabric_bridge_app is None:
+ fabric_bridge_app = paths_finder.get('fabric-bridge-app')
+
if ota_provider_app is None:
ota_provider_app = paths_finder.get('chip-ota-provider-app')
@@ -327,6 +337,9 @@ def cmd_run(context, iterations, all_clusters_app, lock_app, ota_provider_app, o
if rvc_app is None:
rvc_app = paths_finder.get('chip-rvc-app')
+ if network_manager_app is None:
+ network_manager_app = paths_finder.get('matter-network-manager-app')
+
if chip_repl_yaml_tester is None:
chip_repl_yaml_tester = paths_finder.get('yamltest_with_chip_repl_tester.py')
@@ -341,6 +354,7 @@ def cmd_run(context, iterations, all_clusters_app, lock_app, ota_provider_app, o
chip_tool=[context.obj.chip_tool],
all_clusters_app=[all_clusters_app],
lock_app=[lock_app],
+ fabric_bridge_app=[fabric_bridge_app],
ota_provider_app=[ota_provider_app],
ota_requestor_app=[ota_requestor_app],
tv_app=[tv_app],
@@ -348,6 +362,7 @@ def cmd_run(context, iterations, all_clusters_app, lock_app, ota_provider_app, o
lit_icd_app=[lit_icd_app],
microwave_oven_app=[microwave_oven_app],
rvc_app=[rvc_app],
+ network_manager_app=[network_manager_app],
chip_repl_yaml_tester_cmd=['python3'] + [chip_repl_yaml_tester],
chip_tool_with_python_cmd=['python3'] + [chip_tool_with_python],
)
diff --git a/scripts/tools/zap/tests/outputs/all-clusters-app/app-templates/access.h b/scripts/tools/zap/tests/outputs/all-clusters-app/app-templates/access.h
index 282335c5b25384..9b4ddb220986ad 100644
--- a/scripts/tools/zap/tests/outputs/all-clusters-app/app-templates/access.h
+++ b/scripts/tools/zap/tests/outputs/all-clusters-app/app-templates/access.h
@@ -33,9 +33,6 @@
/* Cluster: Level Control, Attribute: StartUpCurrentLevel, Privilege: view */ \
0x0000001F, /* Cluster: Access Control, Attribute: ACL, Privilege: administer */ \
0x0000001F, /* Cluster: Access Control, Attribute: Extension, Privilege: administer */ \
- /* Cluster: Access Control, Attribute: SubjectsPerAccessControlEntry, Privilege: view */ \
- /* Cluster: Access Control, Attribute: TargetsPerAccessControlEntry, Privilege: view */ \
- /* Cluster: Access Control, Attribute: AccessControlEntriesPerFabric, Privilege: view */ \
/* Cluster: Basic Information, Attribute: NodeLabel, Privilege: view */ \
/* Cluster: Basic Information, Attribute: Location, Privilege: view */ \
/* Cluster: Basic Information, Attribute: LocalConfigDisabled, Privilege: view */ \
@@ -79,9 +76,6 @@
/* Cluster: Level Control, Attribute: StartUpCurrentLevel, Privilege: view */ \
0x00000000, /* Cluster: Access Control, Attribute: ACL, Privilege: administer */ \
0x00000001, /* Cluster: Access Control, Attribute: Extension, Privilege: administer */ \
- /* Cluster: Access Control, Attribute: SubjectsPerAccessControlEntry, Privilege: view */ \
- /* Cluster: Access Control, Attribute: TargetsPerAccessControlEntry, Privilege: view */ \
- /* Cluster: Access Control, Attribute: AccessControlEntriesPerFabric, Privilege: view */ \
/* Cluster: Basic Information, Attribute: NodeLabel, Privilege: view */ \
/* Cluster: Basic Information, Attribute: Location, Privilege: view */ \
/* Cluster: Basic Information, Attribute: LocalConfigDisabled, Privilege: view */ \
@@ -125,9 +119,6 @@
/* Cluster: Level Control, Attribute: StartUpCurrentLevel, Privilege: view */ \
chip::Access::Privilege::kAdminister, /* Cluster: Access Control, Attribute: ACL, Privilege: administer */ \
chip::Access::Privilege::kAdminister, /* Cluster: Access Control, Attribute: Extension, Privilege: administer */ \
- /* Cluster: Access Control, Attribute: SubjectsPerAccessControlEntry, Privilege: view */ \
- /* Cluster: Access Control, Attribute: TargetsPerAccessControlEntry, Privilege: view */ \
- /* Cluster: Access Control, Attribute: AccessControlEntriesPerFabric, Privilege: view */ \
/* Cluster: Basic Information, Attribute: NodeLabel, Privilege: view */ \
/* Cluster: Basic Information, Attribute: Location, Privilege: view */ \
/* Cluster: Basic Information, Attribute: LocalConfigDisabled, Privilege: view */ \
@@ -517,18 +508,24 @@
#define GENERATED_ACCESS_READ_EVENT__CLUSTER { \
0x0000001F, /* Cluster: Access Control, Event: AccessControlEntryChanged, Privilege: administer */ \
0x0000001F, /* Cluster: Access Control, Event: AccessControlExtensionChanged, Privilege: administer */ \
+ 0x0000001F, /* Cluster: Access Control, Event: AccessRestrictionEntryChanged, Privilege: administer */ \
+ 0x0000001F, /* Cluster: Access Control, Event: FabricRestrictionReviewUpdate, Privilege: administer */ \
}
// Parallel array data (cluster, *event*, privilege) for read event
#define GENERATED_ACCESS_READ_EVENT__EVENT { \
0x00000000, /* Cluster: Access Control, Event: AccessControlEntryChanged, Privilege: administer */ \
0x00000001, /* Cluster: Access Control, Event: AccessControlExtensionChanged, Privilege: administer */ \
+ 0x00000002, /* Cluster: Access Control, Event: AccessRestrictionEntryChanged, Privilege: administer */ \
+ 0x00000003, /* Cluster: Access Control, Event: FabricRestrictionReviewUpdate, Privilege: administer */ \
}
// Parallel array data (cluster, event, *privilege*) for read event
#define GENERATED_ACCESS_READ_EVENT__PRIVILEGE { \
chip::Access::Privilege::kAdminister, /* Cluster: Access Control, Event: AccessControlEntryChanged, Privilege: administer */ \
chip::Access::Privilege::kAdminister, /* Cluster: Access Control, Event: AccessControlExtensionChanged, Privilege: administer */ \
+ chip::Access::Privilege::kAdminister, /* Cluster: Access Control, Event: AccessRestrictionEntryChanged, Privilege: administer */ \
+ chip::Access::Privilege::kAdminister, /* Cluster: Access Control, Event: FabricRestrictionReviewUpdate, Privilege: administer */ \
}
////////////////////////////////////////////////////////////////////////////////
diff --git a/scripts/tools/zap/tests/outputs/all-clusters-app/app-templates/endpoint_config.h b/scripts/tools/zap/tests/outputs/all-clusters-app/app-templates/endpoint_config.h
index f2c082b1d0d4a1..c60950077fb372 100644
--- a/scripts/tools/zap/tests/outputs/all-clusters-app/app-templates/endpoint_config.h
+++ b/scripts/tools/zap/tests/outputs/all-clusters-app/app-templates/endpoint_config.h
@@ -355,7 +355,7 @@
}
// This is an array of EmberAfAttributeMetadata structures.
-#define GENERATED_ATTRIBUTE_COUNT 1056
+#define GENERATED_ATTRIBUTE_COUNT 1055
#define GENERATED_ATTRIBUTES \
{ \
\
@@ -1400,8 +1400,7 @@
{ ZAP_EMPTY_DEFAULT(), 0x00000051, 0, ZAP_TYPE(ARRAY), \
ZAP_ATTRIBUTE_MASK(EXTERNAL_STORAGE) | ZAP_ATTRIBUTE_MASK(WRITABLE) }, /* Schedules */ \
{ ZAP_EMPTY_DEFAULT(), 0x00000052, 1, ZAP_TYPE(BOOLEAN), 0 }, /* PresetsSchedulesEditable */ \
- { ZAP_SIMPLE_DEFAULT(0), 0x00000053, 1, ZAP_TYPE(BITMAP8), 0 }, /* TemperatureSetpointHoldPolicy */ \
- { ZAP_EMPTY_DEFAULT(), 0x00000054, 4, ZAP_TYPE(EPOCH_S), \
+ { ZAP_SIMPLE_DEFAULT(0), 0x00000053, 4, ZAP_TYPE(EPOCH_S), \
ZAP_ATTRIBUTE_MASK(NULLABLE) }, /* SetpointHoldExpiryTimestamp */ \
{ ZAP_SIMPLE_DEFAULT(0x0023), 0x0000FFFC, 4, ZAP_TYPE(BITMAP32), 0 }, /* FeatureMap */ \
{ ZAP_SIMPLE_DEFAULT(6), 0x0000FFFD, 2, ZAP_TYPE(INT16U), 0 }, /* ClusterRevision */ \
@@ -3749,8 +3748,8 @@
/* Endpoint: 1, Cluster: Thermostat (server) */ \
.clusterId = 0x00000201, \
.attributes = ZAP_ATTRIBUTE_INDEX(616), \
- .attributeCount = 28, \
- .clusterSize = 74, \
+ .attributeCount = 27, \
+ .clusterSize = 73, \
.mask = ZAP_CLUSTER_MASK(SERVER) | ZAP_CLUSTER_MASK(INIT_FUNCTION) | ZAP_CLUSTER_MASK(PRE_ATTRIBUTE_CHANGED_FUNCTION), \
.functions = chipFuncArrayThermostatServer, \
.acceptedCommandList = ZAP_GENERATED_COMMANDS_INDEX( 241 ), \
@@ -3761,7 +3760,7 @@
{ \
/* Endpoint: 1, Cluster: Fan Control (server) */ \
.clusterId = 0x00000202, \
- .attributes = ZAP_ATTRIBUTE_INDEX(644), \
+ .attributes = ZAP_ATTRIBUTE_INDEX(643), \
.attributeCount = 14, \
.clusterSize = 18, \
.mask = ZAP_CLUSTER_MASK(SERVER) | ZAP_CLUSTER_MASK(ATTRIBUTE_CHANGED_FUNCTION) | ZAP_CLUSTER_MASK(PRE_ATTRIBUTE_CHANGED_FUNCTION), \
@@ -3774,7 +3773,7 @@
{ \
/* Endpoint: 1, Cluster: Thermostat User Interface Configuration (server) */ \
.clusterId = 0x00000204, \
- .attributes = ZAP_ATTRIBUTE_INDEX(658), \
+ .attributes = ZAP_ATTRIBUTE_INDEX(657), \
.attributeCount = 5, \
.clusterSize = 9, \
.mask = ZAP_CLUSTER_MASK(SERVER) | ZAP_CLUSTER_MASK(PRE_ATTRIBUTE_CHANGED_FUNCTION), \
@@ -3787,7 +3786,7 @@
{ \
/* Endpoint: 1, Cluster: Color Control (server) */ \
.clusterId = 0x00000300, \
- .attributes = ZAP_ATTRIBUTE_INDEX(663), \
+ .attributes = ZAP_ATTRIBUTE_INDEX(662), \
.attributeCount = 54, \
.clusterSize = 345, \
.mask = ZAP_CLUSTER_MASK(SERVER) | ZAP_CLUSTER_MASK(INIT_FUNCTION) | ZAP_CLUSTER_MASK(SHUTDOWN_FUNCTION), \
@@ -3800,7 +3799,7 @@
{ \
/* Endpoint: 1, Cluster: Ballast Configuration (server) */ \
.clusterId = 0x00000301, \
- .attributes = ZAP_ATTRIBUTE_INDEX(717), \
+ .attributes = ZAP_ATTRIBUTE_INDEX(716), \
.attributeCount = 16, \
.clusterSize = 58, \
.mask = ZAP_CLUSTER_MASK(SERVER), \
@@ -3813,7 +3812,7 @@
{ \
/* Endpoint: 1, Cluster: Illuminance Measurement (server) */ \
.clusterId = 0x00000400, \
- .attributes = ZAP_ATTRIBUTE_INDEX(733), \
+ .attributes = ZAP_ATTRIBUTE_INDEX(732), \
.attributeCount = 7, \
.clusterSize = 15, \
.mask = ZAP_CLUSTER_MASK(SERVER), \
@@ -3826,7 +3825,7 @@
{ \
/* Endpoint: 1, Cluster: Temperature Measurement (server) */ \
.clusterId = 0x00000402, \
- .attributes = ZAP_ATTRIBUTE_INDEX(740), \
+ .attributes = ZAP_ATTRIBUTE_INDEX(739), \
.attributeCount = 6, \
.clusterSize = 14, \
.mask = ZAP_CLUSTER_MASK(SERVER), \
@@ -3839,7 +3838,7 @@
{ \
/* Endpoint: 1, Cluster: Pressure Measurement (server) */ \
.clusterId = 0x00000403, \
- .attributes = ZAP_ATTRIBUTE_INDEX(746), \
+ .attributes = ZAP_ATTRIBUTE_INDEX(745), \
.attributeCount = 5, \
.clusterSize = 12, \
.mask = ZAP_CLUSTER_MASK(SERVER), \
@@ -3852,7 +3851,7 @@
{ \
/* Endpoint: 1, Cluster: Flow Measurement (server) */ \
.clusterId = 0x00000404, \
- .attributes = ZAP_ATTRIBUTE_INDEX(751), \
+ .attributes = ZAP_ATTRIBUTE_INDEX(750), \
.attributeCount = 6, \
.clusterSize = 14, \
.mask = ZAP_CLUSTER_MASK(SERVER), \
@@ -3865,7 +3864,7 @@
{ \
/* Endpoint: 1, Cluster: Relative Humidity Measurement (server) */ \
.clusterId = 0x00000405, \
- .attributes = ZAP_ATTRIBUTE_INDEX(757), \
+ .attributes = ZAP_ATTRIBUTE_INDEX(756), \
.attributeCount = 6, \
.clusterSize = 14, \
.mask = ZAP_CLUSTER_MASK(SERVER), \
@@ -3878,7 +3877,7 @@
{ \
/* Endpoint: 1, Cluster: Occupancy Sensing (server) */ \
.clusterId = 0x00000406, \
- .attributes = ZAP_ATTRIBUTE_INDEX(763), \
+ .attributes = ZAP_ATTRIBUTE_INDEX(762), \
.attributeCount = 5, \
.clusterSize = 9, \
.mask = ZAP_CLUSTER_MASK(SERVER) | ZAP_CLUSTER_MASK(INIT_FUNCTION), \
@@ -3891,7 +3890,7 @@
{ \
/* Endpoint: 1, Cluster: Carbon Monoxide Concentration Measurement (server) */ \
.clusterId = 0x0000040C, \
- .attributes = ZAP_ATTRIBUTE_INDEX(768), \
+ .attributes = ZAP_ATTRIBUTE_INDEX(767), \
.attributeCount = 13, \
.clusterSize = 2, \
.mask = ZAP_CLUSTER_MASK(SERVER), \
@@ -3904,7 +3903,7 @@
{ \
/* Endpoint: 1, Cluster: Carbon Dioxide Concentration Measurement (server) */ \
.clusterId = 0x0000040D, \
- .attributes = ZAP_ATTRIBUTE_INDEX(781), \
+ .attributes = ZAP_ATTRIBUTE_INDEX(780), \
.attributeCount = 13, \
.clusterSize = 2, \
.mask = ZAP_CLUSTER_MASK(SERVER), \
@@ -3917,7 +3916,7 @@
{ \
/* Endpoint: 1, Cluster: Nitrogen Dioxide Concentration Measurement (server) */ \
.clusterId = 0x00000413, \
- .attributes = ZAP_ATTRIBUTE_INDEX(794), \
+ .attributes = ZAP_ATTRIBUTE_INDEX(793), \
.attributeCount = 13, \
.clusterSize = 2, \
.mask = ZAP_CLUSTER_MASK(SERVER), \
@@ -3930,7 +3929,7 @@
{ \
/* Endpoint: 1, Cluster: Ozone Concentration Measurement (server) */ \
.clusterId = 0x00000415, \
- .attributes = ZAP_ATTRIBUTE_INDEX(807), \
+ .attributes = ZAP_ATTRIBUTE_INDEX(806), \
.attributeCount = 13, \
.clusterSize = 2, \
.mask = ZAP_CLUSTER_MASK(SERVER), \
@@ -3943,7 +3942,7 @@
{ \
/* Endpoint: 1, Cluster: PM2.5 Concentration Measurement (server) */ \
.clusterId = 0x0000042A, \
- .attributes = ZAP_ATTRIBUTE_INDEX(820), \
+ .attributes = ZAP_ATTRIBUTE_INDEX(819), \
.attributeCount = 13, \
.clusterSize = 2, \
.mask = ZAP_CLUSTER_MASK(SERVER), \
@@ -3956,7 +3955,7 @@
{ \
/* Endpoint: 1, Cluster: Formaldehyde Concentration Measurement (server) */ \
.clusterId = 0x0000042B, \
- .attributes = ZAP_ATTRIBUTE_INDEX(833), \
+ .attributes = ZAP_ATTRIBUTE_INDEX(832), \
.attributeCount = 13, \
.clusterSize = 2, \
.mask = ZAP_CLUSTER_MASK(SERVER), \
@@ -3969,7 +3968,7 @@
{ \
/* Endpoint: 1, Cluster: PM1 Concentration Measurement (server) */ \
.clusterId = 0x0000042C, \
- .attributes = ZAP_ATTRIBUTE_INDEX(846), \
+ .attributes = ZAP_ATTRIBUTE_INDEX(845), \
.attributeCount = 13, \
.clusterSize = 2, \
.mask = ZAP_CLUSTER_MASK(SERVER), \
@@ -3982,7 +3981,7 @@
{ \
/* Endpoint: 1, Cluster: PM10 Concentration Measurement (server) */ \
.clusterId = 0x0000042D, \
- .attributes = ZAP_ATTRIBUTE_INDEX(859), \
+ .attributes = ZAP_ATTRIBUTE_INDEX(858), \
.attributeCount = 13, \
.clusterSize = 2, \
.mask = ZAP_CLUSTER_MASK(SERVER), \
@@ -3995,7 +3994,7 @@
{ \
/* Endpoint: 1, Cluster: Total Volatile Organic Compounds Concentration Measurement (server) */ \
.clusterId = 0x0000042E, \
- .attributes = ZAP_ATTRIBUTE_INDEX(872), \
+ .attributes = ZAP_ATTRIBUTE_INDEX(871), \
.attributeCount = 13, \
.clusterSize = 2, \
.mask = ZAP_CLUSTER_MASK(SERVER), \
@@ -4008,7 +4007,7 @@
{ \
/* Endpoint: 1, Cluster: Radon Concentration Measurement (server) */ \
.clusterId = 0x0000042F, \
- .attributes = ZAP_ATTRIBUTE_INDEX(885), \
+ .attributes = ZAP_ATTRIBUTE_INDEX(884), \
.attributeCount = 13, \
.clusterSize = 2, \
.mask = ZAP_CLUSTER_MASK(SERVER), \
@@ -4021,7 +4020,7 @@
{ \
/* Endpoint: 1, Cluster: Wake on LAN (server) */ \
.clusterId = 0x00000503, \
- .attributes = ZAP_ATTRIBUTE_INDEX(898), \
+ .attributes = ZAP_ATTRIBUTE_INDEX(897), \
.attributeCount = 3, \
.clusterSize = 19, \
.mask = ZAP_CLUSTER_MASK(SERVER), \
@@ -4034,7 +4033,7 @@
{ \
/* Endpoint: 1, Cluster: Low Power (server) */ \
.clusterId = 0x00000508, \
- .attributes = ZAP_ATTRIBUTE_INDEX(901), \
+ .attributes = ZAP_ATTRIBUTE_INDEX(900), \
.attributeCount = 2, \
.clusterSize = 6, \
.mask = ZAP_CLUSTER_MASK(SERVER), \
@@ -4047,7 +4046,7 @@
{ \
/* Endpoint: 1, Cluster: Electrical Measurement (server) */ \
.clusterId = 0x00000B04, \
- .attributes = ZAP_ATTRIBUTE_INDEX(903), \
+ .attributes = ZAP_ATTRIBUTE_INDEX(902), \
.attributeCount = 13, \
.clusterSize = 32, \
.mask = ZAP_CLUSTER_MASK(SERVER), \
@@ -4060,7 +4059,7 @@
{ \
/* Endpoint: 1, Cluster: Unit Testing (server) */ \
.clusterId = 0xFFF1FC05, \
- .attributes = ZAP_ATTRIBUTE_INDEX(916), \
+ .attributes = ZAP_ATTRIBUTE_INDEX(915), \
.attributeCount = 84, \
.clusterSize = 2290, \
.mask = ZAP_CLUSTER_MASK(SERVER), \
@@ -4073,7 +4072,7 @@
{ \
/* Endpoint: 2, Cluster: Identify (server) */ \
.clusterId = 0x00000003, \
- .attributes = ZAP_ATTRIBUTE_INDEX(1000), \
+ .attributes = ZAP_ATTRIBUTE_INDEX(999), \
.attributeCount = 4, \
.clusterSize = 9, \
.mask = ZAP_CLUSTER_MASK(SERVER) | ZAP_CLUSTER_MASK(INIT_FUNCTION) | ZAP_CLUSTER_MASK(ATTRIBUTE_CHANGED_FUNCTION), \
@@ -4086,7 +4085,7 @@
{ \
/* Endpoint: 2, Cluster: Groups (server) */ \
.clusterId = 0x00000004, \
- .attributes = ZAP_ATTRIBUTE_INDEX(1004), \
+ .attributes = ZAP_ATTRIBUTE_INDEX(1003), \
.attributeCount = 3, \
.clusterSize = 7, \
.mask = ZAP_CLUSTER_MASK(SERVER) | ZAP_CLUSTER_MASK(INIT_FUNCTION), \
@@ -4099,7 +4098,7 @@
{ \
/* Endpoint: 2, Cluster: On/Off (server) */ \
.clusterId = 0x00000006, \
- .attributes = ZAP_ATTRIBUTE_INDEX(1007), \
+ .attributes = ZAP_ATTRIBUTE_INDEX(1006), \
.attributeCount = 7, \
.clusterSize = 13, \
.mask = ZAP_CLUSTER_MASK(SERVER) | ZAP_CLUSTER_MASK(INIT_FUNCTION) | ZAP_CLUSTER_MASK(SHUTDOWN_FUNCTION), \
@@ -4112,7 +4111,7 @@
{ \
/* Endpoint: 2, Cluster: Descriptor (server) */ \
.clusterId = 0x0000001D, \
- .attributes = ZAP_ATTRIBUTE_INDEX(1014), \
+ .attributes = ZAP_ATTRIBUTE_INDEX(1013), \
.attributeCount = 7, \
.clusterSize = 0, \
.mask = ZAP_CLUSTER_MASK(SERVER), \
@@ -4125,7 +4124,7 @@
{ \
/* Endpoint: 2, Cluster: Power Source (server) */ \
.clusterId = 0x0000002F, \
- .attributes = ZAP_ATTRIBUTE_INDEX(1021), \
+ .attributes = ZAP_ATTRIBUTE_INDEX(1020), \
.attributeCount = 9, \
.clusterSize = 72, \
.mask = ZAP_CLUSTER_MASK(SERVER), \
@@ -4138,7 +4137,7 @@
{ \
/* Endpoint: 2, Cluster: Scenes Management (server) */ \
.clusterId = 0x00000062, \
- .attributes = ZAP_ATTRIBUTE_INDEX(1030), \
+ .attributes = ZAP_ATTRIBUTE_INDEX(1029), \
.attributeCount = 5, \
.clusterSize = 16, \
.mask = ZAP_CLUSTER_MASK(SERVER) | ZAP_CLUSTER_MASK(INIT_FUNCTION) | ZAP_CLUSTER_MASK(SHUTDOWN_FUNCTION), \
@@ -4151,7 +4150,7 @@
{ \
/* Endpoint: 2, Cluster: Occupancy Sensing (server) */ \
.clusterId = 0x00000406, \
- .attributes = ZAP_ATTRIBUTE_INDEX(1035), \
+ .attributes = ZAP_ATTRIBUTE_INDEX(1034), \
.attributeCount = 5, \
.clusterSize = 9, \
.mask = ZAP_CLUSTER_MASK(SERVER) | ZAP_CLUSTER_MASK(INIT_FUNCTION), \
@@ -4164,7 +4163,7 @@
{ \
/* Endpoint: 65534, Cluster: Descriptor (server) */ \
.clusterId = 0x0000001D, \
- .attributes = ZAP_ATTRIBUTE_INDEX(1040), \
+ .attributes = ZAP_ATTRIBUTE_INDEX(1039), \
.attributeCount = 6, \
.clusterSize = 0, \
.mask = ZAP_CLUSTER_MASK(SERVER), \
@@ -4177,7 +4176,7 @@
{ \
/* Endpoint: 65534, Cluster: Network Commissioning (server) */ \
.clusterId = 0x00000031, \
- .attributes = ZAP_ATTRIBUTE_INDEX(1046), \
+ .attributes = ZAP_ATTRIBUTE_INDEX(1045), \
.attributeCount = 10, \
.clusterSize = 0, \
.mask = ZAP_CLUSTER_MASK(SERVER), \
@@ -4196,7 +4195,7 @@
// This is an array of EmberAfEndpointType structures.
#define GENERATED_ENDPOINT_TYPES \
{ \
- { ZAP_CLUSTER_INDEX(0), 29, 349 }, { ZAP_CLUSTER_INDEX(29), 74, 3523 }, { ZAP_CLUSTER_INDEX(103), 7, 126 }, \
+ { ZAP_CLUSTER_INDEX(0), 29, 349 }, { ZAP_CLUSTER_INDEX(29), 74, 3522 }, { ZAP_CLUSTER_INDEX(103), 7, 126 }, \
{ ZAP_CLUSTER_INDEX(110), 2, 0 }, \
}
@@ -4209,7 +4208,7 @@ static_assert(ATTRIBUTE_LARGEST <= CHIP_CONFIG_MAX_ATTRIBUTE_STORE_ELEMENT_SIZE,
#define ATTRIBUTE_SINGLETONS_SIZE (36)
// Total size of attribute storage
-#define ATTRIBUTE_MAX_SIZE (3998)
+#define ATTRIBUTE_MAX_SIZE (3997)
// Number of fixed endpoints
#define FIXED_ENDPOINT_COUNT (4)
diff --git a/scripts/tools/zap/tests/outputs/lighting-app/app-templates/access.h b/scripts/tools/zap/tests/outputs/lighting-app/app-templates/access.h
index 5bb357928377a2..45b93e99bae3c8 100644
--- a/scripts/tools/zap/tests/outputs/lighting-app/app-templates/access.h
+++ b/scripts/tools/zap/tests/outputs/lighting-app/app-templates/access.h
@@ -33,9 +33,6 @@
/* Cluster: Level Control, Attribute: StartUpCurrentLevel, Privilege: view */ \
0x0000001F, /* Cluster: Access Control, Attribute: ACL, Privilege: administer */ \
0x0000001F, /* Cluster: Access Control, Attribute: Extension, Privilege: administer */ \
- /* Cluster: Access Control, Attribute: SubjectsPerAccessControlEntry, Privilege: view */ \
- /* Cluster: Access Control, Attribute: TargetsPerAccessControlEntry, Privilege: view */ \
- /* Cluster: Access Control, Attribute: AccessControlEntriesPerFabric, Privilege: view */ \
/* Cluster: Basic Information, Attribute: NodeLabel, Privilege: view */ \
/* Cluster: Basic Information, Attribute: Location, Privilege: view */ \
/* Cluster: Basic Information, Attribute: LocalConfigDisabled, Privilege: view */ \
@@ -59,9 +56,6 @@
/* Cluster: Level Control, Attribute: StartUpCurrentLevel, Privilege: view */ \
0x00000000, /* Cluster: Access Control, Attribute: ACL, Privilege: administer */ \
0x00000001, /* Cluster: Access Control, Attribute: Extension, Privilege: administer */ \
- /* Cluster: Access Control, Attribute: SubjectsPerAccessControlEntry, Privilege: view */ \
- /* Cluster: Access Control, Attribute: TargetsPerAccessControlEntry, Privilege: view */ \
- /* Cluster: Access Control, Attribute: AccessControlEntriesPerFabric, Privilege: view */ \
/* Cluster: Basic Information, Attribute: NodeLabel, Privilege: view */ \
/* Cluster: Basic Information, Attribute: Location, Privilege: view */ \
/* Cluster: Basic Information, Attribute: LocalConfigDisabled, Privilege: view */ \
@@ -85,9 +79,6 @@
/* Cluster: Level Control, Attribute: StartUpCurrentLevel, Privilege: view */ \
chip::Access::Privilege::kAdminister, /* Cluster: Access Control, Attribute: ACL, Privilege: administer */ \
chip::Access::Privilege::kAdminister, /* Cluster: Access Control, Attribute: Extension, Privilege: administer */ \
- /* Cluster: Access Control, Attribute: SubjectsPerAccessControlEntry, Privilege: view */ \
- /* Cluster: Access Control, Attribute: TargetsPerAccessControlEntry, Privilege: view */ \
- /* Cluster: Access Control, Attribute: AccessControlEntriesPerFabric, Privilege: view */ \
/* Cluster: Basic Information, Attribute: NodeLabel, Privilege: view */ \
/* Cluster: Basic Information, Attribute: Location, Privilege: view */ \
/* Cluster: Basic Information, Attribute: LocalConfigDisabled, Privilege: view */ \
@@ -301,18 +292,24 @@
#define GENERATED_ACCESS_READ_EVENT__CLUSTER { \
0x0000001F, /* Cluster: Access Control, Event: AccessControlEntryChanged, Privilege: administer */ \
0x0000001F, /* Cluster: Access Control, Event: AccessControlExtensionChanged, Privilege: administer */ \
+ 0x0000001F, /* Cluster: Access Control, Event: AccessRestrictionEntryChanged, Privilege: administer */ \
+ 0x0000001F, /* Cluster: Access Control, Event: FabricRestrictionReviewUpdate, Privilege: administer */ \
}
// Parallel array data (cluster, *event*, privilege) for read event
#define GENERATED_ACCESS_READ_EVENT__EVENT { \
0x00000000, /* Cluster: Access Control, Event: AccessControlEntryChanged, Privilege: administer */ \
0x00000001, /* Cluster: Access Control, Event: AccessControlExtensionChanged, Privilege: administer */ \
+ 0x00000002, /* Cluster: Access Control, Event: AccessRestrictionEntryChanged, Privilege: administer */ \
+ 0x00000003, /* Cluster: Access Control, Event: FabricRestrictionReviewUpdate, Privilege: administer */ \
}
// Parallel array data (cluster, event, *privilege*) for read event
#define GENERATED_ACCESS_READ_EVENT__PRIVILEGE { \
chip::Access::Privilege::kAdminister, /* Cluster: Access Control, Event: AccessControlEntryChanged, Privilege: administer */ \
chip::Access::Privilege::kAdminister, /* Cluster: Access Control, Event: AccessControlExtensionChanged, Privilege: administer */ \
+ chip::Access::Privilege::kAdminister, /* Cluster: Access Control, Event: AccessRestrictionEntryChanged, Privilege: administer */ \
+ chip::Access::Privilege::kAdminister, /* Cluster: Access Control, Event: FabricRestrictionReviewUpdate, Privilege: administer */ \
}
////////////////////////////////////////////////////////////////////////////////
diff --git a/src/app/chip_data_model.gni b/src/app/chip_data_model.gni
index 7a439a4141ce49..ae7bb84948b3be 100644
--- a/src/app/chip_data_model.gni
+++ b/src/app/chip_data_model.gni
@@ -398,6 +398,12 @@ template("chip_data_model") {
"${_app_root}/clusters/${cluster}/thread-network-diagnostics-provider.cpp",
"${_app_root}/clusters/${cluster}/thread-network-diagnostics-provider.h",
]
+ } else if (cluster == "thread-border-router-management-server") {
+ sources += [
+ "${_app_root}/clusters/${cluster}/thread-border-router-management-server.cpp",
+ "${_app_root}/clusters/${cluster}/thread-border-router-management-server.h",
+ "${_app_root}/clusters/${cluster}/thread-br-delegate.h",
+ ]
} else if (cluster == "water-heater-management-server") {
sources += [
"${_app_root}/clusters/${cluster}/${cluster}.cpp",
@@ -412,6 +418,14 @@ template("chip_data_model") {
"${_app_root}/clusters/${cluster}/DefaultThreadNetworkDirectoryStorage.h",
"${_app_root}/clusters/${cluster}/ThreadNetworkDirectoryStorage.h",
]
+ } else if (cluster == "thermostat-server") {
+ sources += [
+ "${_app_root}/clusters/${cluster}/${cluster}.cpp",
+ "${_app_root}/clusters/${cluster}/${cluster}.h",
+ "${_app_root}/clusters/${cluster}/PresetStructWithOwnedMembers.cpp",
+ "${_app_root}/clusters/${cluster}/PresetStructWithOwnedMembers.h",
+ "${_app_root}/clusters/${cluster}/thermostat-delegate.h",
+ ]
} else {
sources += [ "${_app_root}/clusters/${cluster}/${cluster}.cpp" ]
}
diff --git a/src/app/clusters/level-control/level-control.cpp b/src/app/clusters/level-control/level-control.cpp
index 738a7b10ed0ffb..00d8a2e496518f 100644
--- a/src/app/clusters/level-control/level-control.cpp
+++ b/src/app/clusters/level-control/level-control.cpp
@@ -369,7 +369,7 @@ static void reallyUpdateCoupledColorTemp(EndpointId endpoint)
/*
* @brief
* This function is used to update the current level attribute
- * while respecting it's defined quiet reporting quality:
+ * while respecting its defined quiet reporting quality:
* The attribute will be reported:
* - At most once per second, or
* - At the start of the movement/transition, or
@@ -386,8 +386,7 @@ static Status SetCurrentLevelQuietReport(EndpointId endpoint, EmberAfLevelContro
DataModel::Nullable newValue, bool isStartOrEndOfTransition)
{
AttributeDirtyState dirtyState;
- MarkAttributeDirty markDirty = MarkAttributeDirty::kNo;
- auto now = System::SystemClock().GetMonotonicTimestamp();
+ auto now = System::SystemClock().GetMonotonicTimestamp();
if (isStartOrEndOfTransition)
{
@@ -406,9 +405,10 @@ static Status SetCurrentLevelQuietReport(EndpointId endpoint, EmberAfLevelContro
dirtyState = state->quietCurrentLevel.SetValue(newValue, now, predicate);
}
+ MarkAttributeDirty markDirty = MarkAttributeDirty::kNo;
if (dirtyState == AttributeDirtyState::kMustReport)
{
- markDirty = MarkAttributeDirty::kIfChanged;
+ markDirty = MarkAttributeDirty::kYes;
}
return Attributes::CurrentLevel::Set(endpoint, state->quietCurrentLevel.value(), markDirty);
}
@@ -542,7 +542,7 @@ static void writeRemainingTime(EndpointId endpoint, uint16_t remainingTimeMs)
// - kMarkDirtyOnIncrement : When the value increases.
if (state->quietRemainingTime.SetValue(remainingTimeDs, now) == AttributeDirtyState::kMustReport)
{
- markDirty = MarkAttributeDirty::kIfChanged;
+ markDirty = MarkAttributeDirty::kYes;
}
Attributes::RemainingTime::Set(endpoint, state->quietRemainingTime.value().ValueOr(0), markDirty);
diff --git a/src/app/clusters/occupancy-sensor-server/occupancy-sensor-server.cpp b/src/app/clusters/occupancy-sensor-server/occupancy-sensor-server.cpp
index 50056387e3c359..4a3ba4103a0b0d 100644
--- a/src/app/clusters/occupancy-sensor-server/occupancy-sensor-server.cpp
+++ b/src/app/clusters/occupancy-sensor-server/occupancy-sensor-server.cpp
@@ -1,6 +1,6 @@
/**
*
- * Copyright (c) 2020 Project CHIP Authors
+ * Copyright (c) 2020-2024 Project CHIP Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -16,12 +16,158 @@
*/
#include "occupancy-sensor-server.h"
+#include "occupancy-hal.h"
-#include
+#include
+#include
+#include
+#include
+#include
+#include
-#include "occupancy-hal.h"
+using chip::Protocols::InteractionModel::Status;
+
+namespace chip {
+namespace app {
+namespace Clusters {
+namespace OccupancySensing {
+
+namespace {
+Structs::HoldTimeLimitsStruct::Type
+ sHoldTimeLimitsStructs[MATTER_DM_OCCUPANCY_SENSING_CLUSTER_SERVER_ENDPOINT_COUNT + CHIP_DEVICE_CONFIG_DYNAMIC_ENDPOINT_COUNT];
+
+uint16_t sHoldTime[MATTER_DM_OCCUPANCY_SENSING_CLUSTER_SERVER_ENDPOINT_COUNT + CHIP_DEVICE_CONFIG_DYNAMIC_ENDPOINT_COUNT];
+} // namespace
+
+CHIP_ERROR OccupancySensingAttrAccess::Init()
+{
+ VerifyOrReturnError(registerAttributeAccessOverride(this), CHIP_ERROR_INCORRECT_STATE);
+ return CHIP_NO_ERROR;
+}
+
+void OccupancySensingAttrAccess::Shutdown()
+{
+ unregisterAttributeAccessOverride(this);
+}
+
+CHIP_ERROR OccupancySensingAttrAccess::Read(const ConcreteReadAttributePath & aPath, AttributeValueEncoder & aEncoder)
+{
+ VerifyOrDie(aPath.mClusterId == app::Clusters::OccupancySensing::Id);
+
+ switch (aPath.mAttributeId)
+ {
+ case Attributes::FeatureMap::Id:
+ ReturnErrorOnFailure(aEncoder.Encode(mFeature));
+ break;
+ case Attributes::HoldTime::Id: {
+
+ uint16_t * holdTime = GetHoldTimeForEndpoint(aPath.mEndpointId);
+
+ if (holdTime == nullptr)
+ {
+ return CHIP_ERROR_NOT_FOUND;
+ }
+
+ return aEncoder.Encode(*holdTime);
+ }
+ case Attributes::HoldTimeLimits::Id: {
+
+ Structs::HoldTimeLimitsStruct::Type * holdTimeLimitsStruct = GetHoldTimeLimitsForEndpoint(aPath.mEndpointId);
+
+ if (holdTimeLimitsStruct == nullptr)
+ {
+ return CHIP_ERROR_NOT_FOUND;
+ }
+
+ return aEncoder.Encode(*holdTimeLimitsStruct);
+ }
+ default:
+ return CHIP_NO_ERROR;
+ }
+
+ return CHIP_NO_ERROR;
+}
+
+bool OccupancySensingAttrAccess::HasFeature(Feature aFeature) const
+{
+ return mFeature.Has(aFeature);
+}
+
+Structs::HoldTimeLimitsStruct::Type * GetHoldTimeLimitsForEndpoint(EndpointId endpoint)
+{
+ auto index = emberAfGetClusterServerEndpointIndex(endpoint, app::Clusters::OccupancySensing::Id,
+ MATTER_DM_OCCUPANCY_SENSING_CLUSTER_SERVER_ENDPOINT_COUNT);
+
+ if (index == kEmberInvalidEndpointIndex)
+ {
+ return nullptr;
+ }
+
+ if (index >= ArraySize(sHoldTimeLimitsStructs))
+ {
+ ChipLogError(NotSpecified, "Internal error: invalid/unexpected hold time limits index.");
+ return nullptr;
+ }
+ return &sHoldTimeLimitsStructs[index];
+}
+
+CHIP_ERROR SetHoldTimeLimits(EndpointId endpointId, const Structs::HoldTimeLimitsStruct::Type & holdTimeLimits)
+{
+
+ VerifyOrReturnError(kInvalidEndpointId != endpointId, CHIP_ERROR_INVALID_ARGUMENT);
+
+ Structs::HoldTimeLimitsStruct::Type * holdTimeLimitsForEndpoint = GetHoldTimeLimitsForEndpoint(endpointId);
+ VerifyOrReturnError(holdTimeLimitsForEndpoint != nullptr, CHIP_ERROR_INVALID_ARGUMENT);
+
+ holdTimeLimitsForEndpoint->holdTimeMin = holdTimeLimits.holdTimeMin;
+ holdTimeLimitsForEndpoint->holdTimeMax = holdTimeLimits.holdTimeMax;
+ holdTimeLimitsForEndpoint->holdTimeDefault = holdTimeLimits.holdTimeDefault;
+
+ MatterReportingAttributeChangeCallback(endpointId, OccupancySensing::Id, Attributes::HoldTimeLimits::Id);
+
+ return CHIP_NO_ERROR;
+}
+
+uint16_t * GetHoldTimeForEndpoint(EndpointId endpoint)
+{
+ auto index = emberAfGetClusterServerEndpointIndex(endpoint, app::Clusters::OccupancySensing::Id,
+ MATTER_DM_OCCUPANCY_SENSING_CLUSTER_SERVER_ENDPOINT_COUNT);
+
+ if (index == kEmberInvalidEndpointIndex)
+ {
+ return nullptr;
+ }
+
+ if (index >= ArraySize(sHoldTimeLimitsStructs))
+ {
+ ChipLogError(NotSpecified, "Internal error: invalid/unexpected hold time index.");
+ return nullptr;
+ }
+ return &sHoldTime[index];
+}
+
+CHIP_ERROR SetHoldTime(EndpointId endpointId, const uint16_t & holdTime)
+{
+ VerifyOrReturnError(kInvalidEndpointId != endpointId, CHIP_ERROR_INVALID_ARGUMENT);
+
+ uint16_t * holdTimeForEndpoint = GetHoldTimeForEndpoint(endpointId);
+ VerifyOrReturnError(holdTimeForEndpoint != nullptr, CHIP_ERROR_INVALID_ARGUMENT);
+
+ *holdTimeForEndpoint = holdTime;
+
+ MatterReportingAttributeChangeCallback(endpointId, OccupancySensing::Id, Attributes::HoldTime::Id);
+
+ return CHIP_NO_ERROR;
+}
+
+} // namespace OccupancySensing
+} // namespace Clusters
+} // namespace app
+} // namespace chip
using namespace chip;
+using namespace chip::app;
+using namespace chip::app::Clusters;
using namespace chip::app::Clusters::OccupancySensing;
//******************************************************************************
@@ -59,8 +205,6 @@ void emberAfOccupancySensingClusterServerInitCallback(EndpointId endpoint)
break;
}
Attributes::OccupancySensorTypeBitmap::Set(endpoint, deviceTypeBitmap);
-
- emberAfPluginOccupancyClusterServerPostInitCallback(endpoint);
}
//******************************************************************************
@@ -82,8 +226,6 @@ void halOccupancyStateChangedCallback(EndpointId endpoint, HalOccupancyState occ
Attributes::Occupancy::Set(endpoint, occupancyState);
}
-void emberAfPluginOccupancyClusterServerPostInitCallback(EndpointId endpoint) {}
-
HalOccupancySensorType __attribute__((weak)) halOccupancyGetSensorType(EndpointId endpoint)
{
return HAL_OCCUPANCY_SENSOR_TYPE_PIR;
diff --git a/src/app/clusters/occupancy-sensor-server/occupancy-sensor-server.h b/src/app/clusters/occupancy-sensor-server/occupancy-sensor-server.h
index 3ed762cbfb4013..f24c64f4dbfbb1 100644
--- a/src/app/clusters/occupancy-sensor-server/occupancy-sensor-server.h
+++ b/src/app/clusters/occupancy-sensor-server/occupancy-sensor-server.h
@@ -1,6 +1,6 @@
/*
*
- * Copyright (c) 2020 Project CHIP Authors
+ * Copyright (c) 2020-2024 Project CHIP Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -17,15 +17,48 @@
#pragma once
+#include
+#include
+#include
#include
#include
+#include
+#include
-/** @brief Occupancy Cluster Server Post Init
- *
- * Following resolution of the Occupancy state at startup for this endpoint,
- * perform any additional initialization needed; e.g., synchronize hardware
- * state.
- *
- * @param endpoint Endpoint that is being initialized Ver.: always
- */
-void emberAfPluginOccupancyClusterServerPostInitCallback(chip::EndpointId endpoint);
+namespace chip {
+namespace app {
+namespace Clusters {
+namespace OccupancySensing {
+
+class OccupancySensingAttrAccess : public AttributeAccessInterface
+{
+public:
+ OccupancySensingAttrAccess(BitMask aFeature) :
+ app::AttributeAccessInterface(Optional::Missing(), app::Clusters::OccupancySensing::Id), mFeature(aFeature)
+ {}
+
+ ~OccupancySensingAttrAccess() { Shutdown(); }
+
+ CHIP_ERROR Init();
+ void Shutdown();
+
+ CHIP_ERROR Read(const ConcreteReadAttributePath & aPath, AttributeValueEncoder & aEncoder) override;
+
+ bool HasFeature(Feature aFeature) const;
+
+private:
+ BitMask mFeature;
+};
+
+CHIP_ERROR SetHoldTimeLimits(EndpointId endpointId, const Structs::HoldTimeLimitsStruct::Type & holdTimeLimits);
+
+CHIP_ERROR SetHoldTime(EndpointId endpointId, const uint16_t & holdTime);
+
+Structs::HoldTimeLimitsStruct::Type * GetHoldTimeLimitsForEndpoint(EndpointId endpoint);
+
+uint16_t * GetHoldTimeForEndpoint(EndpointId endpoint);
+
+} // namespace OccupancySensing
+} // namespace Clusters
+} // namespace app
+} // namespace chip
diff --git a/src/app/clusters/operational-state-server/operational-state-server.cpp b/src/app/clusters/operational-state-server/operational-state-server.cpp
index b6ae0d7a221253..c86de02bfab6ae 100644
--- a/src/app/clusters/operational-state-server/operational-state-server.cpp
+++ b/src/app/clusters/operational-state-server/operational-state-server.cpp
@@ -29,6 +29,7 @@
#include
#include
#include
+#include
using namespace chip;
using namespace chip::app;
@@ -43,6 +44,9 @@ Instance::Instance(Delegate * aDelegate, EndpointId aEndpointId, ClusterId aClus
mDelegate(aDelegate), mEndpointId(aEndpointId), mClusterId(aClusterId)
{
mDelegate->SetInstance(this);
+ mCountdownTime.policy()
+ .Set(QuieterReportingPolicyEnum::kMarkDirtyOnIncrement)
+ .Set(QuieterReportingPolicyEnum::kMarkDirtyOnChangeToFromZero);
}
Instance::Instance(Delegate * aDelegate, EndpointId aEndpointId) : Instance(aDelegate, aEndpointId, OperationalState::Id) {}
@@ -84,6 +88,7 @@ CHIP_ERROR Instance::SetCurrentPhase(const DataModel::Nullable & aPhase
if (mCurrentPhase != oldPhase)
{
MatterReportingAttributeChangeCallback(mEndpointId, mClusterId, Attributes::CurrentPhase::Id);
+ UpdateCountdownTimeFromClusterLogic();
}
return CHIP_NO_ERROR;
}
@@ -96,9 +101,11 @@ CHIP_ERROR Instance::SetOperationalState(uint8_t aOpState)
return CHIP_ERROR_INVALID_ARGUMENT;
}
+ bool countdownTimeUpdateNeeded = false;
if (mOperationalError.errorStateID != to_underlying(ErrorStateEnum::kNoError))
{
mOperationalError.Set(to_underlying(ErrorStateEnum::kNoError));
+ countdownTimeUpdateNeeded = true;
MatterReportingAttributeChangeCallback(mEndpointId, mClusterId, Attributes::OperationalError::Id);
}
@@ -107,6 +114,12 @@ CHIP_ERROR Instance::SetOperationalState(uint8_t aOpState)
if (mOperationalState != oldState)
{
MatterReportingAttributeChangeCallback(mEndpointId, mClusterId, Attributes::OperationalState::Id);
+ countdownTimeUpdateNeeded = true;
+ }
+
+ if (countdownTimeUpdateNeeded)
+ {
+ UpdateCountdownTimeFromClusterLogic();
}
return CHIP_NO_ERROR;
}
@@ -143,6 +156,8 @@ void Instance::OnOperationalErrorDetected(const Structs::ErrorStateStruct::Type
MatterReportingAttributeChangeCallback(mEndpointId, mClusterId, Attributes::OperationalError::Id);
}
+ UpdateCountdownTimeFromClusterLogic();
+
// Generate an ErrorDetected event
GenericErrorEvent event(mClusterId, aError);
EventNumber eventNumber;
@@ -156,7 +171,7 @@ void Instance::OnOperationalErrorDetected(const Structs::ErrorStateStruct::Type
void Instance::OnOperationCompletionDetected(uint8_t aCompletionErrorCode,
const Optional> & aTotalOperationalTime,
- const Optional> & aPausedTime) const
+ const Optional> & aPausedTime)
{
ChipLogDetail(Zcl, "OperationalStateServer: OnOperationCompletionDetected");
@@ -169,6 +184,8 @@ void Instance::OnOperationCompletionDetected(uint8_t aCompletionErrorCode,
ChipLogError(Zcl, "OperationalStateServer: Failed to record OperationCompletion event: %" CHIP_ERROR_FORMAT,
error.Format());
}
+
+ UpdateCountdownTimeFromClusterLogic();
}
void Instance::ReportOperationalStateListChange()
@@ -179,6 +196,43 @@ void Instance::ReportOperationalStateListChange()
void Instance::ReportPhaseListChange()
{
MatterReportingAttributeChangeCallback(ConcreteAttributePath(mEndpointId, mClusterId, Attributes::PhaseList::Id));
+ UpdateCountdownTimeFromClusterLogic();
+}
+
+void Instance::UpdateCountdownTime(bool fromDelegate)
+{
+ app::DataModel::Nullable newCountdownTime = mDelegate->GetCountdownTime();
+ auto now = System::SystemClock().GetMonotonicTimestamp();
+
+ bool markDirty = false;
+
+ if (fromDelegate)
+ {
+ // Updates from delegate are reduce-reported to every 10s max (choice of this implementation), in addition
+ // to default change-from-null, change-from-zero and increment policy.
+ auto predicate = [](const decltype(mCountdownTime)::SufficientChangePredicateCandidate & candidate) -> bool {
+ if (candidate.lastDirtyValue.IsNull() || candidate.newValue.IsNull())
+ {
+ return false;
+ }
+
+ uint32_t lastDirtyValue = candidate.lastDirtyValue.Value();
+ uint32_t newValue = candidate.newValue.Value();
+ uint32_t kNumSecondsDeltaToReport = 10;
+ return (newValue < lastDirtyValue) && ((lastDirtyValue - newValue) > kNumSecondsDeltaToReport);
+ };
+ markDirty = (mCountdownTime.SetValue(newCountdownTime, now, predicate) == AttributeDirtyState::kMustReport);
+ }
+ else
+ {
+ auto predicate = [](const decltype(mCountdownTime)::SufficientChangePredicateCandidate &) -> bool { return true; };
+ markDirty = (mCountdownTime.SetValue(newCountdownTime, now, predicate) == AttributeDirtyState::kMustReport);
+ }
+
+ if (markDirty)
+ {
+ MatterReportingAttributeChangeCallback(mEndpointId, mClusterId, Attributes::CountdownTime::Id);
+ }
}
bool Instance::IsSupportedPhase(uint8_t aPhase)
@@ -270,6 +324,7 @@ void Instance::InvokeCommand(HandlerContext & handlerContext)
ChipLogDetail(Zcl, "OperationalState: Entering handling derived cluster commands");
InvokeDerivedClusterCommand(handlerContext);
+ break;
}
}
@@ -294,18 +349,18 @@ CHIP_ERROR Instance::Read(const ConcreteReadAttributePath & aPath, AttributeValu
}
return err;
});
+ break;
}
- break;
case OperationalState::Attributes::OperationalState::Id: {
ReturnErrorOnFailure(aEncoder.Encode(GetCurrentOperationalState()));
+ break;
}
- break;
case OperationalState::Attributes::OperationalError::Id: {
ReturnErrorOnFailure(aEncoder.Encode(mOperationalError));
+ break;
}
- break;
case OperationalState::Attributes::PhaseList::Id: {
@@ -332,18 +387,19 @@ CHIP_ERROR Instance::Read(const ConcreteReadAttributePath & aPath, AttributeValu
ReturnErrorOnFailure(encoder.Encode(phase2));
}
});
+ break;
}
- break;
case OperationalState::Attributes::CurrentPhase::Id: {
ReturnErrorOnFailure(aEncoder.Encode(GetCurrentPhase()));
+ break;
}
- break;
case OperationalState::Attributes::CountdownTime::Id: {
+ // Read through to get value closest to reality.
ReturnErrorOnFailure(aEncoder.Encode(mDelegate->GetCountdownTime()));
+ break;
}
- break;
}
return CHIP_NO_ERROR;
}
diff --git a/src/app/clusters/operational-state-server/operational-state-server.h b/src/app/clusters/operational-state-server/operational-state-server.h
index c1640cb99e9ce7..56229c02541d60 100644
--- a/src/app/clusters/operational-state-server/operational-state-server.h
+++ b/src/app/clusters/operational-state-server/operational-state-server.h
@@ -22,6 +22,8 @@
#include
#include
#include
+#include
+#include
namespace chip {
namespace app {
@@ -113,6 +115,12 @@ class Instance : public CommandHandlerInterface, public AttributeAccessInterface
*/
void GetCurrentOperationalError(GenericOperationalError & error) const;
+ /**
+ * @brief Whenever application delegate wants to possibly report a new updated time,
+ * call this method. The `GetCountdownTime()` method will be called on the delegate.
+ */
+ void UpdateCountdownTimeFromDelegate() { UpdateCountdownTime(/* fromDelegate = */ true); }
+
// Event triggers
/**
* @brief Called when the Node detects a OperationalError has been raised.
@@ -129,7 +137,7 @@ class Instance : public CommandHandlerInterface, public AttributeAccessInterface
*/
void OnOperationCompletionDetected(uint8_t aCompletionErrorCode,
const Optional> & aTotalOperationalTime = NullOptional,
- const Optional> & aPausedTime = NullOptional) const;
+ const Optional> & aPausedTime = NullOptional);
// List change reporting
/**
@@ -192,6 +200,19 @@ class Instance : public CommandHandlerInterface, public AttributeAccessInterface
*/
virtual void InvokeDerivedClusterCommand(HandlerContext & handlerContext) { return; };
+ /**
+ * Causes reporting/udpating of CountdownTime attribute from driver if sufficient changes have
+ * occurred (based on Q quality definition for operational state). Calls the Delegate::GetCountdownTime() method.
+ *
+ * @param fromDelegate true if the change notice was triggered by the delegate, false if internal to cluster logic.
+ */
+ void UpdateCountdownTime(bool fromDelegate);
+
+ /**
+ * @brief Whenever the cluster logic thinks time should be updated, call this.
+ */
+ void UpdateCountdownTimeFromClusterLogic() { UpdateCountdownTime(/* fromDelegate=*/false); }
+
private:
Delegate * mDelegate;
@@ -202,6 +223,7 @@ class Instance : public CommandHandlerInterface, public AttributeAccessInterface
app::DataModel::Nullable mCurrentPhase;
uint8_t mOperationalState = 0; // assume 0 for now.
GenericOperationalError mOperationalError = to_underlying(ErrorStateEnum::kNoError);
+ app::QuieterReportingAttribute mCountdownTime{ DataModel::NullNullable };
/**
* This method is inherited from CommandHandlerInterface.
@@ -262,9 +284,10 @@ class Delegate
virtual ~Delegate() = default;
/**
- * Get the countdown time.
- * NOTE: Changes to this attribute should not be reported.
- * From the spec: Changes to this value SHALL NOT be reported in a subscription.
+ * Get the countdown time. This will get called on many edges such as
+ * commands to change operational state, or when the delegate deals with
+ * changes. Make sure it becomes null whenever it is appropriate.
+ *
* @return The current countdown time.
*/
virtual app::DataModel::Nullable GetCountdownTime() = 0;
diff --git a/src/app/clusters/scenes-server/scenes-server.cpp b/src/app/clusters/scenes-server/scenes-server.cpp
index e657a82f4654fe..7c215c20446948 100644
--- a/src/app/clusters/scenes-server/scenes-server.cpp
+++ b/src/app/clusters/scenes-server/scenes-server.cpp
@@ -376,9 +376,10 @@ void AddSceneParse(CommandHandlerInterface::HandlerContext & ctx, const CommandD
response.sceneID = req.sceneID;
// Verify the attributes are respecting constraints
- if (req.transitionTime > scenes::kScenesMaxTransitionTime || req.sceneName.size() > scenes::kSceneNameMaxLength)
+ if (req.transitionTime > scenes::kScenesMaxTransitionTime || req.sceneName.size() > scenes::kSceneNameMaxLength ||
+ req.sceneID == scenes::kUndefinedSceneId)
{
- response.status = to_underlying(Protocols::InteractionModel::Status::InvalidCommand);
+ response.status = to_underlying(Protocols::InteractionModel::Status::ConstraintError);
ctx.mCommandHandler.AddResponse(ctx.mRequestPath, response);
return;
}
@@ -483,6 +484,14 @@ void ViewSceneParse(HandlerContext & ctx, const CommandData & req, GroupDataProv
response.groupID = req.groupID;
response.sceneID = req.sceneID;
+ // Verify the attributes are respecting constraints
+ if (req.sceneID == scenes::kUndefinedSceneId)
+ {
+ response.status = to_underlying(Protocols::InteractionModel::Status::ConstraintError);
+ ctx.mCommandHandler.AddResponse(ctx.mRequestPath, response);
+ return;
+ }
+
// Verify Endpoint in group
VerifyOrReturn(nullptr != groupProvider);
if (0 != req.groupID &&
@@ -830,6 +839,14 @@ void ScenesServer::HandleRemoveScene(HandlerContext & ctx, const Commands::Remov
response.groupID = req.groupID;
response.sceneID = req.sceneID;
+ // Verify the attributes are respecting constraints
+ if (req.sceneID == scenes::kUndefinedSceneId)
+ {
+ response.status = to_underlying(Protocols::InteractionModel::Status::ConstraintError);
+ ctx.mCommandHandler.AddResponse(ctx.mRequestPath, response);
+ return;
+ }
+
// Scene Table interface data
SceneTableEntry scene(SceneStorageId(req.sceneID, req.groupID));
@@ -930,6 +947,14 @@ void ScenesServer::HandleStoreScene(HandlerContext & ctx, const Commands::StoreS
response.groupID = req.groupID;
response.sceneID = req.sceneID;
+ // Verify the attributes are respecting constraints
+ if (req.sceneID == scenes::kUndefinedSceneId)
+ {
+ response.status = to_underlying(Protocols::InteractionModel::Status::ConstraintError);
+ ctx.mCommandHandler.AddResponse(ctx.mRequestPath, response);
+ return;
+ }
+
CHIP_ERROR err = StoreSceneParse(ctx.mCommandHandler.GetAccessingFabricIndex(), ctx.mRequestPath.mEndpointId, req.groupID,
req.sceneID, mGroupProvider);
@@ -943,6 +968,14 @@ void ScenesServer::HandleStoreScene(HandlerContext & ctx, const Commands::StoreS
void ScenesServer::HandleRecallScene(HandlerContext & ctx, const Commands::RecallScene::DecodableType & req)
{
MATTER_TRACE_SCOPE("RecallScene", "Scenes");
+
+ // Verify the attributes are respecting constraints
+ if (req.sceneID == scenes::kUndefinedSceneId)
+ {
+ ctx.mCommandHandler.AddStatus(ctx.mRequestPath, Protocols::InteractionModel::Status::ConstraintError);
+ return;
+ }
+
CHIP_ERROR err = RecallSceneParse(ctx.mCommandHandler.GetAccessingFabricIndex(), ctx.mRequestPath.mEndpointId, req.groupID,
req.sceneID, req.transitionTime, mGroupProvider);
@@ -1025,6 +1058,14 @@ void ScenesServer::HandleCopyScene(HandlerContext & ctx, const Commands::CopySce
response.groupIdentifierFrom = req.groupIdentifierFrom;
response.sceneIdentifierFrom = req.sceneIdentifierFrom;
+ // Verify the attributes are respecting constraints
+ if (req.sceneIdentifierFrom == scenes::kUndefinedSceneId || req.sceneIdentifierTo == scenes::kUndefinedSceneId)
+ {
+ response.status = to_underlying(Protocols::InteractionModel::Status::ResourceExhausted);
+ ctx.mCommandHandler.AddResponse(ctx.mRequestPath, response);
+ return;
+ }
+
// Verify Endpoint in group
VerifyOrReturn(nullptr != mGroupProvider);
if ((0 != req.groupIdentifierFrom &&
diff --git a/src/app/clusters/thermostat-server/PresetStructWithOwnedMembers.cpp b/src/app/clusters/thermostat-server/PresetStructWithOwnedMembers.cpp
new file mode 100644
index 00000000000000..dfc395f6bee81d
--- /dev/null
+++ b/src/app/clusters/thermostat-server/PresetStructWithOwnedMembers.cpp
@@ -0,0 +1,155 @@
+/**
+ *
+ * Copyright (c) 2024 Project CHIP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "PresetStructWithOwnedMembers.h"
+
+using namespace chip;
+using namespace chip::app;
+using namespace DataModel;
+using namespace chip::app::Clusters::Thermostat::Structs;
+
+namespace chip {
+namespace app {
+namespace Clusters {
+namespace Thermostat {
+
+PresetStructWithOwnedMembers::PresetStructWithOwnedMembers(const PresetStruct::Type & other)
+{
+ *this = other;
+}
+
+void PresetStructWithOwnedMembers::operator=(const PresetStruct::Type & other)
+{
+ SetPresetScenario(other.presetScenario);
+ CHIP_ERROR err = SetPresetHandle(other.presetHandle);
+ if (err != CHIP_NO_ERROR)
+ {
+ ChipLogError(Zcl, "Failed to set Preset handle with err %" CHIP_ERROR_FORMAT, err.Format());
+ }
+ err = SetName(other.name);
+ if (err != CHIP_NO_ERROR)
+ {
+ ChipLogError(Zcl, "Failed to set Preset name with err %" CHIP_ERROR_FORMAT, err.Format());
+ }
+ SetCoolingSetpoint(other.coolingSetpoint);
+ SetHeatingSetpoint(other.heatingSetpoint);
+ SetBuiltIn(other.builtIn);
+}
+
+void PresetStructWithOwnedMembers::SetPresetScenario(PresetScenarioEnum enumValue)
+{
+ presetScenario = enumValue;
+}
+
+CHIP_ERROR PresetStructWithOwnedMembers::SetPresetHandle(const Nullable & newPresetHandle)
+{
+ if (!newPresetHandle.IsNull())
+ {
+ size_t newPresetHandleSize = newPresetHandle.Value().size();
+ if (newPresetHandleSize > kPresetHandleSize)
+ {
+ ChipLogError(Zcl, "Failed to set Preset handle. New preset handle size (%u) > allowed preset handle size (%u)",
+ static_cast(newPresetHandleSize), static_cast(kPresetNameSize));
+ return CHIP_ERROR_NO_MEMORY;
+ }
+ MutableByteSpan targetSpan(presetHandleData);
+ ReturnErrorOnFailure(CopySpanToMutableSpan(newPresetHandle.Value(), targetSpan));
+ presetHandle.SetNonNull(targetSpan);
+ }
+ else
+ {
+ presetHandle.SetNull();
+ }
+
+ return CHIP_NO_ERROR;
+}
+
+CHIP_ERROR PresetStructWithOwnedMembers::SetName(const Optional> & newName)
+{
+ if (newName.HasValue() && !newName.Value().IsNull())
+ {
+ size_t newNameSize = newName.Value().Value().size();
+ if (newNameSize > kPresetNameSize)
+ {
+ ChipLogError(Zcl, "Failed to set Preset name. New name size (%u) > allowed preset name size (%u)",
+ static_cast(newNameSize), static_cast(kPresetNameSize));
+ return CHIP_ERROR_NO_MEMORY;
+ }
+ MutableCharSpan targetSpan(presetNameData);
+ CharSpan newNameSpan = newName.Value().Value();
+ ReturnErrorOnFailure(CopyCharSpanToMutableCharSpan(newNameSpan, targetSpan));
+
+ DataModel::Nullable nullableCharSpan;
+ nullableCharSpan.SetNonNull(targetSpan);
+ name.SetValue(nullableCharSpan);
+ }
+ else
+ {
+ name.ClearValue();
+ }
+ return CHIP_NO_ERROR;
+}
+
+void PresetStructWithOwnedMembers::SetCoolingSetpoint(const Optional & newCoolingSetpoint)
+{
+ coolingSetpoint = newCoolingSetpoint;
+}
+
+void PresetStructWithOwnedMembers::SetHeatingSetpoint(const Optional & newHeatingSetpoint)
+{
+ heatingSetpoint = newHeatingSetpoint;
+}
+
+void PresetStructWithOwnedMembers::SetBuiltIn(DataModel::Nullable newBuiltIn)
+{
+ builtIn = newBuiltIn;
+}
+
+PresetScenarioEnum PresetStructWithOwnedMembers::GetPresetScenario() const
+{
+ return presetScenario;
+}
+
+DataModel::Nullable PresetStructWithOwnedMembers::GetPresetHandle() const
+{
+ return presetHandle;
+}
+
+Optional> PresetStructWithOwnedMembers::GetName() const
+{
+ return name;
+}
+
+Optional PresetStructWithOwnedMembers::GetCoolingSetpoint() const
+{
+ return coolingSetpoint;
+}
+
+Optional PresetStructWithOwnedMembers::GetHeatingSetpoint() const
+{
+ return heatingSetpoint;
+}
+
+DataModel::Nullable PresetStructWithOwnedMembers::GetBuiltIn() const
+{
+ return builtIn;
+}
+
+} // namespace Thermostat
+} // namespace Clusters
+} // namespace app
+} // namespace chip
diff --git a/src/app/clusters/thermostat-server/PresetStructWithOwnedMembers.h b/src/app/clusters/thermostat-server/PresetStructWithOwnedMembers.h
new file mode 100644
index 00000000000000..7161fb874989e2
--- /dev/null
+++ b/src/app/clusters/thermostat-server/PresetStructWithOwnedMembers.h
@@ -0,0 +1,72 @@
+/**
+ *
+ * Copyright (c) 2024 Project CHIP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/****************************************************************************
+ * @file
+ * @brief This class has a struct PresetStructWithOwnedMembers that inherits from
+ * Structs::PresetStruct::Type and manages the storage of the preset handle
+ * member which it owns.
+ *
+ *******************************************************************************
+ ******************************************************************************/
+
+#pragma once
+
+#include
+
+namespace chip {
+namespace app {
+namespace Clusters {
+namespace Thermostat {
+
+static constexpr size_t kPresetHandleSize = 16;
+
+static constexpr size_t kPresetNameSize = 64;
+
+struct PresetStructWithOwnedMembers : protected Structs::PresetStruct::Type
+{
+public:
+ PresetStructWithOwnedMembers() = default;
+ PresetStructWithOwnedMembers(const Structs::PresetStruct::Type & other);
+ void operator=(const Structs::PresetStruct::Type & other);
+
+ void SetPresetScenario(PresetScenarioEnum enumValue);
+ CHIP_ERROR SetPresetHandle(const DataModel::Nullable & newPresetHandle);
+ CHIP_ERROR SetName(const Optional> & newName);
+ void SetCoolingSetpoint(const Optional & newCoolingSetpoint);
+ void SetHeatingSetpoint(const Optional & newHeatingSetpoint);
+ void SetBuiltIn(DataModel::Nullable newBuiltIn);
+
+ PresetScenarioEnum GetPresetScenario() const;
+ DataModel::Nullable GetPresetHandle() const;
+ Optional> GetName() const;
+ Optional GetCoolingSetpoint() const;
+ Optional GetHeatingSetpoint() const;
+ DataModel::Nullable GetBuiltIn() const;
+
+ using Structs::PresetStruct::Type::Encode;
+ using Structs::PresetStruct::Type::kIsFabricScoped;
+
+private:
+ uint8_t presetHandleData[kPresetHandleSize] = { 0 };
+ char presetNameData[kPresetNameSize];
+};
+
+} // namespace Thermostat
+} // namespace Clusters
+} // namespace app
+} // namespace chip
diff --git a/src/app/clusters/thermostat-server/thermostat-delegate.h b/src/app/clusters/thermostat-server/thermostat-delegate.h
new file mode 100644
index 00000000000000..86c1e532b92fc2
--- /dev/null
+++ b/src/app/clusters/thermostat-server/thermostat-delegate.h
@@ -0,0 +1,129 @@
+/**
+ *
+ * Copyright (c) 2024 Project CHIP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include "PresetStructWithOwnedMembers.h"
+#include
+#include
+
+namespace chip {
+namespace app {
+namespace Clusters {
+namespace Thermostat {
+
+/** @brief
+ * Defines methods for implementing application-specific logic for handling Presets in the thermostat cluster.
+ * It defines the interfaces that a thermostat should implement to enable support for reading and writing the
+ * Presets attribute and reading and writing the ActivePresetHandle attribute.
+ */
+class Delegate
+{
+public:
+ Delegate() = default;
+
+ virtual ~Delegate() = default;
+
+ /**
+ * @brief Get the preset type at a given index in the PresetTypes attribute
+ *
+ * @param[in] index The index of the preset type in the list.
+ * @param[out] presetType The preset type at the given index in the list.
+ * @return CHIP_ERROR_PROVIDER_LIST_EXHAUSTED if the index is out of range for the preset types list.
+ */
+ virtual CHIP_ERROR GetPresetTypeAtIndex(size_t index, Structs::PresetTypeStruct::Type & presetType) = 0;
+
+ /**
+ * @brief Get the NumberOfPresets attribute value.
+ *
+ * @return The max number of presets supported. Return 0 if not set.
+ */
+ virtual uint8_t GetNumberOfPresets() = 0;
+
+ /**
+ * @brief Get the preset at a given index in the Presets attribute.
+ *
+ * @param[in] index The index of the preset in the list.
+ * @param[out] preset The PresetStructWithOwnedMembers struct that has the data from the preset
+ * at the given index in the Presets attribute list.
+ * @return CHIP_ERROR_PROVIDER_LIST_EXHAUSTED if the index is out of range for the presets list.
+ */
+ virtual CHIP_ERROR GetPresetAtIndex(size_t index, PresetStructWithOwnedMembers & preset) = 0;
+
+ /**
+ * @brief Get the ActivePresetHandle attribute value.
+ *
+ * @param[out] activePresetHandle The MutableByteSpan to copy the active preset handle into. On success,
+ * the callee must update the length to the length of the copied data. If the value of
+ * the attribute is null, the callee must set the MutableByteSpan to empty.
+ */
+ virtual CHIP_ERROR GetActivePresetHandle(MutableByteSpan & activePresetHandle) = 0;
+
+ /**
+ * @brief Set the ActivePresetHandle attribute value.
+ *
+ * @param[in] newActivePresetHandle The octet string to set the active preset handle to.
+ */
+ virtual CHIP_ERROR SetActivePresetHandle(const DataModel::Nullable & newActivePresetHandle) = 0;
+
+ /**
+ * @brief Appends a preset to the pending presets list maintained by the delegate.
+ * The delegate must ensure it makes a copy of the provided preset and the data
+ * of its preset handle, if any. For example, it could create a PresetStructWithOwnedMembers
+ * from the provided preset.
+ *
+ * @param[in] preset The preset to add to the list.
+ *
+ * @return CHIP_NO_ERROR if the preset was appended to the list successfully.
+ * @return CHIP_ERROR if there was an error adding the preset to the list.
+ */
+ virtual CHIP_ERROR AppendToPendingPresetList(const Structs::PresetStruct::Type & preset) = 0;
+
+ /**
+ * @brief Get the Preset at a given index in the pending presets list.
+ *
+ * @param[in] index The index of the preset in the list.
+ * @param[out] preset The PresetStructWithOwnedMembers struct that has the data from the pending preset
+ * list at the given index.
+ * @return CHIP_ERROR_PROVIDER_LIST_EXHAUSTED if the index is out of range for the pending presets list.
+ */
+ virtual CHIP_ERROR GetPendingPresetAtIndex(size_t index, PresetStructWithOwnedMembers & preset) = 0;
+
+ /**
+ * @brief Updates the presets attribute with the content of the pending presets list. If the preset in the pending presets list
+ * matches i.e. has the same presetHandle as an existing entry in the Presets attribute, the thermostat will update the entry
+ * with the new preset values, otherwise it will add a new preset to the Presets attribute. For new presets that get added,
+ * it is the responsibility of this API to allocate unique preset handles to the presets before saving the preset. This will be
+ * called when the Thermostat receives a CommitPresetsSchedulesRequest command to commit the pending preset changes.
+ *
+ * @return CHIP_NO_ERROR if the updates to the presets attribute has been committed successfully.
+ * @return CHIP_ERROR if the updates to the presets attribute failed to commit for some reason.
+ *
+ */
+ virtual CHIP_ERROR ApplyPendingPresets() = 0;
+
+ /**
+ * @brief Clears the pending presets list.
+ *
+ */
+ virtual void ClearPendingPresetList() = 0;
+};
+
+} // namespace Thermostat
+} // namespace Clusters
+} // namespace app
+} // namespace chip
diff --git a/src/app/clusters/thermostat-server/thermostat-server.cpp b/src/app/clusters/thermostat-server/thermostat-server.cpp
index c650a30c871989..71c2f3d6fd6260 100644
--- a/src/app/clusters/thermostat-server/thermostat-server.cpp
+++ b/src/app/clusters/thermostat-server/thermostat-server.cpp
@@ -15,7 +15,9 @@
* limitations under the License.
*/
-#include
+#include "thermostat-server.h"
+#include "PresetStructWithOwnedMembers.h"
+
#include
#include
@@ -26,11 +28,13 @@
#include
#include
#include
+#include
using namespace chip;
using namespace chip::app;
using namespace chip::app::Clusters;
using namespace chip::app::Clusters::Thermostat;
+using namespace chip::app::Clusters::Thermostat::Structs;
using namespace chip::app::Clusters::Thermostat::Attributes;
using imcode = Protocols::InteractionModel::Status;
@@ -65,16 +69,645 @@ constexpr int8_t kDefaultDeadBand = 25; // 2.5C is the default
namespace {
-class ThermostatAttrAccess : public AttributeAccessInterface
+ThermostatAttrAccess gThermostatAttrAccess;
+
+static_assert(kThermostatEndpointCount <= kEmberInvalidEndpointIndex, "Thermostat Delegate table size error");
+
+Delegate * gDelegateTable[kThermostatEndpointCount] = { nullptr };
+
+Delegate * GetDelegate(EndpointId endpoint)
+{
+ uint16_t ep =
+ emberAfGetClusterServerEndpointIndex(endpoint, Thermostat::Id, MATTER_DM_THERMOSTAT_CLUSTER_SERVER_ENDPOINT_COUNT);
+ return (ep >= ArraySize(gDelegateTable) ? nullptr : gDelegateTable[ep]);
+}
+
+/**
+ * @brief Check if a preset is valid.
+ *
+ * @param[in] preset The preset to check.
+ *
+ * @return true If the preset is valid i.e the PresetHandle (if not null) fits within size constraints and the presetScenario enum
+ * value is valid. Otherwise, return false.
+ */
+bool IsValidPresetEntry(const PresetStruct::Type & preset)
+{
+ // Check that the preset handle is not too long.
+ if (!preset.presetHandle.IsNull() && preset.presetHandle.Value().size() > kPresetHandleSize)
+ {
+ return false;
+ }
+
+ // Ensure we have a valid PresetScenario.
+ return (preset.presetScenario != PresetScenarioEnum::kUnknownEnumValue);
+}
+
+/**
+ * @brief Callback that is called when the timeout for editing the presets expires.
+ *
+ * @param[in] systemLayer The system layer.
+ * @param[in] callbackContext The context passed to the timer callback.
+ */
+void TimerExpiredCallback(System::Layer * systemLayer, void * callbackContext)
+{
+ EndpointId endpoint = static_cast(reinterpret_cast(callbackContext));
+
+ Delegate * delegate = GetDelegate(endpoint);
+ VerifyOrReturn(delegate != nullptr, ChipLogError(Zcl, "Delegate is null. Unable to handle timer expired"));
+
+ delegate->ClearPendingPresetList();
+ gThermostatAttrAccess.SetPresetsEditable(endpoint, false);
+}
+
+/**
+ * @brief Schedules a timer for the given timeout in seconds.
+ *
+ * @param[in] endpoint The endpoint to use.
+ * @param[in] timeoutSeconds The timeout in seconds.
+ */
+void ScheduleTimer(EndpointId endpoint, uint16_t timeoutSeconds)
+{
+ DeviceLayer::SystemLayer().StartTimer(System::Clock::Seconds16(timeoutSeconds), TimerExpiredCallback,
+ reinterpret_cast(static_cast(endpoint)));
+}
+
+/**
+ * @brief Clears the currently scheduled timer.
+ *
+ * @param[in] endpoint The endpoint to use.
+ */
+void ClearTimer(EndpointId endpoint)
+{
+ DeviceLayer::SystemLayer().CancelTimer(TimerExpiredCallback, reinterpret_cast(static_cast(endpoint)));
+}
+
+/**
+ * @brief Extends the currently scheduled timer to a new timeout value in seconds
+ *
+ * @param[in] endpoint The endpoint to use.
+ * @param[in] timeoutSeconds The timeout in seconds to extend the timer to.
+ */
+void ExtendTimer(EndpointId endpoint, uint16_t timeoutSeconds)
+{
+ DeviceLayer::SystemLayer().ExtendTimerTo(System::Clock::Seconds16(timeoutSeconds), TimerExpiredCallback,
+ reinterpret_cast(static_cast(endpoint)));
+}
+
+/**
+ * @brief Checks if the preset is built-in
+ *
+ * @param[in] preset The preset to check.
+ *
+ * @return true If the preset is built-in, false otherwise.
+ */
+bool IsBuiltIn(const PresetStructWithOwnedMembers & preset)
+{
+ return preset.GetBuiltIn().ValueOr(false);
+}
+
+/**
+ * @brief Checks if the presets are matching i.e the presetHandles are the same.
+ *
+ * @param[in] preset The preset to check.
+ * @param[in] presetToMatch The preset to match with.
+ *
+ * @return true If the presets match, false otherwise. If both preset handles are null, returns false
+ */
+bool PresetHandlesExistAndMatch(const PresetStructWithOwnedMembers & preset, const PresetStructWithOwnedMembers & presetToMatch)
+{
+ return !preset.GetPresetHandle().IsNull() && !presetToMatch.GetPresetHandle().IsNull() &&
+ preset.GetPresetHandle().Value().data_equal(presetToMatch.GetPresetHandle().Value());
+}
+
+/**
+ * @brief Get the source scoped node id.
+ *
+ * @param[in] commandObj The command handler object.
+ *
+ * @return The scoped node id of the source node. If the scoped node id is not retreived, return ScopedNodeId().
+ */
+ScopedNodeId GetSourceScopedNodeId(CommandHandler * commandObj)
+{
+ ScopedNodeId sourceNodeId = ScopedNodeId();
+ auto sessionHandle = commandObj->GetExchangeContext()->GetSessionHandle();
+
+ if (sessionHandle->IsSecureSession())
+ {
+ sourceNodeId = sessionHandle->AsSecureSession()->GetPeer();
+ }
+ else if (sessionHandle->IsGroupSession())
+ {
+ sourceNodeId = sessionHandle->AsIncomingGroupSession()->GetPeer();
+ }
+ return sourceNodeId;
+}
+
+/**
+ * @brief Utility to clean up state by clearing the pending presets list, canceling the timer
+ * and setting PresetsEditable to false and clear the originator scoped node id.
+ *
+ * @param[in] delegate The delegate to use.
+ * @param[in] endpoint The endpoint to use.
+ */
+void CleanUp(Delegate * delegate, EndpointId endpoint)
+{
+ if (delegate != nullptr)
+ {
+ delegate->ClearPendingPresetList();
+ }
+ ClearTimer(endpoint);
+ gThermostatAttrAccess.SetPresetsEditable(endpoint, false);
+ gThermostatAttrAccess.SetOriginatorScopedNodeId(endpoint, ScopedNodeId());
+}
+
+/**
+ * @brief Sends a response for the command and cleans up state by calling CleanUp()
+ *
+ * @param[in] delegate The delegate to use.
+ * @param[in] endpoint The endpoint to use.
+ * @param[in] commandObj The command handler to use to add the status response.
+ * @param[in] commandPath The command path.
+ * @param[in] status The status code to send as the response.
+ *
+ * @return true to indicate the response has been sent and command has been handled.
+ */
+bool SendResponseAndCleanUp(Delegate * delegate, EndpointId endpoint, CommandHandler * commandObj,
+ const ConcreteCommandPath & commandPath, imcode status)
+{
+ commandObj->AddStatus(commandPath, status);
+ CleanUp(delegate, endpoint);
+ return true;
+}
+
+/**
+ * @brief Finds an entry in the pending presets list that matches a preset.
+ * The presetHandle of the two presets must match.
+ *
+ * @param[in] delegate The delegate to use.
+ * @param[in] presetToMatch The preset to match with.
+ *
+ * @return true if a matching entry was found in the pending presets list, false otherwise.
+ */
+bool MatchingPendingPresetExists(Delegate * delegate, const PresetStructWithOwnedMembers & presetToMatch)
+{
+ VerifyOrReturnValue(delegate != nullptr, false);
+
+ for (uint8_t i = 0; true; i++)
+ {
+ PresetStructWithOwnedMembers preset;
+ CHIP_ERROR err = delegate->GetPendingPresetAtIndex(i, preset);
+
+ if (err == CHIP_ERROR_PROVIDER_LIST_EXHAUSTED)
+ {
+ break;
+ }
+ if (err != CHIP_NO_ERROR)
+ {
+ ChipLogError(Zcl, "MatchingPendingPresetExists: GetPendingPresetAtIndex failed with error %" CHIP_ERROR_FORMAT,
+ err.Format());
+ return false;
+ }
+
+ if (PresetHandlesExistAndMatch(preset, presetToMatch))
+ {
+ return true;
+ }
+ }
+ return false;
+}
+
+/**
+ * @brief Finds and returns an entry in the Presets attribute list that matches a preset.
+ * The presetHandle of the two presets must match.
+ *
+ * @param[in] delegate The delegate to use.
+ * @param[in] presetToMatch The preset to match with.
+ * @param[out] matchingPreset The preset in the Presets attribute list that has the same PresetHandle as the presetToMatch.
+ *
+ * @return true if a matching entry was found in the presets attribute list, false otherwise.
+ */
+bool GetMatchingPresetInPresets(Delegate * delegate, const PresetStructWithOwnedMembers & presetToMatch,
+ PresetStructWithOwnedMembers & matchingPreset)
+{
+ VerifyOrReturnValue(delegate != nullptr, false);
+
+ for (uint8_t i = 0; true; i++)
+ {
+ CHIP_ERROR err = delegate->GetPresetAtIndex(i, matchingPreset);
+
+ if (err == CHIP_ERROR_PROVIDER_LIST_EXHAUSTED)
+ {
+ break;
+ }
+ if (err != CHIP_NO_ERROR)
+ {
+ ChipLogError(Zcl, "GetMatchingPresetInPresets: GetPresetAtIndex failed with error %" CHIP_ERROR_FORMAT, err.Format());
+ return false;
+ }
+
+ if (PresetHandlesExistAndMatch(matchingPreset, presetToMatch))
+ {
+ return true;
+ }
+ }
+ return false;
+}
+
+/**
+ * @brief Checks if the given preset handle is present in the presets attribute
+ * @param[in] delegate The delegate to use.
+ * @param[in] presetHandleToMatch The preset handle to match with.
+ *
+ * @return true if the given preset handle is present in the presets attribute list, false otherwise.
+ */
+bool IsPresetHandlePresentInPresets(Delegate * delegate, const ByteSpan & presetHandleToMatch)
+{
+ VerifyOrReturnValue(delegate != nullptr, false);
+
+ PresetStructWithOwnedMembers matchingPreset;
+ for (uint8_t i = 0; true; i++)
+ {
+ CHIP_ERROR err = delegate->GetPresetAtIndex(i, matchingPreset);
+
+ if (err == CHIP_ERROR_PROVIDER_LIST_EXHAUSTED)
+ {
+ return false;
+ }
+
+ if (err != CHIP_NO_ERROR)
+ {
+ ChipLogError(Zcl, "IsPresetHandlePresentInPresets: GetPresetAtIndex failed with error %" CHIP_ERROR_FORMAT,
+ err.Format());
+ return false;
+ }
+
+ if (!matchingPreset.GetPresetHandle().IsNull() && matchingPreset.GetPresetHandle().Value().data_equal(presetHandleToMatch))
+ {
+ return true;
+ }
+ }
+ return false;
+}
+
+/**
+ * @brief Returns the length of the list of presets if the pending presets were to be applied. The calculation is done by
+ * adding the number of presets in Presets attribute list to the number of pending presets in the pending
+ * presets list and subtracting the number of duplicate presets. This is called before changes are actually applied.
+ *
+ * @param[in] delegate The delegate to use.
+ *
+ * @return count of the updated Presets attribute if the pending presets were applied to it. Return 0 for error cases.
+ */
+uint8_t CountUpdatedPresetsAfterApplyingPendingPresets(Delegate * delegate)
+{
+ uint8_t numberOfPresets = 0;
+ uint8_t numberOfMatches = 0;
+ uint8_t numberOfPendingPresets = 0;
+
+ VerifyOrReturnValue(delegate != nullptr, 0);
+
+ for (uint8_t i = 0; true; i++)
+ {
+ PresetStructWithOwnedMembers preset;
+ CHIP_ERROR err = delegate->GetPresetAtIndex(i, preset);
+
+ if (err == CHIP_ERROR_PROVIDER_LIST_EXHAUSTED)
+ {
+ break;
+ }
+ if (err != CHIP_NO_ERROR)
+ {
+ ChipLogError(Zcl, "GetUpdatedPresetsCount: GetPresetAtIndex failed with error %" CHIP_ERROR_FORMAT, err.Format());
+ return 0;
+ }
+ numberOfPresets++;
+
+ bool found = MatchingPendingPresetExists(delegate, preset);
+
+ if (found)
+ {
+ numberOfMatches++;
+ }
+ }
+
+ for (uint8_t i = 0; true; i++)
+ {
+ PresetStructWithOwnedMembers pendingPreset;
+ CHIP_ERROR err = delegate->GetPendingPresetAtIndex(i, pendingPreset);
+
+ if (err == CHIP_ERROR_PROVIDER_LIST_EXHAUSTED)
+ {
+ break;
+ }
+ if (err != CHIP_NO_ERROR)
+ {
+ ChipLogError(Zcl, "GetUpdatedPresetsCount: GetPendingPresetAtIndex failed with error %" CHIP_ERROR_FORMAT,
+ err.Format());
+ return 0;
+ }
+ numberOfPendingPresets++;
+ }
+
+ // TODO: #34546 - Need to support deletion of presets that are removed from Presets.
+ // This API needs to modify its logic for the deletion case.
+ return static_cast(numberOfPresets + numberOfPendingPresets - numberOfMatches);
+}
+
+/**
+ * @brief Checks if the presetScenario is present in the PresetTypes attribute.
+ *
+ * @param[in] delegate The delegate to use.
+ * @param[in] presetScenario The presetScenario to match with.
+ *
+ * @return true if the presetScenario is found, false otherwise.
+ */
+bool PresetScenarioExistsInPresetTypes(Delegate * delegate, PresetScenarioEnum presetScenario)
+{
+ VerifyOrReturnValue(delegate != nullptr, false);
+
+ for (uint8_t i = 0; true; i++)
+ {
+ PresetTypeStruct::Type presetType;
+ auto err = delegate->GetPresetTypeAtIndex(i, presetType);
+ if (err != CHIP_NO_ERROR)
+ {
+ return false;
+ }
+
+ if (presetType.presetScenario == presetScenario)
+ {
+ return true;
+ }
+ }
+ return false;
+}
+
+/**
+ * @brief Returns the count of preset entries in the pending presets list that have the matching presetHandle.
+ * @param[in] delegate The delegate to use.
+ * @param[in] presetHandleToMatch The preset handle to match.
+ *
+ * @return count of the number of presets found with the matching presetHandle. Returns 0 if no matching presets were found.
+ */
+uint8_t CountPresetsInPendingListWithPresetHandle(Delegate * delegate, const ByteSpan & presetHandleToMatch)
+{
+ uint8_t count = 0;
+ VerifyOrReturnValue(delegate != nullptr, count);
+
+ for (uint8_t i = 0; true; i++)
+ {
+ PresetStructWithOwnedMembers preset;
+ auto err = delegate->GetPendingPresetAtIndex(i, preset);
+ if (err != CHIP_NO_ERROR)
+ {
+ return count;
+ }
+
+ DataModel::Nullable presetHandle = preset.GetPresetHandle();
+ if (!presetHandle.IsNull() && presetHandle.Value().data_equal(presetHandleToMatch))
+ {
+ count++;
+ }
+ }
+ return count;
+}
+
+/**
+ * @brief Checks if the presetType for the given preset scenario supports name in the presetTypeFeatures bitmap.
+ *
+ * @param[in] delegate The delegate to use.
+ * @param[in] presetScenario The presetScenario to match with.
+ *
+ * @return true if the presetType for the given preset scenario supports name, false otherwise.
+ */
+bool PresetTypeSupportsNames(Delegate * delegate, PresetScenarioEnum scenario)
+{
+ VerifyOrReturnValue(delegate != nullptr, false);
+
+ for (uint8_t i = 0; true; i++)
+ {
+ PresetTypeStruct::Type presetType;
+ auto err = delegate->GetPresetTypeAtIndex(i, presetType);
+ if (err != CHIP_NO_ERROR)
+ {
+ return false;
+ }
+
+ if (presetType.presetScenario == scenario)
+ {
+ return (presetType.presetTypeFeatures.Has(PresetTypeFeaturesBitmap::kSupportsNames));
+ }
+ }
+ return false;
+}
+
+int16_t EnforceHeatingSetpointLimits(int16_t HeatingSetpoint, EndpointId endpoint)
+{
+ // Optional Mfg supplied limits
+ int16_t AbsMinHeatSetpointLimit = kDefaultAbsMinHeatSetpointLimit;
+ int16_t AbsMaxHeatSetpointLimit = kDefaultAbsMaxHeatSetpointLimit;
+
+ // Optional User supplied limits
+ int16_t MinHeatSetpointLimit = kDefaultMinHeatSetpointLimit;
+ int16_t MaxHeatSetpointLimit = kDefaultMaxHeatSetpointLimit;
+
+ // Attempt to read the setpoint limits
+ // Absmin/max are manufacturer limits
+ // min/max are user imposed min/max
+
+ // Note that the limits are initialized above per the spec limits
+ // if they are not present Get() will not update the value so the defaults are used
+ imcode status;
+
+ // https://github.com/CHIP-Specifications/connectedhomeip-spec/issues/3724
+ // behavior is not specified when Abs * values are not present and user values are present
+ // implemented behavior accepts the user values without regard to default Abs values.
+
+ // Per global matter data model policy
+ // if a attribute is not present then it's default shall be used.
+
+ status = AbsMinHeatSetpointLimit::Get(endpoint, &AbsMinHeatSetpointLimit);
+ if (status != imcode::Success)
+ {
+ ChipLogError(Zcl, "Warning: AbsMinHeatSetpointLimit missing using default");
+ }
+
+ status = AbsMaxHeatSetpointLimit::Get(endpoint, &AbsMaxHeatSetpointLimit);
+ if (status != imcode::Success)
+ {
+ ChipLogError(Zcl, "Warning: AbsMaxHeatSetpointLimit missing using default");
+ }
+ status = MinHeatSetpointLimit::Get(endpoint, &MinHeatSetpointLimit);
+ if (status != imcode::Success)
+ {
+ MinHeatSetpointLimit = AbsMinHeatSetpointLimit;
+ }
+
+ status = MaxHeatSetpointLimit::Get(endpoint, &MaxHeatSetpointLimit);
+ if (status != imcode::Success)
+ {
+ MaxHeatSetpointLimit = AbsMaxHeatSetpointLimit;
+ }
+
+ // Make sure the user imposed limits are within the manufacturer imposed limits
+
+ // https://github.com/CHIP-Specifications/connectedhomeip-spec/issues/3725
+ // Spec does not specify the behavior is the requested setpoint exceeds the limit allowed
+ // This implementation clamps at the limit.
+
+ // resolution of 3725 is to clamp.
+
+ if (MinHeatSetpointLimit < AbsMinHeatSetpointLimit)
+ MinHeatSetpointLimit = AbsMinHeatSetpointLimit;
+
+ if (MaxHeatSetpointLimit > AbsMaxHeatSetpointLimit)
+ MaxHeatSetpointLimit = AbsMaxHeatSetpointLimit;
+
+ if (HeatingSetpoint < MinHeatSetpointLimit)
+ HeatingSetpoint = MinHeatSetpointLimit;
+
+ if (HeatingSetpoint > MaxHeatSetpointLimit)
+ HeatingSetpoint = MaxHeatSetpointLimit;
+
+ return HeatingSetpoint;
+}
+
+int16_t EnforceCoolingSetpointLimits(int16_t CoolingSetpoint, EndpointId endpoint)
+{
+ // Optional Mfg supplied limits
+ int16_t AbsMinCoolSetpointLimit = kDefaultAbsMinCoolSetpointLimit;
+ int16_t AbsMaxCoolSetpointLimit = kDefaultAbsMaxCoolSetpointLimit;
+
+ // Optional User supplied limits
+ int16_t MinCoolSetpointLimit = kDefaultMinCoolSetpointLimit;
+ int16_t MaxCoolSetpointLimit = kDefaultMaxCoolSetpointLimit;
+
+ // Attempt to read the setpoint limits
+ // Absmin/max are manufacturer limits
+ // min/max are user imposed min/max
+
+ // Note that the limits are initialized above per the spec limits
+ // if they are not present Get() will not update the value so the defaults are used
+ imcode status;
+
+ // https://github.com/CHIP-Specifications/connectedhomeip-spec/issues/3724
+ // behavior is not specified when Abs * values are not present and user values are present
+ // implemented behavior accepts the user values without regard to default Abs values.
+
+ // Per global matter data model policy
+ // if a attribute is not present then it's default shall be used.
+
+ status = AbsMinCoolSetpointLimit::Get(endpoint, &AbsMinCoolSetpointLimit);
+ if (status != imcode::Success)
+ {
+ ChipLogError(Zcl, "Warning: AbsMinCoolSetpointLimit missing using default");
+ }
+
+ status = AbsMaxCoolSetpointLimit::Get(endpoint, &AbsMaxCoolSetpointLimit);
+ if (status != imcode::Success)
+ {
+ ChipLogError(Zcl, "Warning: AbsMaxCoolSetpointLimit missing using default");
+ }
+
+ status = MinCoolSetpointLimit::Get(endpoint, &MinCoolSetpointLimit);
+ if (status != imcode::Success)
+ {
+ MinCoolSetpointLimit = AbsMinCoolSetpointLimit;
+ }
+
+ status = MaxCoolSetpointLimit::Get(endpoint, &MaxCoolSetpointLimit);
+ if (status != imcode::Success)
+ {
+ MaxCoolSetpointLimit = AbsMaxCoolSetpointLimit;
+ }
+
+ // Make sure the user imposed limits are within the manufacture imposed limits
+ // https://github.com/CHIP-Specifications/connectedhomeip-spec/issues/3725
+ // Spec does not specify the behavior is the requested setpoint exceeds the limit allowed
+ // This implementation clamps at the limit.
+
+ // resolution of 3725 is to clamp.
+
+ if (MinCoolSetpointLimit < AbsMinCoolSetpointLimit)
+ MinCoolSetpointLimit = AbsMinCoolSetpointLimit;
+
+ if (MaxCoolSetpointLimit > AbsMaxCoolSetpointLimit)
+ MaxCoolSetpointLimit = AbsMaxCoolSetpointLimit;
+
+ if (CoolingSetpoint < MinCoolSetpointLimit)
+ CoolingSetpoint = MinCoolSetpointLimit;
+
+ if (CoolingSetpoint > MaxCoolSetpointLimit)
+ CoolingSetpoint = MaxCoolSetpointLimit;
+
+ return CoolingSetpoint;
+}
+
+} // anonymous namespace
+
+namespace chip {
+namespace app {
+namespace Clusters {
+namespace Thermostat {
+
+void SetDefaultDelegate(EndpointId endpoint, Delegate * delegate)
+{
+ uint16_t ep =
+ emberAfGetClusterServerEndpointIndex(endpoint, Thermostat::Id, MATTER_DM_THERMOSTAT_CLUSTER_SERVER_ENDPOINT_COUNT);
+ // if endpoint is found, add the delegate in the delegate table
+ if (ep < ArraySize(gDelegateTable))
+ {
+ gDelegateTable[ep] = delegate;
+ }
+}
+
+void ThermostatAttrAccess::SetPresetsEditable(EndpointId endpoint, bool presetEditable)
+{
+ uint16_t ep =
+ emberAfGetClusterServerEndpointIndex(endpoint, Thermostat::Id, MATTER_DM_THERMOSTAT_CLUSTER_SERVER_ENDPOINT_COUNT);
+
+ if (ep < ArraySize(mPresetsEditables))
+ {
+ mPresetsEditables[ep] = presetEditable;
+ }
+}
+
+bool ThermostatAttrAccess::GetPresetsEditable(EndpointId endpoint)
+{
+ bool presetEditable = false;
+ uint16_t ep =
+ emberAfGetClusterServerEndpointIndex(endpoint, Thermostat::Id, MATTER_DM_THERMOSTAT_CLUSTER_SERVER_ENDPOINT_COUNT);
+
+ if (ep < ArraySize(mPresetsEditables))
+ {
+ presetEditable = mPresetsEditables[ep];
+ }
+ return presetEditable;
+}
+
+void ThermostatAttrAccess::SetOriginatorScopedNodeId(EndpointId endpoint, ScopedNodeId originatorNodeId)
+{
+ uint16_t ep =
+ emberAfGetClusterServerEndpointIndex(endpoint, Thermostat::Id, MATTER_DM_THERMOSTAT_CLUSTER_SERVER_ENDPOINT_COUNT);
+
+ if (ep < ArraySize(mPresetEditRequestOriginatorNodeIds))
+ {
+ mPresetEditRequestOriginatorNodeIds[ep] = originatorNodeId;
+ }
+}
+
+ScopedNodeId ThermostatAttrAccess::GetOriginatorScopedNodeId(EndpointId endpoint)
{
-public:
- ThermostatAttrAccess() : AttributeAccessInterface(Optional::Missing(), Thermostat::Id) {}
-
- CHIP_ERROR Read(const ConcreteReadAttributePath & aPath, AttributeValueEncoder & aEncoder) override;
- CHIP_ERROR Write(const ConcreteDataAttributePath & aPath, AttributeValueDecoder & aDecoder) override;
-};
+ ScopedNodeId originatorNodeId = ScopedNodeId();
+ uint16_t ep =
+ emberAfGetClusterServerEndpointIndex(endpoint, Thermostat::Id, MATTER_DM_THERMOSTAT_CLUSTER_SERVER_ENDPOINT_COUNT);
-ThermostatAttrAccess gThermostatAttrAccess;
+ if (ep < ArraySize(mPresetEditRequestOriginatorNodeIds))
+ {
+ originatorNodeId = mPresetEditRequestOriginatorNodeIds[ep];
+ }
+ return originatorNodeId;
+}
CHIP_ERROR ThermostatAttrAccess::Read(const ConcreteReadAttributePath & aPath, AttributeValueEncoder & aEncoder)
{
@@ -107,11 +740,72 @@ CHIP_ERROR ThermostatAttrAccess::Read(const ConcreteReadAttributePath & aPath, A
}
break;
case PresetTypes::Id: {
- return aEncoder.EncodeList([](const auto & encoder) -> CHIP_ERROR { return CHIP_NO_ERROR; });
+ Delegate * delegate = GetDelegate(aPath.mEndpointId);
+ VerifyOrReturnError(delegate != nullptr, CHIP_ERROR_INCORRECT_STATE, ChipLogError(Zcl, "Delegate is null"));
+
+ return aEncoder.EncodeList([delegate](const auto & encoder) -> CHIP_ERROR {
+ for (uint8_t i = 0; true; i++)
+ {
+ PresetTypeStruct::Type presetType;
+ auto err = delegate->GetPresetTypeAtIndex(i, presetType);
+ if (err == CHIP_ERROR_PROVIDER_LIST_EXHAUSTED)
+ {
+ return CHIP_NO_ERROR;
+ }
+ ReturnErrorOnFailure(err);
+ ReturnErrorOnFailure(encoder.Encode(presetType));
+ }
+ });
+ }
+ break;
+ case NumberOfPresets::Id: {
+ Delegate * delegate = GetDelegate(aPath.mEndpointId);
+ VerifyOrReturnError(delegate != nullptr, CHIP_ERROR_INCORRECT_STATE, ChipLogError(Zcl, "Delegate is null"));
+
+ ReturnErrorOnFailure(aEncoder.Encode(delegate->GetNumberOfPresets()));
}
break;
case Presets::Id: {
- return aEncoder.EncodeList([](const auto & encoder) -> CHIP_ERROR { return CHIP_NO_ERROR; });
+ Delegate * delegate = GetDelegate(aPath.mEndpointId);
+ VerifyOrReturnError(delegate != nullptr, CHIP_ERROR_INCORRECT_STATE, ChipLogError(Zcl, "Delegate is null"));
+
+ return aEncoder.EncodeList([delegate](const auto & encoder) -> CHIP_ERROR {
+ for (uint8_t i = 0; true; i++)
+ {
+ PresetStructWithOwnedMembers preset;
+ auto err = delegate->GetPresetAtIndex(i, preset);
+ if (err == CHIP_ERROR_PROVIDER_LIST_EXHAUSTED)
+ {
+ return CHIP_NO_ERROR;
+ }
+ ReturnErrorOnFailure(err);
+ ReturnErrorOnFailure(encoder.Encode(preset));
+ }
+ });
+ }
+ break;
+ case PresetsSchedulesEditable::Id: {
+ ReturnErrorOnFailure(aEncoder.Encode(GetPresetsEditable(aPath.mEndpointId)));
+ }
+ break;
+ case ActivePresetHandle::Id: {
+ Delegate * delegate = GetDelegate(aPath.mEndpointId);
+ VerifyOrReturnError(delegate != nullptr, CHIP_ERROR_INCORRECT_STATE, ChipLogError(Zcl, "Delegate is null"));
+
+ uint8_t buffer[kPresetHandleSize];
+ MutableByteSpan activePresetHandle(buffer);
+
+ CHIP_ERROR err = delegate->GetActivePresetHandle(activePresetHandle);
+ ReturnErrorOnFailure(err);
+
+ if (activePresetHandle.empty())
+ {
+ ReturnErrorOnFailure(aEncoder.EncodeNull());
+ }
+ else
+ {
+ ReturnErrorOnFailure(aEncoder.Encode(activePresetHandle));
+ }
}
break;
case ScheduleTypes::Id: {
@@ -154,10 +848,72 @@ CHIP_ERROR ThermostatAttrAccess::Write(const ConcreteDataAttributePath & aPath,
}
break;
case Presets::Id: {
- return CHIP_ERROR_NOT_IMPLEMENTED;
+
+ EndpointId endpoint = aPath.mEndpointId;
+ Delegate * delegate = GetDelegate(endpoint);
+ VerifyOrReturnError(delegate != nullptr, CHIP_ERROR_INCORRECT_STATE, ChipLogError(Zcl, "Delegate is null"));
+
+ // Presets are not editable, return INVALID_IN_STATE.
+ VerifyOrReturnError(GetPresetsEditable(endpoint), CHIP_IM_GLOBAL_STATUS(InvalidInState),
+ ChipLogError(Zcl, "Presets are not editable"));
+
+ // Check if the OriginatorScopedNodeId at the endpoint is the same as the node editing the presets,
+ // otherwise return BUSY.
+ const Access::SubjectDescriptor subjectDescriptor = aDecoder.GetSubjectDescriptor();
+ ScopedNodeId scopedNodeId = ScopedNodeId();
+
+ // Get the node id if the authentication mode is CASE.
+ if (subjectDescriptor.authMode == Access::AuthMode::kCase)
+ {
+ scopedNodeId = ScopedNodeId(subjectDescriptor.subject, subjectDescriptor.fabricIndex);
+ }
+
+ if (GetOriginatorScopedNodeId(endpoint) != scopedNodeId)
+ {
+ ChipLogError(Zcl, "Another node is editing presets. Server is busy. Try again later");
+ return CHIP_IM_GLOBAL_STATUS(Busy);
+ }
+
+ // If the list operation is replace all, clear the existing pending list, iterate over the new presets list
+ // and add to the pending presets list.
+ if (!aPath.IsListOperation() || aPath.mListOp == ConcreteDataAttributePath::ListOperation::ReplaceAll)
+ {
+ // Clear the pending presets list
+ delegate->ClearPendingPresetList();
+
+ Presets::TypeInfo::DecodableType newPresetsList;
+ ReturnErrorOnFailure(aDecoder.Decode(newPresetsList));
+
+ // Iterate over the presets and call the delegate to append to the list of pending presets.
+ auto iter = newPresetsList.begin();
+ while (iter.Next())
+ {
+ const PresetStruct::Type & preset = iter.GetValue();
+ if (IsValidPresetEntry(preset))
+ {
+ ReturnErrorOnFailure(delegate->AppendToPendingPresetList(preset));
+ }
+ else
+ {
+ return CHIP_IM_GLOBAL_STATUS(ConstraintError);
+ }
+ }
+ return iter.GetStatus();
+ }
+
+ // If the list operation is AppendItem, call the delegate to append the item to the list of pending presets.
+ if (aPath.mListOp == ConcreteDataAttributePath::ListOperation::AppendItem)
+ {
+ PresetStruct::Type preset;
+ ReturnErrorOnFailure(aDecoder.Decode(preset));
+ if (IsValidPresetEntry(preset))
+ {
+ return delegate->AppendToPendingPresetList(preset);
+ }
+ return CHIP_IM_GLOBAL_STATUS(ConstraintError);
+ }
}
break;
-
case Schedules::Id: {
return CHIP_ERROR_NOT_IMPLEMENTED;
}
@@ -169,7 +925,10 @@ CHIP_ERROR ThermostatAttrAccess::Write(const ConcreteDataAttributePath & aPath,
return CHIP_NO_ERROR;
}
-} // anonymous namespace
+} // namespace Thermostat
+} // namespace Clusters
+} // namespace app
+} // namespace chip
void emberAfThermostatClusterServerInitCallback(chip::EndpointId endpoint)
{
@@ -496,182 +1255,310 @@ bool emberAfThermostatClusterSetActivePresetRequestCallback(
chip::app::CommandHandler * commandObj, const chip::app::ConcreteCommandPath & commandPath,
const chip::app::Clusters::Thermostat::Commands::SetActivePresetRequest::DecodableType & commandData)
{
- // TODO
- return false;
+ EndpointId endpoint = commandPath.mEndpointId;
+ Delegate * delegate = GetDelegate(endpoint);
+
+ if (delegate == nullptr)
+ {
+ ChipLogError(Zcl, "Delegate is null");
+ commandObj->AddStatus(commandPath, imcode::InvalidInState);
+ return true;
+ }
+
+ ByteSpan newPresetHandle = commandData.presetHandle;
+
+ // If the preset handle passed in the command is not present in the Presets attribute, return INVALID_COMMAND.
+ if (!IsPresetHandlePresentInPresets(delegate, newPresetHandle))
+ {
+ commandObj->AddStatus(commandPath, imcode::InvalidCommand);
+ return true;
+ }
+
+ CHIP_ERROR err = delegate->SetActivePresetHandle(DataModel::MakeNullable(newPresetHandle));
+
+ if (err != CHIP_NO_ERROR)
+ {
+ ChipLogError(Zcl, "Failed to set ActivePresetHandle with error %" CHIP_ERROR_FORMAT, err.Format());
+ commandObj->AddStatus(commandPath, StatusIB(err).mStatus);
+ return true;
+ }
+
+ commandObj->AddStatus(commandPath, imcode::Success);
+ return true;
}
bool emberAfThermostatClusterStartPresetsSchedulesEditRequestCallback(
chip::app::CommandHandler * commandObj, const chip::app::ConcreteCommandPath & commandPath,
const chip::app::Clusters::Thermostat::Commands::StartPresetsSchedulesEditRequest::DecodableType & commandData)
{
- // TODO
- return false;
+ ScopedNodeId sourceNodeId = GetSourceScopedNodeId(commandObj);
+
+ EndpointId endpoint = commandPath.mEndpointId;
+
+ // If the presets are editable and the scoped node id of the client sending StartPresetsSchedulesEditRequest command
+ // is not the same as the one that previously originated a StartPresetsSchedulesEditRequest command, return BUSY.
+ if (gThermostatAttrAccess.GetPresetsEditable(endpoint) &&
+ (gThermostatAttrAccess.GetOriginatorScopedNodeId(endpoint) != sourceNodeId))
+ {
+ commandObj->AddStatus(commandPath, imcode::Busy);
+ return true;
+ }
+
+ // If presets are editable and the scoped node id of the client sending StartPresetsSchedulesEditRequest command
+ // is the same as the one that previously originated a StartPresetsSchedulesEditRequest command, extend the timer.
+ if (gThermostatAttrAccess.GetPresetsEditable(endpoint))
+ {
+ ExtendTimer(endpoint, commandData.timeoutSeconds);
+ commandObj->AddStatus(commandPath, imcode::Success);
+ return true;
+ }
+
+ // Set presets editable to true and the scoped originator node id to the source scoped node id, and start a timer with the
+ // timeout in seconds passed in the command args. Return success.
+ gThermostatAttrAccess.SetPresetsEditable(endpoint, true);
+ gThermostatAttrAccess.SetOriginatorScopedNodeId(endpoint, sourceNodeId);
+ ScheduleTimer(endpoint, commandData.timeoutSeconds);
+ commandObj->AddStatus(commandPath, imcode::Success);
+ return true;
}
bool emberAfThermostatClusterCancelPresetsSchedulesEditRequestCallback(
chip::app::CommandHandler * commandObj, const chip::app::ConcreteCommandPath & commandPath,
const chip::app::Clusters::Thermostat::Commands::CancelPresetsSchedulesEditRequest::DecodableType & commandData)
{
- // TODO
- return false;
+ EndpointId endpoint = commandPath.mEndpointId;
+
+ // If presets are not editable, return INVALID_IN_STATE.
+ if (!gThermostatAttrAccess.GetPresetsEditable(endpoint))
+ {
+ commandObj->AddStatus(commandPath, imcode::InvalidInState);
+ return true;
+ }
+
+ ScopedNodeId sourceNodeId = GetSourceScopedNodeId(commandObj);
+
+ // If the node id sending the CancelPresetsSchedulesRequest command is not the same as the one which send the
+ // previous StartPresetsSchedulesEditRequest, return UNSUPPORTED_ACCESS.
+ if (gThermostatAttrAccess.GetOriginatorScopedNodeId(endpoint) != sourceNodeId)
+ {
+ commandObj->AddStatus(commandPath, imcode::UnsupportedAccess);
+ return true;
+ }
+
+ Delegate * delegate = GetDelegate(endpoint);
+
+ if (delegate == nullptr)
+ {
+ ChipLogError(Zcl, "Delegate is null");
+ return SendResponseAndCleanUp(delegate, endpoint, commandObj, commandPath, imcode::InvalidInState);
+ }
+
+ // Clear the timer, discard the changes and set PresetsEditable to false.
+ return SendResponseAndCleanUp(delegate, endpoint, commandObj, commandPath, imcode::Success);
}
bool emberAfThermostatClusterCommitPresetsSchedulesRequestCallback(
chip::app::CommandHandler * commandObj, const chip::app::ConcreteCommandPath & commandPath,
const chip::app::Clusters::Thermostat::Commands::CommitPresetsSchedulesRequest::DecodableType & commandData)
{
- // TODO
- return false;
-}
+ EndpointId endpoint = commandPath.mEndpointId;
+ Delegate * delegate = GetDelegate(endpoint);
-bool emberAfThermostatClusterSetTemperatureSetpointHoldPolicyCallback(
- chip::app::CommandHandler * commandObj, const chip::app::ConcreteCommandPath & commandPath,
- const chip::app::Clusters::Thermostat::Commands::SetTemperatureSetpointHoldPolicy::DecodableType & commandData)
-{
- // TODO
- return false;
-}
+ if (delegate == nullptr)
+ {
+ ChipLogError(Zcl, "Delegate is null");
+ return SendResponseAndCleanUp(delegate, endpoint, commandObj, commandPath, imcode::InvalidInState);
+ }
-int16_t EnforceHeatingSetpointLimits(int16_t HeatingSetpoint, EndpointId endpoint)
-{
- // Optional Mfg supplied limits
- int16_t AbsMinHeatSetpointLimit = kDefaultAbsMinHeatSetpointLimit;
- int16_t AbsMaxHeatSetpointLimit = kDefaultAbsMaxHeatSetpointLimit;
+ // If presets are not editable, return INVALID_IN_STATE.
+ if (!gThermostatAttrAccess.GetPresetsEditable(endpoint))
+ {
+ return SendResponseAndCleanUp(delegate, endpoint, commandObj, commandPath, imcode::InvalidInState);
+ }
- // Optional User supplied limits
- int16_t MinHeatSetpointLimit = kDefaultMinHeatSetpointLimit;
- int16_t MaxHeatSetpointLimit = kDefaultMaxHeatSetpointLimit;
+ ScopedNodeId sourceNodeId = GetSourceScopedNodeId(commandObj);
- // Attempt to read the setpoint limits
- // Absmin/max are manufacturer limits
- // min/max are user imposed min/max
+ // If the node id sending the CommitPresetsSchedulesRequest command is not the same as the one which send the
+ // StartPresetsSchedulesEditRequest, return UNSUPPORTED_ACCESS.
+ if (gThermostatAttrAccess.GetOriginatorScopedNodeId(endpoint) != sourceNodeId)
+ {
+ commandObj->AddStatus(commandPath, imcode::UnsupportedAccess);
+ return true;
+ }
- // Note that the limits are initialized above per the spec limits
- // if they are not present Get() will not update the value so the defaults are used
- imcode status;
+ PresetStructWithOwnedMembers preset;
+ CHIP_ERROR err = CHIP_NO_ERROR;
- // https://github.com/CHIP-Specifications/connectedhomeip-spec/issues/3724
- // behavior is not specified when Abs * values are not present and user values are present
- // implemented behavior accepts the user values without regard to default Abs values.
+ // For each preset in the presets attribute, check that the matching preset in the pending presets list does not
+ // violate any spec constraints.
+ for (uint8_t i = 0; true; i++)
+ {
+ err = delegate->GetPresetAtIndex(i, preset);
- // Per global matter data model policy
- // if a attribute is not present then it's default shall be used.
+ if (err == CHIP_ERROR_PROVIDER_LIST_EXHAUSTED)
+ {
+ break;
+ }
+ if (err != CHIP_NO_ERROR)
+ {
+ ChipLogError(Zcl,
+ "emberAfThermostatClusterCommitPresetsSchedulesRequestCallback: GetPresetAtIndex failed with error "
+ "%" CHIP_ERROR_FORMAT,
+ err.Format());
+ return SendResponseAndCleanUp(delegate, endpoint, commandObj, commandPath, imcode::InvalidInState);
+ }
- status = AbsMinHeatSetpointLimit::Get(endpoint, &AbsMinHeatSetpointLimit);
- if (status != imcode::Success)
- {
- ChipLogError(Zcl, "Warning: AbsMinHeatSetpointLimit missing using default");
+ bool found = MatchingPendingPresetExists(delegate, preset);
+
+ // If a built in preset in the Presets attribute list is removed and not found in the pending presets list, return
+ // CONSTRAINT_ERROR.
+ if (IsBuiltIn(preset) && !found)
+ {
+ return SendResponseAndCleanUp(delegate, endpoint, commandObj, commandPath, imcode::ConstraintError);
+ }
}
- status = AbsMaxHeatSetpointLimit::Get(endpoint, &AbsMaxHeatSetpointLimit);
- if (status != imcode::Success)
+ // If there is an ActivePresetHandle set, find the preset in the pending presets list that matches the ActivePresetHandle
+ // attribute. If a preset is not found with the same presetHandle, return INVALID_IN_STATE. If there is no ActivePresetHandle
+ // attribute set, continue with other checks.
+ uint8_t buffer[kPresetHandleSize];
+ MutableByteSpan activePresetHandle(buffer);
+
+ err = delegate->GetActivePresetHandle(activePresetHandle);
+
+ if (err != CHIP_NO_ERROR)
{
- ChipLogError(Zcl, "Warning: AbsMaxHeatSetpointLimit missing using default");
+ return SendResponseAndCleanUp(delegate, endpoint, commandObj, commandPath, imcode::InvalidInState);
}
- status = MinHeatSetpointLimit::Get(endpoint, &MinHeatSetpointLimit);
- if (status != imcode::Success)
+
+ if (!activePresetHandle.empty())
{
- MinHeatSetpointLimit = AbsMinHeatSetpointLimit;
+ uint8_t count = CountPresetsInPendingListWithPresetHandle(delegate, activePresetHandle);
+ if (count == 0)
+ {
+ return SendResponseAndCleanUp(delegate, endpoint, commandObj, commandPath, imcode::InvalidInState);
+ }
}
- status = MaxHeatSetpointLimit::Get(endpoint, &MaxHeatSetpointLimit);
- if (status != imcode::Success)
+ // For each preset in the pending presets list, check that the preset does not violate any spec constraints.
+ for (uint8_t i = 0; true; i++)
{
- MaxHeatSetpointLimit = AbsMaxHeatSetpointLimit;
- }
+ PresetStructWithOwnedMembers pendingPreset;
+ err = delegate->GetPendingPresetAtIndex(i, pendingPreset);
- // Make sure the user imposed limits are within the manufacturer imposed limits
+ if (err == CHIP_ERROR_PROVIDER_LIST_EXHAUSTED)
+ {
+ break;
+ }
+ if (err != CHIP_NO_ERROR)
+ {
+ ChipLogError(Zcl,
+ "emberAfThermostatClusterCommitPresetsSchedulesRequestCallback: GetPendingPresetAtIndex failed with error "
+ "%" CHIP_ERROR_FORMAT,
+ err.Format());
+ return SendResponseAndCleanUp(delegate, endpoint, commandObj, commandPath, imcode::InvalidInState);
+ }
- // https://github.com/CHIP-Specifications/connectedhomeip-spec/issues/3725
- // Spec does not specify the behavior is the requested setpoint exceeds the limit allowed
- // This implementation clamps at the limit.
+ bool isPendingPresetWithNullPresetHandle = pendingPreset.GetPresetHandle().IsNull();
- // resolution of 3725 is to clamp.
+ // If the preset handle is null and the built in field is set to true, return CONSTRAINT_ERROR.
+ if (isPendingPresetWithNullPresetHandle && IsBuiltIn(pendingPreset))
+ {
+ return SendResponseAndCleanUp(delegate, endpoint, commandObj, commandPath, imcode::ConstraintError);
+ }
- if (MinHeatSetpointLimit < AbsMinHeatSetpointLimit)
- MinHeatSetpointLimit = AbsMinHeatSetpointLimit;
+ bool foundMatchingPresetInPresets = false;
+ PresetStructWithOwnedMembers matchingPreset;
+ if (!isPendingPresetWithNullPresetHandle)
+ {
+ foundMatchingPresetInPresets = GetMatchingPresetInPresets(delegate, pendingPreset, matchingPreset);
- if (MaxHeatSetpointLimit > AbsMaxHeatSetpointLimit)
- MaxHeatSetpointLimit = AbsMaxHeatSetpointLimit;
+ // If the presetHandle for the pending preset is not null and a matching preset is not found in the
+ // presets attribute list, return NOT_FOUND.
+ if (!foundMatchingPresetInPresets)
+ {
+ return SendResponseAndCleanUp(delegate, endpoint, commandObj, commandPath, imcode::NotFound);
+ }
- if (HeatingSetpoint < MinHeatSetpointLimit)
- HeatingSetpoint = MinHeatSetpointLimit;
+ // Find the number of presets in the pending preset list that match the preset handle. If there are duplicate
+ // entries, return CONSTRAINT_ERROR.
+ uint8_t count = CountPresetsInPendingListWithPresetHandle(delegate, pendingPreset.GetPresetHandle().Value());
+ if (count > 1)
+ {
+ return SendResponseAndCleanUp(delegate, endpoint, commandObj, commandPath, imcode::ConstraintError);
+ }
+ }
- if (HeatingSetpoint > MaxHeatSetpointLimit)
- HeatingSetpoint = MaxHeatSetpointLimit;
+ // If the preset is found in the presets attribute list and the preset is builtIn in the pending presets list
+ // but not in the presets attribute list, return UNSUPPORTED_ACCESS.
+ if (foundMatchingPresetInPresets && (IsBuiltIn(pendingPreset) && !IsBuiltIn(matchingPreset)))
+ {
+ return SendResponseAndCleanUp(delegate, endpoint, commandObj, commandPath, imcode::UnsupportedAccess);
+ }
- return HeatingSetpoint;
-}
+ // If the preset is found in the presets attribute list and the preset is builtIn in the presets attribute
+ // but not in the pending presets list, return UNSUPPORTED_ACCESS.
+ if (foundMatchingPresetInPresets && (!IsBuiltIn(pendingPreset) && IsBuiltIn(matchingPreset)))
+ {
+ return SendResponseAndCleanUp(delegate, endpoint, commandObj, commandPath, imcode::UnsupportedAccess);
+ }
-int16_t EnforceCoolingSetpointLimits(int16_t CoolingSetpoint, EndpointId endpoint)
-{
- // Optional Mfg supplied limits
- int16_t AbsMinCoolSetpointLimit = kDefaultAbsMinCoolSetpointLimit;
- int16_t AbsMaxCoolSetpointLimit = kDefaultAbsMaxCoolSetpointLimit;
+ // If the presetScenario is not found in the preset types, return CONSTRAINT_ERROR.
+ PresetScenarioEnum presetScenario = pendingPreset.GetPresetScenario();
+ if (!PresetScenarioExistsInPresetTypes(delegate, presetScenario))
+ {
+ return SendResponseAndCleanUp(delegate, endpoint, commandObj, commandPath, imcode::ConstraintError);
+ }
- // Optional User supplied limits
- int16_t MinCoolSetpointLimit = kDefaultMinCoolSetpointLimit;
- int16_t MaxCoolSetpointLimit = kDefaultMaxCoolSetpointLimit;
+ // If the preset type for the preset scenario does not support names and a name is specified, return CONSTRAINT_ERROR.
+ if (!PresetTypeSupportsNames(delegate, presetScenario) && pendingPreset.GetName().HasValue())
+ {
+ return SendResponseAndCleanUp(delegate, endpoint, commandObj, commandPath, imcode::ConstraintError);
+ }
- // Attempt to read the setpoint limits
- // Absmin/max are manufacturer limits
- // min/max are user imposed min/max
+ // Enforce the Setpoint Limits for both the cooling and heating setpoints in the pending preset.
+ Optional coolingSetpointValue = pendingPreset.GetCoolingSetpoint();
+ if (coolingSetpointValue.HasValue())
+ {
+ pendingPreset.SetCoolingSetpoint(MakeOptional(EnforceCoolingSetpointLimits(coolingSetpointValue.Value(), endpoint)));
+ }
- // Note that the limits are initialized above per the spec limits
- // if they are not present Get() will not update the value so the defaults are used
- imcode status;
+ Optional heatingSetpointValue = pendingPreset.GetHeatingSetpoint();
+ if (heatingSetpointValue.HasValue())
+ {
+ pendingPreset.SetHeatingSetpoint(MakeOptional(EnforceHeatingSetpointLimits(heatingSetpointValue.Value(), endpoint)));
+ }
+ }
- // https://github.com/CHIP-Specifications/connectedhomeip-spec/issues/3724
- // behavior is not specified when Abs * values are not present and user values are present
- // implemented behavior accepts the user values without regard to default Abs values.
+ uint8_t totalCount = CountUpdatedPresetsAfterApplyingPendingPresets(delegate);
- // Per global matter data model policy
- // if a attribute is not present then it's default shall be used.
+ uint8_t numberOfPresetsSupported = delegate->GetNumberOfPresets();
- status = AbsMinCoolSetpointLimit::Get(endpoint, &AbsMinCoolSetpointLimit);
- if (status != imcode::Success)
+ if (numberOfPresetsSupported == 0)
{
- ChipLogError(Zcl, "Warning: AbsMinCoolSetpointLimit missing using default");
+ ChipLogError(Zcl, "emberAfThermostatClusterCommitPresetsSchedulesRequestCallback: Failed to get NumberOfPresets");
+ return SendResponseAndCleanUp(delegate, endpoint, commandObj, commandPath, imcode::InvalidInState);
}
- status = AbsMaxCoolSetpointLimit::Get(endpoint, &AbsMaxCoolSetpointLimit);
- if (status != imcode::Success)
+ // If the expected length of the presets attribute with the applied changes exceeds the total number of presets supported,
+ // return RESOURCE_EXHAUSTED. Note that the changes are not yet applied.
+ if (numberOfPresetsSupported > 0 && totalCount > numberOfPresetsSupported)
{
- ChipLogError(Zcl, "Warning: AbsMaxCoolSetpointLimit missing using default");
+ return SendResponseAndCleanUp(delegate, endpoint, commandObj, commandPath, imcode::ResourceExhausted);
}
- status = MinCoolSetpointLimit::Get(endpoint, &MinCoolSetpointLimit);
- if (status != imcode::Success)
- {
- MinCoolSetpointLimit = AbsMinCoolSetpointLimit;
- }
+ // TODO: Check if the number of presets for each presetScenario exceeds the max number of presets supported for that
+ // scenario. We plan to support only one preset for each presetScenario for our use cases so defer this for re-evaluation.
- status = MaxCoolSetpointLimit::Get(endpoint, &MaxCoolSetpointLimit);
- if (status != imcode::Success)
+ // Call the delegate API to apply the pending presets to the presets attribute and update it.
+ err = delegate->ApplyPendingPresets();
+
+ if (err != CHIP_NO_ERROR)
{
- MaxCoolSetpointLimit = AbsMaxCoolSetpointLimit;
+ return SendResponseAndCleanUp(delegate, endpoint, commandObj, commandPath, imcode::InvalidInState);
}
- // Make sure the user imposed limits are within the manufacture imposed limits
- // https://github.com/CHIP-Specifications/connectedhomeip-spec/issues/3725
- // Spec does not specify the behavior is the requested setpoint exceeds the limit allowed
- // This implementation clamps at the limit.
-
- // resolution of 3725 is to clamp.
-
- if (MinCoolSetpointLimit < AbsMinCoolSetpointLimit)
- MinCoolSetpointLimit = AbsMinCoolSetpointLimit;
-
- if (MaxCoolSetpointLimit > AbsMaxCoolSetpointLimit)
- MaxCoolSetpointLimit = AbsMaxCoolSetpointLimit;
-
- if (CoolingSetpoint < MinCoolSetpointLimit)
- CoolingSetpoint = MinCoolSetpointLimit;
-
- if (CoolingSetpoint > MaxCoolSetpointLimit)
- CoolingSetpoint = MaxCoolSetpointLimit;
-
- return CoolingSetpoint;
+ return SendResponseAndCleanUp(delegate, endpoint, commandObj, commandPath, imcode::Success);
}
bool emberAfThermostatClusterSetpointRaiseLowerCallback(app::CommandHandler * commandObj,
diff --git a/src/app/clusters/thermostat-server/thermostat-server.h b/src/app/clusters/thermostat-server/thermostat-server.h
new file mode 100644
index 00000000000000..955ab9e5c5a777
--- /dev/null
+++ b/src/app/clusters/thermostat-server/thermostat-server.h
@@ -0,0 +1,103 @@
+/**
+ *
+ * Copyright (c) 2024 Project CHIP Authors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/****************************************************************************
+ * @file
+ * @brief APIs for the Thermostat cluster.
+ *
+ *******************************************************************************
+ ******************************************************************************/
+
+#pragma once
+
+#include "thermostat-delegate.h"
+
+#include
+
+namespace chip {
+namespace app {
+namespace Clusters {
+namespace Thermostat {
+
+static constexpr size_t kThermostatEndpointCount =
+ MATTER_DM_THERMOSTAT_CLUSTER_SERVER_ENDPOINT_COUNT + CHIP_DEVICE_CONFIG_DYNAMIC_ENDPOINT_COUNT;
+
+/**
+ * @brief Thermostat Attribute Access Interface.
+ */
+class ThermostatAttrAccess : public chip::app::AttributeAccessInterface
+{
+public:
+ ThermostatAttrAccess() : AttributeAccessInterface(Optional