From b082219e3bc47137b5ca99b66d83200952d63903 Mon Sep 17 00:00:00 2001 From: Moises Terrones Date: Tue, 28 Jan 2025 02:43:54 -0600 Subject: [PATCH 01/36] Remove unused code and functions (#37213) --- src/lib/support/verhoeff/Verhoeff.cpp | 21 --------------------- src/lib/support/verhoeff/Verhoeff.h | 1 - src/lib/support/verhoeff/Verhoeff10.cpp | 8 -------- 3 files changed, 30 deletions(-) diff --git a/src/lib/support/verhoeff/Verhoeff.cpp b/src/lib/support/verhoeff/Verhoeff.cpp index 90f6869e75cb40..bc0117dea8f08a 100644 --- a/src/lib/support/verhoeff/Verhoeff.cpp +++ b/src/lib/support/verhoeff/Verhoeff.cpp @@ -24,27 +24,6 @@ #include "Verhoeff.h" -int Verhoeff::DihedralMultiply(int x, int y, int n) -{ - int n2 = n * 2; - - x = x % n2; - y = y % n2; - - if (x < n) - { - if (y < n) - return (x + y) % n; - - return ((x + (y - n)) % n) + n; - } - - if (y < n) - return ((n + (x - n) - y) % n) + n; - - return (n + (x - n) - (y - n)) % n; -} - int Verhoeff::DihedralInvert(int val, int n) { if (val > 0 && val < n) diff --git a/src/lib/support/verhoeff/Verhoeff.h b/src/lib/support/verhoeff/Verhoeff.h index eca266e3ff3cd4..ae24bc85771a14 100644 --- a/src/lib/support/verhoeff/Verhoeff.h +++ b/src/lib/support/verhoeff/Verhoeff.h @@ -75,7 +75,6 @@ class DLL_EXPORT Verhoeff10 class Verhoeff { public: - static int DihedralMultiply(int x, int y, int n); static int DihedralInvert(int val, int n); static int Permute(int val, const uint8_t * permTable, int permTableLen, uint64_t iterCount); }; diff --git a/src/lib/support/verhoeff/Verhoeff10.cpp b/src/lib/support/verhoeff/Verhoeff10.cpp index dd025a28cdabb9..3e45352dfec53c 100644 --- a/src/lib/support/verhoeff/Verhoeff10.cpp +++ b/src/lib/support/verhoeff/Verhoeff10.cpp @@ -28,16 +28,12 @@ #include #include -#ifndef VERHOEFF10_NO_MULTIPLY_TABLE - const uint8_t Verhoeff10::sMultiplyTable[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 0, 6, 7, 8, 9, 5, 2, 3, 4, 0, 1, 7, 8, 9, 5, 6, 3, 4, 0, 1, 2, 8, 9, 5, 6, 7, 4, 0, 1, 2, 3, 9, 5, 6, 7, 8, 5, 9, 8, 7, 6, 0, 4, 3, 2, 1, 6, 5, 9, 8, 7, 1, 0, 4, 3, 2, 7, 6, 5, 9, 8, 2, 1, 0, 4, 3, 8, 7, 6, 5, 9, 3, 2, 1, 0, 4, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, }; -#endif - const uint8_t Verhoeff10::sPermTable[] = { 1, 5, 7, 6, 2, 8, 3, 0, 9, 4 }; char Verhoeff10::ComputeCheckChar(const char * str) @@ -59,11 +55,7 @@ char Verhoeff10::ComputeCheckChar(const char * str, size_t strLen) int p = Verhoeff::Permute(val, sPermTable, Base, i); -#ifdef VERHOEFF10_NO_MULTIPLY_TABLE - c = Verhoeff::DihedralMultiply(c, p, PolygonSize); -#else c = sMultiplyTable[c * Base + p]; -#endif } c = Verhoeff::DihedralInvert(c, PolygonSize); From 214e03ed99e51493362adc593822a762bc118a58 Mon Sep 17 00:00:00 2001 From: Shreyas Balakrishna Bhandare Date: Tue, 28 Jan 2025 09:19:25 -0800 Subject: [PATCH 02/36] remove dockerization step from chef cloudbuild (#37231) --- integrations/cloudbuild/chef.yaml | 22 ---------------------- 1 file changed, 22 deletions(-) diff --git a/integrations/cloudbuild/chef.yaml b/integrations/cloudbuild/chef.yaml index 2c148f8ef25c8b..13782e062cf1ca 100644 --- a/integrations/cloudbuild/chef.yaml +++ b/integrations/cloudbuild/chef.yaml @@ -58,28 +58,6 @@ steps: - name: pwenv path: /pwenv - - name: "gcr.io/cloud-builders/docker" - args: - [ - "/workspace/examples/chef/create_docker.py", - "--commit_sha", - "$COMMIT_SHA", - "--short_sha", - "$SHORT_SHA", - "--revision_id", - "$REVISION_ID", - "--build_id", - "$BUILD_ID", - "--image_name", - "$_DOCKER_IMAGE_NAME", - "--tar_path", - "/workspace/artifacts", - ] - id: DockerAll - entrypoint: python3 - waitFor: - - CompileNoip - logsBucket: matter-build-automation-build-logs # Global timeout for all steps From 5a825beaeca7b0aa7b87968031b6453133bab692 Mon Sep 17 00:00:00 2001 From: Moises Terrones Date: Tue, 28 Jan 2025 11:37:17 -0600 Subject: [PATCH 03/36] Basic Unit Test for Verhoeff (#37195) * Create basic Unit Test for Verhoff * Change the build script for Accessor class * Change structure and remove private accessors * Change dependencies in build file * Reduce dependencies list * Remove empty sources Editorial commit: remove extra `sources = []`, I expect our templates to handle this one missing. --------- Co-authored-by: Andrei Litvin --- src/BUILD.gn | 1 + src/lib/support/verhoeff/tests/BUILD.gn | 28 ++++++++ .../support/verhoeff/tests/TestVerhoeff.cpp | 70 +++++++++++++++++++ 3 files changed, 99 insertions(+) create mode 100644 src/lib/support/verhoeff/tests/BUILD.gn create mode 100644 src/lib/support/verhoeff/tests/TestVerhoeff.cpp diff --git a/src/BUILD.gn b/src/BUILD.gn index 8eac76615c63c8..ba05860d6a110e 100644 --- a/src/BUILD.gn +++ b/src/BUILD.gn @@ -66,6 +66,7 @@ if (chip_build_tests) { "${chip_root}/src/protocols/interaction_model/tests", "${chip_root}/src/protocols/secure_channel/tests", "${chip_root}/src/protocols/user_directed_commissioning/tests", + "${chip_root}/src/lib/support/verhoeff/tests", "${chip_root}/src/system/tests", "${chip_root}/src/transport/retransmit/tests", "${chip_root}/src/transport/tests", diff --git a/src/lib/support/verhoeff/tests/BUILD.gn b/src/lib/support/verhoeff/tests/BUILD.gn new file mode 100644 index 00000000000000..98ff69d81aaff2 --- /dev/null +++ b/src/lib/support/verhoeff/tests/BUILD.gn @@ -0,0 +1,28 @@ +# 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. + +import("//build_overrides/build.gni") +import("//build_overrides/chip.gni") +import("//build_overrides/pigweed.gni") +import("${chip_root}/build/chip/chip_test_suite.gni") + +chip_test_suite("tests") { + output_name = "libVerhoeffTest" + + test_sources = [ "TestVerhoeff.cpp" ] + + public_deps = [ "${chip_root}/src/lib/support:support" ] + + cflags = [ "-Wconversion" ] +} diff --git a/src/lib/support/verhoeff/tests/TestVerhoeff.cpp b/src/lib/support/verhoeff/tests/TestVerhoeff.cpp new file mode 100644 index 00000000000000..57b510fa1ae8c3 --- /dev/null +++ b/src/lib/support/verhoeff/tests/TestVerhoeff.cpp @@ -0,0 +1,70 @@ +/* + * + * Copyright (c) 2025 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 + +namespace { + +TEST(TestVerhoeff, TestVerhoeff) +{ + + // Valid cases + EXPECT_EQ(Verhoeff10::ComputeCheckChar("236"), '3'); + EXPECT_EQ(Verhoeff10::ComputeCheckChar("0"), '4'); + EXPECT_EQ(Verhoeff10::ComputeCheckChar("11111"), '5'); + + EXPECT_TRUE(Verhoeff10::ValidateCheckChar("123451")); + EXPECT_TRUE(Verhoeff10::ValidateCheckChar("0987652")); + EXPECT_TRUE(Verhoeff10::ValidateCheckChar("150")); + + // Invalid cases + EXPECT_NE(Verhoeff10::ComputeCheckChar("236"), '8'); + EXPECT_NE(Verhoeff10::ComputeCheckChar("0"), '1'); + EXPECT_NE(Verhoeff10::ComputeCheckChar("11111"), '7'); + + EXPECT_FALSE(Verhoeff10::ValidateCheckChar("123456")); + EXPECT_FALSE(Verhoeff10::ValidateCheckChar("0987651")); + EXPECT_FALSE(Verhoeff10::ValidateCheckChar("157")); + + // Transposition + EXPECT_NE(Verhoeff10::ComputeCheckChar("12345"), Verhoeff10::ComputeCheckChar("13245")); + EXPECT_NE(Verhoeff10::ComputeCheckChar("1122334455"), Verhoeff10::ComputeCheckChar("1122334545")); + EXPECT_NE(Verhoeff10::ComputeCheckChar("1234567890"), Verhoeff10::ComputeCheckChar("1234567809")); + + // Non adjacent transpose + EXPECT_NE(Verhoeff10::ComputeCheckChar("12345"), Verhoeff10::ComputeCheckChar("14325")); + EXPECT_NE(Verhoeff10::ComputeCheckChar("876543"), Verhoeff10::ComputeCheckChar("678543")); + + // Long numbers + EXPECT_EQ(Verhoeff10::ComputeCheckChar("4356678912349008"), '7'); + EXPECT_EQ(Verhoeff10::ComputeCheckChar("78324562830019274123748"), '4'); + + // Invalid character + EXPECT_EQ(Verhoeff10::ComputeCheckChar("123F4567"), 0); + EXPECT_EQ(Verhoeff10::ComputeCheckChar("0A"), 0); + EXPECT_EQ(Verhoeff10::ComputeCheckChar("I"), 0); + EXPECT_EQ(Verhoeff10::ComputeCheckChar("23.4"), 0); + + // Empty string + EXPECT_EQ(Verhoeff10::ComputeCheckChar(""), '0'); +} + +} // namespace From dcf7e0dd2d3449c990efc377c63adbedeefb3913 Mon Sep 17 00:00:00 2001 From: "Olivier LORENTE [ST]" <34505085+OlivierGre@users.noreply.github.com> Date: Tue, 28 Jan 2025 19:37:58 +0100 Subject: [PATCH 04/36] Change for NFC Commissioning feature: (#37249) Added package libpcsclite-dev to start-sysroot-vm.sh. This package is needed for the cross compilation of chip-tool for arm64. --- .../images/stage-1/chip-build-crosscompile/start-sysroot-vm.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/integrations/docker/images/stage-1/chip-build-crosscompile/start-sysroot-vm.sh b/integrations/docker/images/stage-1/chip-build-crosscompile/start-sysroot-vm.sh index fb56c433c20666..6c90f72083baf0 100755 --- a/integrations/docker/images/stage-1/chip-build-crosscompile/start-sysroot-vm.sh +++ b/integrations/docker/images/stage-1/chip-build-crosscompile/start-sysroot-vm.sh @@ -117,6 +117,7 @@ packages: - libdbus-1-dev - libgirepository1.0-dev - libglib2.0-dev + - libpcsclite-dev - libreadline-dev - libsdl2-dev - libssl-dev From a3561e16bf9710f717bed1670844f571f7354943 Mon Sep 17 00:00:00 2001 From: Rohan Sahay <103027015+rosahay-silabs@users.noreply.github.com> Date: Wed, 29 Jan 2025 00:52:28 +0530 Subject: [PATCH 05/36] [Silabs] Refactor RCP WiFi initialization to remove platform-specific dependencies and unify initialization function (#37135) * Changes the WiFi initialization and adds it to platfrom init flow * Rename API based on refactor * Add debug log for failed sl_matter_wifi_init * Refactor platform-specific includes in MatterConfig.cpp * Refactor WiFi initialization to remove platform-specific dependencies and unify initialization function * Refactor InitWiFiStack to return CHIP_ERROR and improve error handling across implementations * Improve documentation for wfx_bus_start function * Remove error log from wfx_bus_start and update documentation for memory allocation failure * Apply suggestions from code review Co-authored-by: Mathieu Kardous <84793247+mkardous-silabs@users.noreply.github.com> * Refactor InitWiFiStack error handling to use appropriate CHIP_ERROR codes and update documentation * Update src/platform/silabs/wifi/WifiInterface.h Co-authored-by: Mathieu Kardous <84793247+mkardous-silabs@users.noreply.github.com> --------- Co-authored-by: Mathieu Kardous <84793247+mkardous-silabs@users.noreply.github.com> --- examples/platform/silabs/MatterConfig.cpp | 28 +++---------------- src/platform/silabs/rs911x/BLEManagerImpl.cpp | 7 ----- .../silabs/wifi/SiWx/WifiInterfaceImpl.cpp | 17 ++++++----- src/platform/silabs/wifi/WifiInterface.h | 10 +++++++ .../silabs/wifi/rs911x/WifiInterfaceImpl.cpp | 22 ++++++--------- .../silabs/wifi/wf200/WifiInterfaceImpl.cpp | 11 ++++++++ .../silabs/wifi/wf200/ncp/sl_wfx_task.c | 12 ++------ .../silabs/wifi/wf200/ncp/sl_wfx_task.h | 13 +++++---- .../WiseconnectWifiInterface.h | 12 -------- 9 files changed, 51 insertions(+), 81 deletions(-) diff --git a/examples/platform/silabs/MatterConfig.cpp b/examples/platform/silabs/MatterConfig.cpp index da3ca0dfab2855..1d94da32b45909 100644 --- a/examples/platform/silabs/MatterConfig.cpp +++ b/examples/platform/silabs/MatterConfig.cpp @@ -28,9 +28,9 @@ #include // TODO: We shouldn't need any platform specific includes in this file -#ifdef WF200_WIFI -#include -#endif // WF200_WIFI +#if (defined(SLI_SI91X_MCU_INTERFACE) && SLI_SI91X_MCU_INTERFACE == 1) +#include +#endif // (defined(SLI_SI91X_MCU_INTERFACE) && SLI_SI91X_MCU_INTERFACE == 1) #endif // SL_WIFI #if PW_RPC_ENABLED @@ -45,15 +45,6 @@ #include "MemMonitoring.h" #endif -// TODO: We shouldn't need any platform specific includes in this file -#if (defined(SLI_SI91X_MCU_INTERFACE) && SLI_SI91X_MCU_INTERFACE == 1) -#include -#endif // (defined(SLI_SI91X_MCU_INTERFACE) && SLI_SI91X_MCU_INTERFACE == 1 ) - -#if ((defined(SLI_SI91X_MCU_INTERFACE) && SLI_SI91X_MCU_INTERFACE == 1) || defined(EXP_BOARD)) -#include -#endif // ((defined(SLI_SI91X_MCU_INTERFACE) && SLI_SI91X_MCU_INTERFACE == 1) || defined(EXP_BOARD)) - #include // If building with the EFR32-provided crypto backend, we can use the // opaque keystore @@ -317,18 +308,7 @@ CHIP_ERROR SilabsMatterConfig::InitMatter(const char * appName) #ifdef SL_WIFI CHIP_ERROR SilabsMatterConfig::InitWiFi(void) { - // TODO: Platform specific init should not be required here -#ifdef WF200_WIFI - // Start wfx bus communication task. - wfx_bus_start(); -#endif // WF200_WIFI - - // TODO: Platform specific init should not be required here -#if ((defined(SLI_SI91X_MCU_INTERFACE) && SLI_SI91X_MCU_INTERFACE == 1) || defined(EXP_BOARD)) - VerifyOrReturnError(InitSiWxWifi() == SL_STATUS_OK, CHIP_ERROR_INTERNAL); -#endif //((defined(SLI_SI91X_MCU_INTERFACE) && SLI_SI91X_MCU_INTERFACE == 1 ) || defined(EXP_BOARD)) - - return CHIP_NO_ERROR; + return InitWiFiStack(); } #endif // SL_WIFI diff --git a/src/platform/silabs/rs911x/BLEManagerImpl.cpp b/src/platform/silabs/rs911x/BLEManagerImpl.cpp index 90103f74e77758..823aee32a0c90e 100644 --- a/src/platform/silabs/rs911x/BLEManagerImpl.cpp +++ b/src/platform/silabs/rs911x/BLEManagerImpl.cpp @@ -52,8 +52,6 @@ extern "C" { #define BLE_TIMEOUT_MS 400 #define BLE_SEND_INDICATION_TIMER_PERIOD_MS (5000) -osSemaphoreId_t sl_rs_ble_init_sem; - using namespace ::chip; using namespace ::chip::Ble; using namespace ::chip::DeviceLayer::Internal; @@ -234,9 +232,6 @@ void BLEManagerImpl::sl_ble_event_handling_task(void * args) sl_status_t status; SilabsBleWrapper::BleEvent_t bleEvent; - //! This semaphore is waiting for wifi module initialization. - osSemaphoreAcquire(sl_rs_ble_init_sem, osWaitForever); - // This function initialize BLE and start BLE advertisement. sInstance.sl_ble_init(); @@ -288,8 +283,6 @@ CHIP_ERROR BLEManagerImpl::_Init() { CHIP_ERROR err; - sl_rs_ble_init_sem = osSemaphoreNew(1, 0, NULL); - sBleThread = osThreadNew(sInstance.sl_ble_event_handling_task, NULL, &kBleTaskAttr); VerifyOrReturnError(sBleThread != nullptr, CHIP_ERROR_INCORRECT_STATE); diff --git a/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp b/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp index 9f6fcce1eff188..df9de424b29d45 100644 --- a/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp +++ b/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp @@ -86,7 +86,6 @@ extern "C" { #endif WfxRsi_t wfx_rsi; -extern osSemaphoreId_t sl_rs_ble_init_sem; namespace { @@ -310,7 +309,6 @@ sl_status_t sl_wifi_siwx917_init(void) #endif // SL_MBEDTLS_USE_TINYCRYPT wfx_rsi.dev_state.Set(WifiState::kStationInit); - osSemaphoreRelease(sl_rs_ble_init_sem); return status; } @@ -555,29 +553,30 @@ CHIP_ERROR ResetCounters() return CHIP_NO_ERROR; } -sl_status_t InitSiWxWifi(void) +CHIP_ERROR InitWiFiStack(void) { sl_status_t status = SL_STATUS_OK; status = sl_net_init((sl_net_interface_t) SL_NET_WIFI_CLIENT_INTERFACE, &config, &wifi_client_context, nullptr); - VerifyOrReturnError(status == SL_STATUS_OK, status, ChipLogError(DeviceLayer, "sl_net_init failed: %lx", status)); + VerifyOrReturnError(status == SL_STATUS_OK, CHIP_ERROR_INTERNAL, ChipLogError(DeviceLayer, "sl_net_init failed: %lx", status)); // Create Sempaphore for scan completion sScanCompleteSemaphore = osSemaphoreNew(1, 0, nullptr); - VerifyOrReturnError(sScanCompleteSemaphore != nullptr, SL_STATUS_ALLOCATION_FAILED); + VerifyOrReturnError(sScanCompleteSemaphore != nullptr, CHIP_ERROR_NO_MEMORY); // Create Semaphore for scan in-progress protection sScanInProgressSemaphore = osSemaphoreNew(1, 1, nullptr); - VerifyOrReturnError(sScanCompleteSemaphore != nullptr, SL_STATUS_ALLOCATION_FAILED); + VerifyOrReturnError(sScanCompleteSemaphore != nullptr, CHIP_ERROR_NO_MEMORY); // Create the message queue sWifiEventQueue = osMessageQueueNew(kWfxQueueSize, sizeof(WifiPlatformEvent), nullptr); - VerifyOrReturnError(sWifiEventQueue != nullptr, SL_STATUS_ALLOCATION_FAILED); + VerifyOrReturnError(sWifiEventQueue != nullptr, CHIP_ERROR_NO_MEMORY); status = CreateDHCPTimer(); - VerifyOrReturnError(status == SL_STATUS_OK, status); + VerifyOrReturnError(status == SL_STATUS_OK, CHIP_ERROR_NO_MEMORY, + ChipLogError(DeviceLayer, "CreateDHCPTimer failed: %lx", status)); - return status; + return CHIP_NO_ERROR; } void HandleDHCPPolling(void) diff --git a/src/platform/silabs/wifi/WifiInterface.h b/src/platform/silabs/wifi/WifiInterface.h index bc64846e0cfa10..598d1182a13a77 100644 --- a/src/platform/silabs/wifi/WifiInterface.h +++ b/src/platform/silabs/wifi/WifiInterface.h @@ -177,6 +177,16 @@ extern WfxRsi_t wfx_rsi; /* Updated functions */ +/** + * @brief Function initalizes the WiFi module before starting WiFi task. + * + * @return CHIP_ERROR CHIP_NO_ERROR, if the initialization succeeded + * CHIP_ERROR_INTERNAL, if sequence failed due to internal API error + * CHIP_ERROR_NO_MEMORY, if sequence failed due to unavaliablility of memory + */ + +CHIP_ERROR InitWiFiStack(void); + /** * @brief Function notifies the PlatformManager that an IPv6 event occured on the WiFi interface. * diff --git a/src/platform/silabs/wifi/rs911x/WifiInterfaceImpl.cpp b/src/platform/silabs/wifi/rs911x/WifiInterfaceImpl.cpp index d55cddf7e5adf5..94e5f2ee020c2c 100644 --- a/src/platform/silabs/wifi/rs911x/WifiInterfaceImpl.cpp +++ b/src/platform/silabs/wifi/rs911x/WifiInterfaceImpl.cpp @@ -71,10 +71,6 @@ osThreadAttr_t kDrvTaskAttr = { .name = "drv_rsi", .stack_size = kDrvTaskSize, .priority = osPriorityHigh }; -#if (RSI_BLE_ENABLE) -extern rsi_semaphore_handle_t sl_rs_ble_init_sem; -#endif - static osMessageQueueId_t sWifiEventQueue = NULL; /* * This file implements the interface to the RSI SAPIs @@ -331,10 +327,6 @@ static int32_t sl_matter_wifi_init(void) return status; } -#if (RSI_BLE_ENABLE) - rsi_semaphore_post(&sl_rs_ble_init_sem); -#endif - wfx_rsi.dev_state.Set(WifiState::kStationInit); return RSI_SUCCESS; } @@ -646,15 +638,17 @@ void ProcessEvent(WifiPlatformEvent event) } } +CHIP_ERROR InitWiFiStack(void) +{ + int32_t status = sl_matter_wifi_init(); + VerifyOrReturnError(status == RSI_SUCCESS, CHIP_ERROR_INTERNAL, + ChipLogError(DeviceLayer, "sl_matter_wifi_init failed: %lx", status)); + return CHIP_NO_ERROR; +} + void MatterWifiTask(void * arg) { (void) arg; - uint32_t rsi_status = sl_matter_wifi_init(); - if (rsi_status != RSI_SUCCESS) - { - ChipLogError(DeviceLayer, "MatterWifiTask: sl_matter_wifi_init failed: %ld", rsi_status); - return; - } WifiPlatformEvent event; sl_matter_lwip_start(); sl_matter_wifi_task_started(); diff --git a/src/platform/silabs/wifi/wf200/WifiInterfaceImpl.cpp b/src/platform/silabs/wifi/wf200/WifiInterfaceImpl.cpp index 798f6a8d8fda67..11ce99b088e72d 100644 --- a/src/platform/silabs/wifi/wf200/WifiInterfaceImpl.cpp +++ b/src/platform/silabs/wifi/wf200/WifiInterfaceImpl.cpp @@ -1185,3 +1185,14 @@ void wfx_cancel_scan(void) } scan_cb = nullptr; } + +CHIP_ERROR InitWiFiStack(void) +{ + // TODO: This function should include sl_wfx_hw_init() and sl_wfx_init() functions. Only done now to make MatterConfig platform + // agnostic. (MATTER-4680) + // Start wfx bus communication task. + sl_status_t status = wfx_bus_start(); + VerifyOrReturnError(status == SL_STATUS_OK, CHIP_ERROR_NO_MEMORY, + ChipLogError(DeviceLayer, "wfx_bus_start failed: %lx", status)); + return CHIP_NO_ERROR; +} diff --git a/src/platform/silabs/wifi/wf200/ncp/sl_wfx_task.c b/src/platform/silabs/wifi/wf200/ncp/sl_wfx_task.c index 8a00e454ade504..425e9ffb082560 100644 --- a/src/platform/silabs/wifi/wf200/ncp/sl_wfx_task.c +++ b/src/platform/silabs/wifi/wf200/ncp/sl_wfx_task.c @@ -110,19 +110,13 @@ static void wfx_bus_task(void * p_arg) } } -/*************************************************************************** - * @fn void wfx_bus_start() - * @brief - * Creates WFX bus communication task. - * @param[in] None - * @return None - ******************************************************************************/ -void wfx_bus_start() +sl_status_t wfx_bus_start(void) { wfx_bus_task_handle = xTaskCreateStatic(wfx_bus_task, "wfxbus", BUS_TASK_STACK_SIZE, NULL, WFX_BUS_TASK_PRIORITY, busStack, &busTaskStruct); if (wfx_bus_task_handle == NULL) { - SILABS_LOG("*ERR*WFX BusTask"); + return SL_STATUS_ALLOCATION_FAILED; } + return SL_STATUS_OK; } diff --git a/src/platform/silabs/wifi/wf200/ncp/sl_wfx_task.h b/src/platform/silabs/wifi/wf200/ncp/sl_wfx_task.h index 6838b9bac14eb4..93b10210698609 100644 --- a/src/platform/silabs/wifi/wf200/ncp/sl_wfx_task.h +++ b/src/platform/silabs/wifi/wf200/ncp/sl_wfx_task.h @@ -38,12 +38,13 @@ extern TaskHandle_t wfx_bus_task_handle; extern "C" { #endif -/**************************************************************************** - * @fn void wfx_bus_start(void) - * @brief - * Start wfx bus communication task. - *****************************************************************************/ -void wfx_bus_start(void); +/** + * @brief Start WFX bus communication task. + * + * @return sl_status_t SL_STATUS_OK, if the initialization succeeded + * SL_STATUS_ALLOCATION_FAILED, if there are a memory allocation failure. + */ +sl_status_t wfx_bus_start(void); /**************************************************************************** * @fn bool wfx_bus_is_receive_processing(void) diff --git a/src/platform/silabs/wifi/wiseconnect-interface/WiseconnectWifiInterface.h b/src/platform/silabs/wifi/wiseconnect-interface/WiseconnectWifiInterface.h index 1db5d145fef4de..67f8d421a627a0 100644 --- a/src/platform/silabs/wifi/wiseconnect-interface/WiseconnectWifiInterface.h +++ b/src/platform/silabs/wifi/wiseconnect-interface/WiseconnectWifiInterface.h @@ -112,15 +112,3 @@ void PostWifiPlatformEvent(WifiPlatformEvent event); * @param[in] arg context pointer */ void MatterWifiTask(void * arg); - -/** - * @brief Function initializes SiWx Wi-Fi interface - * - * TODO: This function is specific to the SiWx platform and should not be present in the WiseconnectWifiInterface. - * Once the SoC and NCP init sequence are harmonised, remove this API. - * - * @return sl_status_t SL_STATUS_OK, if the initialization succeeded - * SL_STATUS_ALLOCATION_FAILED, if there are a memory allocation failure, - * SL_STATUS_FAILURE, otherwise - */ -sl_status_t InitSiWxWifi(); From 0980678d8afaf73b338068085e67baa804251d6f Mon Sep 17 00:00:00 2001 From: Rohan Sahay <103027015+rosahay-silabs@users.noreply.github.com> Date: Wed, 29 Jan 2025 01:21:19 +0530 Subject: [PATCH 06/36] Enhance error logging in SetWifiConfigurations function and update encryption setting (#37256) --- .../silabs/wifi/SiWx/WifiInterfaceImpl.cpp | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp b/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp index df9de424b29d45..6ce7b2b66b4a34 100644 --- a/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp +++ b/src/platform/silabs/wifi/SiWx/WifiInterfaceImpl.cpp @@ -377,16 +377,22 @@ sl_status_t SetWifiConfigurations() // Setting the listen interval to 0 which will set it to DTIM interval sl_wifi_listen_interval_t sleep_interval = { .listen_interval = 0 }; status = sl_wifi_set_listen_interval(SL_WIFI_CLIENT_INTERFACE, sleep_interval); - VerifyOrReturnError(status == SL_STATUS_OK, status); + VerifyOrReturnError(status == SL_STATUS_OK, status, + ChipLogError(DeviceLayer, "sl_wifi_set_listen_interval failed: 0x%lx", status)); sl_wifi_advanced_client_configuration_t client_config = { .max_retry_attempts = 5 }; status = sl_wifi_set_advanced_client_configuration(SL_WIFI_CLIENT_INTERFACE, &client_config); - VerifyOrReturnError(status == SL_STATUS_OK, status); + VerifyOrReturnError(status == SL_STATUS_OK, status, + ChipLogError(DeviceLayer, "sl_wifi_set_advanced_client_configuration failed: 0x%lx", status)); #endif // CHIP_CONFIG_ENABLE_ICD_SERVER - status = sl_net_set_credential(SL_NET_DEFAULT_WIFI_CLIENT_CREDENTIAL_ID, SL_NET_WIFI_PSK, &wfx_rsi.sec.passkey[0], - wfx_rsi.sec.passkey_length); - VerifyOrReturnError(status == SL_STATUS_OK, status); + if (wfx_rsi.sec.passkey_length != 0) + { + status = sl_net_set_credential(SL_NET_DEFAULT_WIFI_CLIENT_CREDENTIAL_ID, SL_NET_WIFI_PSK, &wfx_rsi.sec.passkey[0], + wfx_rsi.sec.passkey_length); + VerifyOrReturnError(status == SL_STATUS_OK, status, + ChipLogError(DeviceLayer, "sl_net_set_credential failed: 0x%lx", status)); + } sl_net_wifi_client_profile_t profile = { .config = { @@ -402,7 +408,7 @@ sl_status_t SetWifiConfigurations() .bssid = {{0}}, .bss_type = SL_WIFI_BSS_TYPE_INFRASTRUCTURE, .security = security, - .encryption = SL_WIFI_NO_ENCRYPTION, + .encryption = SL_WIFI_DEFAULT_ENCRYPTION, .client_options = SL_WIFI_JOIN_WITH_SCAN, .credential_id = SL_NET_DEFAULT_WIFI_CLIENT_CREDENTIAL_ID, }, @@ -417,7 +423,7 @@ sl_status_t SetWifiConfigurations() memcpy((char *) &profile.config.ssid.value, wfx_rsi.sec.ssid, wfx_rsi.sec.ssid_length); status = sl_net_set_profile((sl_net_interface_t) SL_NET_WIFI_CLIENT_INTERFACE, SL_NET_DEFAULT_WIFI_CLIENT_PROFILE_ID, &profile); - VerifyOrReturnError(status == SL_STATUS_OK, status, ChipLogError(DeviceLayer, "sl_net_set_profile Failed")); + VerifyOrReturnError(status == SL_STATUS_OK, status, ChipLogError(DeviceLayer, "sl_net_set_profile failed: 0x%lx", status)); return status; } From fb64160dced3af5ca3366f10d32cdb3ac4665f5c Mon Sep 17 00:00:00 2001 From: Boris Zbarsky Date: Tue, 28 Jan 2025 16:29:46 -0500 Subject: [PATCH 07/36] Update Darwin availability annotations for non-generated code. (#37270) --- src/darwin/Framework/CHIP/MTRCommissioneeInfo.h | 2 +- src/darwin/Framework/CHIP/MTRCommissioningParameters.h | 2 +- src/darwin/Framework/CHIP/MTRDeviceController.h | 2 +- src/darwin/Framework/CHIP/MTRDeviceControllerDelegate.h | 5 ++--- src/darwin/Framework/CHIP/MTRDeviceType.h | 2 +- src/darwin/Framework/CHIP/MTRDeviceTypeRevision.h | 6 +++--- src/darwin/Framework/CHIP/MTREndpointInfo.h | 2 +- src/darwin/Framework/CHIP/MTRProductIdentity.h | 2 +- src/darwin/Framework/CHIP/MTRSetupPayload.h | 4 ++-- .../Framework/CHIP/XPC Protocol/MTRXPCServerProtocol.h | 2 +- 10 files changed, 14 insertions(+), 15 deletions(-) diff --git a/src/darwin/Framework/CHIP/MTRCommissioneeInfo.h b/src/darwin/Framework/CHIP/MTRCommissioneeInfo.h index 7c6ff4daea435e..d2e6bd609af375 100644 --- a/src/darwin/Framework/CHIP/MTRCommissioneeInfo.h +++ b/src/darwin/Framework/CHIP/MTRCommissioneeInfo.h @@ -25,7 +25,7 @@ NS_ASSUME_NONNULL_BEGIN * Information read from the commissionee device during commissioning. */ NS_SWIFT_SENDABLE -MTR_NEWLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRCommissioneeInfo : NSObject /** diff --git a/src/darwin/Framework/CHIP/MTRCommissioningParameters.h b/src/darwin/Framework/CHIP/MTRCommissioningParameters.h index 3dcd1efc53dcac..c5bd65b7a0a03d 100644 --- a/src/darwin/Framework/CHIP/MTRCommissioningParameters.h +++ b/src/darwin/Framework/CHIP/MTRCommissioningParameters.h @@ -100,7 +100,7 @@ MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) * Read device type information from all endpoints during commissioning. * Defaults to NO. */ -@property (nonatomic, assign) BOOL readEndpointInformation MTR_NEWLY_AVAILABLE; +@property (nonatomic, assign) BOOL readEndpointInformation MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end diff --git a/src/darwin/Framework/CHIP/MTRDeviceController.h b/src/darwin/Framework/CHIP/MTRDeviceController.h index f9d0cd3d5196d7..8177eda25cd5ba 100644 --- a/src/darwin/Framework/CHIP/MTRDeviceController.h +++ b/src/darwin/Framework/CHIP/MTRDeviceController.h @@ -273,7 +273,7 @@ MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) * Forget any information we have about the device with the given node ID. That * includes clearing any information we have stored about it. */ -- (void)forgetDeviceWithNodeID:(NSNumber *)nodeID MTR_NEWLY_AVAILABLE; +- (void)forgetDeviceWithNodeID:(NSNumber *)nodeID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Compute a PASE verifier for the desired setup passcode. diff --git a/src/darwin/Framework/CHIP/MTRDeviceControllerDelegate.h b/src/darwin/Framework/CHIP/MTRDeviceControllerDelegate.h index 5fac4483671744..80426625f6385c 100644 --- a/src/darwin/Framework/CHIP/MTRDeviceControllerDelegate.h +++ b/src/darwin/Framework/CHIP/MTRDeviceControllerDelegate.h @@ -94,12 +94,11 @@ MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) * so the information delivered by this notification should not be trusted. */ - (void)controller:(MTRDeviceController *)controller - readCommissioneeInfo:(MTRCommissioneeInfo *)info MTR_NEWLY_AVAILABLE; + readCommissioneeInfo:(MTRCommissioneeInfo *)info MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)controller:(MTRDeviceController *)controller readCommissioningInfo:(MTRProductIdentity *)info - MTR_AVAILABLE(ios(17.0), macos(14.0), watchos(10.0), tvos(17.0)) - MTR_NEWLY_DEPRECATED("Use controller:readCommissioneeInfo:"); + MTR_DEPRECATED("Use controller:readCommissioneeInfo:", ios(17.0, 18.4), macos(14.0, 15.4), watchos(10.0, 11.4), tvos(17.0, 18.4)); /** * Notify the delegate when the suspended state changed of the controller, after this happens diff --git a/src/darwin/Framework/CHIP/MTRDeviceType.h b/src/darwin/Framework/CHIP/MTRDeviceType.h index 54802a19e12dd6..2cd8d6b3d2ec10 100644 --- a/src/darwin/Framework/CHIP/MTRDeviceType.h +++ b/src/darwin/Framework/CHIP/MTRDeviceType.h @@ -55,7 +55,7 @@ MTR_AVAILABLE(ios(18.2), macos(15.2), watchos(11.2), tvos(18.2)) @end -MTR_NEWLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRDeviceType () @end diff --git a/src/darwin/Framework/CHIP/MTRDeviceTypeRevision.h b/src/darwin/Framework/CHIP/MTRDeviceTypeRevision.h index e5e55a56450c95..7f33b718a3f233 100644 --- a/src/darwin/Framework/CHIP/MTRDeviceTypeRevision.h +++ b/src/darwin/Framework/CHIP/MTRDeviceTypeRevision.h @@ -44,7 +44,7 @@ MTR_AVAILABLE(ios(17.6), macos(14.6), watchos(10.6), tvos(17.6)) /** * Initializes the receiver based on the values in the specified struct. */ -- (nullable instancetype)initWithDeviceTypeStruct:(MTRDescriptorClusterDeviceTypeStruct *)deviceTypeStruct MTR_NEWLY_AVAILABLE; +- (nullable instancetype)initWithDeviceTypeStruct:(MTRDescriptorClusterDeviceTypeStruct *)deviceTypeStruct MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @property (nonatomic, copy, readonly) NSNumber * deviceTypeID; @property (nonatomic, copy, readonly) NSNumber * deviceTypeRevision; @@ -53,11 +53,11 @@ MTR_AVAILABLE(ios(17.6), macos(14.6), watchos(10.6), tvos(17.6)) * Returns the MTRDeviceType corresponding to deviceTypeID, * or nil if deviceTypeID does not represent a known device type. */ -@property (nonatomic, copy, readonly, nullable) MTRDeviceType * typeInformation MTR_NEWLY_AVAILABLE; +@property (nonatomic, copy, readonly, nullable) MTRDeviceType * typeInformation MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end -MTR_NEWLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRDeviceTypeRevision () @end diff --git a/src/darwin/Framework/CHIP/MTREndpointInfo.h b/src/darwin/Framework/CHIP/MTREndpointInfo.h index dc271a05483442..6c9021967faf4c 100644 --- a/src/darwin/Framework/CHIP/MTREndpointInfo.h +++ b/src/darwin/Framework/CHIP/MTREndpointInfo.h @@ -24,7 +24,7 @@ NS_ASSUME_NONNULL_BEGIN * Meta-data about an endpoint of a Matter node. */ NS_SWIFT_SENDABLE -MTR_NEWLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTREndpointInfo : NSObject - (instancetype)init NS_UNAVAILABLE; diff --git a/src/darwin/Framework/CHIP/MTRProductIdentity.h b/src/darwin/Framework/CHIP/MTRProductIdentity.h index 7277c6441521c1..75985651b18693 100644 --- a/src/darwin/Framework/CHIP/MTRProductIdentity.h +++ b/src/darwin/Framework/CHIP/MTRProductIdentity.h @@ -35,7 +35,7 @@ MTR_AVAILABLE(ios(17.0), macos(14.0), watchos(10.0), tvos(17.0)) @end -MTR_NEWLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRProductIdentity () @end diff --git a/src/darwin/Framework/CHIP/MTRSetupPayload.h b/src/darwin/Framework/CHIP/MTRSetupPayload.h index 99a9bb844a7302..b80e43e480439f 100644 --- a/src/darwin/Framework/CHIP/MTRSetupPayload.h +++ b/src/darwin/Framework/CHIP/MTRSetupPayload.h @@ -175,7 +175,7 @@ MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) /** * Generate a random Matter-valid setup PIN. */ -+ (NSUInteger)generateRandomPIN MTR_NEWLY_DEPRECATED("Please use generateRandomSetupPasscode"); ++ (NSUInteger)generateRandomPIN MTR_DEPRECATED("Please use generateRandomSetupPasscode", ios(16.1, 18.4), macos(13.0, 15.4), watchos(9.1, 11.4), tvos(16.1, 18.4)); /** * Generate a random Matter-valid setup passcode. @@ -218,7 +218,7 @@ MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) * Check whether the provided setup passcode (represented as an unsigned * integer) is a valid setup passcode. */ -+ (BOOL)isValidSetupPasscode:(NSNumber *)setupPasscode MTR_NEWLY_AVAILABLE; ++ (BOOL)isValidSetupPasscode:(NSNumber *)setupPasscode MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end diff --git a/src/darwin/Framework/CHIP/XPC Protocol/MTRXPCServerProtocol.h b/src/darwin/Framework/CHIP/XPC Protocol/MTRXPCServerProtocol.h index ec027fadc5e84c..1c57480565dacb 100644 --- a/src/darwin/Framework/CHIP/XPC Protocol/MTRXPCServerProtocol.h +++ b/src/darwin/Framework/CHIP/XPC Protocol/MTRXPCServerProtocol.h @@ -71,7 +71,7 @@ MTR_AVAILABLE(ios(18.3), macos(15.3), watchos(11.3), tvos(18.3)) // - (oneway void)deviceController:(NSUUID *)controller addServerEndpoint:(MTRServerEndpoint *)endpoint withReply:(void (^)(BOOL success))reply; // - (oneway void)deviceController:(NSUUID *)controller removeServerEndpoint:(MTRServerEndpoint *)endpoint; -- (oneway void)deviceController:(NSUUID *)controller deleteNodeID:(NSNumber *)nodeID MTR_NEWLY_AVAILABLE; +- (oneway void)deviceController:(NSUUID *)controller deleteNodeID:(NSNumber *)nodeID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (oneway void)deviceController:(NSUUID *)controller registerNodeID:(NSNumber *)nodeID; - (oneway void)deviceController:(NSUUID *)controller unregisterNodeID:(NSNumber *)nodeID; From 6e8676be6142bb541fa68048c77f2fc56a21c7b1 Mon Sep 17 00:00:00 2001 From: Adrian Gielniewski Date: Wed, 29 Jan 2025 05:57:11 +0100 Subject: [PATCH 08/36] Update of nRF Connect SDK version to the 2.9.0 (#37105) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [Zephyr] Add ZMS to Zephyr port Added a possibility to use ZMS fs backend in Zephyr. NVS fs backend imply is now controlled by the nrfconnect platform configuration directly. All other platforms use NVS fs backend by default. Signed-off-by: Arkadiusz Balys [nrf toup] Fix defines for ZMS It can be squashed with the 0c49058 commit. Signed-off-by: Arkadiusz Balys * [Zephyr] Fix ICD LIT connected configurations According to specification, if ICD LIT is supported, UAT and LITS features must be supported too. If `CHIP_ICD_LIT_SUPPORT` is selected, select CIP and UAT configs instead of implying them. Signed-off-by: Maciej Baczmanski * [nrfconnect] Introduced Kconfigs to configure few params Introduced new Kconfig options to be able to configure the parameters related to persistent subscriptions re-establishment. Signed-off-by: Kamil Kasperczyk [nrfconnect] Added module to synchronize DFU processes Introduced a module that can be used to synchronize DFU processes and make it mutual exclusive (prevent concurrent DFU runs using different protocols, e.g Matter OTA and DFU over BT SMP). Signed-off-by: Kamil Kasperczyk [nrfconnect] Implement IPv6 agnostic L2 network state getters * Added new API for generic IPv6 connectivity checks * This patch allows the application layer to limit the amount of pre-processor logic (CONFIG_NET_L2_OPENTHREAD/CONFIG_CHIP_WIFI) needed to configure the Signed-off-by: Marcin Kajor [nrfconnect] Added support for settings shell in mem profiling Enabled settings shell configuration and increased shell command buffer size when `CHIP_MEMORY_PROFILING` is enabled to allow reading and writing settings using shell. Signed-off-by: Maciej Baczmanski [nrfconnect] Introduced Kconfig to configure CHIP stack size There is not Kconfig that would allow to set the CHIP task size, what is not convenient, as other stacks can be configured using Kconfig. [nrfconnect] Added log for the WiFi connection failure This might help when debugging the WiFi connection failures. Signed-off-by: Marcin Kajor [nrfconnect] Refactor ExternalFlashManager Make `ExternalFlashManager` a singleton Signed-off-by: Maciej Baczmanski [nrfconnect] Increase workqueue stack size for LIT Whien LIT is enabled, higher workqueue stack size is required when entering active mode. Signed-off-by: Maciej Baczmanski [nrfconnect] Switch to nRF54L15 DK - Removed support for nRF54L15 PDK and added for nRF54L15 DK [nrfconnect] wifi: Migrate to nRF70 upstream nRF70 support moved upstream, update the names. Signed-off-by: Chaitanya Tata [nrfconnect] matter: crypto: Use psa_crypto_config -Previously there was a library called mbedcrypto_common which was used to pass build-related configurations to matter. This is changed to instead reference to the following: -psa_crypto_config (for PSA and Mbed TLS configurations) -psa_interface (for PSA crypto include files) -The commit also removes passing the PSA crypto driver config file as this is no longer needed for an interface build (call from matter) Signed-off-by: Frank Audun Kvamtrø [nrfconnect] Fixed mbedtls configs selection The updated way of handling mbedtls config file is done correctly only for TF-M builds, but without it some of the files are missing Signed-off-by: Kamil Kasperczyk [nrfconnect] Disable unsupported SHELL_WILDCARD SHELL_WILDCARD is not supported for Matter devices in the newest Zephyr version because it selects POSIX_C_LIB_EXT, so we need to disable it. [nrfconnect] Enable SPI for nRF54L15DK NS build Added nRF54L15 DK NS to configuration. Signed-off-by: Arkadiusz Balys [nrfconnect] config: align the MCUmgr Bluetooth transport Kconfig Aligned the MCUmgr Bluetooth transport Kconfig with the latest changes from Zephyr. Ref: NCSDK-29061 Signed-off-by: Kamil Piszczek [nrfconnect] Enable MLDv2 join procedure for IPv6 Multicasts This commit updates the IPv6 multicast subscription mechanism by explicitly using the MLDv2 join procedure. This change ensures proper registration for multicast addresses, improving reliability in multicast communication. Signed-off-by: Łukasz Duda [nrfconnect] Implicitly enable PSA crypto driver for given platform This commit makes in clear which crypto driver is enabled by default. Additionally, stack overflow has been fixed for CC3XX variant, and mbedTLS Heap is disabled for TF-M variant. Signed-off-by: Łukasz Duda [nrfconnect] wifi: Fix nRF70 heap allocation The upstream WPA supplicant uses k_heap instead of libc_heap, so, move the heap to k_heap. Signed-off-by: Chaitanya Tata [nrfconnect] wifi: Fix the heap allocation warning By default nRF70 driver allocates a higher heap to handle most cases, but as Matter doesn't use much heap, enable the ignore minimum warning configuration. Signed-off-by: Chaitanya Tata [nrfconnect] Increased stack size for the OpenThread with nRF54L When using nRF54L15 the stack size required for crypto operations by OpenThread is bigger and must be increased. Signed-off-by: Kamil Kasperczyk [nrfconnect] Enable ZMS in nrfconnect if RRAM is in use. Disabled NVS and enabled ZMS fs backend for all devices that uses RRAM. Signed-off-by: Arkadiusz Balys [nrfconnect] Increased CHIP stack size for cracen based targets Targets using cracen crypto backend requires bigger CHIP stack size. Signed-off-by: Kamil Kasperczyk [nrfconnect] disable `FPROTECT` for nRF54L15 `FPROTECT` should be disabled for nRF54L15 in app to allow correctly protecting whole region of mcuboot Signed-off-by: Maciej Baczmanski [nrfconnect] Factory data partition location change - factory data can be placed before or after settings partition Signed-off-by: Konrad Grucel [nrfconnect] Added config to enable report on active mode Introduced Kconfig option that allows to enable an ICD to send data report on entering the active mode. Signed-off-by: Kamil Kasperczyk [nrfconnect] Increased system workqueue size for LIT The LIT devices seem to need bigger size of workqueue on 54L. Signed-off-by: Kamil Kasperczyk [nrfconnect] Change `CHIP_SPI_NOR` config dependency Set `CHIP_SPI_NOR` to y for all targets that are built for nRF54L15DK, regardless of target SoC. Signed-off-by: Maciej Baczmanski [nrfconnect] Disable chip_build_tools Disable chip_build_tools Signed-off-by: Adrian Gielniewski * [Crypto] Stop compiling legacy SPAKE2P if PSA is available If the CHIP_CRYPTO_PSA_SPAKE2P is enabled the build system should not compile Legacy Spake2p implementation, because the PSA one is available in the PSASpake2p.cpp file. * VerifyOrDie logging for constrained devices 1. Add the configuration to enable logging the location of a failed VerifyOrDie() without logging the condition to reduce the code size impact but still be able to debug failing VerifyOrDie() conditions. 2. Allow to override __FILE__ macro with __FILE_NAME__ by setting the warn_builtin_macro_redefined GN arg to false to further reduce the code size increase. 3. Add Kconfigs for nRF Connect platform for enabling both features. Signed-off-by: Damian Krolik * Include EXTRAVERSION in Matter software version string When a Matter application provides the VERSION file, the Matter software version string is set to 4-number string, such as "2.7.99+0" and the EXTRAVERSION field, which is typically used to denote the branch or tag name, such as "dev" or "rc1", is ignored. If the EXTRAVERSION field is non-empty, set the Matter software version string to a string such as "2.7.99-dev+0". * Clear Thread Network after last fabric is removed Dataset has to be cleared to allow commissioning to different network when CONFIG_CHIP_LAST_FABRIC_REMOVED_ERASE_ONLY is used. Signed-off-by: Adrian Gielniewski * [workflows] Update docker images to version 98 Update docker image version to 98. Signed-off-by: Adrian Gielniewski * [nrfconnect] Change the recommended version to 2.9.0 Change the recommended version of nRF Connected SDK to 2.9.0. Signed-off-by: Adrian Gielniewski * [nrfconnect] Align examples to NCS 2.9.0 Signed-off-by: Adrian Gielniewski * [nrfconnect] Fix FLASH overflow Disable some logs in lighting-app and lock-app due to flash overflow. Signed-off-by: Adrian Gielniewski * [nrfconnect] Align test_driver configuration to NCS 2.9.0 Signed-off-by: Adrian Gielniewski * [nrfconnect] Fix nrf builder Use correct path when running ctest. Signed-off-by: Adrian Gielniewski * [nrfconnect] Disable native build Disable Zephyr native build until next release due to Zephyr regression. Signed-off-by: Adrian Gielniewski --------- Signed-off-by: Arkadiusz Balys Signed-off-by: Maciej Baczmanski Signed-off-by: Adrian Gielniewski Signed-off-by: Damian Krolik Co-authored-by: Arkadiusz Balys Co-authored-by: Maciej Baczmanski Co-authored-by: Kamil Kasperczyk Co-authored-by: Damian Krolik --- .github/workflows/bloat_check.yaml | 2 +- .github/workflows/build.yaml | 10 +-- .github/workflows/chef.yaml | 8 +- .github/workflows/doxygen.yaml | 2 +- .github/workflows/examples-ameba.yaml | 2 +- .github/workflows/examples-asr.yaml | 2 +- .github/workflows/examples-bouffalolab.yaml | 2 +- .github/workflows/examples-cc13xx_26xx.yaml | 2 +- .github/workflows/examples-cc32xx.yaml | 2 +- .github/workflows/examples-efr32.yaml | 2 +- .github/workflows/examples-esp32.yaml | 4 +- .github/workflows/examples-infineon.yaml | 2 +- .github/workflows/examples-linux-arm.yaml | 2 +- .github/workflows/examples-linux-imx.yaml | 2 +- .../workflows/examples-linux-standalone.yaml | 2 +- .../examples-linux-tv-casting-app.yaml | 2 +- .github/workflows/examples-mw320.yaml | 2 +- .github/workflows/examples-nrfconnect.yaml | 11 +-- .github/workflows/examples-nuttx.yaml | 2 +- .github/workflows/examples-nxp.yaml | 4 +- .github/workflows/examples-openiotsdk.yaml | 2 +- .github/workflows/examples-qpg.yaml | 2 +- .github/workflows/examples-stm32.yaml | 2 +- .github/workflows/examples-telink.yaml | 2 +- .github/workflows/examples-tizen.yaml | 2 +- .github/workflows/full-android.yaml | 2 +- .github/workflows/fuzzing-build.yaml | 2 +- .github/workflows/java-tests.yaml | 2 +- .github/workflows/lint.yml | 2 +- .github/workflows/minimal-build.yaml | 4 +- .github/workflows/qemu.yaml | 4 +- .github/workflows/release_artifacts.yaml | 4 +- .github/workflows/smoketest-android.yaml | 2 +- .github/workflows/tests.yaml | 4 +- .github/workflows/unit_integration_test.yaml | 2 +- .github/workflows/zap_regeneration.yaml | 2 +- .github/workflows/zap_templates.yaml | 2 +- build/config/compiler/BUILD.gn | 6 ++ .../.nrfconnect-recommended-revision | 2 +- config/nrfconnect/chip-gn/args.gni | 1 + config/nrfconnect/chip-module/CMakeLists.txt | 36 +++++++-- config/nrfconnect/chip-module/Kconfig | 74 +++++++++++++++++-- .../nrfconnect/chip-module/Kconfig.defaults | 70 +++++++++++------- .../nrfconnect/chip-module/Kconfig.features | 14 ++-- config/nxp/chip-module/Kconfig | 2 +- config/telink/chip-module/Kconfig | 2 +- config/zephyr/Kconfig | 21 ++++-- config/zephyr/chip-module/Kconfig.features | 6 +- config/zephyr/ota-image.cmake | 2 +- config/zephyr/ota-image_sysbuild.cmake | 8 +- .../nrf/nrfconnect_examples_configuration.md | 7 +- examples/chef/nrfconnect/main.cpp | 2 +- .../main/include/CHIPProjectConfig.h | 7 ++ .../main/include/CHIPProjectConfig.h | 7 ++ examples/platform/nrfconnect/util/OTAUtil.cpp | 8 +- .../nrfconnect/util/PigweedLogger.cpp | 2 +- examples/pump-app/nrfconnect/main/AppTask.cpp | 2 +- .../nrfconnect/main/AppTask.cpp | 2 +- .../window-app/nrfconnect/main/AppTask.cpp | 2 +- scripts/build/builders/nrf.py | 2 +- src/crypto/CHIPCryptoPALPSA.cpp | 5 ++ src/lib/core/CHIPConfig.h | 11 +++ src/lib/support/CodeUtils.h | 5 +- .../GenericNetworkCommissioningThreadDriver.h | 2 + ...nericThreadStackManagerImpl_OpenThread.hpp | 8 ++ .../Zephyr/ConfigurationManagerImpl.cpp | 20 +++-- src/platform/nrfconnect/BUILD.gn | 2 + .../nrfconnect/CHIPDevicePlatformConfig.h | 12 +-- src/platform/nrfconnect/CHIPPlatformConfig.h | 29 +++++++- .../nrfconnect/ConnectivityManagerImpl.cpp | 19 +++-- .../nrfconnect/ConnectivityManagerImpl.h | 26 +++++++ src/platform/nrfconnect/DFUSync.cpp | 50 +++++++++++++ src/platform/nrfconnect/DFUSync.h | 60 +++++++++++++++ .../DiagnosticDataProviderImplNrf.cpp | 4 +- .../DiagnosticDataProviderImplNrf.h | 2 +- .../nrfconnect/ExternalFlashManager.h | 18 ++++- src/platform/nrfconnect/FactoryDataProvider.h | 12 ++- .../nrfconnect/OTAImageProcessorImpl.cpp | 19 ++++- .../nrfconnect/OTAImageProcessorImpl.h | 1 + .../nrfconnect/SystemPlatformConfig.h | 4 +- src/platform/nrfconnect/wifi/WiFiManager.cpp | 2 + .../main/include/CHIPProjectConfig.h | 3 + src/test_driver/nrfconnect/prj.conf | 7 +- 83 files changed, 550 insertions(+), 165 deletions(-) create mode 100644 src/platform/nrfconnect/DFUSync.cpp create mode 100644 src/platform/nrfconnect/DFUSync.h diff --git a/.github/workflows/bloat_check.yaml b/.github/workflows/bloat_check.yaml index 92667ddebec3dd..6ac96aebb7ed4c 100644 --- a/.github/workflows/bloat_check.yaml +++ b/.github/workflows/bloat_check.yaml @@ -34,7 +34,7 @@ jobs: runs-on: ubuntu-latest container: - image: ghcr.io/project-chip/chip-build:97 + image: ghcr.io/project-chip/chip-build:98 steps: - name: Checkout diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 42bd2cac7379a7..895e7260d1ba8a 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -43,7 +43,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build:97 + image: ghcr.io/project-chip/chip-build:98 volumes: - "/:/runner-root-volume" - "/tmp/log_output:/tmp/test_logs" @@ -139,7 +139,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build:97 + image: ghcr.io/project-chip/chip-build:98 volumes: - "/:/runner-root-volume" - "/tmp/log_output:/tmp/test_logs" @@ -308,7 +308,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build:97 + image: ghcr.io/project-chip/chip-build:98 volumes: - "/:/runner-root-volume" - "/tmp/log_output:/tmp/test_logs" @@ -373,7 +373,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build:97 + image: ghcr.io/project-chip/chip-build:98 volumes: - "/:/runner-root-volume" - "/tmp/log_output:/tmp/test_logs" @@ -492,7 +492,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build:97 + image: ghcr.io/project-chip/chip-build:98 volumes: - "/:/runner-root-volume" - "/tmp/log_output:/tmp/test_logs" diff --git a/.github/workflows/chef.yaml b/.github/workflows/chef.yaml index be8a6421f6776b..e6bcb180748cb3 100644 --- a/.github/workflows/chef.yaml +++ b/.github/workflows/chef.yaml @@ -36,7 +36,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build:97 + image: ghcr.io/project-chip/chip-build:98 options: --user root steps: @@ -57,7 +57,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-esp32:97 + image: ghcr.io/project-chip/chip-build-esp32:98 options: --user root steps: @@ -78,7 +78,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-nrf-platform:97 + image: ghcr.io/project-chip/chip-build-nrf-platform:98 options: --user root steps: @@ -99,7 +99,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-telink:97 + image: ghcr.io/project-chip/chip-build-telink:98 options: --user root steps: diff --git a/.github/workflows/doxygen.yaml b/.github/workflows/doxygen.yaml index c712ffed71a1fc..9cc5751ab310d3 100644 --- a/.github/workflows/doxygen.yaml +++ b/.github/workflows/doxygen.yaml @@ -84,7 +84,7 @@ jobs: runs-on: ubuntu-latest container: - image: ghcr.io/project-chip/chip-build-doxygen:97 + image: ghcr.io/project-chip/chip-build-doxygen:98 if: github.actor != 'restyled-io[bot]' diff --git a/.github/workflows/examples-ameba.yaml b/.github/workflows/examples-ameba.yaml index ed978476c251e6..121610d215123e 100644 --- a/.github/workflows/examples-ameba.yaml +++ b/.github/workflows/examples-ameba.yaml @@ -39,7 +39,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-ameba:97 + image: ghcr.io/project-chip/chip-build-ameba:98 options: --user root steps: diff --git a/.github/workflows/examples-asr.yaml b/.github/workflows/examples-asr.yaml index bac2f05f7ff65e..5302926ed7fc97 100644 --- a/.github/workflows/examples-asr.yaml +++ b/.github/workflows/examples-asr.yaml @@ -37,7 +37,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-asr:97 + image: ghcr.io/project-chip/chip-build-asr:98 options: --user root steps: diff --git a/.github/workflows/examples-bouffalolab.yaml b/.github/workflows/examples-bouffalolab.yaml index 37fdb947bfd97f..6fcb047e98e3ec 100644 --- a/.github/workflows/examples-bouffalolab.yaml +++ b/.github/workflows/examples-bouffalolab.yaml @@ -38,7 +38,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-bouffalolab:97 + image: ghcr.io/project-chip/chip-build-bouffalolab:98 volumes: - "/tmp/bloat_reports:/tmp/bloat_reports" steps: diff --git a/.github/workflows/examples-cc13xx_26xx.yaml b/.github/workflows/examples-cc13xx_26xx.yaml index 793a27a0287aeb..b879eb5025bdb5 100644 --- a/.github/workflows/examples-cc13xx_26xx.yaml +++ b/.github/workflows/examples-cc13xx_26xx.yaml @@ -42,7 +42,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-ti:97 + image: ghcr.io/project-chip/chip-build-ti:98 volumes: - "/tmp/bloat_reports:/tmp/bloat_reports" steps: diff --git a/.github/workflows/examples-cc32xx.yaml b/.github/workflows/examples-cc32xx.yaml index 703fea73afb882..5516d4374641a7 100644 --- a/.github/workflows/examples-cc32xx.yaml +++ b/.github/workflows/examples-cc32xx.yaml @@ -41,7 +41,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-ti:97 + image: ghcr.io/project-chip/chip-build-ti:98 volumes: - "/tmp/bloat_reports:/tmp/bloat_reports" steps: diff --git a/.github/workflows/examples-efr32.yaml b/.github/workflows/examples-efr32.yaml index bed526f1c140e0..c1b8253b336f24 100644 --- a/.github/workflows/examples-efr32.yaml +++ b/.github/workflows/examples-efr32.yaml @@ -41,7 +41,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-efr32:95 + image: ghcr.io/project-chip/chip-build-efr32:98 volumes: - "/tmp/bloat_reports:/tmp/bloat_reports" steps: diff --git a/.github/workflows/examples-esp32.yaml b/.github/workflows/examples-esp32.yaml index cd626fd02669e3..09f7141f340edd 100644 --- a/.github/workflows/examples-esp32.yaml +++ b/.github/workflows/examples-esp32.yaml @@ -37,7 +37,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-esp32:97 + image: ghcr.io/project-chip/chip-build-esp32:98 volumes: - "/tmp/bloat_reports:/tmp/bloat_reports" @@ -132,7 +132,7 @@ jobs: if: github.actor != 'restyled-io[bot]' && github.repository_owner == 'espressif' container: - image: ghcr.io/project-chip/chip-build-esp32:97 + image: ghcr.io/project-chip/chip-build-esp32:98 volumes: - "/tmp/bloat_reports:/tmp/bloat_reports" diff --git a/.github/workflows/examples-infineon.yaml b/.github/workflows/examples-infineon.yaml index 616b3a5bc4d7b6..52bc9f9752340a 100644 --- a/.github/workflows/examples-infineon.yaml +++ b/.github/workflows/examples-infineon.yaml @@ -38,7 +38,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-infineon:97 + image: ghcr.io/project-chip/chip-build-infineon:98 env: # TODO: this should probably be part of the dockerfile itself CY_TOOLS_PATHS: /opt/Tools/ModusToolbox/tools_3.2 diff --git a/.github/workflows/examples-linux-arm.yaml b/.github/workflows/examples-linux-arm.yaml index 6c0d7418103152..0edd77681284de 100644 --- a/.github/workflows/examples-linux-arm.yaml +++ b/.github/workflows/examples-linux-arm.yaml @@ -37,7 +37,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-crosscompile:97 + image: ghcr.io/project-chip/chip-build-crosscompile:98 volumes: - "/tmp/bloat_reports:/tmp/bloat_reports" diff --git a/.github/workflows/examples-linux-imx.yaml b/.github/workflows/examples-linux-imx.yaml index bc02b0e726268a..a43aadee9dfac9 100644 --- a/.github/workflows/examples-linux-imx.yaml +++ b/.github/workflows/examples-linux-imx.yaml @@ -37,7 +37,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-imx:97 + image: ghcr.io/project-chip/chip-build-imx:98 steps: - name: Checkout diff --git a/.github/workflows/examples-linux-standalone.yaml b/.github/workflows/examples-linux-standalone.yaml index 9f03f103cfdf6e..021640438b22a3 100644 --- a/.github/workflows/examples-linux-standalone.yaml +++ b/.github/workflows/examples-linux-standalone.yaml @@ -37,7 +37,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build:97 + image: ghcr.io/project-chip/chip-build:98 volumes: - "/tmp/bloat_reports:/tmp/bloat_reports" diff --git a/.github/workflows/examples-linux-tv-casting-app.yaml b/.github/workflows/examples-linux-tv-casting-app.yaml index 5d082fb194815e..85ca839cb85651 100644 --- a/.github/workflows/examples-linux-tv-casting-app.yaml +++ b/.github/workflows/examples-linux-tv-casting-app.yaml @@ -37,7 +37,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build:97 + image: ghcr.io/project-chip/chip-build:98 steps: - name: Checkout diff --git a/.github/workflows/examples-mw320.yaml b/.github/workflows/examples-mw320.yaml index 6e820e8faa0273..9cec1c6f94d783 100644 --- a/.github/workflows/examples-mw320.yaml +++ b/.github/workflows/examples-mw320.yaml @@ -40,7 +40,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build:97 + image: ghcr.io/project-chip/chip-build:98 volumes: - "/tmp/bloat_reports:/tmp/bloat_reports" steps: diff --git a/.github/workflows/examples-nrfconnect.yaml b/.github/workflows/examples-nrfconnect.yaml index 77a8ec626ba56a..97034e77f3aa57 100644 --- a/.github/workflows/examples-nrfconnect.yaml +++ b/.github/workflows/examples-nrfconnect.yaml @@ -40,7 +40,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-nrf-platform:97 + image: ghcr.io/project-chip/chip-build-nrf-platform:98 volumes: - "/tmp/bloat_reports:/tmp/bloat_reports" @@ -193,10 +193,11 @@ jobs: nrfconnect nrf7002dk_nrf5340_cpuapp all-clusters-app \ examples/all-clusters-app/nrfconnect/build/nrfconnect/zephyr/zephyr.elf \ /tmp/bloat_reports/ - - name: Run unit tests for Zephyr native_posix_64 platform - if: github.event_name == 'push' || steps.changed_paths.outputs.tests == 'true' || steps.changed_paths.outputs.nrfconnect == 'true' - run: | - scripts/run_in_build_env.sh "./scripts/build/build_examples.py --target nrf-native-posix-64-tests build" + # Disable native build until next release + # - name: Run unit tests for Zephyr native_posix_64 platform + # if: github.event_name == 'push' || steps.changed_paths.outputs.tests == 'true' || steps.changed_paths.outputs.nrfconnect == 'true' + # run: | + # scripts/run_in_build_env.sh "./scripts/build/build_examples.py --target nrf-native-posix-64-tests build" - name: Uploading Failed Test Logs uses: actions/upload-artifact@v4 if: ${{ failure() && !env.ACT }} diff --git a/.github/workflows/examples-nuttx.yaml b/.github/workflows/examples-nuttx.yaml index 274a18ecd202b3..6fa6500abbf4fd 100644 --- a/.github/workflows/examples-nuttx.yaml +++ b/.github/workflows/examples-nuttx.yaml @@ -38,7 +38,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-nuttx:97 + image: ghcr.io/project-chip/chip-build-nuttx:98 volumes: - "/tmp/bloat_reports:/tmp/bloat_reports" steps: diff --git a/.github/workflows/examples-nxp.yaml b/.github/workflows/examples-nxp.yaml index d74f01bc813ccb..870de18bda3a1a 100644 --- a/.github/workflows/examples-nxp.yaml +++ b/.github/workflows/examples-nxp.yaml @@ -40,7 +40,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-nxp:96 + image: ghcr.io/project-chip/chip-build-nxp:98 volumes: - "/tmp/bloat_reports:/tmp/bloat_reports" steps: @@ -239,7 +239,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-nxp-zephyr:97 + image: ghcr.io/project-chip/chip-build-nxp-zephyr:98 steps: - name: Checkout diff --git a/.github/workflows/examples-openiotsdk.yaml b/.github/workflows/examples-openiotsdk.yaml index eb13238550630e..a392c00720d698 100644 --- a/.github/workflows/examples-openiotsdk.yaml +++ b/.github/workflows/examples-openiotsdk.yaml @@ -36,7 +36,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-openiotsdk:97 + image: ghcr.io/project-chip/chip-build-openiotsdk:98 volumes: - "/tmp/bloat_reports:/tmp/bloat_reports" options: --privileged diff --git a/.github/workflows/examples-qpg.yaml b/.github/workflows/examples-qpg.yaml index d1701e03de5db5..630e81eb8d2a86 100644 --- a/.github/workflows/examples-qpg.yaml +++ b/.github/workflows/examples-qpg.yaml @@ -40,7 +40,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build:97 + image: ghcr.io/project-chip/chip-build:98 volumes: - "/tmp/bloat_reports:/tmp/bloat_reports" steps: diff --git a/.github/workflows/examples-stm32.yaml b/.github/workflows/examples-stm32.yaml index 5f1e859c750a38..2682fc6ef3b915 100644 --- a/.github/workflows/examples-stm32.yaml +++ b/.github/workflows/examples-stm32.yaml @@ -41,7 +41,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build:97 + image: ghcr.io/project-chip/chip-build:98 volumes: - "/tmp/bloat_reports:/tmp/bloat_reports" steps: diff --git a/.github/workflows/examples-telink.yaml b/.github/workflows/examples-telink.yaml index a493982513ca0a..95fdb770933d07 100644 --- a/.github/workflows/examples-telink.yaml +++ b/.github/workflows/examples-telink.yaml @@ -39,7 +39,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-telink:97 + image: ghcr.io/project-chip/chip-build-telink:98 volumes: - "/tmp/bloat_reports:/tmp/bloat_reports" diff --git a/.github/workflows/examples-tizen.yaml b/.github/workflows/examples-tizen.yaml index 11093d4ffc1d0b..bc94b0f3375af3 100644 --- a/.github/workflows/examples-tizen.yaml +++ b/.github/workflows/examples-tizen.yaml @@ -37,7 +37,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-tizen:97 + image: ghcr.io/project-chip/chip-build-tizen:98 options: --user root volumes: - "/tmp/bloat_reports:/tmp/bloat_reports" diff --git a/.github/workflows/full-android.yaml b/.github/workflows/full-android.yaml index d672632edfc6e2..0e116e8062b03a 100644 --- a/.github/workflows/full-android.yaml +++ b/.github/workflows/full-android.yaml @@ -39,7 +39,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-android:97 + image: ghcr.io/project-chip/chip-build-android:98 volumes: - "/tmp/log_output:/tmp/test_logs" diff --git a/.github/workflows/fuzzing-build.yaml b/.github/workflows/fuzzing-build.yaml index b236d1bbb6af02..5bc8c6c6f01cc1 100644 --- a/.github/workflows/fuzzing-build.yaml +++ b/.github/workflows/fuzzing-build.yaml @@ -33,7 +33,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build:97 + image: ghcr.io/project-chip/chip-build:98 volumes: - "/tmp/log_output:/tmp/test_logs" diff --git a/.github/workflows/java-tests.yaml b/.github/workflows/java-tests.yaml index 7d5170c39bc5a3..87122ced0e47d3 100644 --- a/.github/workflows/java-tests.yaml +++ b/.github/workflows/java-tests.yaml @@ -43,7 +43,7 @@ jobs: runs-on: ubuntu-latest container: - image: ghcr.io/project-chip/chip-build-java:97 + image: ghcr.io/project-chip/chip-build-java:98 options: --privileged --sysctl "net.ipv6.conf.all.disable_ipv6=0 net.ipv4.conf.all.forwarding=0 net.ipv6.conf.all.forwarding=0" diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 786fee684002a3..3abc726c30ad00 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -36,7 +36,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build:97 + image: ghcr.io/project-chip/chip-build:98 steps: - name: Checkout diff --git a/.github/workflows/minimal-build.yaml b/.github/workflows/minimal-build.yaml index 03766a639f7387..fa9bff4a0735a3 100644 --- a/.github/workflows/minimal-build.yaml +++ b/.github/workflows/minimal-build.yaml @@ -34,7 +34,7 @@ jobs: runs-on: ubuntu-latest container: - image: ghcr.io/project-chip/chip-build-minimal:97 + image: ghcr.io/project-chip/chip-build-minimal:98 steps: - name: Checkout @@ -56,7 +56,7 @@ jobs: runs-on: ubuntu-latest container: - image: ghcr.io/project-chip/chip-build-minimal:97 + image: ghcr.io/project-chip/chip-build-minimal:98 steps: - name: Checkout diff --git a/.github/workflows/qemu.yaml b/.github/workflows/qemu.yaml index 15f04eb82d6d07..c498eb9016cab4 100644 --- a/.github/workflows/qemu.yaml +++ b/.github/workflows/qemu.yaml @@ -41,7 +41,7 @@ jobs: if: github.actor != 'restyled-io[bot]' && github.repository_owner == 'espressif' container: - image: ghcr.io/project-chip/chip-build-esp32-qemu:97 + image: ghcr.io/project-chip/chip-build-esp32-qemu:98 volumes: - "/tmp/log_output:/tmp/test_logs" @@ -79,7 +79,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-tizen-qemu:97 + image: ghcr.io/project-chip/chip-build-tizen-qemu:98 options: --user root volumes: - "/tmp/log_output:/tmp/test_logs" diff --git a/.github/workflows/release_artifacts.yaml b/.github/workflows/release_artifacts.yaml index 6df4cdefc7a190..c513764852d1a4 100644 --- a/.github/workflows/release_artifacts.yaml +++ b/.github/workflows/release_artifacts.yaml @@ -32,7 +32,7 @@ jobs: runs-on: ubuntu-latest container: - image: ghcr.io/project-chip/chip-build-esp32:97 + image: ghcr.io/project-chip/chip-build-esp32:98 steps: - name: Checkout @@ -64,7 +64,7 @@ jobs: runs-on: ubuntu-latest container: - image: ghcr.io/project-chip/chip-build-efr32:97 + image: ghcr.io/project-chip/chip-build-efr32:98 steps: - name: Checkout uses: actions/checkout@v4 diff --git a/.github/workflows/smoketest-android.yaml b/.github/workflows/smoketest-android.yaml index 58226ceb4839de..9d98d0faaca4b7 100644 --- a/.github/workflows/smoketest-android.yaml +++ b/.github/workflows/smoketest-android.yaml @@ -37,7 +37,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-android:97 + image: ghcr.io/project-chip/chip-build-android:98 volumes: - "/:/runner-root-volume" - "/tmp/log_output:/tmp/test_logs" diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index b04edfabac3cfd..7b5286ebefa7c3 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -50,7 +50,7 @@ jobs: runs-on: ubuntu-latest container: - image: ghcr.io/project-chip/chip-build:97 + image: ghcr.io/project-chip/chip-build:98 options: --privileged --sysctl "net.ipv6.conf.all.disable_ipv6=0 net.ipv4.conf.all.forwarding=1 net.ipv6.conf.all.forwarding=1" @@ -461,7 +461,7 @@ jobs: runs-on: ubuntu-latest container: - image: ghcr.io/project-chip/chip-build:97 + image: ghcr.io/project-chip/chip-build:98 options: --privileged --sysctl "net.ipv6.conf.all.disable_ipv6=0 net.ipv4.conf.all.forwarding=0 net.ipv6.conf.all.forwarding=0" diff --git a/.github/workflows/unit_integration_test.yaml b/.github/workflows/unit_integration_test.yaml index 08296b1a00b7ff..8a24ae45728ad8 100644 --- a/.github/workflows/unit_integration_test.yaml +++ b/.github/workflows/unit_integration_test.yaml @@ -40,7 +40,7 @@ jobs: runs-on: ubuntu-latest container: - image: ghcr.io/project-chip/chip-build:97 + image: ghcr.io/project-chip/chip-build:98 volumes: - "/:/runner-root-volume" - "/tmp/log_output:/tmp/test_logs" diff --git a/.github/workflows/zap_regeneration.yaml b/.github/workflows/zap_regeneration.yaml index f861a31d29d0a6..9baec065c4fde7 100644 --- a/.github/workflows/zap_regeneration.yaml +++ b/.github/workflows/zap_regeneration.yaml @@ -30,7 +30,7 @@ jobs: runs-on: ubuntu-20.04 container: - image: ghcr.io/project-chip/chip-build:97 + image: ghcr.io/project-chip/chip-build:98 defaults: run: shell: sh diff --git a/.github/workflows/zap_templates.yaml b/.github/workflows/zap_templates.yaml index 51e4a78c8fb651..51752e3fac8f0d 100644 --- a/.github/workflows/zap_templates.yaml +++ b/.github/workflows/zap_templates.yaml @@ -35,7 +35,7 @@ jobs: runs-on: ubuntu-20.04 container: - image: ghcr.io/project-chip/chip-build:97 + image: ghcr.io/project-chip/chip-build:98 defaults: run: shell: sh diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn index 0310e2a365eb66..1796f02861c18e 100644 --- a/build/config/compiler/BUILD.gn +++ b/build/config/compiler/BUILD.gn @@ -58,6 +58,9 @@ declare_args() { # Enable or disable support for C++ exceptions. enable_exceptions = false + + # Disable this to allow for overriding built-in defines, such as __FILE__. + warn_builtin_macro_redefined = true } if (current_cpu == "arm" || current_cpu == "arm64") { @@ -240,6 +243,9 @@ config("disabled_warnings") { "-Wno-maybe-uninitialized", ] } + if (!warn_builtin_macro_redefined) { + cflags += [ "-Wno-builtin-macro-redefined" ] + } } config("warnings_common") { diff --git a/config/nrfconnect/.nrfconnect-recommended-revision b/config/nrfconnect/.nrfconnect-recommended-revision index 873ca0fa627c90..f367ae3351ba57 100644 --- a/config/nrfconnect/.nrfconnect-recommended-revision +++ b/config/nrfconnect/.nrfconnect-recommended-revision @@ -1 +1 @@ -v2.7.0 +v2.9.0 diff --git a/config/nrfconnect/chip-gn/args.gni b/config/nrfconnect/chip-gn/args.gni index 847a6cff28a2fe..c02f1f99d5c7d8 100644 --- a/config/nrfconnect/chip-gn/args.gni +++ b/config/nrfconnect/chip-gn/args.gni @@ -19,6 +19,7 @@ import("${chip_root}/src/crypto/crypto.gni") chip_device_platform = "nrfconnect" chip_build_tests = false +chip_build_tools = false chip_project_config_include = "" chip_system_project_config_include = "" diff --git a/config/nrfconnect/chip-module/CMakeLists.txt b/config/nrfconnect/chip-module/CMakeLists.txt index e904da06e0db25..f057ee141522dd 100644 --- a/config/nrfconnect/chip-module/CMakeLists.txt +++ b/config/nrfconnect/chip-module/CMakeLists.txt @@ -62,13 +62,20 @@ endif() if (CONFIG_NRF_SECURITY) zephyr_include_directories($) - zephyr_include_directories($) + + if(CONFIG_BUILD_WITH_TFM) + zephyr_include_directories($) + else() + zephyr_include_directories($) + matter_add_flags(-DMBEDTLS_PSA_CRYPTO_USER_CONFIG_FILE=) + endif() + + zephyr_include_directories($) if(TARGET platform_cc3xx) zephyr_include_directories($) endif() matter_add_flags(-DMBEDTLS_CONFIG_FILE=) - matter_add_flags(-DMBEDTLS_PSA_CRYPTO_CONFIG_FILE=) - matter_add_flags(-DMBEDTLS_PSA_CRYPTO_USER_CONFIG_FILE=) + matter_add_flags(-DMBEDTLS_PSA_CRYPTO_CONFIG_FILE=) elseif(CONFIG_MBEDTLS) zephyr_include_directories($) zephyr_compile_definitions($) @@ -78,6 +85,11 @@ if (CONFIG_NRF_802154_RADIO_DRIVER) zephyr_include_directories($) endif() +if (CONFIG_CHIP_LOG_FILE_NAME) + zephyr_compile_definitions(__FILE__=__FILE_NAME__) + zephyr_compile_options(-Wno-builtin-macro-redefined) +endif() + zephyr_get_compile_flags(ZEPHYR_CFLAGS_C C) matter_add_cflags("${ZEPHYR_CFLAGS_C}") zephyr_get_compile_flags(ZEPHYR_CFLAGS_CC CXX) @@ -135,12 +147,12 @@ matter_add_gn_arg_bool ("chip_progress_logging" CONFIG_MATTER_ matter_add_gn_arg_bool ("chip_detail_logging" CONFIG_MATTER_LOG_LEVEL GREATER_EQUAL 4) matter_add_gn_arg_bool ("chip_automation_logging" FALSE) matter_add_gn_arg_bool ("chip_malloc_sys_heap" CONFIG_CHIP_MALLOC_SYS_HEAP) -matter_add_gn_arg_bool ("chip_enable_wifi" CONFIG_WIFI_NRF700X) +matter_add_gn_arg_bool ("chip_enable_wifi" CONFIG_WIFI_NRF70) matter_add_gn_arg_bool ("chip_system_config_provide_statistics" CONFIG_CHIP_STATISTICS) matter_add_gn_arg_bool ("chip_enable_icd_server" CONFIG_CHIP_ENABLE_ICD_SUPPORT) matter_add_gn_arg_bool ("chip_enable_factory_data" CONFIG_CHIP_FACTORY_DATA) matter_add_gn_arg_bool ("chip_enable_read_client" CONFIG_CHIP_ENABLE_READ_CLIENT) -matter_add_gn_arg_bool ("chip_mdns_minimal" CONFIG_WIFI_NRF700X) +matter_add_gn_arg_bool ("chip_mdns_minimal" CONFIG_WIFI_NRF70) matter_add_gn_arg_bool ("chip_mdns_platform" CONFIG_NET_L2_OPENTHREAD) if (CONFIG_CHIP_ENABLE_ICD_SUPPORT) @@ -148,6 +160,7 @@ if (CONFIG_CHIP_ENABLE_ICD_SUPPORT) matter_add_gn_arg_bool ("chip_enable_icd_checkin" CONFIG_CHIP_ICD_CHECK_IN_SUPPORT) matter_add_gn_arg_bool ("chip_enable_icd_user_active_mode_trigger" CONFIG_CHIP_ICD_UAT_SUPPORT) matter_add_gn_arg_bool ("chip_enable_icd_dsls" CONFIG_CHIP_ICD_DSLS_SUPPORT) + matter_add_gn_arg_bool ("chip_icd_report_on_active_mode" CONFIG_CHIP_ICD_REPORT_ON_ACTIVE_MODE) endif() if (CONFIG_CHIP_FACTORY_DATA OR CONFIG_CHIP_FACTORY_DATA_CUSTOM_BACKEND) @@ -160,7 +173,7 @@ if (CONFIG_CHIP_ROTATING_DEVICE_ID) matter_add_gn_arg_bool("chip_enable_additional_data_advertising" TRUE) endif() -if(CONFIG_WIFI_NRF700X) +if(CONFIG_WIFI_NRF70) matter_add_gn_arg_string("chip_mdns" "minimal") elseif (CONFIG_NET_L2_OPENTHREAD) matter_add_gn_arg_string("chip_mdns" "platform") @@ -183,6 +196,10 @@ if (NOT CONFIG_CHIP_DEBUG_SYMBOLS) matter_add_gn_arg_string("symbol_level" "0") endif() +if (CONFIG_CHIP_LOG_FILE_NAME) + matter_add_gn_arg_bool("warn_builtin_macro_redefined" FALSE) +endif() + if (CHIP_COMPILER_LAUNCHER) matter_add_gn_arg_string("pw_command_launcher" ${CHIP_COMPILER_LAUNCHER}) endif() @@ -194,6 +211,13 @@ if (CONFIG_CHIP_PW_RPC) matter_add_gn_arg("pw_build_LINK_DEPS" [\"${PIGWEED_DIR}/pw_assert:impl\",\ \"${PIGWEED_DIR}/pw_log:impl\"]) endif() +# Inform users that they use not-optimized settings backend for the nRF54LX series. +if(CONFIG_SOC_SERIES_NRF54LX AND CONFIG_SETTINGS_NVS) + message(WARNING " + The nRF54L series is not optimized for the NVS settings backend due to RRAM specifications. + Consider using the CONFIG_SETTINGS_ZMS Kconfig option, which is recommended for this type of non-volatile memory.") +endif() + matter_generate_args_tmp_file() # ============================================================================== diff --git a/config/nrfconnect/chip-module/Kconfig b/config/nrfconnect/chip-module/Kconfig index 08f65eabb83c90..155349f946adcb 100644 --- a/config/nrfconnect/chip-module/Kconfig +++ b/config/nrfconnect/chip-module/Kconfig @@ -17,8 +17,12 @@ rsource "../../zephyr/Kconfig" config CHIP - imply NVS_LOOKUP_CACHE - imply NVS_LOOKUP_CACHE_FOR_SETTINGS + imply NVS if !SOC_FLASH_NRF_RRAM + imply NVS_LOOKUP_CACHE if !SOC_FLASH_NRF_RRAM + imply NVS_LOOKUP_CACHE_FOR_SETTINGS if !SOC_FLASH_NRF_RRAM + imply ZMS if SOC_FLASH_NRF_RRAM + imply ZMS_LOOKUP_CACHE if SOC_FLASH_NRF_RRAM + imply ZMS_LOOKUP_CACHE_FOR_SETTINGS if SOC_FLASH_NRF_RRAM if CHIP @@ -91,9 +95,33 @@ config CHIP_DEBUG_SYMBOLS help Enables building the application with debug symbols. +config CHIP_LOG_VERIFY_OR_DIE + bool "Log source code location on VerifyOrDie failure" + help + Enables the feature to log the file name and line number where the Matter + stack calls the VerifyOrDie macro with the condition evaluating to false. + +config CHIP_LOG_FILE_NAME + bool "Log file name instead of entire file path" + default y + help + Enables using a file name instead of an entire file path whenever the + source code location needs to be logged. This is achieved by overriding + the __FILE__ macro with __FILE_NAME__. + This reduces the code size in debug configurations that enable verbose + assertion macros. + config CHIP_MALLOC_SYS_HEAP default y if !ARCH_POSIX +config CHIP_TASK_STACK_SIZE + int "The CHIP (Matter) thread stack size" + default 10240 if (LTO || PSA_CRYPTO_DRIVER_CC3XX) + default 9216 if PSA_CRYPTO_DRIVER_CRACEN + default 6144 + help + Configures the stack size available for the CHIP (Matter) thread. + config CHIP_FACTORY_DATA bool "Factory data provider" select ZCBOR @@ -138,7 +166,7 @@ config CHIP_FACTORY_DATA_ROTATING_DEVICE_UID_MAX_LEN config CHIP_FACTORY_DATA_WRITE_PROTECT bool "Enable Factory Data write protection" select FPROTECT - depends on CHIP_FACTORY_DATA + depends on CHIP_FACTORY_DATA && !SOC_SERIES_NRF54LX default y help Enables the write protection of the Factory Data partition in the flash memory. @@ -239,9 +267,9 @@ config CHIP_DEVICE_GENERATE_ROTATING_DEVICE_UID endif # CHIP_FACTORY_DATA_BUILD # See config/zephyr/Kconfig for full definition -config CHIP_FACTORY_RESET_ERASE_NVS - bool +config CHIP_FACTORY_RESET_ERASE_SETTINGS default y + depends on NVS || ZMS config CHIP_LOG_SIZE_OPTIMIZATION bool "Disable some detailed logs to decrease flash usage" @@ -297,6 +325,42 @@ config CHIP_PERSISTENT_SUBSCRIPTIONS # selecting experimental for this feature since there is an issue with multiple controllers. select EXPERIMENTAL +config CHIP_MAX_FABRICS + int "Maximum number of Matter fabrics" + default 5 + help + The maximum number of Matter fabrics that device can be joined to. + +config CHIP_MAX_ACTIVE_CASE_CLIENTS + int "Maximum number of outgoing CASE sessions" + default CHIP_MAX_FABRICS if CHIP_PERSISTENT_SUBSCRIPTIONS + default 2 + help + The maximum number of outgoing CASE sessions that can be simutaneously handled by the end device. + +config CHIP_MAX_ACTIVE_DEVICES + int "Maximum number of simultaneous connections over CASE" + default CHIP_MAX_FABRICS if CHIP_PERSISTENT_SUBSCRIPTIONS + default 4 + help + The maximum number of devices to which the Server implementers will be able to + concurrently connect over CASE and interact with. + +config CHIP_SUBSCRIPTION_RESUMPTION_MIN_RETRY_INTERVAL + int "Minimum subscription resumption interval in seconds" + default 20 + depends on CHIP_PERSISTENT_SUBSCRIPTIONS + help + The minimum interval in seconds before resuming a subscription that timed out. + +config CHIP_SUBSCRIPTION_RESUMPTION_RETRY_MULTIPLIER + int "The multiplier for subscription resumption retry in seconds" + default 40 + depends on CHIP_PERSISTENT_SUBSCRIPTIONS + help + The multiplier per subscription resumption retry attempt that is multiplied by the index of Fibonacci sequence + and added to CHIP_SUBSCRIPTION_RESUMPTION_MIN_RETRY_INTERVAL to obtain final wait time for next retry. + config CHIP_ENABLE_BDX_LOG_TRANSFER bool "Enable BDX transfer for diagnostic logs" help diff --git a/config/nrfconnect/chip-module/Kconfig.defaults b/config/nrfconnect/chip-module/Kconfig.defaults index e49893cffa1f23..0ba882c0591e12 100644 --- a/config/nrfconnect/chip-module/Kconfig.defaults +++ b/config/nrfconnect/chip-module/Kconfig.defaults @@ -51,12 +51,15 @@ config INIT_STACKS config SYSTEM_WORKQUEUE_STACK_SIZE default 2560 if CHIP_WIFI + default 2048 if CHIP_ICD_LIT_SUPPORT config HEAP_MEM_POOL_SIZE - default 80000 if CHIP_WIFI + default 110720 if CHIP_WIFI + +config HEAP_MEM_POOL_IGNORE_MIN + default y if CHIP_WIFI config CHIP_MALLOC_SYS_HEAP_SIZE - default 30720 if CHIP_WIFI default 8192 if NET_L2_OPENTHREAD # We use sys_heap based allocators, so make sure we don't reserve unused libc heap anyway @@ -64,7 +67,10 @@ config COMMON_LIBC_MALLOC_ARENA_SIZE default -1 config NVS_LOOKUP_CACHE_SIZE - default 512 + default 512 if NVS + +config ZMS_LOOKUP_CACHE_SIZE + default 512 if ZMS # ============================================================================== # Zephyr networking configuration @@ -201,12 +207,12 @@ config CHIP_QSPI_NOR # nRF7002DK uses SPI NOR external flash -if BOARD_NRF7002DK_NRF5340_CPUAPP || BOARD_NRF7002DK_NRF7001_NRF5340_CPUAPP || BOARD_NRF54L15PDK_NRF54L15_CPUAPP +if BOARD_NRF7002DK_NRF5340_CPUAPP || BOARD_NRF7002DK_NRF7001_NRF5340_CPUAPP || BOARD_NRF54L15DK config CHIP_SPI_NOR default y -endif # BOARD_NRF7002DK_NRF5340_CPUAPP || BOARD_NRF7002DK_NRF7001_NRF5340_CPUAPP || BOARD_NRF54L15PDK_NRF54L15_CPUAPP +endif # BOARD_NRF7002DK_NRF5340_CPUAPP || BOARD_NRF7002DK_NRF7001_NRF5340_CPUAPP || BOARD_NRF54L15DK config BOOT_IMAGE_ACCESS_HOOKS default y if SOC_SERIES_NRF53X @@ -226,7 +232,7 @@ config NRF_WIFI_FW_PATCH_DFU # ============================================================================== config NET_L2_OPENTHREAD - default y if !WIFI_NRF700X + default y if !WIFI_NRF70 if NET_L2_OPENTHREAD @@ -235,7 +241,7 @@ config IEEE802154_NRF5_RX_STACK_SIZE default 1024 config OPENTHREAD_THREAD_STACK_SIZE - default 6144 if PSA_CRYPTO_DRIVER_CC3XX && PSA_CRYPTO_DRIVER_OBERON + default 6144 if (PSA_CRYPTO_DRIVER_CC3XX && PSA_CRYPTO_DRIVER_OBERON) || PSA_CRYPTO_DRIVER_CRACEN default 4096 config OPENTHREAD_DEFAULT_TX_POWER @@ -251,35 +257,35 @@ endif # NET_L2_OPENTHREAD if CHIP_WIFI -choice WPA_SUPP_LOG_LEVEL_CHOICE - default WPA_SUPP_LOG_LEVEL_ERR +choice WIFI_NM_WPA_SUPPLICANT_LOG_LEVEL_CHOICE + default WIFI_NM_WPA_SUPPLICANT_LOG_LEVEL_ERR endchoice # it saves us 20kB of FLASH -config WPA_SUPP_NO_DEBUG +config WIFI_NM_WPA_SUPPLICANT_NO_DEBUG default y -config NRF700X_LOG_VERBOSE +config NRF70_LOG_VERBOSE default n -choice WIFI_NRF700X_LOG_LEVEL_CHOICE - default WIFI_NRF700X_LOG_LEVEL_OFF +choice WIFI_NRF70_LOG_LEVEL_CHOICE + default WIFI_NRF70_LOG_LEVEL_OFF endchoice config NRF_WIFI_LOW_POWER default n -config NRF700X_RX_NUM_BUFS +config NRF70_RX_NUM_BUFS default 16 -config NRF700X_MAX_TX_TOKENS +config NRF70_MAX_TX_TOKENS default 10 -config NRF700X_MAX_TX_AGGREGATION +config NRF70_MAX_TX_AGGREGATION default 1 # it saves 25kB of FLASH -config WPA_SUPP_ADVANCED_FEATURES +config WIFI_NM_WPA_SUPPLICANT_ADVANCED_FEATURES default n endif # CHIP_WIFI @@ -298,15 +304,13 @@ choice RNG_GENERATOR_CHOICE default XOSHIRO_RANDOM_GENERATOR if SOC_SERIES_NRF53X endchoice -config OBERON_BACKEND - default y - config MBEDTLS_ENABLE_HEAP - default y + default y if !BUILD_WITH_TFM + default n config MBEDTLS_HEAP_SIZE default 8192 - + # Enable PSA Crypto dependencies for Matter config CHIP_CRYPTO_PSA @@ -315,9 +319,15 @@ config CHIP_CRYPTO_PSA if CHIP_CRYPTO_PSA +config PSA_CRYPTO_DRIVER_OBERON + default y if (SOC_SERIES_NRF52X || SOC_SERIES_NRF53X) + config PSA_CRYPTO_DRIVER_CC3XX default n +config PSA_CRYPTO_DRIVER_CRACEN + default y if SOC_SERIES_NRF54LX + config PSA_WANT_ALG_SHA_224 default n @@ -333,14 +343,13 @@ config PSA_USE_CC3XX_HASH_DRIVER endif # PSA_CRYPTO_DRIVER_CC3XX && PSA_CRYPTO_DRIVER_OBERON -# Spake2+ support -config MBEDTLS_MD_C - default y - endif # CHIP_CRYPTO_PSA if !CHIP_CRYPTO_PSA +config OBERON_BACKEND + default y + config NRF_SECURITY_ADVANCED default y @@ -353,6 +362,9 @@ config MBEDTLS_CTR_DRBG_C config MBEDTLS_CIPHER_MODE_CTR default y +config MBEDTLS_MD_C + default y + config MBEDTLS_SHA1_C default y if CHIP_WIFI @@ -471,6 +483,9 @@ config SHELL_MINIMAL config KERNEL_SHELL default n if !CHIP_MEMORY_PROFILING +config SHELL_WILDCARD + default n + config SENSOR_SHELL default n @@ -498,6 +513,9 @@ config HWINFO_SHELL config OPENTHREAD_SHELL default n if !CHIP_MEMORY_PROFILING +config SHELL_CMD_BUFF_SIZE + default 512 if CHIP_MEMORY_PROFILING + endif # SHELL endif # CHIP diff --git a/config/nrfconnect/chip-module/Kconfig.features b/config/nrfconnect/chip-module/Kconfig.features index a610c37eed70d8..1488cc4e46e5d3 100644 --- a/config/nrfconnect/chip-module/Kconfig.features +++ b/config/nrfconnect/chip-module/Kconfig.features @@ -22,9 +22,9 @@ if CHIP config CHIP_WIFI bool "Enable nrfconnect Wi-Fi support" default y if SHIELD_NRF7002EK || BOARD_NRF7002DK_NRF5340_CPUAPP || SHIELD_NRF7002EB || BOARD_NRF7002DK_NRF7001_NRF5340_CPUAPP - select WIFI_NRF700X + select WIFI_NRF70 select WIFI - select WPA_SUPP + select WIFI_NM_WPA_SUPPLICANT imply NORDIC_SECURITY_BACKEND imply MBEDTLS_ENTROPY_C imply MBEDTLS_PSA_CRYPTO_C @@ -86,6 +86,8 @@ config CHIP_MEMORY_PROFILING select NET_SHELL select NET_BUF_POOL_USAGE select OPENTHREAD_SHELL if !CHIP_WIFI + # Settings + select SETTINGS_SHELL # Zephyr select KERNEL_SHELL help @@ -150,7 +152,7 @@ endif config CHIP_DFU_OVER_BT_SMP bool "Enable DFU over Bluetooth LE SMP feature set" imply CHIP_QSPI_NOR if BOARD_NRF5340DK_NRF5340_CPUAPP || BOARD_NRF52840DK_NRF52840 - imply CHIP_SPI_NOR if BOARD_NRF7002DK_NRF5340_CPUAPP || BOARD_NRF7002DK_NRF7001_NRF5340_CPUAPP || BOARD_NRF54L15PDK_NRF54L15_CPUAPP + imply CHIP_SPI_NOR if BOARD_NRF7002DK_NRF5340_CPUAPP || BOARD_NRF7002DK_NRF7001_NRF5340_CPUAPP || BOARD_NRF54L15DK imply BOOTLOADER_MCUBOOT select MCUMGR select MCUMGR_TRANSPORT_BT @@ -159,6 +161,7 @@ config CHIP_DFU_OVER_BT_SMP select ZCBOR select MCUMGR_GRP_IMG select MCUMGR_GRP_OS + select MCUMGR_GRP_IMG_STATUS_HOOKS # Enable custom SMP request to erase settings partition. select MCUMGR_GRP_ZBASIC select MCUMGR_GRP_ZBASIC_STORAGE_ERASE @@ -170,8 +173,9 @@ config CHIP_DFU_OVER_BT_SMP if CHIP_DFU_OVER_BT_SMP # MCU Manager and SMP configuration -config MCUMGR_TRANSPORT_BT_AUTHEN - default n +choice MCUMGR_TRANSPORT_BT_PERM + default MCUMGR_TRANSPORT_BT_PERM_RW +endchoice config MCUMGR_TRANSPORT_NETBUF_COUNT default 6 diff --git a/config/nxp/chip-module/Kconfig b/config/nxp/chip-module/Kconfig index 152d1161f9f435..022f6d441b031c 100644 --- a/config/nxp/chip-module/Kconfig +++ b/config/nxp/chip-module/Kconfig @@ -197,7 +197,7 @@ config CHIP_DEVICE_GENERATE_ROTATING_DEVICE_UID endif #CHIP_FACTORY_DATA_BUILD # See config/zephyr/Kconfig for full definition -config CHIP_FACTORY_RESET_ERASE_NVS +config CHIP_FACTORY_RESET_ERASE_SETTINGS bool default y diff --git a/config/telink/chip-module/Kconfig b/config/telink/chip-module/Kconfig index 923a2de8c9b3bc..7e20a82c481142 100644 --- a/config/telink/chip-module/Kconfig +++ b/config/telink/chip-module/Kconfig @@ -182,7 +182,7 @@ config CHIP_DEVICE_GENERATE_ROTATING_DEVICE_UID endif #CHIP_FACTORY_DATA_BUILD # See config/zephyr/Kconfig for full definition -config CHIP_FACTORY_RESET_ERASE_NVS +config CHIP_FACTORY_RESET_ERASE_SETTINGS bool default n diff --git a/config/zephyr/Kconfig b/config/zephyr/Kconfig index 7534fbd2e03040..dfe9af71582fe1 100644 --- a/config/zephyr/Kconfig +++ b/config/zephyr/Kconfig @@ -34,7 +34,7 @@ menuconfig CHIP imply HWINFO imply FLASH imply FLASH_MAP - imply NVS + imply NVS if !CHIP_NRF_PLATFORM imply SETTINGS help Enables Matter libraries required for the Matter protocol stack to work. @@ -398,11 +398,11 @@ config CHIP_ICD_ACTIVE_MODE_THRESHOLD config CHIP_ICD_LIT_SUPPORT bool "Intermittently Connected Device Long Idle Time support" - imply CHIP_ICD_CHECK_IN_SUPPORT - imply CHIP_ICD_UAT_SUPPORT + select CHIP_ICD_CHECK_IN_SUPPORT + select CHIP_ICD_UAT_SUPPORT help Enables the Intermittently Connected Device Long Idle Time support in Matter. - It also implies the ICD Check-In and UAT features support that are mandatory for LIT device. + It also selects the ICD Check-In and UAT features support that are mandatory for LIT device. config CHIP_ICD_CHECK_IN_SUPPORT bool "Intermittently Connected Device Check-In protocol support" @@ -417,7 +417,7 @@ config CHIP_ICD_UAT_SUPPORT means (e.g. button press) to trigger an ICD device to enter the active mode and become responsive. config CHIP_ICD_DSLS_SUPPORT - bool "Intermittenttly Connected Device Dynamic SIT LIT support" + bool "Intermittently Connected Device Dynamic SIT LIT support" depends on CHIP_ICD_LIT_SUPPORT help Enables the Dynamic SIT LIT support in Matter. It allows the application to dynamically switch between @@ -431,6 +431,11 @@ config CHIP_ICD_CLIENTS_PER_FABRIC Provides the Intermittently Connected Device number of clients per fabric. It determines the maximum number of clients per fabric that can be registered to receive notification from a device if their subscription is lost. +config CHIP_ICD_REPORT_ON_ACTIVE_MODE + bool "Intermittently Connected Device report on active mode" + help + Enables an ICD to send data report to the subscribers on entering the active mode. + endif # CHIP_ENABLE_ICD_SUPPORT config CHIP_THREAD_SSED @@ -470,11 +475,11 @@ config CHIP_CERTIFiCATION_DECLARATION_OTA_IMAGE_ID endif -config CHIP_FACTORY_RESET_ERASE_NVS +config CHIP_FACTORY_RESET_ERASE_SETTINGS bool "Erase NVS flash pages on factory reset" - depends on SETTINGS_NVS + depends on SETTINGS_NVS || SETTINGS_ZMS help - Erases flash pages occupied by non-volatile storage when a factory reset + Erases non-volatile pages occupied by non-volatile storage when a factory reset is requested, instead of removing Matter-related settings only. Enabling this option provides a more robust factory reset mechanism and allows to regain the original storage performance if any firmware issue has brought diff --git a/config/zephyr/chip-module/Kconfig.features b/config/zephyr/chip-module/Kconfig.features index 1fa6e051a1d2b2..43696be3aa052b 100644 --- a/config/zephyr/chip-module/Kconfig.features +++ b/config/zephyr/chip-module/Kconfig.features @@ -36,9 +36,9 @@ config MCUMGR_TRANSPORT_BT bool default y -config MCUMGR_TRANSPORT_BT_AUTHEN - bool - default n +choice MCUMGR_TRANSPORT_BT_PERM + default MCUMGR_TRANSPORT_BT_PERM_RW +endchoice config MCUMGR_TRANSPORT_NETBUF_COUNT int diff --git a/config/zephyr/ota-image.cmake b/config/zephyr/ota-image.cmake index f254b97ea58b8a..0d0108aa7579d4 100644 --- a/config/zephyr/ota-image.cmake +++ b/config/zephyr/ota-image.cmake @@ -40,7 +40,7 @@ function(chip_ota_image TARGET_NAME) "--version" ${APPVERSION} "--version-str" - ${APP_VERSION_TWEAK_STRING} + ${APP_VERSION_EXTENDED_STRING} "--digest-algorithm" "sha256" ) diff --git a/config/zephyr/ota-image_sysbuild.cmake b/config/zephyr/ota-image_sysbuild.cmake index 2bd78ea6ee5afb..88968ba15ecb80 100644 --- a/config/zephyr/ota-image_sysbuild.cmake +++ b/config/zephyr/ota-image_sysbuild.cmake @@ -45,8 +45,14 @@ function(chip_ota_image TARGET_NAME) set(app_version_patchlevel ${CMAKE_MATCH_1}) string(REGEX MATCH "VERSION_TWEAK = ([0-9]*)" _ ${ver}) set(app_version_tweak ${CMAKE_MATCH_1}) + string(REGEX MATCH "EXTRAVERSION = ([a-z0-9]*)" _ ${ver}) + set(app_version_extra ${CMAKE_MATCH_1}) - set(APP_VERSION_STRING "${app_version_major}.${app_version_minor}.${app_version_patchlevel}+${app_version_tweak}") + if(app_version_extra) + set(APP_VERSION_STRING "${app_version_major}.${app_version_minor}.${app_version_patchlevel}-${app_version_extra}+${app_version_tweak}") + else() + set(APP_VERSION_STRING "${app_version_major}.${app_version_minor}.${app_version_patchlevel}+${app_version_tweak}") + endif() math(EXPR APPVERSION "(${app_version_major} << 24) | (${app_version_minor} << 16) | (${app_version_patchlevel} << 8) | ${app_version_tweak}" OUTPUT_FORMAT HEXADECIMAL) set(OTA_ARGS diff --git a/docs/platforms/nrf/nrfconnect_examples_configuration.md b/docs/platforms/nrf/nrfconnect_examples_configuration.md index 9116f6518cd9d5..ab79e64b9212c1 100644 --- a/docs/platforms/nrf/nrfconnect_examples_configuration.md +++ b/docs/platforms/nrf/nrfconnect_examples_configuration.md @@ -208,9 +208,10 @@ To enable sharing the onboarding payload in an NFC tag, set the By default, the factory reset procedure implemented in the Matter stack removes Matter-related settings only. If your application does not depend on any device-lifelong data stored in the non-volatile storage, set the -`CONFIG_CHIP_FACTORY_RESET_ERASE_NVS` option to fully erase the NVS partition at -the factory reset. This approach is more robust and regains the original NVS -performance in case it has been polluted with unwanted entries. +`CONFIG_CHIP_FACTORY_RESET_ERASE_SETTINGS` option to fully erase the +non-volatile settings partition at the factory reset. This approach is more +robust and regains the original non-volatile performance in case it has been +polluted with unwanted entries. #### Logging diff --git a/examples/chef/nrfconnect/main.cpp b/examples/chef/nrfconnect/main.cpp index ab2fc8cd51fb25..14068cf37eed83 100644 --- a/examples/chef/nrfconnect/main.cpp +++ b/examples/chef/nrfconnect/main.cpp @@ -110,7 +110,7 @@ int main() ChipLogError(AppServer, "ConnectivityMgr().SetThreadDeviceType() failed"); return 1; } -#elif !defined(CONFIG_WIFI_NRF700X) +#elif !defined(CONFIG_WIFI_NRF70) return CHIP_ERROR_INTERNAL; #endif diff --git a/examples/lighting-app/nrfconnect/main/include/CHIPProjectConfig.h b/examples/lighting-app/nrfconnect/main/include/CHIPProjectConfig.h index 4baa186190f638..e655282240b5d6 100644 --- a/examples/lighting-app/nrfconnect/main/include/CHIPProjectConfig.h +++ b/examples/lighting-app/nrfconnect/main/include/CHIPProjectConfig.h @@ -26,3 +26,10 @@ */ #pragma once + +#define CHIP_CONFIG_LOG_MODULE_Zcl_PROGRESS 0 +#define CHIP_CONFIG_LOG_MODULE_InteractionModel_PROGRESS 0 +#define CHIP_CONFIG_LOG_MODULE_InteractionModel_DETAIL 0 +#define CHIP_CONFIG_LOG_MODULE_DataManagement_PROGRESS 0 +#define CHIP_CONFIG_LOG_MODULE_FabricProvisioning_PROGRESS 0 +#define CHIP_CONFIG_LOG_MODULE_SecureChannel_PROGRESS 0 diff --git a/examples/lock-app/nrfconnect/main/include/CHIPProjectConfig.h b/examples/lock-app/nrfconnect/main/include/CHIPProjectConfig.h index 4baa186190f638..e655282240b5d6 100644 --- a/examples/lock-app/nrfconnect/main/include/CHIPProjectConfig.h +++ b/examples/lock-app/nrfconnect/main/include/CHIPProjectConfig.h @@ -26,3 +26,10 @@ */ #pragma once + +#define CHIP_CONFIG_LOG_MODULE_Zcl_PROGRESS 0 +#define CHIP_CONFIG_LOG_MODULE_InteractionModel_PROGRESS 0 +#define CHIP_CONFIG_LOG_MODULE_InteractionModel_DETAIL 0 +#define CHIP_CONFIG_LOG_MODULE_DataManagement_PROGRESS 0 +#define CHIP_CONFIG_LOG_MODULE_FabricProvisioning_PROGRESS 0 +#define CHIP_CONFIG_LOG_MODULE_SecureChannel_PROGRESS 0 diff --git a/examples/platform/nrfconnect/util/OTAUtil.cpp b/examples/platform/nrfconnect/util/OTAUtil.cpp index c642a9001f56ef..a9d37cce3b0bda 100644 --- a/examples/platform/nrfconnect/util/OTAUtil.cpp +++ b/examples/platform/nrfconnect/util/OTAUtil.cpp @@ -45,7 +45,7 @@ chip::DefaultOTARequestor sOTARequestor; OTAImageProcessorImpl & GetOTAImageProcessor() { #if CONFIG_PM_DEVICE && CONFIG_NORDIC_QSPI_NOR - static OTAImageProcessorImpl sOTAImageProcessor(&GetFlashHandler()); + static OTAImageProcessorImpl sOTAImageProcessor(ExternalFlashManager.GetInstance()); #else static OTAImageProcessorImpl sOTAImageProcessor; #endif @@ -93,9 +93,3 @@ void OtaConfirmNewImage() } #endif - -ExternalFlashManager & GetFlashHandler() -{ - static ExternalFlashManager sFlashHandler; - return sFlashHandler; -} diff --git a/examples/platform/nrfconnect/util/PigweedLogger.cpp b/examples/platform/nrfconnect/util/PigweedLogger.cpp index 1fb02366596a5d..c35db300c423c7 100644 --- a/examples/platform/nrfconnect/util/PigweedLogger.cpp +++ b/examples/platform/nrfconnect/util/PigweedLogger.cpp @@ -105,7 +105,7 @@ void processMessage(const struct log_backend * const backend, union log_msg_gene return; } - int ret = k_sem_take(&sLoggerLock, K_FOREVER); + [[maybe_unused]] int ret = k_sem_take(&sLoggerLock, K_FOREVER); assert(ret == 0); log_format_func_t outputFunc = log_format_func_t_get(LOG_OUTPUT_TEXT); diff --git a/examples/pump-app/nrfconnect/main/AppTask.cpp b/examples/pump-app/nrfconnect/main/AppTask.cpp index 45fcc3d5492338..3aa16dba35c96e 100644 --- a/examples/pump-app/nrfconnect/main/AppTask.cpp +++ b/examples/pump-app/nrfconnect/main/AppTask.cpp @@ -138,7 +138,7 @@ CHIP_ERROR AppTask::Init() LOG_ERR("ConnectivityMgr().SetThreadDeviceType() failed"); return err; } -#elif !defined(CONFIG_WIFI_NRF700X) +#elif !defined(CONFIG_WIFI_NRF70) return CHIP_ERROR_INTERNAL; #endif diff --git a/examples/pump-controller-app/nrfconnect/main/AppTask.cpp b/examples/pump-controller-app/nrfconnect/main/AppTask.cpp index 0fe9554ceafe76..e22c3c75e37c12 100644 --- a/examples/pump-controller-app/nrfconnect/main/AppTask.cpp +++ b/examples/pump-controller-app/nrfconnect/main/AppTask.cpp @@ -126,7 +126,7 @@ CHIP_ERROR AppTask::Init() LOG_ERR("ConnectivityMgr().SetThreadDeviceType() failed"); return err; } -#elif !defined(CONFIG_WIFI_NRF700X) +#elif !defined(CONFIG_WIFI_NRF70) return CHIP_ERROR_INTERNAL; #endif diff --git a/examples/window-app/nrfconnect/main/AppTask.cpp b/examples/window-app/nrfconnect/main/AppTask.cpp index 1ec6df1c88ee81..2b6fb6ba667bb6 100644 --- a/examples/window-app/nrfconnect/main/AppTask.cpp +++ b/examples/window-app/nrfconnect/main/AppTask.cpp @@ -143,7 +143,7 @@ CHIP_ERROR AppTask::Init() LOG_ERR("ConnectivityMgr().SetThreadDeviceType() failed"); return err; } -#elif !defined(CONFIG_WIFI_NRF700X) +#elif !defined(CONFIG_WIFI_NRF70) return CHIP_ERROR_INTERNAL; #endif diff --git a/scripts/build/builders/nrf.py b/scripts/build/builders/nrf.py index bd681abedb5cfd..50e9d2be1ffa68 100644 --- a/scripts/build/builders/nrf.py +++ b/scripts/build/builders/nrf.py @@ -220,7 +220,7 @@ def _build(self): # Note: running zephyr/zephyr.elf has the same result except it creates # a flash.bin in the current directory. ctest has more options and does not # pollute the source directory - self._Execute(['ctest', '--build-nocmake', '-V', '--output-on-failure', '--test-dir', self.output_dir], + self._Execute(['ctest', '--build-nocmake', '-V', '--output-on-failure', '--test-dir', os.path.join(self.output_dir, 'nrfconnect')], title='Run Tests ' + self.identifier) def _bundle(self): diff --git a/src/crypto/CHIPCryptoPALPSA.cpp b/src/crypto/CHIPCryptoPALPSA.cpp index eb67240232240a..924759b9353c29 100644 --- a/src/crypto/CHIPCryptoPALPSA.cpp +++ b/src/crypto/CHIPCryptoPALPSA.cpp @@ -788,6 +788,9 @@ CHIP_ERROR P256Keypair::NewCertificateSigningRequest(uint8_t * out_csr, size_t & return CHIP_NO_ERROR; } +// We should compile this SPAKE2P implementation only if the PSA implementation is not in use. +#if !CHIP_CRYPTO_PSA_SPAKE2P + typedef struct Spake2p_Context { mbedtls_ecp_group curve; @@ -1093,5 +1096,7 @@ CHIP_ERROR Spake2p_P256_SHA256_HKDF_HMAC::PointIsValid(void * R) return CHIP_NO_ERROR; } +#endif // !CHIP_CRYPTO_PSA_SPAKE2P + } // namespace Crypto } // namespace chip diff --git a/src/lib/core/CHIPConfig.h b/src/lib/core/CHIPConfig.h index cf15875faebbed..8731bc4b3019a7 100644 --- a/src/lib/core/CHIPConfig.h +++ b/src/lib/core/CHIPConfig.h @@ -1014,6 +1014,17 @@ extern const char CHIP_NON_PRODUCTION_MARKER[]; #define CHIP_CONFIG_VERBOSE_VERIFY_OR_DIE 0 #endif +/** + * @def CHIP_CONFIG_VERBOSE_VERIFY_OR_DIE_NO_COND + * + * @brief If true, VerifyOrDie() built with @c CHIP_CONFIG_VERBOSE_VERIFY_OR_DIE + * generates a short message that includes only the source code location, + * without the condition that fails. + */ +#ifndef CHIP_CONFIG_VERBOSE_VERIFY_OR_DIE_NO_COND +#define CHIP_CONFIG_VERBOSE_VERIFY_OR_DIE_NO_COND 0 +#endif + /** * @def CHIP_CONFIG_CONTROLLER_MAX_ACTIVE_DEVICES * diff --git a/src/lib/support/CodeUtils.h b/src/lib/support/CodeUtils.h index cd07370fa92ec4..d96112d88586e8 100644 --- a/src/lib/support/CodeUtils.h +++ b/src/lib/support/CodeUtils.h @@ -519,7 +519,10 @@ inline void chipDie(void) * @sa #chipDie * */ -#if CHIP_CONFIG_VERBOSE_VERIFY_OR_DIE +#if CHIP_CONFIG_VERBOSE_VERIFY_OR_DIE && CHIP_CONFIG_VERBOSE_VERIFY_OR_DIE_NO_COND +#define VerifyOrDie(aCondition) \ + nlABORT_ACTION(aCondition, ChipLogError(Support, "VerifyOrDie failure at %s:%d", __FILE__, __LINE__)) +#elif CHIP_CONFIG_VERBOSE_VERIFY_OR_DIE #define VerifyOrDie(aCondition) \ nlABORT_ACTION(aCondition, ChipLogError(Support, "VerifyOrDie failure at %s:%d: %s", __FILE__, __LINE__, #aCondition)) #else // CHIP_CONFIG_VERBOSE_VERIFY_OR_DIE diff --git a/src/platform/OpenThread/GenericNetworkCommissioningThreadDriver.h b/src/platform/OpenThread/GenericNetworkCommissioningThreadDriver.h index f570a85fef0211..3cdb8cff668034 100644 --- a/src/platform/OpenThread/GenericNetworkCommissioningThreadDriver.h +++ b/src/platform/OpenThread/GenericNetworkCommissioningThreadDriver.h @@ -87,6 +87,8 @@ class GenericThreadDriver final : public ThreadDriver connectNetworkTimeout = connectTimeoutSec; } + void ClearNetwork() { mStagingNetwork.Clear(); } + // BaseDriver NetworkIterator * GetNetworks() override { return new ThreadNetworkIterator(this); } CHIP_ERROR Init(Internal::BaseDriver::NetworkStatusChangeCallback * statusChangeCallback) override; diff --git a/src/platform/OpenThread/GenericThreadStackManagerImpl_OpenThread.hpp b/src/platform/OpenThread/GenericThreadStackManagerImpl_OpenThread.hpp index f15e22252d6ab9..86aee98c4aaf1b 100644 --- a/src/platform/OpenThread/GenericThreadStackManagerImpl_OpenThread.hpp +++ b/src/platform/OpenThread/GenericThreadStackManagerImpl_OpenThread.hpp @@ -87,6 +87,13 @@ void initNetworkCommissioningThreadDriver() #endif } +void resetGenericThreadDriver() +{ +#ifndef _NO_GENERIC_THREAD_NETWORK_COMMISSIONING_DRIVER_ + sGenericThreadDriver.ClearNetwork(); +#endif +} + #if CHIP_DEVICE_CONFIG_ENABLE_THREAD_DNS_CLIENT CHIP_ERROR ReadDomainNameComponent(const char *& in, char * out, size_t outSize) { @@ -1257,6 +1264,7 @@ void GenericThreadStackManagerImpl_OpenThread::_ErasePersistentInfo() otThreadSetEnabled(mOTInst, false); otIp6SetEnabled(mOTInst, false); otInstanceErasePersistentInfo(mOTInst); + resetGenericThreadDriver(); Impl()->UnlockThreadStack(); } diff --git a/src/platform/Zephyr/ConfigurationManagerImpl.cpp b/src/platform/Zephyr/ConfigurationManagerImpl.cpp index b582f4a3180a97..81c5707cb50fa0 100644 --- a/src/platform/Zephyr/ConfigurationManagerImpl.cpp +++ b/src/platform/Zephyr/ConfigurationManagerImpl.cpp @@ -41,10 +41,14 @@ #include #include -#ifdef CONFIG_CHIP_FACTORY_RESET_ERASE_NVS -#include +#ifdef CONFIG_CHIP_FACTORY_RESET_ERASE_SETTINGS #include -#endif +#if defined(CONFIG_SETTINGS_NVS) +#include +#elif defined(CONFIG_SETTINGS_ZMS) +#include +#endif // CONFIG_SETTINGS_NVS || CONFIG_SETTINGS_ZMS +#endif // CONFIG_CHIP_FACTORY_RESET_ERASE_SETTINGS #ifdef CONFIG_NET_L2_OPENTHREAD #include @@ -198,20 +202,24 @@ void ConfigurationManagerImpl::DoFactoryReset(intptr_t arg) ThreadStackMgr().LockThreadStack(); #endif -#ifdef CONFIG_CHIP_FACTORY_RESET_ERASE_NVS +#ifdef CONFIG_CHIP_FACTORY_RESET_ERASE_SETTINGS void * storage = nullptr; int status = settings_storage_get(&storage); if (status == 0) { +#if defined(CONFIG_SETTINGS_NVS) status = nvs_clear(static_cast(storage)); +#elif defined(CONFIG_SETTINGS_ZMS) + status = zms_clear(static_cast(storage)); +#endif // CONFIG_SETTINGS_NVS || CONFIG_SETTINGS_ZMS } - if (status) { ChipLogError(DeviceLayer, "Factory reset failed: %d", status); } #else + const CHIP_ERROR err = PersistedStorage::KeyValueStoreMgrImpl().DoFactoryReset(); if (err != CHIP_NO_ERROR) @@ -220,7 +228,7 @@ void ConfigurationManagerImpl::DoFactoryReset(intptr_t arg) } ConnectivityMgr().ErasePersistentInfo(); -#endif +#endif // CONFIG_CHIP_FACTORY_RESET_ERASE_SETTINGS PlatformMgr().Shutdown(); } diff --git a/src/platform/nrfconnect/BUILD.gn b/src/platform/nrfconnect/BUILD.gn index 8b02a62892462e..b78ddc12536e92 100644 --- a/src/platform/nrfconnect/BUILD.gn +++ b/src/platform/nrfconnect/BUILD.gn @@ -42,6 +42,8 @@ static_library("nrfconnect") { "ConfigurationManagerImpl.h", "ConnectivityManagerImpl.cpp", "ConnectivityManagerImpl.h", + "DFUSync.cpp", + "DFUSync.h", "DiagnosticDataProviderImplNrf.cpp", "DiagnosticDataProviderImplNrf.h", "ExternalFlashManager.h", diff --git a/src/platform/nrfconnect/CHIPDevicePlatformConfig.h b/src/platform/nrfconnect/CHIPDevicePlatformConfig.h index 486a48cc074af2..ee788b2c90d321 100644 --- a/src/platform/nrfconnect/CHIPDevicePlatformConfig.h +++ b/src/platform/nrfconnect/CHIPDevicePlatformConfig.h @@ -46,7 +46,7 @@ #ifdef CONFIG_CHIP_DEVICE_SOFTWARE_VERSION_STRING #define CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION_STRING CONFIG_CHIP_DEVICE_SOFTWARE_VERSION_STRING #else -#define CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION_STRING APP_VERSION_TWEAK_STRING +#define CHIP_DEVICE_CONFIG_DEVICE_SOFTWARE_VERSION_STRING APP_VERSION_EXTENDED_STRING #endif #define CHIP_DEVICE_CONFIG_TEST_MANUFACTURING_DATE CONFIG_CHIP_DEVICE_MANUFACTURING_DATE @@ -64,8 +64,8 @@ #define CHIP_DEVICE_CONFIG_ENABLE_THREAD 0 #endif -#ifdef CONFIG_WIFI_NRF700X -#define CHIP_DEVICE_CONFIG_ENABLE_WIFI CONFIG_WIFI_NRF700X +#ifdef CONFIG_WIFI_NRF70 +#define CHIP_DEVICE_CONFIG_ENABLE_WIFI CONFIG_WIFI_NRF70 #define CHIP_DEVICE_CONFIG_ENABLE_WIFI_STATION 1 #define CHIP_DEVICE_CONFIG_ENABLE_WIFI_AP 0 #else @@ -180,11 +180,7 @@ #endif // CHIP_DEVICE_CONFIG_CHIP_TASK_PRIORITY #ifndef CHIP_DEVICE_CONFIG_CHIP_TASK_STACK_SIZE -#if defined(CONFIG_LTO) -#define CHIP_DEVICE_CONFIG_CHIP_TASK_STACK_SIZE 10240 -#else -#define CHIP_DEVICE_CONFIG_CHIP_TASK_STACK_SIZE 6144 -#endif // CONFIG_LTO +#define CHIP_DEVICE_CONFIG_CHIP_TASK_STACK_SIZE CONFIG_CHIP_TASK_STACK_SIZE #endif // CHIP_DEVICE_CONFIG_CHIP_TASK_STACK_SIZE #define CHIP_DEVICE_CONFIG_MAX_EVENT_QUEUE_SIZE 64 diff --git a/src/platform/nrfconnect/CHIPPlatformConfig.h b/src/platform/nrfconnect/CHIPPlatformConfig.h index 7355d1a1834acb..af6707f74c1fe7 100644 --- a/src/platform/nrfconnect/CHIPPlatformConfig.h +++ b/src/platform/nrfconnect/CHIPPlatformConfig.h @@ -81,9 +81,25 @@ #define CHIP_CONFIG_BDX_MAX_NUM_TRANSFERS 1 #endif // CHIP_CONFIG_BDX_MAX_NUM_TRANSFERS -#ifndef CHIP_CONFIG_MAX_FABRICS -#define CHIP_CONFIG_MAX_FABRICS 5 -#endif +#ifdef CONFIG_CHIP_MAX_FABRICS +#define CHIP_CONFIG_MAX_FABRICS CONFIG_CHIP_MAX_FABRICS +#endif // CONFIG_CHIP_MAX_FABRICS + +#ifdef CONFIG_CHIP_MAX_ACTIVE_CASE_CLIENTS +#define CHIP_CONFIG_DEVICE_MAX_ACTIVE_CASE_CLIENTS CONFIG_CHIP_MAX_ACTIVE_CASE_CLIENTS +#endif // CONFIG_CHIP_MAX_ACTIVE_CASE_CLIENTS + +#ifdef CONFIG_CHIP_MAX_ACTIVE_DEVICES +#define CHIP_CONFIG_DEVICE_MAX_ACTIVE_DEVICES CONFIG_CHIP_MAX_ACTIVE_DEVICES +#endif // CONFIG_CHIP_MAX_ACTIVE_DEVICES + +#ifdef CONFIG_CHIP_SUBSCRIPTION_RESUMPTION_MIN_RETRY_INTERVAL +#define CHIP_CONFIG_SUBSCRIPTION_TIMEOUT_RESUMPTION_MIN_RETRY_INTERVAL_SECS CONFIG_CHIP_SUBSCRIPTION_RESUMPTION_MIN_RETRY_INTERVAL +#endif // CONFIG_CHIP_SUBSCRIPTION_RESUMPTION_MIN_RETRY_INTERVAL + +#ifdef CONFIG_CHIP_SUBSCRIPTION_RESUMPTION_RETRY_MULTIPLIER +#define CHIP_CONFIG_SUBSCRIPTION_TIMEOUT_RESUMPTION_WAIT_TIME_MULTIPLIER_SECS CONFIG_CHIP_SUBSCRIPTION_RESUMPTION_RETRY_MULTIPLIER +#endif // CONFIG_CHIP_SUBSCRIPTION_RESUMPTION_RETRY_MULTIPLIER #ifdef CONFIG_CHIP_LOG_SIZE_OPTIMIZATION // Disable some of the too detailed log modules to save flash @@ -155,3 +171,10 @@ #define CHIP_CONFIG_ENABLE_BDX_LOG_TRANSFER CONFIG_CHIP_ENABLE_BDX_LOG_TRANSFER #endif // CONFIG_CHIP_ENABLE_BDX_LOG_TRANSFER #endif // CHIP_CONFIG_ENABLE_BDX_LOG_TRANSFER + +#ifdef CONFIG_CHIP_LOG_VERIFY_OR_DIE +#define CHIP_CONFIG_VERBOSE_VERIFY_OR_DIE 1 +#ifndef CHIP_CONFIG_VERBOSE_VERIFY_OR_DIE_NO_COND +#define CHIP_CONFIG_VERBOSE_VERIFY_OR_DIE_NO_COND 1 +#endif // CHIP_CONFIG_VERBOSE_VERIFY_OR_DIE_NO_COND +#endif // CONFIG_CHIP_LOG_VERIFY_OR_DIE diff --git a/src/platform/nrfconnect/ConnectivityManagerImpl.cpp b/src/platform/nrfconnect/ConnectivityManagerImpl.cpp index 971c365561b2bc..f7f4cc5529cffb 100644 --- a/src/platform/nrfconnect/ConnectivityManagerImpl.cpp +++ b/src/platform/nrfconnect/ConnectivityManagerImpl.cpp @@ -43,6 +43,13 @@ #include #endif +#if CHIP_DEVICE_CONFIG_ENABLE_WIFI +// Temporary workaround for lack of the public Zephyr's API for MLDv2. +// Should be removed after https://github.com/zephyrproject-rtos/zephyr/pull/79274 is merged. +extern "C" int net_ipv6_mld_join(struct net_if * iface, const struct in6_addr * addr); +extern "C" int net_ipv6_mld_leave(struct net_if * iface, const struct in6_addr * addr); +#endif + using namespace ::chip::Inet; using namespace ::chip::DeviceLayer::Internal; @@ -73,19 +80,17 @@ CHIP_ERROR JoinLeaveMulticastGroup(net_if * iface, const Inet::IPAddress & addre // The following code should also be valid for other interface types, such as Ethernet, // but they are not officially supported, so for now enable it for Wi-Fi only. const in6_addr in6Addr = InetUtils::ToZephyrAddr(address); + int status; if (operation == UDPEndPointImplSockets::MulticastOperation::kJoin) { - net_if_mcast_addr * maddr = net_if_ipv6_maddr_add(iface, &in6Addr); - - if (maddr && !net_if_ipv6_maddr_is_joined(maddr)) - { - net_if_ipv6_maddr_join(iface, maddr); - } + status = net_ipv6_mld_join(iface, &in6Addr); + VerifyOrReturnError((status == 0 || status == -EALREADY), System::MapErrorZephyr(status)); } else if (operation == UDPEndPointImplSockets::MulticastOperation::kLeave) { - VerifyOrReturnError(net_if_ipv6_maddr_rm(iface, &in6Addr), CHIP_ERROR_INVALID_ADDRESS); + status = net_ipv6_mld_leave(iface, &in6Addr); + VerifyOrReturnError(status == 0, System::MapErrorZephyr(status)); } else { diff --git a/src/platform/nrfconnect/ConnectivityManagerImpl.h b/src/platform/nrfconnect/ConnectivityManagerImpl.h index 8ea6c2d76b6561..e7d9fc4f4ea576 100644 --- a/src/platform/nrfconnect/ConnectivityManagerImpl.h +++ b/src/platform/nrfconnect/ConnectivityManagerImpl.h @@ -81,6 +81,32 @@ class ConnectivityManagerImpl final : public ConnectivityManager, // the implementation methods provided by this class. friend class ConnectivityManager; +public: + // Generic network status checkers + bool IsIPv6NetworkEnabled() + { + return false +#if CHIP_DEVICE_CONFIG_ENABLE_THREAD + || IsThreadEnabled() +#endif +#if CHIP_DEVICE_CONFIG_ENABLE_WIFI + || IsWiFiStationEnabled() +#endif + ; + }; + + bool IsIPv6NetworkProvisioned() + { + return false +#if CHIP_DEVICE_CONFIG_ENABLE_THREAD + || IsThreadProvisioned() +#endif +#if CHIP_DEVICE_CONFIG_ENABLE_WIFI + || IsWiFiStationProvisioned() +#endif + ; + } + private: // ===== Members that implement the ConnectivityManager abstract interface. diff --git a/src/platform/nrfconnect/DFUSync.cpp b/src/platform/nrfconnect/DFUSync.cpp new file mode 100644 index 00000000000000..2d7394a2bc053d --- /dev/null +++ b/src/platform/nrfconnect/DFUSync.cpp @@ -0,0 +1,50 @@ +/* + * + * 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 "DFUSync.h" + +CHIP_ERROR DFUSync::Take(uint32_t & id) +{ + if (mIsTaken) + { + if (id == mOwnerId) + { + return CHIP_NO_ERROR; + } + return CHIP_ERROR_BUSY; + } + + mIsTaken = true; + /* Increment owner id to make sure that every allocation is unique. */ + mOwnerId++; + id = mOwnerId; + + return CHIP_NO_ERROR; +} + +CHIP_ERROR DFUSync::Free(uint32_t id) +{ + /* Prevent free operation from the threads that do not own mutex. */ + if (id != mOwnerId) + { + return CHIP_ERROR_ACCESS_DENIED; + } + + mIsTaken = false; + + return CHIP_NO_ERROR; +} diff --git a/src/platform/nrfconnect/DFUSync.h b/src/platform/nrfconnect/DFUSync.h new file mode 100644 index 00000000000000..283807339d7f8b --- /dev/null +++ b/src/platform/nrfconnect/DFUSync.h @@ -0,0 +1,60 @@ +/* + * + * 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 +#include + +class DFUSync +{ +public: + /** + * @brief Tries to take a mutex allowing to perform the DFU process. + * + * @param id reference to the mutex owner id that is assigned with random id, if the mutex was taken successfully + * + * @return CHIP_NO_ERROR on success, the other error code on failure. + */ + CHIP_ERROR Take(uint32_t & id); + + /** + * @brief Tries to free a mutex allowing to perform the DFU process. + * + * @param id mutex owner id that has to be equal to the id assigned by Take method to prevent free attempts from the other + * threads that do not own the mutex. + * + * @return CHIP_NO_ERROR on success, the other error code on failure. + */ + CHIP_ERROR Free(uint32_t id); + + /** + * @brief Get the DFUSync instance + * + * @return DFUSync object + */ + static inline DFUSync & GetInstance() + { + static DFUSync sInstance; + return sInstance; + } + +private: + /* Mutex to synchronize the DFU operations. */ + std::atomic mIsTaken = false; + uint32_t mOwnerId = 0; +}; diff --git a/src/platform/nrfconnect/DiagnosticDataProviderImplNrf.cpp b/src/platform/nrfconnect/DiagnosticDataProviderImplNrf.cpp index 2c4b3b4ff934f4..12a718e2c5046c 100644 --- a/src/platform/nrfconnect/DiagnosticDataProviderImplNrf.cpp +++ b/src/platform/nrfconnect/DiagnosticDataProviderImplNrf.cpp @@ -23,7 +23,7 @@ #include "DiagnosticDataProviderImplNrf.h" -#ifdef CONFIG_WIFI_NRF700X +#ifdef CONFIG_WIFI_NRF70 #include #endif @@ -41,7 +41,7 @@ DiagnosticDataProviderImplNrf & DiagnosticDataProviderImplNrf::GetDefaultInstanc return sInstance; } -#ifdef CONFIG_WIFI_NRF700X +#ifdef CONFIG_WIFI_NRF70 CHIP_ERROR DiagnosticDataProviderImplNrf::GetWiFiBssId(MutableByteSpan & value) { WiFiManager::WiFiInfo info; diff --git a/src/platform/nrfconnect/DiagnosticDataProviderImplNrf.h b/src/platform/nrfconnect/DiagnosticDataProviderImplNrf.h index 8b45aed77bffa0..de9168a01b9e35 100644 --- a/src/platform/nrfconnect/DiagnosticDataProviderImplNrf.h +++ b/src/platform/nrfconnect/DiagnosticDataProviderImplNrf.h @@ -31,7 +31,7 @@ namespace DeviceLayer { class DiagnosticDataProviderImplNrf : public DiagnosticDataProviderImpl { public: -#ifdef CONFIG_WIFI_NRF700X +#ifdef CONFIG_WIFI_NRF70 CHIP_ERROR GetWiFiBssId(MutableByteSpan & value) override; CHIP_ERROR GetWiFiSecurityType(app::Clusters::WiFiNetworkDiagnostics::SecurityTypeEnum & securityType) override; CHIP_ERROR GetWiFiVersion(app::Clusters::WiFiNetworkDiagnostics::WiFiVersionEnum & wiFiVersion) override; diff --git a/src/platform/nrfconnect/ExternalFlashManager.h b/src/platform/nrfconnect/ExternalFlashManager.h index 6ecfb5075934b8..62bfdd3e05a7e4 100644 --- a/src/platform/nrfconnect/ExternalFlashManager.h +++ b/src/platform/nrfconnect/ExternalFlashManager.h @@ -31,9 +31,19 @@ class ExternalFlashManager SLEEP }; - virtual ~ExternalFlashManager() {} + // Not copyable or movable + ExternalFlashManager(ExternalFlashManager &&) = delete; + ExternalFlashManager & operator=(const ExternalFlashManager &) = delete; + ExternalFlashManager(const ExternalFlashManager &) = delete; + ExternalFlashManager & operator=(ExternalFlashManager &&) = delete; - virtual void DoAction(Action aAction) + static ExternalFlashManager & GetInstance() + { + static ExternalFlashManager sExternalFlashManager; + return sExternalFlashManager; + } + + void DoAction(Action aAction) { #if defined(CONFIG_PM_DEVICE) && defined(CONFIG_NORDIC_QSPI_NOR) // utilize the QSPI driver sleep power mode @@ -45,6 +55,10 @@ class ExternalFlashManager } #endif } + +private: + // Singleton Object + ExternalFlashManager() = default; }; } // namespace DeviceLayer diff --git a/src/platform/nrfconnect/FactoryDataProvider.h b/src/platform/nrfconnect/FactoryDataProvider.h index ef6c8ffa66185f..ea94e2abd07cd6 100644 --- a/src/platform/nrfconnect/FactoryDataProvider.h +++ b/src/platform/nrfconnect/FactoryDataProvider.h @@ -64,7 +64,7 @@ struct InternalFlashFactoryData // 2) it does not exceed the settings partition start address // Note that this block can overlap with app partition but this is not a problem since we do not aim to modify // the application code at runtime anyway. - constexpr size_t FactoryDataBlockBegin() + static constexpr size_t FactoryDataBlockBegin() { // calculate the nearest multiple of CONFIG_FPROTECT_BLOCK_SIZE smaller than FACTORY_DATA_ADDRESS return FACTORY_DATA_ADDRESS & (-CONFIG_FPROTECT_BLOCK_SIZE); @@ -76,11 +76,19 @@ struct InternalFlashFactoryData // and make sure we do not overlap with settings partition constexpr size_t kFactoryDataBlockEnd = (FACTORY_DATA_ADDRESS + FACTORY_DATA_SIZE + CONFIG_FPROTECT_BLOCK_SIZE - 1) & (-CONFIG_FPROTECT_BLOCK_SIZE); - static_assert(kFactoryDataBlockEnd <= PM_SETTINGS_STORAGE_ADDRESS, + + // Only the partition that is protected by fprotect must be aligned to fprotect block size + constexpr size_t kSettingsBlockEnd = PM_SETTINGS_STORAGE_ADDRESS + PM_SETTINGS_STORAGE_SIZE; + + constexpr bool kOverlapsCheck = + (kSettingsBlockEnd <= FactoryDataBlockBegin()) || (kFactoryDataBlockEnd <= PM_SETTINGS_STORAGE_ADDRESS); + + static_assert(kOverlapsCheck, "FPROTECT memory block, which contains factory data" "partition overlaps with the settings partition." "Probably your settings partition size is not a multiple" "of the atomic FPROTECT block size of " TO_STR(CONFIG_FPROTECT_BLOCK_SIZE) "kB"); + return kFactoryDataBlockEnd - FactoryDataBlockBegin(); } #undef TO_STR diff --git a/src/platform/nrfconnect/OTAImageProcessorImpl.cpp b/src/platform/nrfconnect/OTAImageProcessorImpl.cpp index f0baf084b0ead3..1cd3f051d13bb4 100644 --- a/src/platform/nrfconnect/OTAImageProcessorImpl.cpp +++ b/src/platform/nrfconnect/OTAImageProcessorImpl.cpp @@ -31,6 +31,8 @@ #include #endif +#include "DFUSync.h" + #include #include #include @@ -66,9 +68,22 @@ CHIP_ERROR OTAImageProcessorImpl::PrepareDownload() { VerifyOrReturnError(mDownloader != nullptr, CHIP_ERROR_INCORRECT_STATE); + if (DFUSync::GetInstance().Take(mDfuSyncMutexId) != CHIP_NO_ERROR) + { + ChipLogError(SoftwareUpdate, "Cannot start Matter OTA, another DFU in progress."); + return CHIP_ERROR_BUSY; + } + TriggerFlashAction(ExternalFlashManager::Action::WAKE_UP); - return DeviceLayer::SystemLayer().ScheduleLambda([this] { mDownloader->OnPreparedForDownload(PrepareDownloadImpl()); }); + return DeviceLayer::SystemLayer().ScheduleLambda([this] { + CHIP_ERROR err = PrepareDownloadImpl(); + if (err != CHIP_NO_ERROR) + { + DFUSync::GetInstance().Free(mDfuSyncMutexId); + } + mDownloader->OnPreparedForDownload(err); + }); } CHIP_ERROR OTAImageProcessorImpl::PrepareDownloadImpl() @@ -112,6 +127,7 @@ CHIP_ERROR OTAImageProcessorImpl::PrepareDownloadImpl() CHIP_ERROR OTAImageProcessorImpl::Finalize() { PostOTAStateChangeEvent(DeviceLayer::kOtaDownloadComplete); + DFUSync::GetInstance().Free(mDfuSyncMutexId); return System::MapErrorZephyr(dfu_multi_image_done(true)); } @@ -119,6 +135,7 @@ CHIP_ERROR OTAImageProcessorImpl::Abort() { CHIP_ERROR error = System::MapErrorZephyr(dfu_multi_image_done(false)); + DFUSync::GetInstance().Free(mDfuSyncMutexId); TriggerFlashAction(ExternalFlashManager::Action::SLEEP); PostOTAStateChangeEvent(DeviceLayer::kOtaDownloadAborted); diff --git a/src/platform/nrfconnect/OTAImageProcessorImpl.h b/src/platform/nrfconnect/OTAImageProcessorImpl.h index 7a87bc4bef5f55..9209aeaf712936 100644 --- a/src/platform/nrfconnect/OTAImageProcessorImpl.h +++ b/src/platform/nrfconnect/OTAImageProcessorImpl.h @@ -57,6 +57,7 @@ class OTAImageProcessorImpl : public OTAImageProcessorInterface private: bool mImageConfirmed = false; + uint32_t mDfuSyncMutexId; }; } // namespace DeviceLayer diff --git a/src/platform/nrfconnect/SystemPlatformConfig.h b/src/platform/nrfconnect/SystemPlatformConfig.h index de2f59cb7eac27..a82ce0e35db1bb 100644 --- a/src/platform/nrfconnect/SystemPlatformConfig.h +++ b/src/platform/nrfconnect/SystemPlatformConfig.h @@ -52,7 +52,7 @@ struct ChipDeviceEvent; #endif #ifndef CHIP_SYSTEM_CONFIG_PACKETBUFFER_CAPACITY_MAX -#ifdef CONFIG_WIFI_NRF700X +#ifdef CONFIG_WIFI_NRF70 // Minimal mDNS uses Matter packet buffers, so as long as minimal mDNS is used // in Nordic's Wi-Fi solution, the packet buffers must be a bit bigger than what // is required by Matter. @@ -62,7 +62,7 @@ struct ChipDeviceEvent; // unless for large messages that can be sent over BTP or TCP. But those will // likely require a separate buffer pool or employ chained buffers. #define CHIP_SYSTEM_CONFIG_PACKETBUFFER_CAPACITY_MAX 1280 -#endif // CONFIG_WIFI_NRF700X +#endif // CONFIG_WIFI_NRF70 #endif // CHIP_SYSTEM_CONFIG_PACKETBUFFER_CAPACITY_MAX // ========== Platform-specific Configuration Overrides ========= diff --git a/src/platform/nrfconnect/wifi/WiFiManager.cpp b/src/platform/nrfconnect/wifi/WiFiManager.cpp index 6b1effd541be15..117b8063f17860 100644 --- a/src/platform/nrfconnect/wifi/WiFiManager.cpp +++ b/src/platform/nrfconnect/wifi/WiFiManager.cpp @@ -500,6 +500,8 @@ void WiFiManager::ConnectHandler(Platform::UniquePtr data, size_t lengt } delegate->OnAssociationFailureDetected(associationFailureCause, reason); + + ChipLogError(DeviceLayer, "WiFi connection failure. Cause: %d, reason: %d", associationFailureCause, reason); } } else // The connection has been established successfully. diff --git a/src/test_driver/nrfconnect/main/include/CHIPProjectConfig.h b/src/test_driver/nrfconnect/main/include/CHIPProjectConfig.h index 3c3df5b97d593a..0c028f05283a5f 100644 --- a/src/test_driver/nrfconnect/main/include/CHIPProjectConfig.h +++ b/src/test_driver/nrfconnect/main/include/CHIPProjectConfig.h @@ -33,4 +33,7 @@ // Enable unit-test only features #define CONFIG_BUILD_FOR_HOST_UNIT_TEST 1 +// Increase max. lambda event size +#define CHIP_CONFIG_LAMBDA_EVENT_SIZE 32 + #endif // CHIP_PROJECT_CONFIG_H diff --git a/src/test_driver/nrfconnect/prj.conf b/src/test_driver/nrfconnect/prj.conf index 97b7787fe93ac8..4cbd592950d18c 100644 --- a/src/test_driver/nrfconnect/prj.conf +++ b/src/test_driver/nrfconnect/prj.conf @@ -43,8 +43,8 @@ CONFIG_MBEDTLS_HEAP_SIZE=65536 CONFIG_MBEDTLS_SSL_MAX_CONTENT_LEN=768 CONFIG_MBEDTLS_USER_CONFIG_ENABLE=y CONFIG_MBEDTLS_USER_CONFIG_FILE="app_mbedtls_config.h" -CONFIG_MBEDTLS_ZEPHYR_ENTROPY=y -CONFIG_MBEDTLS_ENTROPY_ENABLED=y +CONFIG_MBEDTLS_ENTROPY_POLL_ZEPHYR=y +CONFIG_MBEDTLS_ENTROPY_C=y CONFIG_MBEDTLS_CTR_DRBG_ENABLED=y CONFIG_MBEDTLS_CIPHER_CCM_ENABLED=y CONFIG_MBEDTLS_ECP_DP_SECP256R1_ENABLED=y @@ -58,6 +58,9 @@ CONFIG_MBEDTLS_PSA_CRYPTO_C=y CONFIG_MBEDTLS_MEMORY_DEBUG=y CONFIG_MBEDTLS_DEBUG=y +# PSA Crypto configuration +CONFIG_PSA_WANT_KEY_TYPE_ECC_PUBLIC_KEY=y + # Enable entropy CONFIG_ENTROPY_GENERATOR=y From f40e8bb9358f121f9fb1024993897881010dbc18 Mon Sep 17 00:00:00 2001 From: Andrei Litvin Date: Wed, 29 Jan 2025 10:00:01 -0500 Subject: [PATCH 09/36] Bump cloudbuild image version to 98, to match #37105 and make nrf build (#37299) --- integrations/cloudbuild/chef.yaml | 8 ++++---- integrations/cloudbuild/smoke-test.yaml | 14 +++++++------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/integrations/cloudbuild/chef.yaml b/integrations/cloudbuild/chef.yaml index 13782e062cf1ca..986ee6939be6d5 100644 --- a/integrations/cloudbuild/chef.yaml +++ b/integrations/cloudbuild/chef.yaml @@ -1,5 +1,5 @@ steps: - - name: "ghcr.io/project-chip/chip-build-vscode:97" + - name: "ghcr.io/project-chip/chip-build-vscode:98" entrypoint: "bash" args: - "-c" @@ -7,7 +7,7 @@ steps: git config --global --add safe.directory "*" python scripts/checkout_submodules.py --shallow --recursive --platform esp32 nrfconnect silabs linux android id: Submodules - - name: "ghcr.io/project-chip/chip-build-vscode:97" + - name: "ghcr.io/project-chip/chip-build-vscode:98" # NOTE: silabs boostrap is NOT done with the rest as it requests a conflicting # jinja2 version (asks for 3.1.3 when constraints.txt asks for 3.0.3) env: @@ -23,7 +23,7 @@ steps: - name: pwenv path: /pwenv timeout: 900s - - name: "ghcr.io/project-chip/chip-build-vscode:97" + - name: "ghcr.io/project-chip/chip-build-vscode:98" env: - PW_ENVIRONMENT_ROOT=/pwenv args: @@ -38,7 +38,7 @@ steps: - name: pwenv path: /pwenv - - name: "ghcr.io/project-chip/chip-build-vscode:97" + - name: "ghcr.io/project-chip/chip-build-vscode:98" env: - PW_ENVIRONMENT_ROOT=/pwenv args: diff --git a/integrations/cloudbuild/smoke-test.yaml b/integrations/cloudbuild/smoke-test.yaml index d0bfe029e30180..c3873a9ddb2a90 100644 --- a/integrations/cloudbuild/smoke-test.yaml +++ b/integrations/cloudbuild/smoke-test.yaml @@ -1,5 +1,5 @@ steps: - - name: "ghcr.io/project-chip/chip-build-vscode:97" + - name: "ghcr.io/project-chip/chip-build-vscode:98" entrypoint: "bash" args: - "-c" @@ -7,7 +7,7 @@ steps: git config --global --add safe.directory "*" python scripts/checkout_submodules.py --shallow --recursive --platform esp32 nrfconnect silabs linux android id: Submodules - - name: "ghcr.io/project-chip/chip-build-vscode:97" + - name: "ghcr.io/project-chip/chip-build-vscode:98" # NOTE: silabs boostrap is NOT done with the rest as it requests a conflicting # jinja2 version (asks for 3.1.3 when constraints.txt asks for 3.0.3) env: @@ -24,7 +24,7 @@ steps: path: /pwenv timeout: 900s - - name: "ghcr.io/project-chip/chip-build-vscode:97" + - name: "ghcr.io/project-chip/chip-build-vscode:98" id: ESP32 env: - PW_ENVIRONMENT_ROOT=/pwenv @@ -44,7 +44,7 @@ steps: volumes: - name: pwenv path: /pwenv - - name: "ghcr.io/project-chip/chip-build-vscode:97" + - name: "ghcr.io/project-chip/chip-build-vscode:98" id: NRFConnect env: - PW_ENVIRONMENT_ROOT=/pwenv @@ -65,7 +65,7 @@ steps: - name: pwenv path: /pwenv - - name: "ghcr.io/project-chip/chip-build-vscode:97" + - name: "ghcr.io/project-chip/chip-build-vscode:98" id: EFR32 env: - PW_ENVIRONMENT_ROOT=/pwenv @@ -87,7 +87,7 @@ steps: - name: pwenv path: /pwenv - - name: "ghcr.io/project-chip/chip-build-vscode:97" + - name: "ghcr.io/project-chip/chip-build-vscode:98" id: Linux env: - PW_ENVIRONMENT_ROOT=/pwenv @@ -140,7 +140,7 @@ steps: - name: pwenv path: /pwenv - - name: "ghcr.io/project-chip/chip-build-vscode:97" + - name: "ghcr.io/project-chip/chip-build-vscode:98" id: Android env: - PW_ENVIRONMENT_ROOT=/pwenv From ef193bc0ca3cfc581da3054bb0ef2cd5bd8da1c2 Mon Sep 17 00:00:00 2001 From: C Freeman Date: Wed, 29 Jan 2025 10:31:57 -0500 Subject: [PATCH 10/36] DM XMLs: switch 1.4 to use alchemy (#37201) * Run dos2unix on all DM XML files in 1.4 * Add newlines at end of all DM XML files for 1.4 sed -i -e '$a\' data_model/1.4/device_types/* sed -i -e '$a\' data_model/1.4/clusters/* * DM XMLs: switch 1.4 DM XMLs to alchemy * Generator updates to alchemy * Update 1.4 using alchemy 1.5.0 * Restyled by autopep8 * Add the in-progress defines to match the 1.5 0.7 spec ballot * Fix define processing for alchemy, add tag file * Fix linter, add check for non-existent tag file * Remove a leftover file - this isn't generated by alchemy * Remove file from gni list --------- Co-authored-by: Restyled.io --- data_model/1.4/clusters/ACL-Cluster.xml | 146 +++--- data_model/1.4/clusters/AccountLogin.xml | 116 ++--- .../clusters/AdminCommissioningCluster.xml | 130 ++--- data_model/1.4/clusters/AirQuality.xml | 116 ++--- data_model/1.4/clusters/AlarmBase.xml | 124 ++--- data_model/1.4/clusters/ApplicationBasic.xml | 130 ++--- .../1.4/clusters/ApplicationLauncher.xml | 120 ++--- data_model/1.4/clusters/AudioOutput.xml | 116 ++--- .../1.4/clusters/BallastConfiguration.xml | 146 +++--- .../1.4/clusters/BasicInformationCluster.xml | 166 +++---- data_model/1.4/clusters/Binding-Cluster.xml | 126 ++--- data_model/1.4/clusters/BooleanState.xml | 118 ++--- .../clusters/BooleanStateConfiguration.xml | 126 ++--- data_model/1.4/clusters/Channel.xml | 128 ++--- data_model/1.4/clusters/ColorControl.xml | 206 ++++---- .../clusters/CommissionerControlCluster.xml | 114 ++--- .../1.4/clusters/ConcentrationMeasurement.xml | 157 +++--- .../1.4/clusters/ContentAppObserver.xml | 116 ++--- data_model/1.4/clusters/ContentControl.xml | 157 +++--- data_model/1.4/clusters/ContentLauncher.xml | 137 +++--- .../1.4/clusters/Descriptor-Cluster.xml | 126 ++--- .../1.4/clusters/DeviceEnergyManagement.xml | 152 +++--- .../1.4/clusters/DiagnosticLogsCluster.xml | 116 ++--- .../1.4/clusters/DiagnosticsEthernet.xml | 132 ++--- .../1.4/clusters/DiagnosticsGeneral.xml | 138 +++--- .../1.4/clusters/DiagnosticsSoftware.xml | 114 ++--- data_model/1.4/clusters/DiagnosticsThread.xml | 248 +++++----- data_model/1.4/clusters/DiagnosticsWiFi.xml | 142 +++--- data_model/1.4/clusters/DishwasherAlarm.xml | 128 ++--- data_model/1.4/clusters/DoorLock.xml | 459 +++++++++++------- .../clusters/EcosystemInformationCluster.xml | 124 ++--- .../clusters/ElectricalEnergyMeasurement.xml | 140 +++--- .../clusters/ElectricalPowerMeasurement.xml | 215 ++++---- data_model/1.4/clusters/EnergyEVSE.xml | 172 ++++--- data_model/1.4/clusters/EnergyPreference.xml | 132 ++--- data_model/1.4/clusters/FanControl.xml | 153 +++--- data_model/1.4/clusters/FlowMeasurement.xml | 127 ++--- .../clusters/GeneralCommissioningCluster.xml | 165 +++---- .../clusters/Group-Key-Management-Cluster.xml | 140 +++--- data_model/1.4/clusters/Groups.xml | 118 ++--- data_model/1.4/clusters/ICDManagement.xml | 163 ++++--- data_model/1.4/clusters/Identify.xml | 129 +++-- .../1.4/clusters/IlluminanceMeasurement.xml | 132 ++--- .../clusters/JointFabricDatastoreCluster.xml | 281 ++++++----- .../1.4/clusters/JointFabricPKICluster.xml | 158 +++--- data_model/1.4/clusters/KeypadInput.xml | 230 ++++----- .../Label-Cluster-FixedLabelCluster.xml | 119 +++-- .../clusters/Label-Cluster-LabelCluster.xml | 120 +++-- .../Label-Cluster-UserLabelCluster.xml | 120 +++-- .../1.4/clusters/LaundryDryerControls.xml | 116 ++--- .../1.4/clusters/LaundryWasherControls.xml | 120 ++--- data_model/1.4/clusters/LevelControl.xml | 169 ++++--- .../clusters/LocalizationConfiguration.xml | 118 ++--- .../1.4/clusters/LocalizationTimeFormat.xml | 148 +++--- data_model/1.4/clusters/LocalizationUnit.xml | 116 ++--- data_model/1.4/clusters/LowPower.xml | 116 ++--- data_model/1.4/clusters/MediaInput.xml | 116 ++--- data_model/1.4/clusters/MediaPlayback.xml | 140 +++--- data_model/1.4/clusters/Messages.xml | 181 +++---- .../1.4/clusters/MicrowaveOvenControl.xml | 156 +++--- data_model/1.4/clusters/ModeBase.xml | 150 +++--- data_model/1.4/clusters/ModeSelect.xml | 131 ++--- .../clusters/Mode_DeviceEnergyManagement.xml | 140 +++--- data_model/1.4/clusters/Mode_Dishwasher.xml | 131 ++--- data_model/1.4/clusters/Mode_EVSE.xml | 140 +++--- .../1.4/clusters/Mode_LaundryWasher.xml | 132 ++--- .../1.4/clusters/Mode_MicrowaveOven.xml | 140 +++--- data_model/1.4/clusters/Mode_Oven.xml | 146 +++--- data_model/1.4/clusters/Mode_RVCClean.xml | 139 +++--- data_model/1.4/clusters/Mode_RVCRun.xml | 139 +++--- data_model/1.4/clusters/Mode_Refrigerator.xml | 130 ++--- data_model/1.4/clusters/Mode_WaterHeater.xml | 139 +++--- .../clusters/NetworkCommissioningCluster.xml | 178 +++---- data_model/1.4/clusters/OTAProvider.xml | 120 ++--- data_model/1.4/clusters/OTARequestor.xml | 125 ++--- data_model/1.4/clusters/OccupancySensing.xml | 168 ++++--- data_model/1.4/clusters/OnOff.xml | 132 +++-- .../clusters/OperationalCredentialCluster.xml | 189 ++++---- data_model/1.4/clusters/OperationalState.xml | 138 +++--- .../1.4/clusters/OperationalState_Oven.xml | 116 ++--- .../1.4/clusters/OperationalState_RVC.xml | 140 +++--- .../1.4/clusters/PowerSourceCluster.xml | 156 +++--- .../PowerSourceConfigurationCluster.xml | 116 ++--- data_model/1.4/clusters/PowerTopology.xml | 118 ++--- .../1.4/clusters/PressureMeasurement.xml | 138 +++--- .../clusters/ProxyConfiguration-Cluster.xml | 121 ++--- .../1.4/clusters/ProxyDiscovery-Cluster.xml | 121 ++--- .../1.4/clusters/PumpConfigurationControl.xml | 194 ++++---- data_model/1.4/clusters/RefrigeratorAlarm.xml | 118 ++--- .../1.4/clusters/ResourceMonitoring.xml | 124 ++--- data_model/1.4/clusters/Scenes.xml | 151 +++--- data_model/1.4/clusters/ServiceArea.xml | 157 +++--- data_model/1.4/clusters/SmokeCOAlarm.xml | 136 +++--- data_model/1.4/clusters/Switch.xml | 149 +++--- data_model/1.4/clusters/TargetNavigator.xml | 116 ++--- .../1.4/clusters/TemperatureControl.xml | 125 ++--- .../1.4/clusters/TemperatureMeasurement.xml | 127 ++--- data_model/1.4/clusters/Thermostat.xml | 408 ++++++++-------- .../ThermostatUserInterfaceConfiguration.xml | 114 ++--- .../clusters/ThreadBorderRouterManagement.xml | 126 ++--- .../1.4/clusters/ThreadNetworkDirectory.xml | 134 ++--- data_model/1.4/clusters/TimeSync.xml | 150 +++--- .../1.4/clusters/ValidProxies-Cluster.xml | 122 ++--- .../clusters/ValveConfigurationControl.xml | 142 +++--- data_model/1.4/clusters/WakeOnLAN.xml | 122 ++--- .../1.4/clusters/WaterContentMeasurement.xml | 131 ++--- .../1.4/clusters/WaterHeaterManagement.xml | 138 +++--- .../1.4/clusters/WiFiNetworkManagement.xml | 120 ++--- data_model/1.4/clusters/WindowCovering.xml | 186 +++---- .../bridge-clusters-ActionsCluster.xml | 128 +++-- ...s-BridgedDeviceBasicInformationCluster.xml | 224 +++++---- data_model/1.4/clusters/cluster_ids.json | 16 +- data_model/1.4/device_types/Aggregator.xml | 117 ++--- data_model/1.4/device_types/AirPurifier.xml | 115 ++--- .../1.4/device_types/AirQualitySensor.xml | 115 ++--- .../1.4/device_types/BaseDeviceType.xml | 112 ++--- .../1.4/device_types/BasicVideoPlayer.xml | 114 ++--- .../1.4/device_types/BatteryStorage.xml | 115 ++--- data_model/1.4/device_types/BridgedNode.xml | 117 ++--- .../1.4/device_types/CastingVideoClient.xml | 115 ++--- .../1.4/device_types/CastingVideoPlayer.xml | 118 ++--- .../1.4/device_types/ColorDimmerSwitch.xml | 115 ++--- .../device_types/ColorTemperatureLight.xml | 127 ++--- data_model/1.4/device_types/ContactSensor.xml | 115 ++--- data_model/1.4/device_types/ContentApp.xml | 117 ++--- data_model/1.4/device_types/ControlBridge.xml | 115 ++--- data_model/1.4/device_types/CookSurface.xml | 119 ++--- data_model/1.4/device_types/Cooktop.xml | 115 ++--- .../device_types/DeviceEnergyManagement.xml | 117 ++--- data_model/1.4/device_types/DimmableLight.xml | 125 ++--- .../1.4/device_types/DimmablePlug-InUnit.xml | 125 ++--- data_model/1.4/device_types/DimmerSwitch.xml | 115 ++--- data_model/1.4/device_types/Dishwasher.xml | 117 ++--- data_model/1.4/device_types/DoorLock.xml | 119 ++--- .../1.4/device_types/DoorLockController.xml | 115 ++--- data_model/1.4/device_types/EVSE.xml | 115 ++--- .../1.4/device_types/ElectricalSensor.xml | 118 ++--- .../1.4/device_types/ExtendedColorLight.xml | 129 ++--- data_model/1.4/device_types/ExtractorHood.xml | 115 ++--- data_model/1.4/device_types/Fan.xml | 119 ++--- data_model/1.4/device_types/FlowSensor.xml | 115 ++--- data_model/1.4/device_types/GenericSwitch.xml | 115 ++--- data_model/1.4/device_types/HeatPump.xml | 115 ++--- .../1.4/device_types/HumiditySensor.xml | 115 ++--- .../1.4/device_types/JointFabricAdmin.xml | 114 ++--- data_model/1.4/device_types/LaundryDryer.xml | 117 ++--- data_model/1.4/device_types/LaundryWasher.xml | 117 ++--- data_model/1.4/device_types/LightSensor.xml | 115 ++--- data_model/1.4/device_types/MicrowaveOven.xml | 117 ++--- .../1.4/device_types/ModeSelectDeviceType.xml | 115 ++--- .../MountedDimmableLoadControl.xml | 125 ++--- .../1.4/device_types/MountedOnOffControl.xml | 125 ++--- .../1.4/device_types/NetworkInfraIntro.xml | 58 --- .../1.4/device_types/NetworkInfraManager.xml | 115 ++--- .../1.4/device_types/OccupancySensor.xml | 115 ++--- data_model/1.4/device_types/OnOffLight.xml | 125 ++--- .../1.4/device_types/OnOffLightSwitch.xml | 115 ++--- .../1.4/device_types/OnOffPlug-inUnit.xml | 125 ++--- data_model/1.4/device_types/OnOffSensor.xml | 115 ++--- data_model/1.4/device_types/OtaProvider.xml | 114 ++--- data_model/1.4/device_types/OtaRequestor.xml | 114 ++--- data_model/1.4/device_types/Oven.xml | 115 ++--- data_model/1.4/device_types/PowerSource.xml | 116 ++--- .../1.4/device_types/PressureSensor.xml | 115 ++--- data_model/1.4/device_types/Pump.xml | 115 ++--- .../1.4/device_types/PumpController.xml | 114 ++--- data_model/1.4/device_types/RainSensor.xml | 117 ++--- data_model/1.4/device_types/Refrigerator.xml | 117 ++--- .../1.4/device_types/RoboticVacuumCleaner.xml | 115 ++--- .../1.4/device_types/RoomAirConditioner.xml | 117 ++--- .../1.4/device_types/RootNodeDeviceType.xml | 120 ++--- .../SecondaryNetworkInterface.xml | 114 ++--- data_model/1.4/device_types/SmokeCOAlarm.xml | 115 ++--- data_model/1.4/device_types/SolarPower.xml | 115 ++--- data_model/1.4/device_types/Speaker.xml | 115 ++--- .../TemperatureControlledCabinet.xml | 126 ++--- .../1.4/device_types/TemperatureSensor.xml | 115 ++--- data_model/1.4/device_types/Thermostat.xml | 123 ++--- .../1.4/device_types/ThreadBorderRouter.xml | 115 ++--- .../1.4/device_types/VideoRemoteControl.xml | 115 ++--- .../1.4/device_types/WaterFreezeDetector.xml | 117 ++--- data_model/1.4/device_types/WaterHeater.xml | 115 ++--- .../1.4/device_types/WaterLeakDetector.xml | 117 ++--- data_model/1.4/device_types/WaterValve.xml | 115 ++--- .../1.4/device_types/WindowCovering.xml | 117 ++--- .../device_types/WindowCoveringController.xml | 117 ++--- data_model/1.4/scraper_version | 2 +- scripts/spec_xml/generate_spec_xml.py | 112 ++++- .../data_model_xmls.gni | 1 - 189 files changed, 12799 insertions(+), 12194 deletions(-) delete mode 100644 data_model/1.4/device_types/NetworkInfraIntro.xml diff --git a/data_model/1.4/clusters/ACL-Cluster.xml b/data_model/1.4/clusters/ACL-Cluster.xml index 15eebb425286a4..4f397f5c6acdf4 100644 --- a/data_model/1.4/clusters/ACL-Cluster.xml +++ b/data_model/1.4/clusters/ACL-Cluster.xml @@ -1,59 +1,61 @@ - @@ -61,7 +63,7 @@ Davis, CA 95616, USA - + @@ -83,10 +85,10 @@ Davis, CA 95616, USA - + - + @@ -137,18 +139,22 @@ Davis, CA 95616, USA - + - + + + - + + + @@ -183,7 +189,7 @@ Davis, CA 95616, USA - + @@ -207,7 +213,7 @@ Davis, CA 95616, USA - + @@ -231,32 +237,32 @@ Davis, CA 95616, USA - + - + - + - + - + - + @@ -349,4 +355,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/AccountLogin.xml b/data_model/1.4/clusters/AccountLogin.xml index 6205fb6cb73261..f409545b146c40 100644 --- a/data_model/1.4/clusters/AccountLogin.xml +++ b/data_model/1.4/clusters/AccountLogin.xml @@ -1,61 +1,61 @@ - @@ -115,4 +115,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/AdminCommissioningCluster.xml b/data_model/1.4/clusters/AdminCommissioningCluster.xml index 77a8862b2eedc7..ff34a2133da4f9 100644 --- a/data_model/1.4/clusters/AdminCommissioningCluster.xml +++ b/data_model/1.4/clusters/AdminCommissioningCluster.xml @@ -1,59 +1,61 @@ - @@ -82,7 +84,17 @@ Davis, CA 95616, USA - + + + + + + + + + + + @@ -91,12 +103,12 @@ Davis, CA 95616, USA - + - + @@ -139,4 +151,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/AirQuality.xml b/data_model/1.4/clusters/AirQuality.xml index 69387d451a38c0..b2b3b7ee539d36 100644 --- a/data_model/1.4/clusters/AirQuality.xml +++ b/data_model/1.4/clusters/AirQuality.xml @@ -1,61 +1,61 @@ - @@ -119,4 +119,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/AlarmBase.xml b/data_model/1.4/clusters/AlarmBase.xml index e374dcc382d208..c967ee0f8acc06 100644 --- a/data_model/1.4/clusters/AlarmBase.xml +++ b/data_model/1.4/clusters/AlarmBase.xml @@ -1,63 +1,63 @@ - - + @@ -71,7 +71,7 @@ Davis, CA 95616, USA - + @@ -80,7 +80,7 @@ Davis, CA 95616, USA - + @@ -91,7 +91,7 @@ Davis, CA 95616, USA - + @@ -131,4 +131,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/ApplicationBasic.xml b/data_model/1.4/clusters/ApplicationBasic.xml index 93ffeeb958ad3a..5e5f2ad364746f 100644 --- a/data_model/1.4/clusters/ApplicationBasic.xml +++ b/data_model/1.4/clusters/ApplicationBasic.xml @@ -1,61 +1,61 @@ - @@ -92,29 +92,29 @@ Davis, CA 95616, USA - + - + - + - + - + @@ -125,15 +125,15 @@ Davis, CA 95616, USA - + - + - \ No newline at end of file + diff --git a/data_model/1.4/clusters/ApplicationLauncher.xml b/data_model/1.4/clusters/ApplicationLauncher.xml index 51fcde769007e9..553328ddf7944f 100644 --- a/data_model/1.4/clusters/ApplicationLauncher.xml +++ b/data_model/1.4/clusters/ApplicationLauncher.xml @@ -1,61 +1,61 @@ - @@ -113,14 +113,14 @@ Davis, CA 95616, USA - + - + @@ -169,4 +169,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/AudioOutput.xml b/data_model/1.4/clusters/AudioOutput.xml index 9972a8a87e7a6f..c2ccff03872d26 100644 --- a/data_model/1.4/clusters/AudioOutput.xml +++ b/data_model/1.4/clusters/AudioOutput.xml @@ -1,61 +1,61 @@ - @@ -136,4 +136,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/BallastConfiguration.xml b/data_model/1.4/clusters/BallastConfiguration.xml index 9dbf4e61887d76..3b679b4a7de37b 100644 --- a/data_model/1.4/clusters/BallastConfiguration.xml +++ b/data_model/1.4/clusters/BallastConfiguration.xml @@ -1,61 +1,61 @@ - @@ -100,15 +100,23 @@ Davis, CA 95616, USA - + + - + + + + - + + - + + + + @@ -118,12 +126,12 @@ Davis, CA 95616, USA - + - + @@ -131,24 +139,24 @@ Davis, CA 95616, USA - + - + - + - + @@ -157,8 +165,8 @@ Davis, CA 95616, USA - + - \ No newline at end of file + diff --git a/data_model/1.4/clusters/BasicInformationCluster.xml b/data_model/1.4/clusters/BasicInformationCluster.xml index 483cd643e65bda..7c353543604a71 100644 --- a/data_model/1.4/clusters/BasicInformationCluster.xml +++ b/data_model/1.4/clusters/BasicInformationCluster.xml @@ -1,59 +1,61 @@ - @@ -175,131 +177,131 @@ Davis, CA 95616, USA - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -331,4 +333,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/Binding-Cluster.xml b/data_model/1.4/clusters/Binding-Cluster.xml index 72fc1eb6b3282d..a6856c548db700 100644 --- a/data_model/1.4/clusters/Binding-Cluster.xml +++ b/data_model/1.4/clusters/Binding-Cluster.xml @@ -1,61 +1,61 @@ - @@ -69,13 +69,13 @@ Davis, CA 95616, USA - + - + @@ -83,7 +83,7 @@ Davis, CA 95616, USA - + @@ -94,12 +94,12 @@ Davis, CA 95616, USA - + - + - \ No newline at end of file + diff --git a/data_model/1.4/clusters/BooleanState.xml b/data_model/1.4/clusters/BooleanState.xml index 9754a7af60b57a..399547dae13b40 100644 --- a/data_model/1.4/clusters/BooleanState.xml +++ b/data_model/1.4/clusters/BooleanState.xml @@ -1,61 +1,61 @@ - @@ -68,7 +68,7 @@ Davis, CA 95616, USA - + @@ -81,4 +81,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/BooleanStateConfiguration.xml b/data_model/1.4/clusters/BooleanStateConfiguration.xml index d4ae791ad7649f..7be27159baec96 100644 --- a/data_model/1.4/clusters/BooleanStateConfiguration.xml +++ b/data_model/1.4/clusters/BooleanStateConfiguration.xml @@ -1,61 +1,61 @@ - @@ -106,7 +106,7 @@ Davis, CA 95616, USA - + @@ -114,7 +114,7 @@ Davis, CA 95616, USA - + @@ -122,7 +122,7 @@ Davis, CA 95616, USA - + @@ -145,7 +145,7 @@ Davis, CA 95616, USA - + @@ -155,7 +155,7 @@ Davis, CA 95616, USA - + @@ -217,4 +217,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/Channel.xml b/data_model/1.4/clusters/Channel.xml index 02bfcf3b25c854..22820d49e15f29 100644 --- a/data_model/1.4/clusters/Channel.xml +++ b/data_model/1.4/clusters/Channel.xml @@ -1,61 +1,61 @@ - @@ -281,7 +281,7 @@ Davis, CA 95616, USA - + @@ -307,7 +307,7 @@ Davis, CA 95616, USA - + @@ -315,7 +315,7 @@ Davis, CA 95616, USA - + @@ -390,7 +390,7 @@ Davis, CA 95616, USA - + @@ -427,7 +427,7 @@ Davis, CA 95616, USA - + @@ -452,7 +452,7 @@ Davis, CA 95616, USA - + @@ -462,4 +462,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/ColorControl.xml b/data_model/1.4/clusters/ColorControl.xml index fa14aca0f8b5f4..c0a9f9c175ed5e 100644 --- a/data_model/1.4/clusters/ColorControl.xml +++ b/data_model/1.4/clusters/ColorControl.xml @@ -1,61 +1,61 @@ - @@ -65,10 +65,7 @@ Davis, CA 95616, USA - + @@ -246,7 +243,7 @@ Davis, CA 95616, USA - + @@ -254,7 +251,7 @@ Davis, CA 95616, USA - + @@ -262,38 +259,38 @@ Davis, CA 95616, USA - + - + - + - + - + - + - + - + - + @@ -301,7 +298,7 @@ Davis, CA 95616, USA - + @@ -311,13 +308,13 @@ Davis, CA 95616, USA - + - + @@ -331,7 +328,7 @@ Davis, CA 95616, USA - + @@ -345,7 +342,7 @@ Davis, CA 95616, USA - + @@ -358,7 +355,7 @@ Davis, CA 95616, USA - + @@ -372,7 +369,7 @@ Davis, CA 95616, USA - + @@ -386,7 +383,7 @@ Davis, CA 95616, USA - + @@ -399,7 +396,7 @@ Davis, CA 95616, USA - + @@ -413,7 +410,7 @@ Davis, CA 95616, USA - + @@ -427,7 +424,7 @@ Davis, CA 95616, USA - + @@ -440,7 +437,7 @@ Davis, CA 95616, USA - + @@ -454,7 +451,7 @@ Davis, CA 95616, USA - + @@ -468,7 +465,7 @@ Davis, CA 95616, USA - + @@ -481,7 +478,7 @@ Davis, CA 95616, USA - + @@ -495,7 +492,7 @@ Davis, CA 95616, USA - + @@ -509,7 +506,7 @@ Davis, CA 95616, USA - + @@ -522,7 +519,7 @@ Davis, CA 95616, USA - + @@ -536,7 +533,7 @@ Davis, CA 95616, USA - + @@ -550,7 +547,7 @@ Davis, CA 95616, USA - + @@ -583,7 +580,7 @@ Davis, CA 95616, USA - + @@ -598,7 +595,7 @@ Davis, CA 95616, USA - + @@ -613,24 +610,24 @@ Davis, CA 95616, USA - + - + - + - + @@ -638,7 +635,7 @@ Davis, CA 95616, USA - + @@ -646,7 +643,7 @@ Davis, CA 95616, USA - + @@ -690,11 +687,14 @@ Davis, CA 95616, USA - + + + + - + @@ -1159,4 +1159,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/CommissionerControlCluster.xml b/data_model/1.4/clusters/CommissionerControlCluster.xml index d02e9592ee232d..942925a3481e9e 100644 --- a/data_model/1.4/clusters/CommissionerControlCluster.xml +++ b/data_model/1.4/clusters/CommissionerControlCluster.xml @@ -1,59 +1,61 @@ - @@ -144,4 +146,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/ConcentrationMeasurement.xml b/data_model/1.4/clusters/ConcentrationMeasurement.xml index 68d4b7937bf717..ea6bc5461bd189 100644 --- a/data_model/1.4/clusters/ConcentrationMeasurement.xml +++ b/data_model/1.4/clusters/ConcentrationMeasurement.xml @@ -1,61 +1,63 @@ - - + @@ -76,10 +78,10 @@ Davis, CA 95616, USA - + - + @@ -181,38 +183,46 @@ Davis, CA 95616, USA - + - + + + + - + - + - + + + - + - + + + + - + @@ -220,15 +230,18 @@ Davis, CA 95616, USA - + - + + + + - + @@ -243,14 +256,14 @@ Davis, CA 95616, USA - + - + @@ -260,4 +273,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/ContentAppObserver.xml b/data_model/1.4/clusters/ContentAppObserver.xml index 7ffe0b11d04377..f508049717eac2 100644 --- a/data_model/1.4/clusters/ContentAppObserver.xml +++ b/data_model/1.4/clusters/ContentAppObserver.xml @@ -1,61 +1,61 @@ - @@ -103,4 +103,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/ContentControl.xml b/data_model/1.4/clusters/ContentControl.xml index 6b72a298ebeead..dedc6176c0c100 100644 --- a/data_model/1.4/clusters/ContentControl.xml +++ b/data_model/1.4/clusters/ContentControl.xml @@ -1,59 +1,61 @@ - @@ -92,8 +94,39 @@ Davis, CA 95616, USA - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -149,7 +182,7 @@ Davis, CA 95616, USA - + @@ -172,12 +205,12 @@ Davis, CA 95616, USA - + - + @@ -306,7 +339,7 @@ Davis, CA 95616, USA - + @@ -427,4 +460,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/ContentLauncher.xml b/data_model/1.4/clusters/ContentLauncher.xml index 5470a14ce1da64..83d6015fbb99cb 100644 --- a/data_model/1.4/clusters/ContentLauncher.xml +++ b/data_model/1.4/clusters/ContentLauncher.xml @@ -1,61 +1,61 @@ - @@ -105,15 +105,10 @@ Davis, CA 95616, USA - + - + @@ -268,8 +263,8 @@ Davis, CA 95616, USA - - + + @@ -281,7 +276,7 @@ Davis, CA 95616, USA - + @@ -299,7 +294,7 @@ Davis, CA 95616, USA - + @@ -307,7 +302,7 @@ Davis, CA 95616, USA - + @@ -333,7 +328,7 @@ Davis, CA 95616, USA - + @@ -371,4 +366,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/Descriptor-Cluster.xml b/data_model/1.4/clusters/Descriptor-Cluster.xml index e30b12ea713d6b..2278e89f8933b9 100644 --- a/data_model/1.4/clusters/Descriptor-Cluster.xml +++ b/data_model/1.4/clusters/Descriptor-Cluster.xml @@ -1,61 +1,61 @@ - @@ -84,20 +84,20 @@ Davis, CA 95616, USA - + - + - + @@ -106,13 +106,13 @@ Davis, CA 95616, USA - + - + - \ No newline at end of file + diff --git a/data_model/1.4/clusters/DeviceEnergyManagement.xml b/data_model/1.4/clusters/DeviceEnergyManagement.xml index 3b95a7b8d449dc..89b5cd7fdbd698 100644 --- a/data_model/1.4/clusters/DeviceEnergyManagement.xml +++ b/data_model/1.4/clusters/DeviceEnergyManagement.xml @@ -1,61 +1,61 @@ - @@ -69,12 +69,10 @@ Davis, CA 95616, USA - + - + @@ -92,33 +90,27 @@ Davis, CA 95616, USA - + - + - + - + - + - @@ -137,7 +129,7 @@ Davis, CA 95616, USA - + @@ -475,12 +467,12 @@ Davis, CA 95616, USA - + - + @@ -495,18 +487,20 @@ Davis, CA 95616, USA - + + + - + - + @@ -665,4 +659,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/DiagnosticLogsCluster.xml b/data_model/1.4/clusters/DiagnosticLogsCluster.xml index 9dc7f4c7ef448d..5adee11fd0310c 100644 --- a/data_model/1.4/clusters/DiagnosticLogsCluster.xml +++ b/data_model/1.4/clusters/DiagnosticLogsCluster.xml @@ -1,59 +1,61 @@ - @@ -128,9 +130,9 @@ Davis, CA 95616, USA - + - \ No newline at end of file + diff --git a/data_model/1.4/clusters/DiagnosticsEthernet.xml b/data_model/1.4/clusters/DiagnosticsEthernet.xml index f000669f64156c..20f5032ca9fab1 100644 --- a/data_model/1.4/clusters/DiagnosticsEthernet.xml +++ b/data_model/1.4/clusters/DiagnosticsEthernet.xml @@ -1,59 +1,61 @@ - @@ -110,57 +112,57 @@ Davis, CA 95616, USA - + - + - + - + - + - + - + - + - + @@ -175,4 +177,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/DiagnosticsGeneral.xml b/data_model/1.4/clusters/DiagnosticsGeneral.xml index 1266705ba6d0dc..9f2a48159c7e0b 100644 --- a/data_model/1.4/clusters/DiagnosticsGeneral.xml +++ b/data_model/1.4/clusters/DiagnosticsGeneral.xml @@ -1,59 +1,61 @@ - @@ -75,7 +77,7 @@ Davis, CA 95616, USA - + @@ -196,16 +198,18 @@ Davis, CA 95616, USA - + + + - + - + @@ -223,17 +227,17 @@ Davis, CA 95616, USA - + - + - + @@ -272,7 +276,7 @@ Davis, CA 95616, USA - + @@ -284,10 +288,10 @@ Davis, CA 95616, USA - + - + @@ -299,7 +303,7 @@ Davis, CA 95616, USA - + @@ -370,4 +374,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/DiagnosticsSoftware.xml b/data_model/1.4/clusters/DiagnosticsSoftware.xml index 55e865af040763..77f60ccfb7fcb9 100644 --- a/data_model/1.4/clusters/DiagnosticsSoftware.xml +++ b/data_model/1.4/clusters/DiagnosticsSoftware.xml @@ -1,59 +1,61 @@ - @@ -137,4 +139,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/DiagnosticsThread.xml b/data_model/1.4/clusters/DiagnosticsThread.xml index a712cebc8f1bf0..1987e35201eebc 100644 --- a/data_model/1.4/clusters/DiagnosticsThread.xml +++ b/data_model/1.4/clusters/DiagnosticsThread.xml @@ -1,59 +1,61 @@ - @@ -260,404 +262,404 @@ Davis, CA 95616, USA - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -668,7 +670,7 @@ Davis, CA 95616, USA - + @@ -676,7 +678,7 @@ Davis, CA 95616, USA - + @@ -714,4 +716,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/DiagnosticsWiFi.xml b/data_model/1.4/clusters/DiagnosticsWiFi.xml index 87f7e44dc92b55..493d2876590942 100644 --- a/data_model/1.4/clusters/DiagnosticsWiFi.xml +++ b/data_model/1.4/clusters/DiagnosticsWiFi.xml @@ -1,59 +1,61 @@ - @@ -143,81 +145,81 @@ Davis, CA 95616, USA - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -257,4 +259,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/DishwasherAlarm.xml b/data_model/1.4/clusters/DishwasherAlarm.xml index bdc399f9399486..6aace5dbe2a3b9 100644 --- a/data_model/1.4/clusters/DishwasherAlarm.xml +++ b/data_model/1.4/clusters/DishwasherAlarm.xml @@ -1,61 +1,61 @@ - @@ -70,36 +70,36 @@ Davis, CA 95616, USA - + - + - + - + - + - + - \ No newline at end of file + diff --git a/data_model/1.4/clusters/DoorLock.xml b/data_model/1.4/clusters/DoorLock.xml index 932532c768d423..69078a0bdb228b 100644 --- a/data_model/1.4/clusters/DoorLock.xml +++ b/data_model/1.4/clusters/DoorLock.xml @@ -1,61 +1,61 @@ - @@ -66,8 +66,7 @@ Davis, CA 95616, USA - + @@ -89,7 +88,7 @@ Davis, CA 95616, USA - + @@ -125,10 +124,10 @@ Davis, CA 95616, USA - + - + @@ -215,19 +214,17 @@ Davis, CA 95616, USA - + - + - + @@ -511,8 +508,7 @@ Davis, CA 95616, USA - + @@ -532,7 +528,14 @@ Davis, CA 95616, USA - + + + + + + + + @@ -715,7 +718,7 @@ Davis, CA 95616, USA - + @@ -730,7 +733,7 @@ Davis, CA 95616, USA - + @@ -756,28 +759,28 @@ Davis, CA 95616, USA - + - + - + - + @@ -785,7 +788,7 @@ Davis, CA 95616, USA - + @@ -793,7 +796,7 @@ Davis, CA 95616, USA - + @@ -801,111 +804,111 @@ Davis, CA 95616, USA - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -916,7 +919,7 @@ Davis, CA 95616, USA - + @@ -925,9 +928,9 @@ Davis, CA 95616, USA - + - + @@ -937,9 +940,9 @@ Davis, CA 95616, USA - + - + @@ -953,7 +956,7 @@ Davis, CA 95616, USA - + @@ -961,39 +964,39 @@ Davis, CA 95616, USA - + - + - + - + - + - + - + - + - + @@ -1001,18 +1004,18 @@ Davis, CA 95616, USA - + - + - + - + @@ -1020,21 +1023,21 @@ Davis, CA 95616, USA - + - + - + @@ -1166,7 +1169,10 @@ Davis, CA 95616, USA - + + + + @@ -1244,11 +1250,17 @@ Davis, CA 95616, USA - + + + + - + + + + @@ -1277,11 +1289,17 @@ Davis, CA 95616, USA - + + + + - + + + + @@ -1290,11 +1308,17 @@ Davis, CA 95616, USA - + + + + - + + + + @@ -1327,12 +1351,18 @@ Davis, CA 95616, USA - + + + + - + + + + @@ -1342,11 +1372,17 @@ Davis, CA 95616, USA - + + + + - + + + + @@ -1362,11 +1398,17 @@ Davis, CA 95616, USA - + + + + - + + + + @@ -1375,19 +1417,22 @@ Davis, CA 95616, USA - + + + + - + + + + - - - @@ -1399,12 +1444,18 @@ Davis, CA 95616, USA - + + + + - + + + + @@ -1414,7 +1465,10 @@ Davis, CA 95616, USA - + + + + @@ -1433,7 +1487,10 @@ Davis, CA 95616, USA - + + + + @@ -1442,7 +1499,10 @@ Davis, CA 95616, USA - + + + + @@ -1452,7 +1512,7 @@ Davis, CA 95616, USA - + @@ -1468,7 +1528,10 @@ Davis, CA 95616, USA - + + + + @@ -1610,7 +1673,10 @@ Davis, CA 95616, USA - + + + + @@ -1637,7 +1703,10 @@ Davis, CA 95616, USA - + + + + @@ -1658,12 +1727,12 @@ Davis, CA 95616, USA - - - - - - + + + + + + @@ -1677,7 +1746,10 @@ Davis, CA 95616, USA - + + + + @@ -1686,7 +1758,10 @@ Davis, CA 95616, USA - + + + + @@ -1714,7 +1789,10 @@ Davis, CA 95616, USA - + + + + @@ -1727,7 +1805,10 @@ Davis, CA 95616, USA - + + + + @@ -1737,7 +1818,10 @@ Davis, CA 95616, USA - + + + + @@ -1761,7 +1845,10 @@ Davis, CA 95616, USA - + + + + @@ -1773,12 +1860,12 @@ Davis, CA 95616, USA - - - - - - + + + + + + @@ -1792,7 +1879,10 @@ Davis, CA 95616, USA - + + + + @@ -1819,7 +1909,10 @@ Davis, CA 95616, USA - + + + + @@ -1874,21 +1967,21 @@ Davis, CA 95616, USA - + - + - + - + @@ -1906,7 +1999,7 @@ Davis, CA 95616, USA - + @@ -1915,7 +2008,7 @@ Davis, CA 95616, USA - + @@ -1942,10 +2035,13 @@ Davis, CA 95616, USA - + + + + - + @@ -1975,7 +2071,10 @@ Davis, CA 95616, USA - + + + + @@ -2014,4 +2113,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/EcosystemInformationCluster.xml b/data_model/1.4/clusters/EcosystemInformationCluster.xml index ddebe95679370e..95349f31a6f24d 100644 --- a/data_model/1.4/clusters/EcosystemInformationCluster.xml +++ b/data_model/1.4/clusters/EcosystemInformationCluster.xml @@ -1,61 +1,61 @@ - @@ -84,7 +84,7 @@ Davis, CA 95616, USA - + @@ -109,7 +109,7 @@ Davis, CA 95616, USA - + @@ -124,14 +124,14 @@ Davis, CA 95616, USA - + - + - \ No newline at end of file + diff --git a/data_model/1.4/clusters/ElectricalEnergyMeasurement.xml b/data_model/1.4/clusters/ElectricalEnergyMeasurement.xml index 259f9f512aec02..0dcd875014847d 100644 --- a/data_model/1.4/clusters/ElectricalEnergyMeasurement.xml +++ b/data_model/1.4/clusters/ElectricalEnergyMeasurement.xml @@ -1,61 +1,61 @@ - @@ -67,16 +67,16 @@ Davis, CA 95616, USA - + - + - + - + @@ -109,7 +109,7 @@ Davis, CA 95616, USA - + @@ -122,14 +122,14 @@ Davis, CA 95616, USA - + - + - + @@ -139,7 +139,7 @@ Davis, CA 95616, USA - + @@ -149,7 +149,7 @@ Davis, CA 95616, USA - + @@ -159,7 +159,7 @@ Davis, CA 95616, USA - + @@ -169,7 +169,7 @@ Davis, CA 95616, USA - + @@ -221,4 +221,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/ElectricalPowerMeasurement.xml b/data_model/1.4/clusters/ElectricalPowerMeasurement.xml index 5953d36b9d992e..07bc001884b43b 100644 --- a/data_model/1.4/clusters/ElectricalPowerMeasurement.xml +++ b/data_model/1.4/clusters/ElectricalPowerMeasurement.xml @@ -1,61 +1,61 @@ - @@ -67,10 +67,10 @@ Davis, CA 95616, USA - + - + @@ -108,24 +108,24 @@ Davis, CA 95616, USA - + - + - + - + - + @@ -133,18 +133,18 @@ Davis, CA 95616, USA - + - + - + @@ -152,12 +152,12 @@ Davis, CA 95616, USA - + - + @@ -170,101 +170,107 @@ Davis, CA 95616, USA - + - + - + - + + + + - + - + + + + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -273,7 +279,7 @@ Davis, CA 95616, USA - + @@ -282,7 +288,7 @@ Davis, CA 95616, USA - + @@ -290,7 +296,7 @@ Davis, CA 95616, USA - + @@ -298,20 +304,23 @@ Davis, CA 95616, USA - + - + - + + + + - \ No newline at end of file + diff --git a/data_model/1.4/clusters/EnergyEVSE.xml b/data_model/1.4/clusters/EnergyEVSE.xml index 352ac7e24ad205..63e4207d03752e 100644 --- a/data_model/1.4/clusters/EnergyEVSE.xml +++ b/data_model/1.4/clusters/EnergyEVSE.xml @@ -1,61 +1,61 @@ - @@ -94,8 +94,6 @@ Davis, CA 95616, USA - - @@ -181,7 +179,7 @@ Davis, CA 95616, USA - + @@ -197,12 +195,10 @@ Davis, CA 95616, USA - + - + @@ -254,7 +250,7 @@ Davis, CA 95616, USA - + @@ -262,7 +258,7 @@ Davis, CA 95616, USA - + @@ -271,7 +267,7 @@ Davis, CA 95616, USA - + @@ -284,37 +280,37 @@ Davis, CA 95616, USA - + - + - + - + - + - + @@ -322,33 +318,33 @@ Davis, CA 95616, USA - + - + - + - + - + @@ -356,14 +352,14 @@ Davis, CA 95616, USA - + - + @@ -371,14 +367,14 @@ Davis, CA 95616, USA - + - + @@ -386,7 +382,7 @@ Davis, CA 95616, USA - + @@ -394,23 +390,23 @@ Davis, CA 95616, USA - + - + - + - + @@ -592,4 +588,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/EnergyPreference.xml b/data_model/1.4/clusters/EnergyPreference.xml index 2534ccfc8474c6..6bb1955359d189 100644 --- a/data_model/1.4/clusters/EnergyPreference.xml +++ b/data_model/1.4/clusters/EnergyPreference.xml @@ -1,61 +1,61 @@ - @@ -69,10 +69,10 @@ Davis, CA 95616, USA - + - + @@ -92,9 +92,11 @@ Davis, CA 95616, USA + + @@ -104,7 +106,7 @@ Davis, CA 95616, USA - + @@ -112,7 +114,7 @@ Davis, CA 95616, USA - + @@ -120,7 +122,7 @@ Davis, CA 95616, USA - + @@ -129,7 +131,7 @@ Davis, CA 95616, USA - + @@ -137,10 +139,10 @@ Davis, CA 95616, USA - + - \ No newline at end of file + diff --git a/data_model/1.4/clusters/FanControl.xml b/data_model/1.4/clusters/FanControl.xml index ec05b6f74e069d..7d57f4b17033a9 100644 --- a/data_model/1.4/clusters/FanControl.xml +++ b/data_model/1.4/clusters/FanControl.xml @@ -1,61 +1,61 @@ - @@ -187,24 +187,17 @@ Davis, CA 95616, USA - + - - - - - - - - + - + @@ -215,7 +208,7 @@ Davis, CA 95616, USA - + @@ -223,23 +216,27 @@ Davis, CA 95616, USA - + - + + + - + - + + + - + @@ -247,7 +244,7 @@ Davis, CA 95616, USA - + @@ -255,7 +252,7 @@ Davis, CA 95616, USA - + @@ -263,7 +260,7 @@ Davis, CA 95616, USA - + @@ -271,7 +268,7 @@ Davis, CA 95616, USA - + @@ -295,4 +292,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/FlowMeasurement.xml b/data_model/1.4/clusters/FlowMeasurement.xml index 7ee97f586e708a..f1660fc631c3c9 100644 --- a/data_model/1.4/clusters/FlowMeasurement.xml +++ b/data_model/1.4/clusters/FlowMeasurement.xml @@ -1,61 +1,61 @@ - @@ -70,19 +70,22 @@ Davis, CA 95616, USA - + - + + + + - + - + @@ -92,4 +95,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/GeneralCommissioningCluster.xml b/data_model/1.4/clusters/GeneralCommissioningCluster.xml index 01450f959dfea3..059e5b858e272f 100644 --- a/data_model/1.4/clusters/GeneralCommissioningCluster.xml +++ b/data_model/1.4/clusters/GeneralCommissioningCluster.xml @@ -1,59 +1,61 @@ - @@ -74,29 +76,29 @@ Davis, CA 95616, USA - + - + - + - + - + - + - + @@ -130,27 +132,28 @@ Davis, CA 95616, USA - + - + + - + - + - + @@ -160,7 +163,7 @@ Davis, CA 95616, USA - + @@ -170,7 +173,7 @@ Davis, CA 95616, USA - + @@ -180,7 +183,7 @@ Davis, CA 95616, USA - + @@ -190,7 +193,7 @@ Davis, CA 95616, USA - + @@ -212,12 +215,12 @@ Davis, CA 95616, USA - + - + - + @@ -228,7 +231,7 @@ Davis, CA 95616, USA - + @@ -236,10 +239,10 @@ Davis, CA 95616, USA - + - + @@ -249,10 +252,10 @@ Davis, CA 95616, USA - + - + @@ -278,9 +281,9 @@ Davis, CA 95616, USA - + - \ No newline at end of file + diff --git a/data_model/1.4/clusters/Group-Key-Management-Cluster.xml b/data_model/1.4/clusters/Group-Key-Management-Cluster.xml index 1974047c01acf0..31aa2c14ad618f 100644 --- a/data_model/1.4/clusters/Group-Key-Management-Cluster.xml +++ b/data_model/1.4/clusters/Group-Key-Management-Cluster.xml @@ -1,59 +1,61 @@ - @@ -61,7 +63,7 @@ Davis, CA 95616, USA - + @@ -125,7 +127,7 @@ Davis, CA 95616, USA - + @@ -136,7 +138,7 @@ Davis, CA 95616, USA - + @@ -147,7 +149,7 @@ Davis, CA 95616, USA - + @@ -167,7 +169,7 @@ Davis, CA 95616, USA - + @@ -179,52 +181,52 @@ Davis, CA 95616, USA - + - + - + - + - + - + - + - + @@ -232,4 +234,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/Groups.xml b/data_model/1.4/clusters/Groups.xml index 214e6c18280afa..2829d7598510a4 100644 --- a/data_model/1.4/clusters/Groups.xml +++ b/data_model/1.4/clusters/Groups.xml @@ -1,61 +1,61 @@ - @@ -83,7 +83,7 @@ Davis, CA 95616, USA - + @@ -194,4 +194,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/ICDManagement.xml b/data_model/1.4/clusters/ICDManagement.xml index d9cb7397da7256..a9d6724e7f0058 100644 --- a/data_model/1.4/clusters/ICDManagement.xml +++ b/data_model/1.4/clusters/ICDManagement.xml @@ -1,61 +1,61 @@ - @@ -64,7 +64,7 @@ Davis, CA 95616, USA - + @@ -94,7 +94,14 @@ Davis, CA 95616, USA - + + + + + + + + @@ -159,10 +166,12 @@ Davis, CA 95616, USA + + @@ -170,6 +179,7 @@ Davis, CA 95616, USA + @@ -178,24 +188,24 @@ Davis, CA 95616, USA - + - + - + - + - + @@ -203,14 +213,14 @@ Davis, CA 95616, USA - + - + @@ -218,15 +228,15 @@ Davis, CA 95616, USA - + - + - + @@ -237,11 +247,14 @@ Davis, CA 95616, USA - + - + + + + @@ -258,11 +271,11 @@ Davis, CA 95616, USA - + - + @@ -286,7 +299,7 @@ Davis, CA 95616, USA - + @@ -314,4 +327,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/Identify.xml b/data_model/1.4/clusters/Identify.xml index ddc3e33e9d28d3..557d6e221c9aac 100644 --- a/data_model/1.4/clusters/Identify.xml +++ b/data_model/1.4/clusters/Identify.xml @@ -1,61 +1,61 @@ - @@ -74,18 +74,16 @@ Davis, CA 95616, USA - - - - + + + + @@ -113,8 +111,7 @@ Davis, CA 95616, USA - + @@ -151,4 +148,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/IlluminanceMeasurement.xml b/data_model/1.4/clusters/IlluminanceMeasurement.xml index d7cb9a993d0e4e..e5388deb35c65c 100644 --- a/data_model/1.4/clusters/IlluminanceMeasurement.xml +++ b/data_model/1.4/clusters/IlluminanceMeasurement.xml @@ -1,61 +1,61 @@ - @@ -75,28 +75,28 @@ Davis, CA 95616, USA - - - - + - + + + + - + - + @@ -107,8 +107,8 @@ Davis, CA 95616, USA - + - \ No newline at end of file + diff --git a/data_model/1.4/clusters/JointFabricDatastoreCluster.xml b/data_model/1.4/clusters/JointFabricDatastoreCluster.xml index 4557cfae7fdf41..234985e45ded43 100644 --- a/data_model/1.4/clusters/JointFabricDatastoreCluster.xml +++ b/data_model/1.4/clusters/JointFabricDatastoreCluster.xml @@ -1,66 +1,68 @@ - - + @@ -77,159 +79,145 @@ Davis, CA 95616, USA - + - - - + - - + - - - - - + + + + + + + + + + + + + + - - - - - - + + - - + + - + - - - + - - - - - - - + - + - - - - - + + - - + - - + + - + - - - - - + @@ -237,66 +225,70 @@ Davis, CA 95616, USA - + - + - + - + - - + + + - - + + + - - + + + - - + + + - - + + - + - + - + - + - + - + @@ -318,11 +310,11 @@ Davis, CA 95616, USA - + - + @@ -348,26 +340,25 @@ Davis, CA 95616, USA - + - - + - + - + - + @@ -385,14 +376,14 @@ Davis, CA 95616, USA - + - + @@ -403,14 +394,14 @@ Davis, CA 95616, USA - + - + @@ -421,14 +412,14 @@ Davis, CA 95616, USA - + - + @@ -442,7 +433,7 @@ Davis, CA 95616, USA - + @@ -455,7 +446,7 @@ Davis, CA 95616, USA - + @@ -468,7 +459,7 @@ Davis, CA 95616, USA - + @@ -477,11 +468,11 @@ Davis, CA 95616, USA - + - + @@ -494,17 +485,17 @@ Davis, CA 95616, USA - + - + - + @@ -515,4 +506,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/JointFabricPKICluster.xml b/data_model/1.4/clusters/JointFabricPKICluster.xml index 41c9823626b528..15917a0c16ef9a 100644 --- a/data_model/1.4/clusters/JointFabricPKICluster.xml +++ b/data_model/1.4/clusters/JointFabricPKICluster.xml @@ -1,59 +1,61 @@ - @@ -66,76 +68,76 @@ Davis, CA 95616, USA - - + + - + - + - + - + - + - + - + - - + + - + - + - + - + - + - + - + - + - + - + - + - \ No newline at end of file + diff --git a/data_model/1.4/clusters/KeypadInput.xml b/data_model/1.4/clusters/KeypadInput.xml index efeb92ba28fb73..db05639b0a5bfe 100644 --- a/data_model/1.4/clusters/KeypadInput.xml +++ b/data_model/1.4/clusters/KeypadInput.xml @@ -1,61 +1,61 @@ - @@ -81,100 +81,58 @@ Davis, CA 95616, USA - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -207,6 +165,18 @@ Davis, CA 95616, USA + + + + + + + + + + + + @@ -264,6 +234,24 @@ Davis, CA 95616, USA + + + + + + + + + + + + + + + + + + @@ -318,6 +306,18 @@ Davis, CA 95616, USA + + + + + + + + + + + + @@ -344,7 +344,7 @@ Davis, CA 95616, USA - + @@ -364,4 +364,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/Label-Cluster-FixedLabelCluster.xml b/data_model/1.4/clusters/Label-Cluster-FixedLabelCluster.xml index a172d1e281eff5..9e21318ad6e13a 100644 --- a/data_model/1.4/clusters/Label-Cluster-FixedLabelCluster.xml +++ b/data_model/1.4/clusters/Label-Cluster-FixedLabelCluster.xml @@ -1,61 +1,61 @@ - @@ -65,13 +65,12 @@ Davis, CA 95616, USA - - + - \ No newline at end of file + diff --git a/data_model/1.4/clusters/Label-Cluster-LabelCluster.xml b/data_model/1.4/clusters/Label-Cluster-LabelCluster.xml index 2f8a371f74042c..3a04b25aa16065 100644 --- a/data_model/1.4/clusters/Label-Cluster-LabelCluster.xml +++ b/data_model/1.4/clusters/Label-Cluster-LabelCluster.xml @@ -1,63 +1,63 @@ - - + @@ -80,9 +80,7 @@ Davis, CA 95616, USA - - - \ No newline at end of file + diff --git a/data_model/1.4/clusters/Label-Cluster-UserLabelCluster.xml b/data_model/1.4/clusters/Label-Cluster-UserLabelCluster.xml index 466550f12520f1..10abf4c48a24a5 100644 --- a/data_model/1.4/clusters/Label-Cluster-UserLabelCluster.xml +++ b/data_model/1.4/clusters/Label-Cluster-UserLabelCluster.xml @@ -1,61 +1,61 @@ - @@ -65,14 +65,12 @@ Davis, CA 95616, USA - - + - - \ No newline at end of file + diff --git a/data_model/1.4/clusters/LaundryDryerControls.xml b/data_model/1.4/clusters/LaundryDryerControls.xml index 85f7871b267be5..802a1339909430 100644 --- a/data_model/1.4/clusters/LaundryDryerControls.xml +++ b/data_model/1.4/clusters/LaundryDryerControls.xml @@ -1,59 +1,61 @@ - @@ -88,9 +90,9 @@ Davis, CA 95616, USA - + - \ No newline at end of file + diff --git a/data_model/1.4/clusters/LaundryWasherControls.xml b/data_model/1.4/clusters/LaundryWasherControls.xml index 046ecc3c51d697..d79ac13361b8a5 100644 --- a/data_model/1.4/clusters/LaundryWasherControls.xml +++ b/data_model/1.4/clusters/LaundryWasherControls.xml @@ -1,59 +1,61 @@ - @@ -66,10 +68,10 @@ Davis, CA 95616, USA - + - + @@ -109,7 +111,7 @@ Davis, CA 95616, USA - + @@ -131,4 +133,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/LevelControl.xml b/data_model/1.4/clusters/LevelControl.xml index 1a034d5802bb73..872eeb54ce9361 100644 --- a/data_model/1.4/clusters/LevelControl.xml +++ b/data_model/1.4/clusters/LevelControl.xml @@ -1,86 +1,83 @@ - - + - + - + - + - + @@ -120,13 +117,16 @@ Davis, CA 95616, USA - + - + + + + - + @@ -150,15 +150,21 @@ Davis, CA 95616, USA - + + + + - + - + + + + @@ -171,7 +177,9 @@ Davis, CA 95616, USA - + + + @@ -184,29 +192,32 @@ Davis, CA 95616, USA - + - + + + + - + - + - + - + @@ -315,4 +326,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/LocalizationConfiguration.xml b/data_model/1.4/clusters/LocalizationConfiguration.xml index 6bc3abd50600ab..81e66f57c487cb 100644 --- a/data_model/1.4/clusters/LocalizationConfiguration.xml +++ b/data_model/1.4/clusters/LocalizationConfiguration.xml @@ -1,59 +1,61 @@ - @@ -66,7 +68,7 @@ Davis, CA 95616, USA - + @@ -75,9 +77,9 @@ Davis, CA 95616, USA - + - \ No newline at end of file + diff --git a/data_model/1.4/clusters/LocalizationTimeFormat.xml b/data_model/1.4/clusters/LocalizationTimeFormat.xml index 2de3724879701d..4ac06048841acd 100644 --- a/data_model/1.4/clusters/LocalizationTimeFormat.xml +++ b/data_model/1.4/clusters/LocalizationTimeFormat.xml @@ -1,59 +1,61 @@ - @@ -71,43 +73,43 @@ Davis, CA 95616, USA - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -125,24 +127,24 @@ Davis, CA 95616, USA - + - + - + - + - \ No newline at end of file + diff --git a/data_model/1.4/clusters/LocalizationUnit.xml b/data_model/1.4/clusters/LocalizationUnit.xml index e08ce0e8810f26..b68d951c6fa993 100644 --- a/data_model/1.4/clusters/LocalizationUnit.xml +++ b/data_model/1.4/clusters/LocalizationUnit.xml @@ -1,59 +1,61 @@ - @@ -84,10 +86,10 @@ Davis, CA 95616, USA - + - \ No newline at end of file + diff --git a/data_model/1.4/clusters/LowPower.xml b/data_model/1.4/clusters/LowPower.xml index 2e91a02c16a4b3..f4a143080e3977 100644 --- a/data_model/1.4/clusters/LowPower.xml +++ b/data_model/1.4/clusters/LowPower.xml @@ -1,61 +1,61 @@ - @@ -71,4 +71,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/MediaInput.xml b/data_model/1.4/clusters/MediaInput.xml index c01567f6e1ae3e..cc909cf9111748 100644 --- a/data_model/1.4/clusters/MediaInput.xml +++ b/data_model/1.4/clusters/MediaInput.xml @@ -1,61 +1,61 @@ - @@ -165,4 +165,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/MediaPlayback.xml b/data_model/1.4/clusters/MediaPlayback.xml index e37d5944aeb366..91aac58ef4f3f6 100644 --- a/data_model/1.4/clusters/MediaPlayback.xml +++ b/data_model/1.4/clusters/MediaPlayback.xml @@ -1,61 +1,61 @@ - @@ -161,15 +161,13 @@ Davis, CA 95616, USA - + - + @@ -223,7 +221,7 @@ Davis, CA 95616, USA - + @@ -231,7 +229,7 @@ Davis, CA 95616, USA - + @@ -239,7 +237,7 @@ Davis, CA 95616, USA - + @@ -254,7 +252,7 @@ Davis, CA 95616, USA - + @@ -262,7 +260,7 @@ Davis, CA 95616, USA - + @@ -270,7 +268,7 @@ Davis, CA 95616, USA - + @@ -279,7 +277,7 @@ Davis, CA 95616, USA - + @@ -287,7 +285,7 @@ Davis, CA 95616, USA - + @@ -296,7 +294,7 @@ Davis, CA 95616, USA - + @@ -472,4 +470,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/Messages.xml b/data_model/1.4/clusters/Messages.xml index d2dbd28ba87f81..b8910f555d6333 100644 --- a/data_model/1.4/clusters/Messages.xml +++ b/data_model/1.4/clusters/Messages.xml @@ -1,100 +1,61 @@ - @@ -125,7 +86,6 @@ Davis, CA 95616, USA - @@ -195,9 +155,10 @@ Davis, CA 95616, USA - + + @@ -241,7 +202,7 @@ Davis, CA 95616, USA - + @@ -251,8 +212,9 @@ Davis, CA 95616, USA - + + @@ -284,7 +246,7 @@ Davis, CA 95616, USA - + @@ -292,24 +254,27 @@ Davis, CA 95616, USA - + - + + - + - + + - + - + + @@ -330,4 +295,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/MicrowaveOvenControl.xml b/data_model/1.4/clusters/MicrowaveOvenControl.xml index 2169f7b1437945..aa0e1f15cfb1f7 100644 --- a/data_model/1.4/clusters/MicrowaveOvenControl.xml +++ b/data_model/1.4/clusters/MicrowaveOvenControl.xml @@ -1,61 +1,61 @@ - @@ -85,11 +85,14 @@ Davis, CA 95616, USA - + + + + - + @@ -102,7 +105,7 @@ Davis, CA 95616, USA - + @@ -110,7 +113,7 @@ Davis, CA 95616, USA - + @@ -118,7 +121,7 @@ Davis, CA 95616, USA - + @@ -127,7 +130,7 @@ Davis, CA 95616, USA - + @@ -148,7 +151,7 @@ Davis, CA 95616, USA - + @@ -157,21 +160,27 @@ Davis, CA 95616, USA - + - - + + + + + - + - + + + + - + @@ -185,8 +194,11 @@ Davis, CA 95616, USA - + + + + - \ No newline at end of file + diff --git a/data_model/1.4/clusters/ModeBase.xml b/data_model/1.4/clusters/ModeBase.xml index c874eee69d3eb6..a9eb66e762c833 100644 --- a/data_model/1.4/clusters/ModeBase.xml +++ b/data_model/1.4/clusters/ModeBase.xml @@ -1,65 +1,66 @@ - - + - + @@ -73,14 +74,17 @@ Davis, CA 95616, USA + + + @@ -99,25 +103,25 @@ Davis, CA 95616, USA - + - + - + - + @@ -136,23 +140,21 @@ Davis, CA 95616, USA - - - - - - - - - - - + + + + + + + + + - \ No newline at end of file + diff --git a/data_model/1.4/clusters/ModeSelect.xml b/data_model/1.4/clusters/ModeSelect.xml index 6e6f062182e503..56d0a43a4ae8b2 100644 --- a/data_model/1.4/clusters/ModeSelect.xml +++ b/data_model/1.4/clusters/ModeSelect.xml @@ -1,59 +1,61 @@ - @@ -72,24 +74,29 @@ Davis, CA 95616, USA + + + + + @@ -97,38 +104,38 @@ Davis, CA 95616, USA - + - + - + - + - + - + @@ -145,4 +152,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/Mode_DeviceEnergyManagement.xml b/data_model/1.4/clusters/Mode_DeviceEnergyManagement.xml index 9fca7f31ca00e7..742a136355c652 100644 --- a/data_model/1.4/clusters/Mode_DeviceEnergyManagement.xml +++ b/data_model/1.4/clusters/Mode_DeviceEnergyManagement.xml @@ -1,61 +1,61 @@ - @@ -72,6 +72,22 @@ Davis, CA 95616, USA + + + + + + + + + + + + + + + + @@ -86,12 +102,8 @@ Davis, CA 95616, USA - - - - - - + + @@ -99,4 +111,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/Mode_Dishwasher.xml b/data_model/1.4/clusters/Mode_Dishwasher.xml index ca14d02672dd2c..ebc10d0d54e419 100644 --- a/data_model/1.4/clusters/Mode_Dishwasher.xml +++ b/data_model/1.4/clusters/Mode_Dishwasher.xml @@ -1,61 +1,61 @@ - @@ -73,6 +73,21 @@ Davis, CA 95616, USA + + + + + + + + + + + + + + + @@ -100,4 +115,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/Mode_EVSE.xml b/data_model/1.4/clusters/Mode_EVSE.xml index 863a2b7d6446c1..b776028605dd11 100644 --- a/data_model/1.4/clusters/Mode_EVSE.xml +++ b/data_model/1.4/clusters/Mode_EVSE.xml @@ -1,61 +1,61 @@ - @@ -72,6 +72,22 @@ Davis, CA 95616, USA + + + + + + + + + + + + + + + + @@ -86,12 +102,8 @@ Davis, CA 95616, USA - - - - - - + + @@ -99,4 +111,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/Mode_LaundryWasher.xml b/data_model/1.4/clusters/Mode_LaundryWasher.xml index a13253304d2ef3..9a8b64b75e7b8d 100644 --- a/data_model/1.4/clusters/Mode_LaundryWasher.xml +++ b/data_model/1.4/clusters/Mode_LaundryWasher.xml @@ -1,61 +1,61 @@ - @@ -73,6 +73,22 @@ Davis, CA 95616, USA + + + + + + + + + + + + + + + + @@ -100,4 +116,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/Mode_MicrowaveOven.xml b/data_model/1.4/clusters/Mode_MicrowaveOven.xml index 371b294849143d..2b778183d0b7c2 100644 --- a/data_model/1.4/clusters/Mode_MicrowaveOven.xml +++ b/data_model/1.4/clusters/Mode_MicrowaveOven.xml @@ -1,61 +1,61 @@ - @@ -71,13 +71,25 @@ Davis, CA 95616, USA + + + + + + + + + + + + + + + + - - - - - - + + @@ -93,4 +105,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/Mode_Oven.xml b/data_model/1.4/clusters/Mode_Oven.xml index 071f70d277a0e6..62e50c896f1e33 100644 --- a/data_model/1.4/clusters/Mode_Oven.xml +++ b/data_model/1.4/clusters/Mode_Oven.xml @@ -1,61 +1,61 @@ - @@ -72,6 +72,28 @@ Davis, CA 95616, USA + + + + + + + + + + + + + + + + + + + + + + @@ -86,12 +108,8 @@ Davis, CA 95616, USA - - - - - - + + @@ -99,4 +117,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/Mode_RVCClean.xml b/data_model/1.4/clusters/Mode_RVCClean.xml index b73a4a5361d81f..6d78cbe3658ce0 100644 --- a/data_model/1.4/clusters/Mode_RVCClean.xml +++ b/data_model/1.4/clusters/Mode_RVCClean.xml @@ -1,61 +1,61 @@ - @@ -73,6 +73,21 @@ Davis, CA 95616, USA + + + + + + + + + + + + + + + @@ -87,12 +102,8 @@ Davis, CA 95616, USA - - - - - - + + @@ -100,4 +111,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/Mode_RVCRun.xml b/data_model/1.4/clusters/Mode_RVCRun.xml index c65bc3850473bd..e5b0c0d7c94f93 100644 --- a/data_model/1.4/clusters/Mode_RVCRun.xml +++ b/data_model/1.4/clusters/Mode_RVCRun.xml @@ -1,61 +1,61 @@ - @@ -73,6 +73,21 @@ Davis, CA 95616, USA + + + + + + + + + + + + + + + @@ -87,12 +102,8 @@ Davis, CA 95616, USA - - - - - - + + @@ -100,4 +111,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/Mode_Refrigerator.xml b/data_model/1.4/clusters/Mode_Refrigerator.xml index 692740e090f198..6a786048c3bc2e 100644 --- a/data_model/1.4/clusters/Mode_Refrigerator.xml +++ b/data_model/1.4/clusters/Mode_Refrigerator.xml @@ -1,61 +1,61 @@ - @@ -73,6 +73,20 @@ Davis, CA 95616, USA + + + + + + + + + + + + + + @@ -100,4 +114,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/Mode_WaterHeater.xml b/data_model/1.4/clusters/Mode_WaterHeater.xml index cc9c96e484bce2..6d60836966d024 100644 --- a/data_model/1.4/clusters/Mode_WaterHeater.xml +++ b/data_model/1.4/clusters/Mode_WaterHeater.xml @@ -1,61 +1,61 @@ - @@ -71,6 +71,21 @@ Davis, CA 95616, USA + + + + + + + + + + + + + + + @@ -85,12 +100,8 @@ Davis, CA 95616, USA - - - - - - + + @@ -98,4 +109,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/NetworkCommissioningCluster.xml b/data_model/1.4/clusters/NetworkCommissioningCluster.xml index 8ee15e1b47ad3d..25bf37ec110136 100644 --- a/data_model/1.4/clusters/NetworkCommissioningCluster.xml +++ b/data_model/1.4/clusters/NetworkCommissioningCluster.xml @@ -1,59 +1,61 @@ - @@ -80,61 +82,61 @@ Davis, CA 95616, USA - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -212,6 +214,8 @@ Davis, CA 95616, USA + + @@ -240,7 +244,7 @@ Davis, CA 95616, USA - + @@ -262,7 +266,7 @@ Davis, CA 95616, USA - + @@ -270,11 +274,13 @@ Davis, CA 95616, USA - + + + - + @@ -285,7 +291,7 @@ Davis, CA 95616, USA - + @@ -296,29 +302,29 @@ Davis, CA 95616, USA - + - + - + - + - + @@ -326,14 +332,14 @@ Davis, CA 95616, USA - + - + @@ -510,4 +516,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/OTAProvider.xml b/data_model/1.4/clusters/OTAProvider.xml index f300a419518675..feef66814c5c85 100644 --- a/data_model/1.4/clusters/OTAProvider.xml +++ b/data_model/1.4/clusters/OTAProvider.xml @@ -1,59 +1,61 @@ - @@ -127,9 +129,9 @@ Davis, CA 95616, USA - + - + @@ -160,7 +162,7 @@ Davis, CA 95616, USA - + @@ -200,4 +202,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/OTARequestor.xml b/data_model/1.4/clusters/OTARequestor.xml index ea7ec03c717fd3..9d88c518225387 100644 --- a/data_model/1.4/clusters/OTARequestor.xml +++ b/data_model/1.4/clusters/OTARequestor.xml @@ -1,59 +1,61 @@ - @@ -71,8 +73,7 @@ Davis, CA 95616, USA - + @@ -133,14 +134,14 @@ Davis, CA 95616, USA - + - + - + @@ -150,7 +151,7 @@ Davis, CA 95616, USA - + @@ -225,4 +226,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/OccupancySensing.xml b/data_model/1.4/clusters/OccupancySensing.xml index 7400dde084f7d0..096614d2099942 100644 --- a/data_model/1.4/clusters/OccupancySensing.xml +++ b/data_model/1.4/clusters/OccupancySensing.xml @@ -1,61 +1,61 @@ - @@ -63,13 +63,7 @@ Davis, CA 95616, USA - + @@ -77,28 +71,28 @@ Davis, CA 95616, USA - + - + - + - + - + - + - + - + @@ -151,13 +145,13 @@ Davis, CA 95616, USA - + - + @@ -166,7 +160,7 @@ Davis, CA 95616, USA - + @@ -175,20 +169,20 @@ Davis, CA 95616, USA - + - + - + @@ -214,7 +208,7 @@ Davis, CA 95616, USA - + @@ -262,7 +256,7 @@ Davis, CA 95616, USA - + @@ -311,7 +305,7 @@ Davis, CA 95616, USA - + @@ -324,7 +318,7 @@ Davis, CA 95616, USA - + @@ -344,7 +338,7 @@ Davis, CA 95616, USA - + @@ -365,7 +359,7 @@ Davis, CA 95616, USA - + @@ -378,7 +372,7 @@ Davis, CA 95616, USA - + @@ -398,7 +392,7 @@ Davis, CA 95616, USA - + @@ -427,4 +421,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/OnOff.xml b/data_model/1.4/clusters/OnOff.xml index b1ea6ebba4af7d..7151e61dfb9c90 100644 --- a/data_model/1.4/clusters/OnOff.xml +++ b/data_model/1.4/clusters/OnOff.xml @@ -1,61 +1,61 @@ - @@ -78,7 +78,7 @@ Davis, CA 95616, USA - + @@ -128,11 +128,7 @@ Davis, CA 95616, USA - + @@ -143,12 +139,12 @@ Davis, CA 95616, USA - + - + - + @@ -168,7 +164,7 @@ Davis, CA 95616, USA - + @@ -235,4 +231,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/OperationalCredentialCluster.xml b/data_model/1.4/clusters/OperationalCredentialCluster.xml index 26ae2c57a257b2..b59e905135412a 100644 --- a/data_model/1.4/clusters/OperationalCredentialCluster.xml +++ b/data_model/1.4/clusters/OperationalCredentialCluster.xml @@ -1,74 +1,71 @@ - - + - + - - - - - @@ -81,44 +78,44 @@ Davis, CA 95616, USA - + - + - + - + - + - + - + - + - + - + - + - + @@ -130,7 +127,7 @@ Davis, CA 95616, USA - + @@ -155,37 +152,45 @@ Davis, CA 95616, USA - + - + + + - + - + + + - + - + - + + + - + - + + + @@ -198,18 +203,17 @@ Davis, CA 95616, USA - + - - + @@ -232,7 +236,7 @@ Davis, CA 95616, USA - + @@ -242,11 +246,10 @@ Davis, CA 95616, USA - - + @@ -262,9 +265,9 @@ Davis, CA 95616, USA - + - + @@ -322,4 +325,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/OperationalState.xml b/data_model/1.4/clusters/OperationalState.xml index d02635cf65fabd..be8fa18b9044d3 100644 --- a/data_model/1.4/clusters/OperationalState.xml +++ b/data_model/1.4/clusters/OperationalState.xml @@ -1,59 +1,61 @@ - @@ -67,24 +69,30 @@ Davis, CA 95616, USA - + - + - + + + + - + + + + - + - + @@ -115,19 +123,19 @@ Davis, CA 95616, USA - + - + - + @@ -217,4 +225,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/OperationalState_Oven.xml b/data_model/1.4/clusters/OperationalState_Oven.xml index e743fbf1d7752c..aec8f7d3f26e2c 100644 --- a/data_model/1.4/clusters/OperationalState_Oven.xml +++ b/data_model/1.4/clusters/OperationalState_Oven.xml @@ -1,61 +1,61 @@ - @@ -77,4 +77,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/OperationalState_RVC.xml b/data_model/1.4/clusters/OperationalState_RVC.xml index fb9fea9d5d4e27..3950183f254ca6 100644 --- a/data_model/1.4/clusters/OperationalState_RVC.xml +++ b/data_model/1.4/clusters/OperationalState_RVC.xml @@ -1,61 +1,61 @@ - @@ -68,6 +68,18 @@ Davis, CA 95616, USA + + + + + + + + + + + + @@ -94,6 +106,18 @@ Davis, CA 95616, USA + + + + + + + + + + + + @@ -120,4 +144,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/PowerSourceCluster.xml b/data_model/1.4/clusters/PowerSourceCluster.xml index 82491aaa741720..ca4b91403c6a23 100644 --- a/data_model/1.4/clusters/PowerSourceCluster.xml +++ b/data_model/1.4/clusters/PowerSourceCluster.xml @@ -1,59 +1,61 @@ - @@ -557,32 +559,32 @@ Davis, CA 95616, USA - + - + - + - + - + @@ -590,21 +592,21 @@ Davis, CA 95616, USA - + - + - + @@ -625,14 +627,14 @@ Davis, CA 95616, USA - + - + @@ -640,7 +642,7 @@ Davis, CA 95616, USA - + @@ -660,7 +662,7 @@ Davis, CA 95616, USA - + @@ -681,7 +683,7 @@ Davis, CA 95616, USA - + @@ -689,7 +691,7 @@ Davis, CA 95616, USA - + @@ -697,7 +699,7 @@ Davis, CA 95616, USA - + @@ -705,7 +707,7 @@ Davis, CA 95616, USA - + @@ -713,7 +715,7 @@ Davis, CA 95616, USA - + @@ -721,7 +723,7 @@ Davis, CA 95616, USA - + @@ -731,7 +733,7 @@ Davis, CA 95616, USA - + @@ -745,7 +747,7 @@ Davis, CA 95616, USA - + @@ -758,7 +760,7 @@ Davis, CA 95616, USA - + @@ -827,4 +829,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/PowerSourceConfigurationCluster.xml b/data_model/1.4/clusters/PowerSourceConfigurationCluster.xml index 61df60149ca00f..d2f41b8977f023 100644 --- a/data_model/1.4/clusters/PowerSourceConfigurationCluster.xml +++ b/data_model/1.4/clusters/PowerSourceConfigurationCluster.xml @@ -1,59 +1,61 @@ - @@ -67,9 +69,9 @@ Davis, CA 95616, USA - + - \ No newline at end of file + diff --git a/data_model/1.4/clusters/PowerTopology.xml b/data_model/1.4/clusters/PowerTopology.xml index eb0a2d74f5e585..3c9e88254cb201 100644 --- a/data_model/1.4/clusters/PowerTopology.xml +++ b/data_model/1.4/clusters/PowerTopology.xml @@ -1,59 +1,61 @@ - @@ -83,7 +85,7 @@ Davis, CA 95616, USA - + @@ -92,11 +94,11 @@ Davis, CA 95616, USA - + - \ No newline at end of file + diff --git a/data_model/1.4/clusters/PressureMeasurement.xml b/data_model/1.4/clusters/PressureMeasurement.xml index 09b9577cc84585..a5ea5fe4432955 100644 --- a/data_model/1.4/clusters/PressureMeasurement.xml +++ b/data_model/1.4/clusters/PressureMeasurement.xml @@ -1,61 +1,61 @@ - @@ -75,19 +75,22 @@ Davis, CA 95616, USA - + - + + + + - + - + @@ -98,15 +101,18 @@ Davis, CA 95616, USA - + - + + + + - + @@ -114,7 +120,7 @@ Davis, CA 95616, USA - + @@ -135,4 +141,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/ProxyConfiguration-Cluster.xml b/data_model/1.4/clusters/ProxyConfiguration-Cluster.xml index 6796e79ac9bf59..9356e7f55932b6 100644 --- a/data_model/1.4/clusters/ProxyConfiguration-Cluster.xml +++ b/data_model/1.4/clusters/ProxyConfiguration-Cluster.xml @@ -1,66 +1,68 @@ - - + @@ -68,24 +70,23 @@ Davis, CA 95616, USA - - + - + - \ No newline at end of file + diff --git a/data_model/1.4/clusters/ProxyDiscovery-Cluster.xml b/data_model/1.4/clusters/ProxyDiscovery-Cluster.xml index 7353386929c109..d87c7e67a73163 100644 --- a/data_model/1.4/clusters/ProxyDiscovery-Cluster.xml +++ b/data_model/1.4/clusters/ProxyDiscovery-Cluster.xml @@ -1,72 +1,74 @@ - - + - + @@ -81,8 +83,7 @@ Davis, CA 95616, USA - - + @@ -97,4 +98,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/PumpConfigurationControl.xml b/data_model/1.4/clusters/PumpConfigurationControl.xml index 2be5a4437184c7..d9b81833da5d20 100644 --- a/data_model/1.4/clusters/PumpConfigurationControl.xml +++ b/data_model/1.4/clusters/PumpConfigurationControl.xml @@ -1,59 +1,61 @@ - @@ -68,19 +70,19 @@ Davis, CA 95616, USA - + - + - + - + - + @@ -96,44 +98,37 @@ Davis, CA 95616, USA - + - + - + - + - + - + - + @@ -143,8 +138,7 @@ Davis, CA 95616, USA - + @@ -183,22 +177,22 @@ Davis, CA 95616, USA - + - + - + - + @@ -210,7 +204,7 @@ Davis, CA 95616, USA - + @@ -222,7 +216,7 @@ Davis, CA 95616, USA - + @@ -234,7 +228,7 @@ Davis, CA 95616, USA - + @@ -246,7 +240,7 @@ Davis, CA 95616, USA - + @@ -258,7 +252,7 @@ Davis, CA 95616, USA - + @@ -270,7 +264,7 @@ Davis, CA 95616, USA - + @@ -282,7 +276,7 @@ Davis, CA 95616, USA - + @@ -294,7 +288,7 @@ Davis, CA 95616, USA - + @@ -307,7 +301,7 @@ Davis, CA 95616, USA - + @@ -320,56 +314,56 @@ Davis, CA 95616, USA - + - + - + - + - + - + - + - + - + - + @@ -447,4 +441,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/RefrigeratorAlarm.xml b/data_model/1.4/clusters/RefrigeratorAlarm.xml index a3a75011813cd1..98ee14fb7e4c46 100644 --- a/data_model/1.4/clusters/RefrigeratorAlarm.xml +++ b/data_model/1.4/clusters/RefrigeratorAlarm.xml @@ -1,61 +1,61 @@ - @@ -72,7 +72,7 @@ Davis, CA 95616, USA - + @@ -82,4 +82,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/ResourceMonitoring.xml b/data_model/1.4/clusters/ResourceMonitoring.xml index 911ad11373b948..d263bb53b8ba29 100644 --- a/data_model/1.4/clusters/ResourceMonitoring.xml +++ b/data_model/1.4/clusters/ResourceMonitoring.xml @@ -1,63 +1,63 @@ - - + @@ -137,7 +137,7 @@ Davis, CA 95616, USA - + @@ -153,13 +153,13 @@ Davis, CA 95616, USA - + - + @@ -172,4 +172,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/Scenes.xml b/data_model/1.4/clusters/Scenes.xml index 3de80abbc56ef8..53bea65b8f7067 100644 --- a/data_model/1.4/clusters/Scenes.xml +++ b/data_model/1.4/clusters/Scenes.xml @@ -1,61 +1,61 @@ - @@ -117,29 +117,6 @@ Davis, CA 95616, USA - - - - - - - - - - - - - - - - - - - - - - - @@ -153,7 +130,7 @@ Davis, CA 95616, USA - + @@ -167,12 +144,12 @@ Davis, CA 95616, USA - + - + @@ -361,6 +338,12 @@ Davis, CA 95616, USA + + + + + + @@ -402,4 +385,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/ServiceArea.xml b/data_model/1.4/clusters/ServiceArea.xml index 3ea629625cb1ee..9f2c8b35844854 100644 --- a/data_model/1.4/clusters/ServiceArea.xml +++ b/data_model/1.4/clusters/ServiceArea.xml @@ -1,59 +1,61 @@ - @@ -76,26 +78,49 @@ Davis, CA 95616, USA - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + @@ -175,12 +200,12 @@ Davis, CA 95616, USA - + - + @@ -234,4 +259,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/SmokeCOAlarm.xml b/data_model/1.4/clusters/SmokeCOAlarm.xml index 482a8a82f2abf5..838f0b2e69d4b1 100644 --- a/data_model/1.4/clusters/SmokeCOAlarm.xml +++ b/data_model/1.4/clusters/SmokeCOAlarm.xml @@ -1,61 +1,61 @@ - @@ -67,10 +67,10 @@ Davis, CA 95616, USA - + - + @@ -163,31 +163,31 @@ Davis, CA 95616, USA - + - + - + - + - + @@ -196,12 +196,12 @@ Davis, CA 95616, USA - + - + @@ -226,7 +226,7 @@ Davis, CA 95616, USA - + @@ -305,4 +305,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/Switch.xml b/data_model/1.4/clusters/Switch.xml index 8662d262f0b50e..def888d4f66b68 100644 --- a/data_model/1.4/clusters/Switch.xml +++ b/data_model/1.4/clusters/Switch.xml @@ -1,66 +1,66 @@ - - + @@ -116,19 +116,19 @@ Davis, CA 95616, USA - + - + - + - + @@ -143,7 +143,7 @@ Davis, CA 95616, USA - + @@ -153,7 +153,7 @@ Davis, CA 95616, USA - + @@ -163,7 +163,7 @@ Davis, CA 95616, USA - + @@ -173,7 +173,7 @@ Davis, CA 95616, USA - + @@ -183,7 +183,7 @@ Davis, CA 95616, USA - + @@ -198,11 +198,14 @@ Davis, CA 95616, USA - + - + + + + @@ -212,12 +215,14 @@ Davis, CA 95616, USA - + - + + + - \ No newline at end of file + diff --git a/data_model/1.4/clusters/TargetNavigator.xml b/data_model/1.4/clusters/TargetNavigator.xml index b1fcff6d60cd1e..8cbe2d42829fd7 100644 --- a/data_model/1.4/clusters/TargetNavigator.xml +++ b/data_model/1.4/clusters/TargetNavigator.xml @@ -1,61 +1,61 @@ - @@ -139,4 +139,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/TemperatureControl.xml b/data_model/1.4/clusters/TemperatureControl.xml index 511761b24b9e89..e7db3b6883d7d0 100644 --- a/data_model/1.4/clusters/TemperatureControl.xml +++ b/data_model/1.4/clusters/TemperatureControl.xml @@ -1,59 +1,61 @@ - @@ -82,11 +84,14 @@ Davis, CA 95616, USA - + + + + - + @@ -94,7 +99,7 @@ Davis, CA 95616, USA - + @@ -102,7 +107,7 @@ Davis, CA 95616, USA - + @@ -144,4 +149,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/TemperatureMeasurement.xml b/data_model/1.4/clusters/TemperatureMeasurement.xml index 5c1df46ccbf115..88e1f4cc080d1c 100644 --- a/data_model/1.4/clusters/TemperatureMeasurement.xml +++ b/data_model/1.4/clusters/TemperatureMeasurement.xml @@ -1,61 +1,61 @@ - @@ -71,19 +71,22 @@ Davis, CA 95616, USA - + - + + + + - + - + @@ -93,4 +96,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/Thermostat.xml b/data_model/1.4/clusters/Thermostat.xml index 6c5584e087d47c..c82c878be94ffa 100644 --- a/data_model/1.4/clusters/Thermostat.xml +++ b/data_model/1.4/clusters/Thermostat.xml @@ -1,59 +1,61 @@ - @@ -63,8 +65,7 @@ Davis, CA 95616, USA - + @@ -77,7 +78,7 @@ Davis, CA 95616, USA - + @@ -85,7 +86,7 @@ Davis, CA 95616, USA - + @@ -116,9 +117,9 @@ Davis, CA 95616, USA - - - + + + @@ -197,7 +198,7 @@ Davis, CA 95616, USA - + @@ -325,12 +326,12 @@ Davis, CA 95616, USA - + - + @@ -397,10 +398,10 @@ Davis, CA 95616, USA - + - + @@ -444,16 +445,16 @@ Davis, CA 95616, USA - + - + - + - + @@ -504,12 +505,12 @@ Davis, CA 95616, USA - + - + @@ -532,13 +533,13 @@ Davis, CA 95616, USA - + - + @@ -581,7 +582,10 @@ Davis, CA 95616, USA - + + + + @@ -627,7 +631,9 @@ Davis, CA 95616, USA - + + + @@ -652,12 +658,12 @@ Davis, CA 95616, USA - + - + @@ -666,88 +672,88 @@ Davis, CA 95616, USA - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + @@ -756,9 +762,9 @@ Davis, CA 95616, USA - + - + @@ -767,71 +773,67 @@ Davis, CA 95616, USA - + + - + - + + - + - + + - + - + + - + - + - + - + - + - - + - + - - - - - - - @@ -839,9 +841,9 @@ Davis, CA 95616, USA - + - + @@ -849,37 +851,37 @@ Davis, CA 95616, USA - + - + - + - + - + - + @@ -889,97 +891,113 @@ Davis, CA 95616, USA - + - + - + - + - + - + + + + - + - + - + + + - + - + - + + + + - + - + - + + + + - + - + - + + + - + - + - + + + + - + - + - + - + - + - + @@ -989,25 +1007,25 @@ Davis, CA 95616, USA - + - + - + - + @@ -1016,7 +1034,7 @@ Davis, CA 95616, USA - + @@ -1024,35 +1042,35 @@ Davis, CA 95616, USA - + - + - + - + - + @@ -1060,7 +1078,7 @@ Davis, CA 95616, USA - + @@ -1069,16 +1087,18 @@ Davis, CA 95616, USA - + - + + + - + @@ -1086,7 +1106,7 @@ Davis, CA 95616, USA - + @@ -1145,34 +1165,6 @@ Davis, CA 95616, USA - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -1193,12 +1185,6 @@ Davis, CA 95616, USA - - - - - - @@ -1221,4 +1207,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/ThermostatUserInterfaceConfiguration.xml b/data_model/1.4/clusters/ThermostatUserInterfaceConfiguration.xml index 8b33ccedbd2200..a77c6c4fece947 100644 --- a/data_model/1.4/clusters/ThermostatUserInterfaceConfiguration.xml +++ b/data_model/1.4/clusters/ThermostatUserInterfaceConfiguration.xml @@ -1,59 +1,61 @@ - @@ -116,4 +118,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/ThreadBorderRouterManagement.xml b/data_model/1.4/clusters/ThreadBorderRouterManagement.xml index 7ae4edab62f8b3..4059db7ebd9bd3 100644 --- a/data_model/1.4/clusters/ThreadBorderRouterManagement.xml +++ b/data_model/1.4/clusters/ThreadBorderRouterManagement.xml @@ -1,61 +1,61 @@ - @@ -79,26 +79,26 @@ Davis, CA 95616, USA - + - + - + - + - + @@ -140,4 +140,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/ThreadNetworkDirectory.xml b/data_model/1.4/clusters/ThreadNetworkDirectory.xml index e5112991e6ff06..c814ace82c56d1 100644 --- a/data_model/1.4/clusters/ThreadNetworkDirectory.xml +++ b/data_model/1.4/clusters/ThreadNetworkDirectory.xml @@ -1,61 +1,61 @@ - @@ -69,7 +69,7 @@ Davis, CA 95616, USA - + @@ -86,20 +86,22 @@ Davis, CA 95616, USA - + - + - + - + + + - + @@ -118,7 +120,7 @@ Davis, CA 95616, USA - + @@ -126,7 +128,7 @@ Davis, CA 95616, USA - + @@ -137,4 +139,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/TimeSync.xml b/data_model/1.4/clusters/TimeSync.xml index e72a9d32467983..9a50063b750b7d 100644 --- a/data_model/1.4/clusters/TimeSync.xml +++ b/data_model/1.4/clusters/TimeSync.xml @@ -1,62 +1,61 @@ - @@ -99,7 +98,11 @@ Davis, CA 95616, USA - + + + + + @@ -213,7 +216,7 @@ Davis, CA 95616, USA - + @@ -228,14 +231,14 @@ Davis, CA 95616, USA - + - + @@ -244,35 +247,35 @@ Davis, CA 95616, USA - + - + - + - + - + - + @@ -280,7 +283,7 @@ Davis, CA 95616, USA - + @@ -288,15 +291,15 @@ Davis, CA 95616, USA - + - + - + @@ -394,7 +397,6 @@ Davis, CA 95616, USA - @@ -408,4 +410,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/ValidProxies-Cluster.xml b/data_model/1.4/clusters/ValidProxies-Cluster.xml index 51cfeedb46926d..518b4aad5715b7 100644 --- a/data_model/1.4/clusters/ValidProxies-Cluster.xml +++ b/data_model/1.4/clusters/ValidProxies-Cluster.xml @@ -1,66 +1,68 @@ - - + @@ -68,18 +70,18 @@ Davis, CA 95616, USA - + - + - + @@ -95,4 +97,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/ValveConfigurationControl.xml b/data_model/1.4/clusters/ValveConfigurationControl.xml index 6f38375a1a31c6..844eeb781eb869 100644 --- a/data_model/1.4/clusters/ValveConfigurationControl.xml +++ b/data_model/1.4/clusters/ValveConfigurationControl.xml @@ -1,61 +1,61 @@ - @@ -72,7 +72,11 @@ Davis, CA 95616, USA - + + + + + @@ -108,55 +112,55 @@ Davis, CA 95616, USA - + - + - + - + - + - + - + - + - + @@ -168,7 +172,7 @@ Davis, CA 95616, USA - + @@ -217,4 +221,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/WakeOnLAN.xml b/data_model/1.4/clusters/WakeOnLAN.xml index 092e0a8ea8f4de..a315346bfbbb8d 100644 --- a/data_model/1.4/clusters/WakeOnLAN.xml +++ b/data_model/1.4/clusters/WakeOnLAN.xml @@ -1,82 +1,82 @@ - - + - + - + - \ No newline at end of file + diff --git a/data_model/1.4/clusters/WaterContentMeasurement.xml b/data_model/1.4/clusters/WaterContentMeasurement.xml index b613bf4e1522fb..0f2bf36d84163c 100644 --- a/data_model/1.4/clusters/WaterContentMeasurement.xml +++ b/data_model/1.4/clusters/WaterContentMeasurement.xml @@ -1,88 +1,91 @@ - - + - + - + - + + + + - + - + @@ -92,4 +95,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/WaterHeaterManagement.xml b/data_model/1.4/clusters/WaterHeaterManagement.xml index 49cdf1eeb25b57..6193fe7eee70ed 100644 --- a/data_model/1.4/clusters/WaterHeaterManagement.xml +++ b/data_model/1.4/clusters/WaterHeaterManagement.xml @@ -1,61 +1,61 @@ - @@ -105,8 +105,19 @@ Davis, CA 95616, USA - - + + + + + + + + + + + + + @@ -116,7 +127,7 @@ Davis, CA 95616, USA - + @@ -124,6 +135,9 @@ Davis, CA 95616, USA + + + @@ -131,7 +145,7 @@ Davis, CA 95616, USA - + @@ -188,4 +202,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/WiFiNetworkManagement.xml b/data_model/1.4/clusters/WiFiNetworkManagement.xml index 3aad5935d2843d..59a11866f0edef 100644 --- a/data_model/1.4/clusters/WiFiNetworkManagement.xml +++ b/data_model/1.4/clusters/WiFiNetworkManagement.xml @@ -1,61 +1,61 @@ - @@ -68,13 +68,13 @@ Davis, CA 95616, USA - + - + @@ -91,4 +91,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/WindowCovering.xml b/data_model/1.4/clusters/WindowCovering.xml index dd6d2293cc31f2..f421678aad0c02 100644 --- a/data_model/1.4/clusters/WindowCovering.xml +++ b/data_model/1.4/clusters/WindowCovering.xml @@ -1,61 +1,61 @@ - @@ -71,10 +71,10 @@ Davis, CA 95616, USA - + - + @@ -305,7 +305,7 @@ Davis, CA 95616, USA - + @@ -349,15 +349,15 @@ Davis, CA 95616, USA - + - + - + @@ -405,13 +405,13 @@ Davis, CA 95616, USA - + - + @@ -422,7 +422,7 @@ Davis, CA 95616, USA - + @@ -433,7 +433,7 @@ Davis, CA 95616, USA - + @@ -441,11 +441,14 @@ Davis, CA 95616, USA - + + + + - + @@ -453,31 +456,34 @@ Davis, CA 95616, USA - + + + + - + - + - + - + @@ -487,7 +493,7 @@ Davis, CA 95616, USA - + @@ -497,13 +503,12 @@ Davis, CA 95616, USA - + - - + @@ -513,7 +518,7 @@ Davis, CA 95616, USA - + @@ -523,13 +528,13 @@ Davis, CA 95616, USA - + - + @@ -540,7 +545,7 @@ Davis, CA 95616, USA - + @@ -551,7 +556,7 @@ Davis, CA 95616, USA - + @@ -563,7 +568,7 @@ Davis, CA 95616, USA - + @@ -575,7 +580,7 @@ Davis, CA 95616, USA - + @@ -587,7 +592,7 @@ Davis, CA 95616, USA - + @@ -606,11 +611,10 @@ Davis, CA 95616, USA - + - + - @@ -620,7 +624,7 @@ Davis, CA 95616, USA - + @@ -701,4 +705,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/bridge-clusters-ActionsCluster.xml b/data_model/1.4/clusters/bridge-clusters-ActionsCluster.xml index 354e24c424417d..868c40de2dacf2 100644 --- a/data_model/1.4/clusters/bridge-clusters-ActionsCluster.xml +++ b/data_model/1.4/clusters/bridge-clusters-ActionsCluster.xml @@ -1,61 +1,61 @@ - @@ -101,7 +101,7 @@ Davis, CA 95616, USA - + @@ -166,7 +166,8 @@ Davis, CA 95616, USA - + + @@ -184,21 +185,18 @@ Davis, CA 95616, USA - - - + + - - @@ -379,4 +377,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/bridge-clusters-BridgedDeviceBasicInformationCluster.xml b/data_model/1.4/clusters/bridge-clusters-BridgedDeviceBasicInformationCluster.xml index 3f7eda5f1ea87c..b9847f4f417593 100644 --- a/data_model/1.4/clusters/bridge-clusters-BridgedDeviceBasicInformationCluster.xml +++ b/data_model/1.4/clusters/bridge-clusters-BridgedDeviceBasicInformationCluster.xml @@ -1,61 +1,61 @@ - @@ -74,72 +74,134 @@ Davis, CA 95616, USA - + + + + - + + + + - + + + - + + + + - - + + + + + + + + - + + + + - + + + - + + + + - + + + + - + + + + - + + + + - + + + + - + + + + - + + + + - + + + + - + + + - + + - + + + + - + + + - + + + - + + + + - + + + + @@ -188,4 +250,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/clusters/cluster_ids.json b/data_model/1.4/clusters/cluster_ids.json index 687bbc32298a3c..7850a064e28211 100644 --- a/data_model/1.4/clusters/cluster_ids.json +++ b/data_model/1.4/clusters/cluster_ids.json @@ -5,7 +5,7 @@ "8": "Level Control", "29": "Descriptor", "30": "Binding", - "31": "AccessControl", + "31": "Access Control", "37": "Actions", "40": "Basic Information", "41": "OTA Software Update Provider", @@ -28,14 +28,14 @@ "59": "Switch", "60": "Administrator Commissioning", "62": "Operational Credentials", - "63": "GroupKeyManagement", + "63": "Group Key Management", "64": "Fixed Label", "65": "User Label", - "66": "ProxyConfiguration", - "67": "ProxyDiscovery", - "68": "ValidProxies", + "66": "Proxy Configuration", + "67": "Proxy Discovery", + "68": "Valid Proxies", "69": "Boolean State", - "70": "ICDManagement", + "70": "ICD Management", "72": "Oven Cavity Operational State", "73": "Oven Mode", "74": "Laundry Dryer Controls", @@ -100,7 +100,7 @@ "1105": "Wi-Fi Network Management", "1106": "Thread Border Router Management", "1107": "Thread Network Directory", - "1283": "Wake on LAN", + "1283": "Wake On LAN", "1284": "Channel", "1285": "Target Navigator", "1286": "Media Playback", @@ -116,6 +116,6 @@ "1296": "Content App Observer", "1872": "Ecosystem Information", "1873": "Commissioner Control", - "1874": "Joint Fabric Datastore Cluster", + "1874": "Joint Fabric Datastore", "1875": "Joint Fabric PKI" } diff --git a/data_model/1.4/device_types/Aggregator.xml b/data_model/1.4/device_types/Aggregator.xml index be604976521c54..7e940b075a9694 100644 --- a/data_model/1.4/device_types/Aggregator.xml +++ b/data_model/1.4/device_types/Aggregator.xml @@ -1,59 +1,61 @@ - @@ -61,6 +63,9 @@ Davis, CA 95616, USA + + + @@ -74,4 +79,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/AirPurifier.xml b/data_model/1.4/device_types/AirPurifier.xml index 62045f090c71a5..b8aac8b4445167 100644 --- a/data_model/1.4/device_types/AirPurifier.xml +++ b/data_model/1.4/device_types/AirPurifier.xml @@ -1,59 +1,61 @@ - @@ -61,7 +63,6 @@ Davis, CA 95616, USA - @@ -82,4 +83,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/AirQualitySensor.xml b/data_model/1.4/device_types/AirQualitySensor.xml index 756b42e437ac9a..97df65166d42fc 100644 --- a/data_model/1.4/device_types/AirQualitySensor.xml +++ b/data_model/1.4/device_types/AirQualitySensor.xml @@ -1,66 +1,67 @@ - - @@ -105,4 +106,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/BaseDeviceType.xml b/data_model/1.4/device_types/BaseDeviceType.xml index 272b74feb5ff67..676f12eec91548 100644 --- a/data_model/1.4/device_types/BaseDeviceType.xml +++ b/data_model/1.4/device_types/BaseDeviceType.xml @@ -1,59 +1,59 @@ - @@ -87,4 +87,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/BasicVideoPlayer.xml b/data_model/1.4/device_types/BasicVideoPlayer.xml index d35bbed3211422..79f2f4773ef153 100644 --- a/data_model/1.4/device_types/BasicVideoPlayer.xml +++ b/data_model/1.4/device_types/BasicVideoPlayer.xml @@ -1,59 +1,61 @@ - @@ -104,4 +106,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/BatteryStorage.xml b/data_model/1.4/device_types/BatteryStorage.xml index 5f09eeb1d2dac9..6351fd3eaf5c5c 100644 --- a/data_model/1.4/device_types/BatteryStorage.xml +++ b/data_model/1.4/device_types/BatteryStorage.xml @@ -1,69 +1,70 @@ - - - \ No newline at end of file + diff --git a/data_model/1.4/device_types/BridgedNode.xml b/data_model/1.4/device_types/BridgedNode.xml index 1ea7a1984f57f5..1b308650c807ee 100644 --- a/data_model/1.4/device_types/BridgedNode.xml +++ b/data_model/1.4/device_types/BridgedNode.xml @@ -1,59 +1,61 @@ - @@ -62,6 +64,9 @@ Davis, CA 95616, USA + + + @@ -93,4 +98,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/CastingVideoClient.xml b/data_model/1.4/device_types/CastingVideoClient.xml index 949142a6bca151..24f535da7f2efc 100644 --- a/data_model/1.4/device_types/CastingVideoClient.xml +++ b/data_model/1.4/device_types/CastingVideoClient.xml @@ -1,59 +1,61 @@ - @@ -61,7 +63,6 @@ Davis, CA 95616, USA - @@ -118,4 +119,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/CastingVideoPlayer.xml b/data_model/1.4/device_types/CastingVideoPlayer.xml index 5c88cf92947e0b..77e5f5725a80e1 100644 --- a/data_model/1.4/device_types/CastingVideoPlayer.xml +++ b/data_model/1.4/device_types/CastingVideoPlayer.xml @@ -1,59 +1,61 @@ - @@ -62,9 +64,7 @@ Davis, CA 95616, USA - + @@ -123,4 +123,4 @@ launch Content Apps and represent these apps as separate endpoints."/> - \ No newline at end of file + diff --git a/data_model/1.4/device_types/ColorDimmerSwitch.xml b/data_model/1.4/device_types/ColorDimmerSwitch.xml index abc027eaec711c..5a4c7af4edb035 100644 --- a/data_model/1.4/device_types/ColorDimmerSwitch.xml +++ b/data_model/1.4/device_types/ColorDimmerSwitch.xml @@ -1,59 +1,61 @@ - @@ -62,7 +64,6 @@ Davis, CA 95616, USA - @@ -89,4 +90,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/ColorTemperatureLight.xml b/data_model/1.4/device_types/ColorTemperatureLight.xml index 56db5416cf02c9..4e7a37ac8c665b 100644 --- a/data_model/1.4/device_types/ColorTemperatureLight.xml +++ b/data_model/1.4/device_types/ColorTemperatureLight.xml @@ -1,59 +1,61 @@ - @@ -63,12 +65,11 @@ Davis, CA 95616, USA - - + @@ -95,13 +96,13 @@ Davis, CA 95616, USA - + - + - + @@ -112,7 +113,7 @@ Davis, CA 95616, USA - + @@ -128,7 +129,7 @@ Davis, CA 95616, USA - + @@ -137,4 +138,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/ContactSensor.xml b/data_model/1.4/device_types/ContactSensor.xml index 2767e5e37a384b..88e82576edaff0 100644 --- a/data_model/1.4/device_types/ContactSensor.xml +++ b/data_model/1.4/device_types/ContactSensor.xml @@ -1,59 +1,61 @@ - @@ -61,7 +63,6 @@ Davis, CA 95616, USA - @@ -73,4 +74,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/ContentApp.xml b/data_model/1.4/device_types/ContentApp.xml index 81b967db9c8dc1..c32856e567f2d9 100644 --- a/data_model/1.4/device_types/ContentApp.xml +++ b/data_model/1.4/device_types/ContentApp.xml @@ -1,59 +1,61 @@ - @@ -61,6 +63,9 @@ Davis, CA 95616, USA + + + @@ -102,4 +107,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/ControlBridge.xml b/data_model/1.4/device_types/ControlBridge.xml index ab07228e728f52..be36b89991ea95 100644 --- a/data_model/1.4/device_types/ControlBridge.xml +++ b/data_model/1.4/device_types/ControlBridge.xml @@ -1,59 +1,61 @@ - @@ -62,7 +64,6 @@ Davis, CA 95616, USA - @@ -95,4 +96,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/CookSurface.xml b/data_model/1.4/device_types/CookSurface.xml index 3a0e8f062c7495..35bdc0c3b92014 100644 --- a/data_model/1.4/device_types/CookSurface.xml +++ b/data_model/1.4/device_types/CookSurface.xml @@ -1,66 +1,67 @@ - - @@ -71,10 +72,10 @@ Davis, CA 95616, USA - + - + - \ No newline at end of file + diff --git a/data_model/1.4/device_types/Cooktop.xml b/data_model/1.4/device_types/Cooktop.xml index 9164641c06f2c1..e780e390cd8a01 100644 --- a/data_model/1.4/device_types/Cooktop.xml +++ b/data_model/1.4/device_types/Cooktop.xml @@ -1,66 +1,67 @@ - - @@ -74,4 +75,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/DeviceEnergyManagement.xml b/data_model/1.4/device_types/DeviceEnergyManagement.xml index 0a90a21edb868c..ae832a8330a8c6 100644 --- a/data_model/1.4/device_types/DeviceEnergyManagement.xml +++ b/data_model/1.4/device_types/DeviceEnergyManagement.xml @@ -1,59 +1,61 @@ - @@ -61,6 +63,9 @@ Davis, CA 95616, USA + + + @@ -81,4 +86,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/DimmableLight.xml b/data_model/1.4/device_types/DimmableLight.xml index 4d6c53e4ae36fd..7d6fdd016aad20 100644 --- a/data_model/1.4/device_types/DimmableLight.xml +++ b/data_model/1.4/device_types/DimmableLight.xml @@ -1,59 +1,61 @@ - @@ -62,12 +64,11 @@ Davis, CA 95616, USA - - + @@ -94,13 +95,13 @@ Davis, CA 95616, USA - + - + - + @@ -111,7 +112,7 @@ Davis, CA 95616, USA - + @@ -123,4 +124,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/DimmablePlug-InUnit.xml b/data_model/1.4/device_types/DimmablePlug-InUnit.xml index 73fd2a37c48bab..bf49f0cc471c7f 100644 --- a/data_model/1.4/device_types/DimmablePlug-InUnit.xml +++ b/data_model/1.4/device_types/DimmablePlug-InUnit.xml @@ -1,59 +1,61 @@ - @@ -63,12 +65,11 @@ Davis, CA 95616, USA - - + @@ -95,13 +96,13 @@ Davis, CA 95616, USA - + - + - + @@ -112,7 +113,7 @@ Davis, CA 95616, USA - + @@ -124,4 +125,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/DimmerSwitch.xml b/data_model/1.4/device_types/DimmerSwitch.xml index 9dce28fdd7ce71..b4ff8be95f1412 100644 --- a/data_model/1.4/device_types/DimmerSwitch.xml +++ b/data_model/1.4/device_types/DimmerSwitch.xml @@ -1,59 +1,61 @@ - @@ -62,7 +64,6 @@ Davis, CA 95616, USA - @@ -86,4 +87,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/Dishwasher.xml b/data_model/1.4/device_types/Dishwasher.xml index b13f9a42ebcc49..f64ece8036297d 100644 --- a/data_model/1.4/device_types/Dishwasher.xml +++ b/data_model/1.4/device_types/Dishwasher.xml @@ -1,66 +1,67 @@ - - @@ -84,7 +85,7 @@ Davis, CA 95616, USA - + @@ -96,4 +97,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/DoorLock.xml b/data_model/1.4/device_types/DoorLock.xml index 622b9a8bfc6300..8c42604ec86b39 100644 --- a/data_model/1.4/device_types/DoorLock.xml +++ b/data_model/1.4/device_types/DoorLock.xml @@ -1,59 +1,61 @@ - @@ -62,7 +64,6 @@ Davis, CA 95616, USA - @@ -98,12 +99,12 @@ Davis, CA 95616, USA - + - + - \ No newline at end of file + diff --git a/data_model/1.4/device_types/DoorLockController.xml b/data_model/1.4/device_types/DoorLockController.xml index 40749d77b3c783..1ac00447f120cc 100644 --- a/data_model/1.4/device_types/DoorLockController.xml +++ b/data_model/1.4/device_types/DoorLockController.xml @@ -1,59 +1,61 @@ - @@ -62,7 +64,6 @@ Davis, CA 95616, USA - @@ -80,4 +81,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/EVSE.xml b/data_model/1.4/device_types/EVSE.xml index d468cb8a180f22..2f7c30d3fc6878 100644 --- a/data_model/1.4/device_types/EVSE.xml +++ b/data_model/1.4/device_types/EVSE.xml @@ -1,59 +1,61 @@ - @@ -61,7 +63,6 @@ Davis, CA 95616, USA - @@ -76,4 +77,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/ElectricalSensor.xml b/data_model/1.4/device_types/ElectricalSensor.xml index 75c4b0bb7cbbed..c97dcf9516a489 100644 --- a/data_model/1.4/device_types/ElectricalSensor.xml +++ b/data_model/1.4/device_types/ElectricalSensor.xml @@ -1,59 +1,61 @@ - @@ -62,13 +64,13 @@ Davis, CA 95616, USA - + - + - \ No newline at end of file + diff --git a/data_model/1.4/device_types/ExtendedColorLight.xml b/data_model/1.4/device_types/ExtendedColorLight.xml index 0678094669459f..0c6a880d1f8549 100644 --- a/data_model/1.4/device_types/ExtendedColorLight.xml +++ b/data_model/1.4/device_types/ExtendedColorLight.xml @@ -1,59 +1,61 @@ - @@ -63,12 +65,11 @@ Davis, CA 95616, USA - - + @@ -95,13 +96,13 @@ Davis, CA 95616, USA - + - + - + @@ -112,7 +113,7 @@ Davis, CA 95616, USA - + @@ -132,7 +133,7 @@ Davis, CA 95616, USA - + @@ -140,7 +141,7 @@ Davis, CA 95616, USA - + @@ -149,4 +150,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/ExtractorHood.xml b/data_model/1.4/device_types/ExtractorHood.xml index 3e8064adb149f4..18b46b3b262f66 100644 --- a/data_model/1.4/device_types/ExtractorHood.xml +++ b/data_model/1.4/device_types/ExtractorHood.xml @@ -1,66 +1,67 @@ - - @@ -86,4 +87,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/Fan.xml b/data_model/1.4/device_types/Fan.xml index e5184cfe22aec7..81fed1fc3ee9cb 100644 --- a/data_model/1.4/device_types/Fan.xml +++ b/data_model/1.4/device_types/Fan.xml @@ -1,59 +1,61 @@ - @@ -62,7 +64,6 @@ Davis, CA 95616, USA - @@ -76,8 +77,8 @@ Davis, CA 95616, USA - - + + @@ -86,4 +87,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/FlowSensor.xml b/data_model/1.4/device_types/FlowSensor.xml index 6a9023060e12f9..1ae86913829c60 100644 --- a/data_model/1.4/device_types/FlowSensor.xml +++ b/data_model/1.4/device_types/FlowSensor.xml @@ -1,59 +1,61 @@ - @@ -61,7 +63,6 @@ Davis, CA 95616, USA - @@ -75,4 +76,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/GenericSwitch.xml b/data_model/1.4/device_types/GenericSwitch.xml index b8bc394b96e2e8..ac2e2b91284d14 100644 --- a/data_model/1.4/device_types/GenericSwitch.xml +++ b/data_model/1.4/device_types/GenericSwitch.xml @@ -1,59 +1,61 @@ - @@ -62,7 +64,6 @@ Davis, CA 95616, USA - @@ -71,4 +72,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/HeatPump.xml b/data_model/1.4/device_types/HeatPump.xml index 012060e034b84c..d0227ffca0791f 100644 --- a/data_model/1.4/device_types/HeatPump.xml +++ b/data_model/1.4/device_types/HeatPump.xml @@ -1,66 +1,67 @@ - - @@ -69,4 +70,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/HumiditySensor.xml b/data_model/1.4/device_types/HumiditySensor.xml index c6def400a2a6bb..7a2a8c61e5bf78 100644 --- a/data_model/1.4/device_types/HumiditySensor.xml +++ b/data_model/1.4/device_types/HumiditySensor.xml @@ -1,59 +1,61 @@ - @@ -61,7 +63,6 @@ Davis, CA 95616, USA - @@ -75,4 +76,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/JointFabricAdmin.xml b/data_model/1.4/device_types/JointFabricAdmin.xml index 6c63dc9bdd96a1..b9fa8752ebe7b5 100644 --- a/data_model/1.4/device_types/JointFabricAdmin.xml +++ b/data_model/1.4/device_types/JointFabricAdmin.xml @@ -1,59 +1,61 @@ - @@ -68,4 +70,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/LaundryDryer.xml b/data_model/1.4/device_types/LaundryDryer.xml index 36dc182c393bd7..7c51ba553107c6 100644 --- a/data_model/1.4/device_types/LaundryDryer.xml +++ b/data_model/1.4/device_types/LaundryDryer.xml @@ -1,66 +1,67 @@ - - @@ -84,7 +85,7 @@ Davis, CA 95616, USA - + @@ -96,4 +97,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/LaundryWasher.xml b/data_model/1.4/device_types/LaundryWasher.xml index d88ee7e9fd94ca..41d440039a07bc 100644 --- a/data_model/1.4/device_types/LaundryWasher.xml +++ b/data_model/1.4/device_types/LaundryWasher.xml @@ -1,66 +1,67 @@ - - @@ -81,7 +82,7 @@ Davis, CA 95616, USA - + @@ -96,4 +97,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/LightSensor.xml b/data_model/1.4/device_types/LightSensor.xml index e7200e347726aa..d2b2d3a9ca58d7 100644 --- a/data_model/1.4/device_types/LightSensor.xml +++ b/data_model/1.4/device_types/LightSensor.xml @@ -1,59 +1,61 @@ - @@ -62,7 +64,6 @@ Davis, CA 95616, USA - @@ -76,4 +77,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/MicrowaveOven.xml b/data_model/1.4/device_types/MicrowaveOven.xml index 98d2902d049610..e02cf7afdc5fed 100644 --- a/data_model/1.4/device_types/MicrowaveOven.xml +++ b/data_model/1.4/device_types/MicrowaveOven.xml @@ -1,66 +1,67 @@ - - @@ -74,7 +75,7 @@ Davis, CA 95616, USA - + @@ -91,4 +92,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/ModeSelectDeviceType.xml b/data_model/1.4/device_types/ModeSelectDeviceType.xml index ad4cf56671243b..28c7ff3e9ad11c 100644 --- a/data_model/1.4/device_types/ModeSelectDeviceType.xml +++ b/data_model/1.4/device_types/ModeSelectDeviceType.xml @@ -1,69 +1,70 @@ - - - \ No newline at end of file + diff --git a/data_model/1.4/device_types/MountedDimmableLoadControl.xml b/data_model/1.4/device_types/MountedDimmableLoadControl.xml index d0cee6e5ef37cd..d282009d99f867 100644 --- a/data_model/1.4/device_types/MountedDimmableLoadControl.xml +++ b/data_model/1.4/device_types/MountedDimmableLoadControl.xml @@ -1,71 +1,72 @@ - - - + @@ -92,13 +93,13 @@ Davis, CA 95616, USA - + - + - + @@ -109,7 +110,7 @@ Davis, CA 95616, USA - + @@ -121,4 +122,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/MountedOnOffControl.xml b/data_model/1.4/device_types/MountedOnOffControl.xml index 09628bb4e0e9f0..2a6b568889df9b 100644 --- a/data_model/1.4/device_types/MountedOnOffControl.xml +++ b/data_model/1.4/device_types/MountedOnOffControl.xml @@ -1,71 +1,72 @@ - - - + @@ -92,13 +93,13 @@ Davis, CA 95616, USA - + - + - + @@ -109,7 +110,7 @@ Davis, CA 95616, USA - + @@ -121,4 +122,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/NetworkInfraIntro.xml b/data_model/1.4/device_types/NetworkInfraIntro.xml deleted file mode 100644 index e5bc56b1f095ac..00000000000000 --- a/data_model/1.4/device_types/NetworkInfraIntro.xml +++ /dev/null @@ -1,58 +0,0 @@ - - - \ No newline at end of file diff --git a/data_model/1.4/device_types/NetworkInfraManager.xml b/data_model/1.4/device_types/NetworkInfraManager.xml index a4d17e11c0faaa..c99c05e1e32fbc 100644 --- a/data_model/1.4/device_types/NetworkInfraManager.xml +++ b/data_model/1.4/device_types/NetworkInfraManager.xml @@ -1,66 +1,67 @@ - - @@ -72,4 +73,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/OccupancySensor.xml b/data_model/1.4/device_types/OccupancySensor.xml index f257bab38a7686..7600fe0ed8db2e 100644 --- a/data_model/1.4/device_types/OccupancySensor.xml +++ b/data_model/1.4/device_types/OccupancySensor.xml @@ -1,59 +1,61 @@ - @@ -63,7 +65,6 @@ Davis, CA 95616, USA - @@ -75,4 +76,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/OnOffLight.xml b/data_model/1.4/device_types/OnOffLight.xml index c74f5f79000919..ce841e89775ee2 100644 --- a/data_model/1.4/device_types/OnOffLight.xml +++ b/data_model/1.4/device_types/OnOffLight.xml @@ -1,59 +1,61 @@ - @@ -62,12 +64,11 @@ Davis, CA 95616, USA - - + @@ -94,13 +95,13 @@ Davis, CA 95616, USA - + - + - + @@ -111,7 +112,7 @@ Davis, CA 95616, USA - + @@ -123,4 +124,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/OnOffLightSwitch.xml b/data_model/1.4/device_types/OnOffLightSwitch.xml index 0cfa5ba7a3702c..0fcbf09a806076 100644 --- a/data_model/1.4/device_types/OnOffLightSwitch.xml +++ b/data_model/1.4/device_types/OnOffLightSwitch.xml @@ -1,59 +1,61 @@ - @@ -62,7 +64,6 @@ Davis, CA 95616, USA - @@ -83,4 +84,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/OnOffPlug-inUnit.xml b/data_model/1.4/device_types/OnOffPlug-inUnit.xml index 946f7919516e2d..b8bc8bc5c6987e 100644 --- a/data_model/1.4/device_types/OnOffPlug-inUnit.xml +++ b/data_model/1.4/device_types/OnOffPlug-inUnit.xml @@ -1,59 +1,61 @@ - @@ -62,12 +64,11 @@ Davis, CA 95616, USA - - + @@ -94,13 +95,13 @@ Davis, CA 95616, USA - + - + - + @@ -111,7 +112,7 @@ Davis, CA 95616, USA - + @@ -123,4 +124,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/OnOffSensor.xml b/data_model/1.4/device_types/OnOffSensor.xml index 0fc76f8314a6b5..832e44d5daf809 100644 --- a/data_model/1.4/device_types/OnOffSensor.xml +++ b/data_model/1.4/device_types/OnOffSensor.xml @@ -1,59 +1,61 @@ - @@ -62,7 +64,6 @@ Davis, CA 95616, USA - @@ -89,4 +90,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/OtaProvider.xml b/data_model/1.4/device_types/OtaProvider.xml index b148d27ebb74e5..4dfe9013b5c05d 100644 --- a/data_model/1.4/device_types/OtaProvider.xml +++ b/data_model/1.4/device_types/OtaProvider.xml @@ -1,59 +1,61 @@ - @@ -68,4 +70,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/OtaRequestor.xml b/data_model/1.4/device_types/OtaRequestor.xml index d782ee992c454b..d2fd3b460b3b8a 100644 --- a/data_model/1.4/device_types/OtaRequestor.xml +++ b/data_model/1.4/device_types/OtaRequestor.xml @@ -1,59 +1,61 @@ - @@ -68,4 +70,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/Oven.xml b/data_model/1.4/device_types/Oven.xml index d34bc4c52bfbb6..1c012d05489ace 100644 --- a/data_model/1.4/device_types/Oven.xml +++ b/data_model/1.4/device_types/Oven.xml @@ -1,59 +1,61 @@ - @@ -61,10 +63,9 @@ Davis, CA 95616, USA - - \ No newline at end of file + diff --git a/data_model/1.4/device_types/PowerSource.xml b/data_model/1.4/device_types/PowerSource.xml index 4e6c6defabccf9..f00ae14434b786 100644 --- a/data_model/1.4/device_types/PowerSource.xml +++ b/data_model/1.4/device_types/PowerSource.xml @@ -1,68 +1,70 @@ - - + - \ No newline at end of file + diff --git a/data_model/1.4/device_types/PressureSensor.xml b/data_model/1.4/device_types/PressureSensor.xml index 5b7ef86c25cc3d..c86c0c504eb030 100644 --- a/data_model/1.4/device_types/PressureSensor.xml +++ b/data_model/1.4/device_types/PressureSensor.xml @@ -1,59 +1,61 @@ - @@ -61,7 +63,6 @@ Davis, CA 95616, USA - @@ -75,4 +76,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/Pump.xml b/data_model/1.4/device_types/Pump.xml index a39cd97b87e7ad..13fbf2212189a2 100644 --- a/data_model/1.4/device_types/Pump.xml +++ b/data_model/1.4/device_types/Pump.xml @@ -1,59 +1,61 @@ - @@ -62,7 +64,6 @@ Davis, CA 95616, USA - @@ -107,4 +108,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/PumpController.xml b/data_model/1.4/device_types/PumpController.xml index 25e9a8e982b5ff..e71ab5325e50b5 100644 --- a/data_model/1.4/device_types/PumpController.xml +++ b/data_model/1.4/device_types/PumpController.xml @@ -1,59 +1,61 @@ - @@ -98,4 +100,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/RainSensor.xml b/data_model/1.4/device_types/RainSensor.xml index a03060c5415dc0..5d10d2683644e0 100644 --- a/data_model/1.4/device_types/RainSensor.xml +++ b/data_model/1.4/device_types/RainSensor.xml @@ -1,66 +1,67 @@ - - @@ -68,7 +69,7 @@ Davis, CA 95616, USA - + @@ -77,4 +78,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/Refrigerator.xml b/data_model/1.4/device_types/Refrigerator.xml index c8bdf86e3ef737..852dc6effd9fd8 100644 --- a/data_model/1.4/device_types/Refrigerator.xml +++ b/data_model/1.4/device_types/Refrigerator.xml @@ -1,59 +1,61 @@ - @@ -61,7 +63,6 @@ Davis, CA 95616, USA - @@ -74,7 +75,7 @@ Davis, CA 95616, USA - + @@ -83,4 +84,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/RoboticVacuumCleaner.xml b/data_model/1.4/device_types/RoboticVacuumCleaner.xml index 446410dfb7c60a..ed0ce08fdd9580 100644 --- a/data_model/1.4/device_types/RoboticVacuumCleaner.xml +++ b/data_model/1.4/device_types/RoboticVacuumCleaner.xml @@ -1,59 +1,61 @@ - @@ -62,7 +64,6 @@ Davis, CA 95616, USA - @@ -80,4 +81,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/RoomAirConditioner.xml b/data_model/1.4/device_types/RoomAirConditioner.xml index e2b3061a42b515..20b5767ca56adb 100644 --- a/data_model/1.4/device_types/RoomAirConditioner.xml +++ b/data_model/1.4/device_types/RoomAirConditioner.xml @@ -1,59 +1,61 @@ - @@ -61,7 +63,6 @@ Davis, CA 95616, USA - @@ -92,7 +93,7 @@ Davis, CA 95616, USA - + @@ -104,4 +105,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/RootNodeDeviceType.xml b/data_model/1.4/device_types/RootNodeDeviceType.xml index 99ce8fc319af47..304c62b10ec8d4 100644 --- a/data_model/1.4/device_types/RootNodeDeviceType.xml +++ b/data_model/1.4/device_types/RootNodeDeviceType.xml @@ -1,59 +1,61 @@ - @@ -62,12 +64,16 @@ Davis, CA 95616, USA + + + + - + @@ -174,4 +180,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/SecondaryNetworkInterface.xml b/data_model/1.4/device_types/SecondaryNetworkInterface.xml index 8217aea71529d0..ed65a5b0051687 100644 --- a/data_model/1.4/device_types/SecondaryNetworkInterface.xml +++ b/data_model/1.4/device_types/SecondaryNetworkInterface.xml @@ -1,59 +1,61 @@ - @@ -80,4 +82,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/SmokeCOAlarm.xml b/data_model/1.4/device_types/SmokeCOAlarm.xml index 769e6f5f91bbe1..cd247953c946d7 100644 --- a/data_model/1.4/device_types/SmokeCOAlarm.xml +++ b/data_model/1.4/device_types/SmokeCOAlarm.xml @@ -1,66 +1,67 @@ - - @@ -81,4 +82,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/SolarPower.xml b/data_model/1.4/device_types/SolarPower.xml index 7556fb519a685d..25345c27890fce 100644 --- a/data_model/1.4/device_types/SolarPower.xml +++ b/data_model/1.4/device_types/SolarPower.xml @@ -1,69 +1,70 @@ - - - \ No newline at end of file + diff --git a/data_model/1.4/device_types/Speaker.xml b/data_model/1.4/device_types/Speaker.xml index d3f9b1166e4458..11fd3ea3e57df3 100644 --- a/data_model/1.4/device_types/Speaker.xml +++ b/data_model/1.4/device_types/Speaker.xml @@ -1,66 +1,67 @@ - - @@ -69,4 +70,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/TemperatureControlledCabinet.xml b/data_model/1.4/device_types/TemperatureControlledCabinet.xml index 68788e22d7db06..45e7f43df144b0 100644 --- a/data_model/1.4/device_types/TemperatureControlledCabinet.xml +++ b/data_model/1.4/device_types/TemperatureControlledCabinet.xml @@ -1,59 +1,61 @@ - @@ -62,16 +64,20 @@ Davis, CA 95616, USA + + + + - + - + @@ -86,7 +92,7 @@ Davis, CA 95616, USA - + @@ -101,7 +107,7 @@ Davis, CA 95616, USA - + @@ -113,4 +119,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/TemperatureSensor.xml b/data_model/1.4/device_types/TemperatureSensor.xml index bf3221858dc103..ccc6d143a15f9c 100644 --- a/data_model/1.4/device_types/TemperatureSensor.xml +++ b/data_model/1.4/device_types/TemperatureSensor.xml @@ -1,59 +1,61 @@ - @@ -61,7 +63,6 @@ Davis, CA 95616, USA - @@ -75,4 +76,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/Thermostat.xml b/data_model/1.4/device_types/Thermostat.xml index dfc55d628a5b6e..11b495b88fca6c 100644 --- a/data_model/1.4/device_types/Thermostat.xml +++ b/data_model/1.4/device_types/Thermostat.xml @@ -1,59 +1,61 @@ - @@ -63,14 +65,13 @@ Davis, CA 95616, USA - - + @@ -84,15 +85,15 @@ Davis, CA 95616, USA - + - + - + @@ -113,4 +114,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/ThreadBorderRouter.xml b/data_model/1.4/device_types/ThreadBorderRouter.xml index 792f002801b9a0..5dc3d06ade928f 100644 --- a/data_model/1.4/device_types/ThreadBorderRouter.xml +++ b/data_model/1.4/device_types/ThreadBorderRouter.xml @@ -1,66 +1,67 @@ - - @@ -72,4 +73,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/VideoRemoteControl.xml b/data_model/1.4/device_types/VideoRemoteControl.xml index de83b02508a89f..2b920feb6a3c68 100644 --- a/data_model/1.4/device_types/VideoRemoteControl.xml +++ b/data_model/1.4/device_types/VideoRemoteControl.xml @@ -1,59 +1,61 @@ - @@ -61,7 +63,6 @@ Davis, CA 95616, USA - @@ -109,4 +110,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/WaterFreezeDetector.xml b/data_model/1.4/device_types/WaterFreezeDetector.xml index b2f4a49a7847e4..614bf30050d979 100644 --- a/data_model/1.4/device_types/WaterFreezeDetector.xml +++ b/data_model/1.4/device_types/WaterFreezeDetector.xml @@ -1,66 +1,67 @@ - - @@ -68,7 +69,7 @@ Davis, CA 95616, USA - + @@ -77,4 +78,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/WaterHeater.xml b/data_model/1.4/device_types/WaterHeater.xml index 975e9f2bb4b850..2647c010fc059b 100644 --- a/data_model/1.4/device_types/WaterHeater.xml +++ b/data_model/1.4/device_types/WaterHeater.xml @@ -1,66 +1,67 @@ - - @@ -80,4 +81,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/WaterLeakDetector.xml b/data_model/1.4/device_types/WaterLeakDetector.xml index 7277ce69908fb6..683b841adc4593 100644 --- a/data_model/1.4/device_types/WaterLeakDetector.xml +++ b/data_model/1.4/device_types/WaterLeakDetector.xml @@ -1,66 +1,67 @@ - - @@ -68,7 +69,7 @@ Davis, CA 95616, USA - + @@ -77,4 +78,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/WaterValve.xml b/data_model/1.4/device_types/WaterValve.xml index 21b77edf5fc614..57f88a717c2a9c 100644 --- a/data_model/1.4/device_types/WaterValve.xml +++ b/data_model/1.4/device_types/WaterValve.xml @@ -1,66 +1,67 @@ - - @@ -75,4 +76,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/WindowCovering.xml b/data_model/1.4/device_types/WindowCovering.xml index da8780b3c94be4..75b97cae6173f1 100644 --- a/data_model/1.4/device_types/WindowCovering.xml +++ b/data_model/1.4/device_types/WindowCovering.xml @@ -1,59 +1,61 @@ - @@ -62,7 +64,6 @@ Davis, CA 95616, USA - @@ -70,7 +71,7 @@ Davis, CA 95616, USA - + @@ -86,4 +87,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/device_types/WindowCoveringController.xml b/data_model/1.4/device_types/WindowCoveringController.xml index 189fee3d9d6303..56c17bfe51eb65 100644 --- a/data_model/1.4/device_types/WindowCoveringController.xml +++ b/data_model/1.4/device_types/WindowCoveringController.xml @@ -1,59 +1,61 @@ - @@ -62,7 +64,6 @@ Davis, CA 95616, USA - @@ -73,7 +74,7 @@ Davis, CA 95616, USA - + @@ -89,4 +90,4 @@ Davis, CA 95616, USA - \ No newline at end of file + diff --git a/data_model/1.4/scraper_version b/data_model/1.4/scraper_version index c813fe116c9f9e..0705c7f52f2253 100644 --- a/data_model/1.4/scraper_version +++ b/data_model/1.4/scraper_version @@ -1 +1 @@ -1.2.5 +alchemy version: 1.5.0 (585e1dc) diff --git a/scripts/spec_xml/generate_spec_xml.py b/scripts/spec_xml/generate_spec_xml.py index e6a772246838d5..e72da49cf34c09 100755 --- a/scripts/spec_xml/generate_spec_xml.py +++ b/scripts/spec_xml/generate_spec_xml.py @@ -14,6 +14,7 @@ # See the License for the specific language governing permissions and # limitations under the License. +import contextlib import glob import json import os @@ -24,10 +25,33 @@ import click from chip.testing.spec_parsing import build_xml_clusters -from paths import get_chip_root, get_documentation_file_path, get_in_progress_defines +from paths import get_chip_root, get_documentation_file_path + +CURRENT_IN_PROGRESS_DEFINES = [ + "cameras", + "closures", + "device-location", + "endpointuniqueid", + "energy-drlc", + "energy-mtrid", + "energy-price", + "energy-tariff", + "hrap-2", + "hrap-tbrd", + "hvac-preset-suggestions", + "hvac-thermostat-events", + "irrigation-system", + "metering network-recovery", + "nfcCommissioning", + "paftp", + "rvc-direct-mode", + "rvc-moreopstates", + "rvc-vacthenmop", + "soil-sensor", + "thermostat-controller", + "tls", +] -# Use the get_in_progress_defines() function to fetch the in-progress defines -CURRENT_IN_PROGRESS_DEFINES = get_in_progress_defines() # Replace hardcoded paths with dynamic paths using paths.py functions DEFAULT_CHIP_ROOT = get_chip_root() @@ -78,14 +102,64 @@ def make_asciidoc(target: str, include_in_progress: str, spec_dir: str, dry_run: @click.option( '--include-in-progress', type=click.Choice(['All', 'None', 'Current']), default='All') -def main(scraper, spec_root, output_dir, dry_run, include_in_progress): - scrape_clusters(scraper, spec_root, output_dir, dry_run, include_in_progress) - scrape_device_types(scraper, spec_root, output_dir, dry_run, include_in_progress) +@click.option( + '--legacy', + default=False, + is_flag=True, + help='Use the DM editor spec scraper (legacy) rather than alchemy') +def main(scraper, spec_root, output_dir, dry_run, include_in_progress, legacy): + if legacy: + scrape_clusters(scraper, spec_root, output_dir, dry_run, include_in_progress) + scrape_device_types(scraper, spec_root, output_dir, dry_run, include_in_progress) + else: + scrape_all(scraper, spec_root, output_dir, dry_run, include_in_progress) if not dry_run: - dump_versions(scraper, spec_root, output_dir) + dump_versions(scraper, spec_root, output_dir, legacy) dump_cluster_ids(output_dir) +def scrape_all(scraper, spec_root, output_dir, dry_run, include_in_progress): + print('Generating main spec to get file include list - this may take a few minutes') + main_out = make_asciidoc('pdf', include_in_progress, spec_root, dry_run) + print('Generating cluster spec to get file include list - this may take a few minutes') + cluster_out = make_asciidoc('pdf-appclusters-book', include_in_progress, spec_root, dry_run) + print('Generating device type library to get file include list - this may take a few minutes') + device_type_files = make_asciidoc('pdf-devicelibrary-book', include_in_progress, spec_root, dry_run) + + cluster_files = main_out + cluster_out + cmd = [scraper, 'dm', '--dmRoot', output_dir, '--specRoot', spec_root] + if include_in_progress == 'All': + cmd.extend(['-a', 'in-progress']) + elif include_in_progress == 'Current': + for d in CURRENT_IN_PROGRESS_DEFINES: + cmd.extend(['-a']) + cmd.extend([d]) + + if (dry_run): + print(cmd) + return + subprocess.run(cmd) + # Remove all the files that weren't compiled into the spec + clusters_output_dir = os.path.join(output_dir, 'clusters') + device_types_output_dir = os.path.abspath(os.path.join(output_dir, 'device_types')) + for filename in os.listdir(clusters_output_dir): + # There are a couple of clusters that appear in the same adoc file and they have prefixes. + # Look for these specifically. + # For 1.5 onward, we should separate these. + if "Label-Cluster" in filename or "bridge-clusters" in filename: + continue + adoc = os.path.basename(filename).replace('.xml', '.adoc') + if adoc not in cluster_files: + print(f'Removing {adoc} as it was not in the generated spec document') + os.remove(os.path.join(clusters_output_dir, filename)) + + for filename in os.listdir(device_types_output_dir): + adoc = os.path.basename(filename).replace('.xml', '.adoc') + if adoc not in device_type_files: + print(f'Removing {adoc} as it was not in the generated spec document') + os.remove(os.path.join(device_types_output_dir, filename)) + + def scrape_clusters(scraper, spec_root, output_dir, dry_run, include_in_progress): src_dir = os.path.abspath(os.path.join(spec_root, 'src')) sdm_clusters_dir = os.path.abspath(os.path.join(src_dir, 'service_device_management')) @@ -173,20 +247,38 @@ def scrape_device_type(filename: str) -> None: scrape_device_type(filename) -def dump_versions(scraper, spec_root, output_dir): +def dump_versions(scraper, spec_root, output_dir, legacy): sha_file = os.path.abspath(os.path.join(output_dir, 'spec_sha')) + tag_file = os.path.abspath(os.path.join(output_dir, 'spec_tag')) out = subprocess.run(['git', 'rev-parse', 'HEAD'], capture_output=True, encoding="utf8", cwd=spec_root) sha = out.stdout with open(sha_file, 'wt', encoding='utf8') as output: output.write(sha) + cmd = ['git', 'show-ref', '--tags'] + out = subprocess.run(cmd, capture_output=True, encoding="utf-8", cwd=spec_root) + tags = out.stdout.splitlines() + tag = [t for t in tags if sha.strip() in t] + if tag: + with open(tag_file, 'wt', encoding='utf8') as output: + output.write(f'{tag[0].split("/")[-1]}\n') + else: + print(f"WARNING: no tag found for sha {sha}") + with contextlib.suppress(FileNotFoundError): + os.remove(tag_file) scraper_file = os.path.abspath(os.path.join(output_dir, 'scraper_version')) - out = subprocess.run([scraper, '--version'], + version_cmd = 'version' + if legacy: + version_cmd = '--version' + out = subprocess.run([scraper, version_cmd], capture_output=True, encoding="utf8") version = out.stdout with open(scraper_file, "wt", encoding='utf8') as output: - output.write(version) + if legacy: + output.write(version) + else: + output.write(f'alchemy {version}') def dump_cluster_ids(output_dir): diff --git a/src/python_testing/matter_testing_infrastructure/data_model_xmls.gni b/src/python_testing/matter_testing_infrastructure/data_model_xmls.gni index 066537816a5c9a..fc2d80305e6789 100644 --- a/src/python_testing/matter_testing_infrastructure/data_model_xmls.gni +++ b/src/python_testing/matter_testing_infrastructure/data_model_xmls.gni @@ -332,7 +332,6 @@ data_model_XMLS = [ "${chip_root}/data_model/1.4/device_types/ModeSelectDeviceType.xml", "${chip_root}/data_model/1.4/device_types/MountedDimmableLoadControl.xml", "${chip_root}/data_model/1.4/device_types/MountedOnOffControl.xml", - "${chip_root}/data_model/1.4/device_types/NetworkInfraIntro.xml", "${chip_root}/data_model/1.4/device_types/NetworkInfraManager.xml", "${chip_root}/data_model/1.4/device_types/OccupancySensor.xml", "${chip_root}/data_model/1.4/device_types/OnOffLight.xml", From 2ce3daf293974746876810733ee068719e10d72c Mon Sep 17 00:00:00 2001 From: Adrian Gielniewski Date: Wed, 29 Jan 2025 16:55:30 +0100 Subject: [PATCH 11/36] [nrfconnect] Fix ZEPHYR_SDK_INSTALL_DIR in chip-build-vscode (#37302) Signed-off-by: Adrian Gielniewski --- integrations/docker/images/base/chip-build/version | 2 +- integrations/docker/images/vscode/chip-build-vscode/Dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/integrations/docker/images/base/chip-build/version b/integrations/docker/images/base/chip-build/version index 60379853bb3fdc..db931482d45485 100644 --- a/integrations/docker/images/base/chip-build/version +++ b/integrations/docker/images/base/chip-build/version @@ -1 +1 @@ -101 : [Silabs] Update Silabs docker to support MG26 Modules. +102 : [nrfconnect] Fix ZEPHYR_SDK_INSTALL_DIR in chip-build-vscode diff --git a/integrations/docker/images/vscode/chip-build-vscode/Dockerfile b/integrations/docker/images/vscode/chip-build-vscode/Dockerfile index a9a2c9d690e24a..45834408fd44aa 100644 --- a/integrations/docker/images/vscode/chip-build-vscode/Dockerfile +++ b/integrations/docker/images/vscode/chip-build-vscode/Dockerfile @@ -129,7 +129,7 @@ ENV TELINK_ZEPHYR_BASE=/opt/telink/zephyrproject/zephyr ENV TELINK_ZEPHYR_SDK_DIR=/opt/telink/zephyr-sdk-0.16.1 ENV TI_SYSCONFIG_ROOT=/opt/ti/sysconfig_1.18.1 ENV ZEPHYR_BASE=/opt/NordicSemiconductor/nrfconnect/zephyr -ENV ZEPHYR_SDK_INSTALL_DIR=/opt/NordicSemiconductor/nRF5_tools/zephyr-sdk-0.16.5 +ENV ZEPHYR_SDK_INSTALL_DIR=/opt/NordicSemiconductor/nRF5_tools/zephyr-sdk-0.17.0 ENV ZEPHYR_TOOLCHAIN_VARIANT=gnuarmemb ENV ZEPHYR_NXP_BASE=/opt/nxp-zephyr/zephyrproject/zephyr ENV ZEPHYR_NXP_SDK_INSTALL_DIR=/opt/nxp-zephyr/zephyr-sdk-0.17.0 From 2399e4279a4e2615f27e5249359e282c75b75013 Mon Sep 17 00:00:00 2001 From: "Olivier LORENTE [ST]" <34505085+OlivierGre@users.noreply.github.com> Date: Wed, 29 Jan 2025 16:57:16 +0100 Subject: [PATCH 12/36] Changed Dockerfile for crosscompile image. (#37300) * Changed Dockerfile for crosscompile image. Now pointing to a new sysroot. Changed needed for NFC Commissioning. * Bumped version --------- Co-authored-by: Andrei Litvin --- integrations/docker/images/base/chip-build/version | 2 +- .../docker/images/stage-1/chip-build-crosscompile/Dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/integrations/docker/images/base/chip-build/version b/integrations/docker/images/base/chip-build/version index db931482d45485..e760cfdf5e679a 100644 --- a/integrations/docker/images/base/chip-build/version +++ b/integrations/docker/images/base/chip-build/version @@ -1 +1 @@ -102 : [nrfconnect] Fix ZEPHYR_SDK_INSTALL_DIR in chip-build-vscode +103 : Changed sysroot for crosscompile image (new ubuntu version and includes NFC libs) diff --git a/integrations/docker/images/stage-1/chip-build-crosscompile/Dockerfile b/integrations/docker/images/stage-1/chip-build-crosscompile/Dockerfile index 5fa709e30d10b9..24c7280f5d68f1 100644 --- a/integrations/docker/images/stage-1/chip-build-crosscompile/Dockerfile +++ b/integrations/docker/images/stage-1/chip-build-crosscompile/Dockerfile @@ -17,7 +17,7 @@ WORKDIR /opt RUN set -x \ && git clone --depth 1 https://chromium.googlesource.com/chromium/tools/depot_tools.git /opt/depot_tools \ # TODO: Remove experimental solution to create the sysroot file in cross-compile image - && echo 'experimental/matter/sysroot/ubuntu-22.04.1-aarch64 latest' > ensure_file.txt \ + && echo 'experimental/matter/sysroot/ubuntu-24.04-aarch64 version:build-2025.01.28' > ensure_file.txt \ && ./depot_tools/cipd ensure -ensure-file ensure_file.txt -root ./ \ && tar xfvJ ubuntu-22.04.1-aarch64-sysroot.tar.xz \ && rm -rf /opt/ubuntu-22.04.1-aarch64-sysroot/usr/lib/firmware \ From bb4ba895a64e450130b875a520aa25ca4334a369 Mon Sep 17 00:00:00 2001 From: Andrei Litvin Date: Wed, 29 Jan 2025 11:02:40 -0500 Subject: [PATCH 13/36] Fix sysroot paths (#37303) --- .../chip-build-crosscompile/Dockerfile | 42 +++++++++---------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/integrations/docker/images/stage-1/chip-build-crosscompile/Dockerfile b/integrations/docker/images/stage-1/chip-build-crosscompile/Dockerfile index 24c7280f5d68f1..bcf8ac55dd79a3 100644 --- a/integrations/docker/images/stage-1/chip-build-crosscompile/Dockerfile +++ b/integrations/docker/images/stage-1/chip-build-crosscompile/Dockerfile @@ -3,34 +3,34 @@ FROM ghcr.io/project-chip/chip-build:${VERSION} as build LABEL org.opencontainers.image.source https://github.com/project-chip/connectedhomeip RUN set -x \ - && apt-get update \ - && DEBIAN_FRONTEND=noninteractive apt-get install -fy --no-install-recommends \ - git \ - xz-utils \ - && apt-get clean \ - && rm -rf /var/lib/apt/lists/ \ - && : # last line + && apt-get update \ + && DEBIAN_FRONTEND=noninteractive apt-get install -fy --no-install-recommends \ + git \ + xz-utils \ + && apt-get clean \ + && rm -rf /var/lib/apt/lists/ \ + && : # last line WORKDIR /opt # Unpack the sysroot, while also removing some rather large items in it that # are generally not required for compilation RUN set -x \ - && git clone --depth 1 https://chromium.googlesource.com/chromium/tools/depot_tools.git /opt/depot_tools \ - # TODO: Remove experimental solution to create the sysroot file in cross-compile image - && echo 'experimental/matter/sysroot/ubuntu-24.04-aarch64 version:build-2025.01.28' > ensure_file.txt \ - && ./depot_tools/cipd ensure -ensure-file ensure_file.txt -root ./ \ - && tar xfvJ ubuntu-22.04.1-aarch64-sysroot.tar.xz \ - && rm -rf /opt/ubuntu-22.04.1-aarch64-sysroot/usr/lib/firmware \ - && rm -rf /opt/ubuntu-22.04.1-aarch64-sysroot/usr/lib/git-core \ - && rm -rf /opt/ubuntu-22.04.1-aarch64-sysroot/usr/lib/modules \ - && rm -rf /opt/ubuntu-22.04.1-aarch64-sysroot/lib/firmware \ - && rm -rf /opt/ubuntu-22.04.1-aarch64-sysroot/lib/git-core \ - && rm -rf /opt/ubuntu-22.04.1-aarch64-sysroot/lib/modules \ - && : # last line + && git clone --depth 1 https://chromium.googlesource.com/chromium/tools/depot_tools.git /opt/depot_tools \ + # TODO: Remove experimental solution to create the sysroot file in cross-compile image + && echo 'experimental/matter/sysroot/ubuntu-24.04-aarch64 version:build-2025.01.28' > ensure_file.txt \ + && ./depot_tools/cipd ensure -ensure-file ensure_file.txt -root ./ \ + && tar xfvJ ubuntu-24.04.1-aarch64-sysroot.tar.xz \ + && rm -rf /opt/ubuntu-24.04.1-aarch64-sysroot/usr/lib/firmware \ + && rm -rf /opt/ubuntu-24.04.1-aarch64-sysroot/usr/lib/git-core \ + && rm -rf /opt/ubuntu-24.04.1-aarch64-sysroot/usr/lib/modules \ + && rm -rf /opt/ubuntu-24.04.1-aarch64-sysroot/lib/firmware \ + && rm -rf /opt/ubuntu-24.04.1-aarch64-sysroot/lib/git-core \ + && rm -rf /opt/ubuntu-24.04.1-aarch64-sysroot/lib/modules \ + && : # last line FROM ghcr.io/project-chip/chip-build:${VERSION} LABEL org.opencontainers.image.source https://github.com/project-chip/connectedhomeip -COPY --from=build /opt/ubuntu-22.04.1-aarch64-sysroot/ /opt/ubuntu-22.04.1-aarch64-sysroot/ +COPY --from=build /opt/ubuntu-24.04.1-aarch64-sysroot/ /opt/ubuntu-24.04.1-aarch64-sysroot/ -ENV SYSROOT_AARCH64=/opt/ubuntu-22.04.1-aarch64-sysroot +ENV SYSROOT_AARCH64=/opt/ubuntu-24.04.1-aarch64-sysroot From 2ca3a4957d78f23f00a67bc140613de4d905b46e Mon Sep 17 00:00:00 2001 From: Andrei Litvin Date: Wed, 29 Jan 2025 11:08:25 -0500 Subject: [PATCH 14/36] Fix paths again (#37304) --- .../stage-1/chip-build-crosscompile/Dockerfile | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/integrations/docker/images/stage-1/chip-build-crosscompile/Dockerfile b/integrations/docker/images/stage-1/chip-build-crosscompile/Dockerfile index bcf8ac55dd79a3..8bc3f0c4df92fb 100644 --- a/integrations/docker/images/stage-1/chip-build-crosscompile/Dockerfile +++ b/integrations/docker/images/stage-1/chip-build-crosscompile/Dockerfile @@ -19,18 +19,17 @@ RUN set -x \ # TODO: Remove experimental solution to create the sysroot file in cross-compile image && echo 'experimental/matter/sysroot/ubuntu-24.04-aarch64 version:build-2025.01.28' > ensure_file.txt \ && ./depot_tools/cipd ensure -ensure-file ensure_file.txt -root ./ \ - && tar xfvJ ubuntu-24.04.1-aarch64-sysroot.tar.xz \ - && rm -rf /opt/ubuntu-24.04.1-aarch64-sysroot/usr/lib/firmware \ - && rm -rf /opt/ubuntu-24.04.1-aarch64-sysroot/usr/lib/git-core \ - && rm -rf /opt/ubuntu-24.04.1-aarch64-sysroot/usr/lib/modules \ - && rm -rf /opt/ubuntu-24.04.1-aarch64-sysroot/lib/firmware \ - && rm -rf /opt/ubuntu-24.04.1-aarch64-sysroot/lib/git-core \ - && rm -rf /opt/ubuntu-24.04.1-aarch64-sysroot/lib/modules \ + && rm -rf /opt/ubuntu-24.04-aarch64-sysroot/usr/lib/firmware \ + && rm -rf /opt/ubuntu-24.04-aarch64-sysroot/usr/lib/git-core \ + && rm -rf /opt/ubuntu-24.04-aarch64-sysroot/usr/lib/modules \ + && rm -rf /opt/ubuntu-24.04-aarch64-sysroot/lib/firmware \ + && rm -rf /opt/ubuntu-24.04-aarch64-sysroot/lib/git-core \ + && rm -rf /opt/ubuntu-24.04-aarch64-sysroot/lib/modules \ && : # last line FROM ghcr.io/project-chip/chip-build:${VERSION} LABEL org.opencontainers.image.source https://github.com/project-chip/connectedhomeip -COPY --from=build /opt/ubuntu-24.04.1-aarch64-sysroot/ /opt/ubuntu-24.04.1-aarch64-sysroot/ +COPY --from=build /opt/ubuntu-24.04-aarch64-sysroot/ /opt/ubuntu-24.04-aarch64-sysroot/ -ENV SYSROOT_AARCH64=/opt/ubuntu-24.04.1-aarch64-sysroot +ENV SYSROOT_AARCH64=/opt/ubuntu-24.04-aarch64-sysroot From e80451c0d2c6a27ca56ec6d4dd74a82ff3413372 Mon Sep 17 00:00:00 2001 From: Vivien Nicolas Date: Wed, 29 Jan 2025 18:45:33 +0100 Subject: [PATCH 15/36] [chip-tool] Add Enhanced Commissioning Support (T&C Flow via Local DCL) to chip-tool (#37049) * [chip-tool] Add chip-tool dcl fake cluster commands * [chip-tool] Add a fake local dcl server script for testing/developement purposes * [chip-tool] Add chip-tool dcl tc-display and tc-display-by-payload commands * [General Commissioning Server] Dynamically encode the feature map 'GeneralCommissioning::Feature::kTermsAndConditions' if CHIP_CONFIG_TERMS_AND_CONDITIONS_REQUIRED is set * [Examples/platform/linux] Set default TermsAndConditions if requested from the command line * [chip-tool] Add TermsAndConditions support to chip-tool pairing code command --- examples/chip-tool/BUILD.gn | 15 + examples/chip-tool/commands/dcl/Commands.h | 37 ++ examples/chip-tool/commands/dcl/DCLClient.cpp | 241 +++++++++++++ examples/chip-tool/commands/dcl/DCLClient.h | 100 ++++++ examples/chip-tool/commands/dcl/DCLCommands.h | 202 +++++++++++ .../dcl/DisplayTermsAndConditions.cpp | 230 ++++++++++++ .../commands/dcl/DisplayTermsAndConditions.h | 44 +++ .../chip-tool/commands/dcl/HTTPSRequest.cpp | 339 ++++++++++++++++++ .../chip-tool/commands/dcl/HTTPSRequest.h | 39 ++ .../commands/dcl/JsonSchemaMacros.cpp | 64 ++++ .../chip-tool/commands/dcl/JsonSchemaMacros.h | 41 +++ .../chip-tool/commands/dcl/test_dcl_server.py | 245 +++++++++++++ .../commands/pairing/PairingCommand.cpp | 27 ++ .../commands/pairing/PairingCommand.h | 8 + examples/chip-tool/main.cpp | 2 + examples/platform/linux/AppMain.cpp | 14 + examples/platform/linux/Options.cpp | 28 ++ examples/platform/linux/Options.h | 5 + .../general-commissioning-server.cpp | 8 + third_party/boringssl/repo/BUILD.gn | 16 + 20 files changed, 1705 insertions(+) create mode 100644 examples/chip-tool/commands/dcl/Commands.h create mode 100644 examples/chip-tool/commands/dcl/DCLClient.cpp create mode 100644 examples/chip-tool/commands/dcl/DCLClient.h create mode 100644 examples/chip-tool/commands/dcl/DCLCommands.h create mode 100644 examples/chip-tool/commands/dcl/DisplayTermsAndConditions.cpp create mode 100644 examples/chip-tool/commands/dcl/DisplayTermsAndConditions.h create mode 100644 examples/chip-tool/commands/dcl/HTTPSRequest.cpp create mode 100644 examples/chip-tool/commands/dcl/HTTPSRequest.h create mode 100644 examples/chip-tool/commands/dcl/JsonSchemaMacros.cpp create mode 100644 examples/chip-tool/commands/dcl/JsonSchemaMacros.h create mode 100755 examples/chip-tool/commands/dcl/test_dcl_server.py diff --git a/examples/chip-tool/BUILD.gn b/examples/chip-tool/BUILD.gn index acacbc70e8bfad..992fbd53e4ecf5 100644 --- a/examples/chip-tool/BUILD.gn +++ b/examples/chip-tool/BUILD.gn @@ -23,6 +23,9 @@ if (config_use_interactive_mode) { import("//build_overrides/editline.gni") } +import("${chip_root}/build_overrides/boringssl.gni") +import("${chip_root}/src/crypto/crypto.gni") + assert(chip_build_tools) config("config") { @@ -67,6 +70,14 @@ static_library("chip-tool-utils") { "commands/common/HexConversion.h", "commands/common/RemoteDataModelLogger.cpp", "commands/common/RemoteDataModelLogger.h", + "commands/dcl/DCLClient.cpp", + "commands/dcl/DCLClient.h", + "commands/dcl/DisplayTermsAndConditions.cpp", + "commands/dcl/DisplayTermsAndConditions.h", + "commands/dcl/HTTPSRequest.cpp", + "commands/dcl/HTTPSRequest.h", + "commands/dcl/JsonSchemaMacros.cpp", + "commands/dcl/JsonSchemaMacros.h", "commands/delay/SleepCommand.cpp", "commands/delay/WaitForCommissioneeCommand.cpp", "commands/discover/DiscoverCommand.cpp", @@ -102,6 +113,10 @@ static_library("chip-tool-utils") { sources += [ "commands/common/DeviceScanner.cpp" ] } + if (chip_device_platform == "darwin" || chip_crypto == "boringssl") { + deps += [ "${boringssl_root}:boringssl_with_ssl_sources" ] + } + public_deps = [ "${chip_root}/examples/common/tracing:commandline", "${chip_root}/src/app/icd/client:handler", diff --git a/examples/chip-tool/commands/dcl/Commands.h b/examples/chip-tool/commands/dcl/Commands.h new file mode 100644 index 00000000000000..05220771fcda09 --- /dev/null +++ b/examples/chip-tool/commands/dcl/Commands.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2022 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 "commands/common/Commands.h" +#include "commands/dcl/DCLCommands.h" + +void registerCommandsDCL(Commands & commands) +{ + const char * clusterName = "DCL"; + commands_list clusterCommands = { + make_unique(), // + make_unique(), // + make_unique(), // + make_unique(), // + make_unique(), // + make_unique(), // + }; + + commands.RegisterCommandSet(clusterName, clusterCommands, "Commands to interact with the DCL."); +} diff --git a/examples/chip-tool/commands/dcl/DCLClient.cpp b/examples/chip-tool/commands/dcl/DCLClient.cpp new file mode 100644 index 00000000000000..ada5d8113d7d05 --- /dev/null +++ b/examples/chip-tool/commands/dcl/DCLClient.cpp @@ -0,0 +1,241 @@ +/* + * 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 "DCLClient.h" + +#include +#include +#include +#include + +#include "HTTPSRequest.h" +#include "JsonSchemaMacros.h" + +namespace { +constexpr const char * kDefaultDCLHostName = "on.dcl.csa-iot.org"; +constexpr const char * kErrorSchemaValidation = "Model schema validation failed for response content: "; +constexpr const char * kErrorVendorIdIsZero = "Invalid argument: Vendor ID should not be 0"; +constexpr const char * kErrorProductIdIsZero = "Invalid argument: Product ID should not be 0"; +constexpr const char * kErrorOrdinalValueTooLarge = "Ordinal value exceeds the maximum allowable bits: "; +constexpr const char * kRequestModelVendorProductPath = "/dcl/model/models/%u/%u"; +constexpr uint8_t kRequestPathBufferSize = 64; +constexpr uint16_t kTermsAndConditionSchemaVersion = 1; +} // namespace + +namespace chip { +namespace tool { +namespace dcl { + +namespace { +CHIP_ERROR ValidateModelSchema(const Json::Value & json) +{ + CHECK_REQUIRED_TYPE(json, model, Object) + auto model = json["model"]; + + CHECK_REQUIRED_TYPE(model, commissioningCustomFlow, UInt); + + // The "enhancedSetupFlowOptions" field is theoretically required by the schema. + // However, the current DCL implementation does not include it. + // To handle this gracefully, we inject the field and set its value to 0 if it is missing. + if (!model.isMember("enhancedSetupFlowOptions")) + { + model["enhancedSetupFlowOptions"] = 0; + } + + CHECK_REQUIRED_TYPE(model, enhancedSetupFlowOptions, UInt) + + // Check if enhancedSetupFlowOptions has bit 0 set. + // Bit 0 indicates that enhanced setup flow is enabled. + auto enhancedSetupFlowOptions = model["enhancedSetupFlowOptions"]; + VerifyOrReturnError((enhancedSetupFlowOptions.asUInt() & 0x01) != 0, CHIP_NO_ERROR); + + // List of required keys in the "model" object if enhancedSetupFlowOptions has bit 0 set. + CHECK_REQUIRED_TYPE(model, enhancedSetupFlowTCUrl, String) + CHECK_REQUIRED_TYPE(model, enhancedSetupFlowTCDigest, String) + CHECK_REQUIRED_TYPE(model, enhancedSetupFlowTCFileSize, UInt) + CHECK_REQUIRED_TYPE(model, enhancedSetupFlowTCRevision, UInt) + CHECK_REQUIRED_TYPE(model, enhancedSetupFlowMaintenanceUrl, String) + + return CHIP_NO_ERROR; +} + +CHIP_ERROR ValidateModelCustomFlow(const Json::Value & json, CommissioningFlow payloadCommissioningFlow) +{ + auto model = json["model"]; + CHECK_REQUIRED_VALUE(model, commissioningCustomFlow, to_underlying(payloadCommissioningFlow)) + return CHIP_NO_ERROR; +} + +CHIP_ERROR ValidateTCLanguageEntries(const Json::Value & languageEntries) +{ + for (Json::Value::const_iterator it = languageEntries.begin(); it != languageEntries.end(); it++) + { + const Json::Value & languageArray = *it; + + CHECK_TYPE(languageArray, languageArray, Array); + + for (Json::ArrayIndex i = 0; i < languageArray.size(); i++) + { + const Json::Value & term = languageArray[i]; + CHECK_REQUIRED_TYPE(term, title, String); + CHECK_REQUIRED_TYPE(term, text, String); + CHECK_REQUIRED_TYPE(term, required, Bool); + CHECK_REQUIRED_TYPE(term, ordinal, UInt); + + auto ordinal = term["ordinal"].asUInt(); + VerifyOrReturnError(ordinal < 16, CHIP_ERROR_INVALID_ARGUMENT, + ChipLogError(chipTool, "%s%u", kErrorOrdinalValueTooLarge, ordinal)); + } + } + + return CHIP_NO_ERROR; +} + +CHIP_ERROR ValidateTCCountryEntries(const Json::Value & countryEntries) +{ + for (Json::Value::const_iterator it = countryEntries.begin(); it != countryEntries.end(); it++) + { + const Json::Value & countryEntry = *it; + + CHECK_REQUIRED_TYPE(countryEntry, defaultLanguage, String); + CHECK_REQUIRED_TYPE(countryEntry, languageEntries, Object); + + ReturnErrorOnFailure(ValidateTCLanguageEntries(countryEntry["languageEntries"])); + } + + return CHIP_NO_ERROR; +} + +CHIP_ERROR ValidateTermsAndConditionsSchema(const Json::Value & tc, unsigned int expectedEnhancedSetupFlowTCRevision) +{ + CHECK_REQUIRED_VALUE(tc, schemaVersion, kTermsAndConditionSchemaVersion) + CHECK_REQUIRED_TYPE(tc, esfRevision, UInt) + CHECK_REQUIRED_TYPE(tc, defaultCountry, String) + CHECK_REQUIRED_TYPE(tc, countryEntries, Object) + CHECK_REQUIRED_VALUE(tc, esfRevision, expectedEnhancedSetupFlowTCRevision) + return ValidateTCCountryEntries(tc["countryEntries"]); +} + +CHIP_ERROR RequestTermsAndConditions(const Json::Value & json, Json::Value & tc) +{ + auto & model = json["model"]; + if ((model["enhancedSetupFlowOptions"].asUInt() & 0x01) == 0) + { + ChipLogProgress(chipTool, + "Enhanced setup flow is not enabled for this model (bit 0 of enhancedSetupFlowOptions is not set). No " + "Terms and Conditions are required for this configuration."); + tc = Json::nullValue; + return CHIP_NO_ERROR; + } + + auto & enhancedSetupFlowTCUrl = model["enhancedSetupFlowTCUrl"]; + auto & enhancedSetupFlowTCFileSize = model["enhancedSetupFlowTCFileSize"]; + auto & enhancedSetupFlowTCDigest = model["enhancedSetupFlowTCDigest"]; + auto & enhancedSetupFlowTCRevision = model["enhancedSetupFlowTCRevision"]; + + auto * tcUrl = enhancedSetupFlowTCUrl.asCString(); + const auto optionalFileSize = MakeOptional(static_cast(enhancedSetupFlowTCFileSize.asUInt())); + const auto optionalDigest = MakeOptional(enhancedSetupFlowTCDigest.asCString()); + ReturnErrorOnFailure(https::Request(tcUrl, tc, optionalFileSize, optionalDigest)); + ReturnErrorOnFailure(ValidateTermsAndConditionsSchema(tc, enhancedSetupFlowTCRevision.asUInt())); + + return CHIP_NO_ERROR; +} + +} // namespace + +DCLClient::DCLClient(Optional hostname, Optional port) +{ + mHostName = hostname.ValueOr(kDefaultDCLHostName); + mPort = port.ValueOr(0); +} + +CHIP_ERROR DCLClient::Model(const char * onboardingPayload, Json::Value & outModel) +{ + SetupPayload payload; + bool isQRCode = strncmp(onboardingPayload, kQRCodePrefix, strlen(kQRCodePrefix)) == 0; + if (isQRCode) + { + ReturnErrorOnFailure(QRCodeSetupPayloadParser(onboardingPayload).populatePayload(payload)); + VerifyOrReturnError(payload.isValidQRCodePayload(), CHIP_ERROR_INVALID_ARGUMENT); + } + else + { + ReturnErrorOnFailure(ManualSetupPayloadParser(onboardingPayload).populatePayload(payload)); + VerifyOrReturnError(payload.isValidManualCode(), CHIP_ERROR_INVALID_ARGUMENT); + } + + auto vendorId = static_cast(payload.vendorID); + auto productId = payload.productID; + + // If both vendorId and productId are zero, return a null model without error. + if (vendorId == 0 && productId == 0) + { + ChipLogProgress(chipTool, "Vendor ID and Product ID not found in the provided payload. DCL lookup will not be used."); + outModel = Json::nullValue; + return CHIP_NO_ERROR; + } + + ReturnErrorOnFailure(Model(vendorId, productId, outModel)); + + auto commissioningFlow = payload.commissioningFlow; + CHIP_ERROR error = ValidateModelCustomFlow(outModel, commissioningFlow); + VerifyOrReturnError(CHIP_NO_ERROR == error, error, + ChipLogError(chipTool, "%s%s", kErrorSchemaValidation, outModel.toStyledString().c_str())); + + return CHIP_NO_ERROR; +} + +CHIP_ERROR DCLClient::Model(const chip::VendorId vendorId, const uint16_t productId, Json::Value & outModel) +{ + VerifyOrReturnError(0 != vendorId, CHIP_ERROR_INVALID_ARGUMENT, ChipLogError(chipTool, "%s", kErrorVendorIdIsZero)); + VerifyOrReturnError(0 != productId, CHIP_ERROR_INVALID_ARGUMENT, ChipLogError(chipTool, "%s", kErrorProductIdIsZero)); + + char path[kRequestPathBufferSize]; + VerifyOrReturnError(snprintf(path, sizeof(path), kRequestModelVendorProductPath, to_underlying(vendorId), productId) >= 0, + CHIP_ERROR_INVALID_ARGUMENT); + ReturnErrorOnFailure(https::Request(mHostName, mPort, path, outModel)); + + CHIP_ERROR error = ValidateModelSchema(outModel); + VerifyOrReturnError(CHIP_NO_ERROR == error, error, + ChipLogError(chipTool, "%s%s", kErrorSchemaValidation, outModel.toStyledString().c_str())); + + return CHIP_NO_ERROR; +} + +CHIP_ERROR DCLClient::TermsAndConditions(const char * onboardingPayload, Json::Value & outTc) +{ + Json::Value json; + ReturnErrorOnFailure(Model(onboardingPayload, json)); + VerifyOrReturnError(Json::nullValue != json.type(), CHIP_NO_ERROR, outTc = Json::nullValue); + ReturnErrorOnFailure(RequestTermsAndConditions(json, outTc)); + return CHIP_NO_ERROR; +} + +CHIP_ERROR DCLClient::TermsAndConditions(const chip::VendorId vendorId, const uint16_t productId, Json::Value & outTc) +{ + Json::Value json; + ReturnErrorOnFailure(Model(vendorId, productId, json)); + VerifyOrReturnError(Json::nullValue != json.type(), CHIP_NO_ERROR, outTc = Json::nullValue); + ReturnErrorOnFailure(RequestTermsAndConditions(json, outTc)); + return CHIP_NO_ERROR; +} + +} // namespace dcl +} // namespace tool +} // namespace chip diff --git a/examples/chip-tool/commands/dcl/DCLClient.h b/examples/chip-tool/commands/dcl/DCLClient.h new file mode 100644 index 00000000000000..d4ce72c38f76f8 --- /dev/null +++ b/examples/chip-tool/commands/dcl/DCLClient.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. + * + */ + +#include +#include +#include + +#include +#include + +namespace chip { +namespace tool { +namespace dcl { +class DCLClient +{ +public: + DCLClient(Optional hostname, Optional port); + + /** + * @brief Retrieves the model information from the DCL based on the onboarding payload. + * + * This function uses the onboarding payload (a QR Code or Manual Code) to fetch the model information. + * It constructs an HTTPS request to retrieve the model data associated with the specified vendor ID and product ID from the + * payload. + * + * @param[in] onboardingPayload A null-terminated string containing the onboarding payload. + * This can either start with a QR Code prefix or be a Manual Code. + * @param[out] outModel A Json::Value object to store the retrieved model information. + * If the vendor and product IDs are missing, this will be set to null. + * + * @return CHIP_ERROR CHIP_NO_ERROR on success, error code otherwise. + */ + CHIP_ERROR Model(const char * onboardingPayload, Json::Value & outModel); + + /** + * @brief Retrieves the model information from the DCL using vendor ID and product ID. + * + * This function constructs an HTTPS request to retrieve the model data associated with the specified vendor ID and product ID. + * + * @param[in] vendorId The vendor ID of the model (must not be 0). + * @param[in] productId The product ID of the model (must not be 0). + * @param[out] outModel A Json::Value object to store the retrieved model information. + * + * @return CHIP_ERROR CHIP_NO_ERROR on success, error code otherwise. + */ + CHIP_ERROR Model(const VendorId vendorId, const uint16_t productId, Json::Value & outModel); + + /** + * @brief Retrieves the Terms and Conditions from the DCL based on the onboarding payload. + * + * This function uses the onboarding payload (a QR Code or Manual Code) to fetch the model information. + * If the model includes enhanced setup flow options, it requests and validates the associated Terms + * and Conditions data. If enhanced setup flow is not enabled, the output `tc` is set to null. + * + * @param[in] onboardingPayload A null-terminated string containing the onboarding payload. + * This can either start with a QR Code prefix or be a Manual Code. + * @param[out] outTc A Json::Value object to store the retrieved Terms and Conditions data. + * If enhanced setup flow options are not enabled, this will be set to null. + * + * @return CHIP_ERROR CHIP_NO_ERROR on success, error code otherwise. + */ + CHIP_ERROR TermsAndConditions(const char * onboardingPayload, Json::Value & outTc); + + /** + * @brief Retrieves the Terms and Conditions from the DCL using vendor ID and product ID. + * + * This function first retrieves the model information using the specified vendor ID and product ID. + * If the model includes enhanced setup flow options, it fetches the Terms and Conditions, validates the data, and returns it. + * + * @param[in] vendorId The vendor ID of the model (must not be 0). + * @param[in] productId The product ID of the model (must not be 0). + * @param[out] outTc A Json::Value object to store the retrieved Terms and Conditions data. + * If enhanced setup flow options are not enabled, this will be set to null. + * + * @return CHIP_ERROR CHIP_NO_ERROR on success, error code otherwise. + */ + CHIP_ERROR TermsAndConditions(const chip::VendorId vendorId, const uint16_t productId, Json::Value & outTc); + +private: + std::string mHostName; + uint16_t mPort; +}; +} // namespace dcl +} // namespace tool +} // namespace chip diff --git a/examples/chip-tool/commands/dcl/DCLCommands.h b/examples/chip-tool/commands/dcl/DCLCommands.h new file mode 100644 index 00000000000000..7fc910aa727952 --- /dev/null +++ b/examples/chip-tool/commands/dcl/DCLCommands.h @@ -0,0 +1,202 @@ +/* + * 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 "../common/Command.h" + +#include "DCLClient.h" +#include "DisplayTermsAndConditions.h" + +class DCLCommandBase : public Command +{ +public: + DCLCommandBase(const char * name) : Command(name) {} + + void AddArguments() + { + AddArgument("hostname", &mHostName, + "Hostname of the DCL server to fetch information from. Defaults to 'on.dcl.csa-iot.org'."); + AddArgument("port", 0, UINT16_MAX, &mPort, "Port number for connecting to the DCL server. Defaults to '443'."); + } + + CHIP_ERROR Run() + { + auto client = chip::tool::dcl::DCLClient(mHostName, mPort); + return RunCommand(client); + + return CHIP_NO_ERROR; + } + + virtual CHIP_ERROR RunCommand(chip::tool::dcl::DCLClient & client) = 0; + +private: + chip::Optional mHostName; + chip::Optional mPort; +}; + +class DCLPayloadCommandBase : public DCLCommandBase +{ +public: + DCLPayloadCommandBase(const char * name) : DCLCommandBase(name) + { + AddArgument("payload", &mPayload); + DCLCommandBase::AddArguments(); + } + +protected: + char * mPayload; +}; + +class DCLIdsCommandBase : public DCLCommandBase +{ +public: + DCLIdsCommandBase(const char * name) : DCLCommandBase(name) + { + AddArgument("vendor-id", 0, UINT16_MAX, &mVendorId); + AddArgument("product-id", 0, UINT16_MAX, &mProductId); + DCLCommandBase::AddArguments(); + } + +protected: + uint16_t mVendorId; + uint16_t mProductId; +}; + +class DCLModelByPayloadCommand : public DCLPayloadCommandBase +{ +public: + DCLModelByPayloadCommand() : DCLPayloadCommandBase("model-by-payload") {} + + CHIP_ERROR RunCommand(chip::tool::dcl::DCLClient & client) + { + Json::Value model; + ReturnErrorOnFailure(client.Model(mPayload, model)); + VerifyOrReturnError(model != Json::nullValue, CHIP_NO_ERROR); + + ChipLogProgress(chipTool, "%s", model.toStyledString().c_str()); + return CHIP_NO_ERROR; + } +}; + +class DCLModelCommand : public DCLIdsCommandBase +{ +public: + DCLModelCommand() : DCLIdsCommandBase("model") {} + + CHIP_ERROR RunCommand(chip::tool::dcl::DCLClient & client) + { + Json::Value model; + ReturnErrorOnFailure(client.Model(static_cast(mVendorId), mProductId, model)); + VerifyOrReturnError(model != Json::nullValue, CHIP_NO_ERROR); + + ChipLogProgress(chipTool, "%s", model.toStyledString().c_str()); + return CHIP_NO_ERROR; + } +}; + +class DCLTCByPayloadCommand : public DCLPayloadCommandBase +{ +public: + DCLTCByPayloadCommand() : DCLPayloadCommandBase("tc-by-payload") {} + + CHIP_ERROR RunCommand(chip::tool::dcl::DCLClient & client) + { + Json::Value tc; + ReturnErrorOnFailure(client.TermsAndConditions(mPayload, tc)); + VerifyOrReturnError(tc != Json::nullValue, CHIP_NO_ERROR); + + ChipLogProgress(chipTool, "%s", tc.toStyledString().c_str()); + return CHIP_NO_ERROR; + } +}; + +class DCLTCCommand : public DCLIdsCommandBase +{ +public: + DCLTCCommand() : DCLIdsCommandBase("tc") {} + + CHIP_ERROR RunCommand(chip::tool::dcl::DCLClient & client) + { + Json::Value tc; + ReturnErrorOnFailure(client.TermsAndConditions(static_cast(mVendorId), mProductId, tc)); + VerifyOrReturnError(tc != Json::nullValue, CHIP_NO_ERROR); + + ChipLogProgress(chipTool, "%s", tc.toStyledString().c_str()); + return CHIP_NO_ERROR; + } +}; + +class DCLTCDisplayByPayloadCommand : public DCLPayloadCommandBase +{ +public: + DCLTCDisplayByPayloadCommand() : DCLPayloadCommandBase("tc-display-by-payload") + { + AddArgument("country-code", &mCountryCode, + "The country code to retrieve terms and conditions for. Defaults to the country configured in the DCL."); + AddArgument("language-code", &mLanguageCode, + "The language code to retrieve terms and conditions for. Defaults to the language configured for the chosen " + "country in the DCL."); + } + + CHIP_ERROR RunCommand(chip::tool::dcl::DCLClient & client) + { + Json::Value tc; + ReturnErrorOnFailure(client.TermsAndConditions(mPayload, tc)); + VerifyOrReturnError(tc != Json::nullValue, CHIP_NO_ERROR); + + uint16_t version = 0; + uint16_t userResponse = 0; + ReturnErrorOnFailure(chip::tool::dcl::DisplayTermsAndConditions(tc, version, userResponse, mCountryCode, mLanguageCode)); + + ChipLogProgress(chipTool, "\nTerms and conditions\n\tRevision : %u\n\tUserResponse: %u", version, userResponse); + return CHIP_NO_ERROR; + } + +private: + chip::Optional mCountryCode; + chip::Optional mLanguageCode; +}; + +class DCLTCDisplayCommand : public DCLIdsCommandBase +{ +public: + DCLTCDisplayCommand() : DCLIdsCommandBase("tc-display") + { + AddArgument("country-code", &mCountryCode, + "The country code to retrieve terms and conditions for. Defaults to the country configured in the DCL."); + AddArgument("language-code", &mLanguageCode, + "The language code to retrieve terms and conditions for. Defaults to the language configured for the chosen " + "country in the DCL."); + } + CHIP_ERROR RunCommand(chip::tool::dcl::DCLClient & client) + { + Json::Value tc; + ReturnErrorOnFailure(client.TermsAndConditions(static_cast(mVendorId), mProductId, tc)); + VerifyOrReturnError(tc != Json::nullValue, CHIP_NO_ERROR); + + uint16_t version = 0; + uint16_t userResponse = 0; + ReturnErrorOnFailure(chip::tool::dcl::DisplayTermsAndConditions(tc, version, userResponse, mCountryCode, mLanguageCode)); + + ChipLogProgress(chipTool, "\nTerms and conditions\n\tRevision : %u\n\tUserResponse: %u", version, userResponse); + return CHIP_NO_ERROR; + } + +private: + chip::Optional mCountryCode; + chip::Optional mLanguageCode; +}; diff --git a/examples/chip-tool/commands/dcl/DisplayTermsAndConditions.cpp b/examples/chip-tool/commands/dcl/DisplayTermsAndConditions.cpp new file mode 100644 index 00000000000000..8745db90c6dff4 --- /dev/null +++ b/examples/chip-tool/commands/dcl/DisplayTermsAndConditions.cpp @@ -0,0 +1,230 @@ +/* + * 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 "DisplayTermsAndConditions.h" + +#include +#include + +#include +#include +#include + +namespace chip { +namespace tool { +namespace dcl { +namespace { +constexpr const char * kAcceptTerms = "Do you accept these terms? [Y/n]: "; +constexpr const char * kRequiredTerms = "Required"; +constexpr const char * kOptionalTerms = "Optional"; +constexpr const char * kTitleAllowedTags = R"(<(/?)(b|em|i|small|strong|u)>)"; +constexpr const char * kTextAllowedTags = R"(<(/?)(b|br|em|h1|h2|h3|h4|h5|h6|hr|i|li|ol|p|small|strong|u|ul)>)"; +constexpr const char * kAnsiCodeReset = "\033[0m"; +constexpr const char * kAnsiCodeBold = "\033[1m"; +constexpr const char * kAnsiCodeFaint = "\033[2m"; +constexpr const char * kAnsiCodeItalics = "\033[3m"; +constexpr const char * kAnsiCodeUnderline = "\033[4m"; +constexpr const char * kLineBreak = "\n"; +constexpr const char * kListItem = " - "; +constexpr const char * kHorizontalLine = "\n==========================================\n"; +constexpr const char * kErrorInvalidInput = "Invalid input. Please enter 'Y' (yes) or 'N' (no). Default is 'Y'."; + +// Fields names for the ESF JSON schema +constexpr const char * kFieldCountryEntries = "countryEntries"; +constexpr const char * kFieldDefaultCountry = "defaultCountry"; +constexpr const char * kFieldLanguageEntries = "languageEntries"; +constexpr const char * kFieldDefaultLanguage = "defaultLanguage"; +constexpr const char * kFieldOrdinal = "ordinal"; +constexpr const char * kFieldRequired = "required"; +constexpr const char * kFieldSchemaVersion = "schemaVersion"; +constexpr const char * kFieldText = "text"; +constexpr const char * kFieldTitle = "title"; + +const std::unordered_map kHtmlToAnsiCodes = { + { "b", kAnsiCodeBold }, // + { "br", kLineBreak }, // + { "em", kAnsiCodeItalics }, // + { "h1", kAnsiCodeBold }, // + { "h2", kAnsiCodeBold }, // + { "h3", kAnsiCodeBold }, // + { "h4", kAnsiCodeBold }, // + { "h5", kAnsiCodeBold }, // + { "h6", kAnsiCodeBold }, // + { "hr", kHorizontalLine }, // + { "i", kAnsiCodeItalics }, // + { "li", kListItem }, // + { "ol", kLineBreak }, // + { "p", kLineBreak }, // + { "small", kAnsiCodeFaint }, // + { "strong", kAnsiCodeBold }, // + { "u", kAnsiCodeUnderline }, // + { "ul", kLineBreak }, // +}; + +std::string ToUpperCase(const std::string & input) +{ + std::string output = input; + std::transform(output.begin(), output.end(), output.begin(), [](unsigned char c) { return std::toupper(c); }); + return output; +} + +std::string ToLowerCase(const std::string & input) +{ + std::string output = input; + std::transform(output.begin(), output.end(), output.begin(), [](unsigned char c) { return std::tolower(c); }); + return output; +} + +std::string Center(const std::string & text) +{ + size_t lineWidth = strlen(kHorizontalLine) - 1; + if (text.length() >= lineWidth) + { + return text; // No padding if the text is longer than the width + } + + size_t totalPadding = lineWidth - text.length(); + size_t paddingLeft = totalPadding / 2; + size_t paddingRight = totalPadding - paddingLeft; + + return std::string(paddingLeft, ' ') + text + std::string(paddingRight, ' '); +} + +std::string HTMLTagToAnsiCode(const std::smatch & match) +{ + if (match[1] == "/") + { + return kAnsiCodeReset; + } + + std::string tag = match[2]; + auto ansiCode = kHtmlToAnsiCodes.find(ToLowerCase(tag)); + if (ansiCode == kHtmlToAnsiCodes.end()) + { + return "<" + tag + ">"; + } + + return ansiCode->second; +} + +std::string renderHTMLInTerminal(const std::string & html, const std::string & allowedTags = kTextAllowedTags) +{ + std::string formattedText; + std::string::const_iterator current = html.cbegin(); + + std::regex regex(allowedTags, std::regex_constants::icase); + for (std::sregex_iterator it(html.cbegin(), html.cend(), regex), end; it != end; ++it) + { + const auto & match = *it; + + formattedText += std::string(current, html.cbegin() + match.position()); + formattedText += HTMLTagToAnsiCode(match); + + current = html.cbegin() + match.position() + match.length(); + } + + formattedText += std::string(current, html.cend()); + formattedText += kAnsiCodeReset; + return formattedText; +} + +const char * ResolveValueOrDefault(const Json::Value & entries, const Optional & userValue, const char * defaultValue, + const char * valueType) +{ + const char * resolvedValue = userValue.ValueOr(defaultValue); + + if (userValue.HasValue() && !entries.isMember(resolvedValue)) + { + ChipLogProgress(chipTool, "User-chosen %s ('%s') not found. Defaulting to '%s'", valueType, userValue.Value(), + defaultValue); + resolvedValue = defaultValue; + } + + return resolvedValue; +} + +const Json::Value & GetTexts(const Json::Value & tc, Optional optionalCountryCode, + Optional optionalLanguageCode) +{ + const char * defaultCountry = tc[kFieldDefaultCountry].asCString(); + const char * chosenCountry = ResolveValueOrDefault(tc[kFieldCountryEntries], optionalCountryCode, defaultCountry, "country"); + auto & countryEntry = tc[kFieldCountryEntries][chosenCountry]; + + const char * defaultLanguage = countryEntry[kFieldDefaultLanguage].asCString(); + const char * chosenLanguage = + ResolveValueOrDefault(countryEntry[kFieldLanguageEntries], optionalLanguageCode, defaultLanguage, "language"); + auto & languageEntry = countryEntry[kFieldLanguageEntries][chosenLanguage]; + + return languageEntry; +} + +void PrintText(const Json::Value & json) +{ + auto title = renderHTMLInTerminal(Center(ToUpperCase(json[kFieldTitle].asCString())), kTitleAllowedTags); + auto text = renderHTMLInTerminal(json[kFieldText].asCString()); + auto userQuestion = renderHTMLInTerminal(kAcceptTerms); + auto required = json[kFieldRequired].asBool() ? kRequiredTerms : kOptionalTerms; + + printf("%s", kHorizontalLine); + printf("%s", title.c_str()); + printf("%s", kHorizontalLine); + printf("%s", text.c_str()); + printf("%s", kHorizontalLine); + printf("[%s] %s", required, userQuestion.c_str()); +} + +bool AcknowledgeText() +{ + while (true) + { + std::string userInput; + std::getline(std::cin, userInput); + + VerifyOrReturnValue(!userInput.empty() && userInput != "Y" && userInput != "y", true); + VerifyOrReturnValue(userInput != "N" && userInput != "n", false); + + ChipLogError(chipTool, "%s", kErrorInvalidInput); + } +} + +} // namespace + +CHIP_ERROR DisplayTermsAndConditions(const Json::Value & tc, uint16_t & outVersion, uint16_t & outUserResponse, + Optional countryCode, Optional languageCode) +{ + VerifyOrReturnError(CanCastTo(tc[kFieldSchemaVersion].asUInt()), CHIP_ERROR_INVALID_ARGUMENT); + outVersion = static_cast(tc[kFieldSchemaVersion].asUInt()); + + auto texts = GetTexts(tc, countryCode, languageCode); + for (const auto & text : texts) + { + PrintText(text); + + if (AcknowledgeText()) + { + auto ordinal = text[kFieldOrdinal].asUInt(); + VerifyOrReturnError(ordinal < 16, CHIP_ERROR_INVALID_ARGUMENT); // Only 16 bits are available for user response + uint16_t shiftedValue = static_cast((1U << (ordinal & 0x0F)) & 0xFFFF); + outUserResponse |= shiftedValue; + } + } + return CHIP_NO_ERROR; +} +} // namespace dcl +} // namespace tool +} // namespace chip diff --git a/examples/chip-tool/commands/dcl/DisplayTermsAndConditions.h b/examples/chip-tool/commands/dcl/DisplayTermsAndConditions.h new file mode 100644 index 00000000000000..49a68e3a6e1781 --- /dev/null +++ b/examples/chip-tool/commands/dcl/DisplayTermsAndConditions.h @@ -0,0 +1,44 @@ +/* + * 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 + +namespace chip { +namespace tool { +namespace dcl { +/** + * Display the terms and conditions to the user and prompt for acceptance. + * + * @param[in] tc The terms and conditions JSON object. + * @param[out] outVersion The schema version of the terms and conditions. + * @param[out] outUserResponse The user response as a bitfield where each bit corresponds to the ordinal of the text. + * @param[in] countryCode The country code to use for the terms and conditions. If not provided, the default country will be used. + * @param[in] languageCode The language code to use for the terms and conditions. If not provided, the default language will be + * used. + * + * @return CHIP_NO_ERROR on success, error code otherwise. + */ +CHIP_ERROR DisplayTermsAndConditions(const Json::Value & tc, uint16_t & outVersion, uint16_t & outUserResponse, + Optional countryCode = NullOptional, + Optional languageCode = NullOptional); +} // namespace dcl +} // namespace tool +} // namespace chip diff --git a/examples/chip-tool/commands/dcl/HTTPSRequest.cpp b/examples/chip-tool/commands/dcl/HTTPSRequest.cpp new file mode 100644 index 00000000000000..29b0ed8f2726db --- /dev/null +++ b/examples/chip-tool/commands/dcl/HTTPSRequest.cpp @@ -0,0 +1,339 @@ +/* + * 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 "HTTPSRequest.h" + +#include +#include +#include +#include +#include +#include + +#if (CHIP_CRYPTO_OPENSSL || CHIP_CRYPTO_BORINGSSL) +#include +#include +#include +#ifdef SHA256_DIGEST_LENGTH +#define USE_CHIP_CRYPTO 1 +#endif +#endif //(CHIP_CRYPTO_OPENSSL || CHIP_CRYPTO_BORINGSSL) + +namespace { +constexpr const char * kHttpsPrefix = "https://"; +constexpr uint16_t kHttpsPort = 443; +constexpr const char * kErrorJsonParse = "Failed to parse JSON: "; +constexpr const char * kErrorHTTPSPrefix = "URL must start with 'https://': "; +constexpr const char * kErrorHTTPSPort = "Invalid port: 0"; +constexpr const char * kErrorHTTPSHostName = "Invalid hostname: empty"; +constexpr const char * kErrorBase64Decode = "Error while decoding base64 data"; +constexpr const char * kErrorSizeMismatch = "The response size does not match the expected size: "; +} // namespace + +namespace chip { +namespace tool { +namespace https { +namespace { +#ifndef USE_CHIP_CRYPTO +/** + * @brief Stub implementation of HTTPSSessionHolder when neither OpenSSL nor BoringSSL is enabled. + * + * This class provides placeholder methods that log errors indicating the lack of SSL library support + * and encourages contributions for new implementations. + */ +class HTTPSSessionHolder +{ +public: + CHIP_ERROR Init(std::string & hostname, uint16_t port) { return LogNotImplementedError(); } + + CHIP_ERROR SendRequest(std::string & request) { return LogNotImplementedError(); } + + CHIP_ERROR ReceiveResponse(std::string & response) { return LogNotImplementedError(); } + +private: + CHIP_ERROR LogNotImplementedError() const + { + ChipLogError(chipTool, + "HTTPS requests are not available because neither OpenSSL nor BoringSSL is enabled. Contributions for " + "alternative implementations are welcome!"); + return CHIP_ERROR_NOT_IMPLEMENTED; + } +}; +#else // USE_CHIP_CRYPTO +constexpr uint16_t kResponseBufferSize = 4096; +constexpr const char * kErrorSendHTTPRequest = "Failed to send HTTP request"; +constexpr const char * kErrorReceiveHTTPResponse = "Failed to read HTTP response"; +constexpr const char * kErrorConnection = "Failed to connect to: "; +constexpr const char * kErrorSSLContextCreate = "Failed to create SSL context"; +constexpr const char * kErrorSSLObjectCreate = "Failed to create SSL object"; +constexpr const char * kErrorSSLHandshake = "SSL handshake failed"; +constexpr const char * kErrorDigestMismatch = "The response digest does not match the expected digest"; +class HTTPSSessionHolder +{ +public: + HTTPSSessionHolder(){}; + + ~HTTPSSessionHolder() + { + VerifyOrReturn(nullptr != mContext); + SSL_free(mSSL); + SSL_CTX_free(mContext); + close(mSock); + +#if !defined(OPENSSL_IS_BORINGSSL) + EVP_cleanup(); +#endif + } + + CHIP_ERROR Init(std::string & hostname, uint16_t port) + { + int sock; + ReturnErrorOnFailure(InitSocket(hostname, port, sock)); + ReturnErrorOnFailure(InitSSL(sock)); + return CHIP_NO_ERROR; + } + + CHIP_ERROR SendRequest(std::string & request) + { + int written = SSL_write(mSSL, request.c_str(), (int) request.size()); + VerifyOrReturnError(written > 0, CHIP_ERROR_BAD_REQUEST, ChipLogError(chipTool, "%s", kErrorSendHTTPRequest)); + return CHIP_NO_ERROR; + } + + CHIP_ERROR ReceiveResponse(std::string & response) + { + char buffer[kResponseBufferSize]; + + ssize_t n = -1; + while ((n = SSL_read(mSSL, buffer, sizeof(buffer))) > 0) + { + VerifyOrReturnError(CanCastTo(n), CHIP_ERROR_INVALID_ARGUMENT); + response.append(buffer, static_cast(n)); + } + + VerifyOrReturnError(n >= 0, CHIP_ERROR_INTERNAL, ChipLogError(chipTool, "%s", kErrorReceiveHTTPResponse)); + + return CHIP_NO_ERROR; + } + +private: + CHIP_ERROR InitSocket(std::string & hostname, uint16_t port, int & sock) + { + auto * server = gethostbyname(hostname.c_str()); + VerifyOrReturnError(nullptr != server, CHIP_ERROR_NOT_CONNECTED); + + sock = socket(AF_INET, SOCK_STREAM, 0); + VerifyOrReturnError(sock >= 0, CHIP_ERROR_NOT_CONNECTED); + + struct sockaddr_in server_addr; + memset(&server_addr, 0, sizeof(server_addr)); + server_addr.sin_family = AF_INET; + server_addr.sin_port = htons(port); + memcpy(&server_addr.sin_addr.s_addr, server->h_addr, (size_t) server->h_length); + + int rv = connect(sock, (struct sockaddr *) &server_addr, sizeof(server_addr)); + VerifyOrReturnError(rv >= 0, CHIP_ERROR_POSIX(errno), + ChipLogError(chipTool, "%s%s:%u", kErrorConnection, hostname.c_str(), port)); + + return CHIP_NO_ERROR; + } + + CHIP_ERROR InitSSL(int sock) + { + SSL_load_error_strings(); + OpenSSL_add_ssl_algorithms(); + + auto * context = SSL_CTX_new(TLS_client_method()); + VerifyOrReturnError(nullptr != context, CHIP_ERROR_NOT_CONNECTED, ChipLogError(chipTool, "%s", kErrorSSLContextCreate)); + + auto * ssl = SSL_new(context); + VerifyOrReturnError(nullptr != ssl, CHIP_ERROR_NOT_CONNECTED, ChipLogError(chipTool, "%s", kErrorSSLObjectCreate)); + + SSL_set_fd(ssl, sock); + VerifyOrReturnError(SSL_connect(ssl) > 0, CHIP_ERROR_NOT_CONNECTED, ChipLogError(chipTool, "%s", kErrorSSLHandshake)); + + mContext = context; + mSSL = ssl; + mSock = sock; + return CHIP_NO_ERROR; + } + + SSL_CTX * mContext = nullptr; + SSL * mSSL = nullptr; + int mSock = -1; +}; +#endif // USE_CHIP_CRYPTO + +std::string BuildRequest(std::string & hostname, std::string & path) +{ + return "GET " + path + " HTTP/1.1\r\n" + // + "Host: " + hostname + "\r\n" + // + "Accept: application/json\r\n" + // + "Connection: close\r\n\r\n"; // +} + +CHIP_ERROR RemoveHeader(std::string & response) +{ + size_t headerEnd = response.find("\r\n\r\n"); + VerifyOrReturnError(std::string::npos != headerEnd, CHIP_ERROR_INVALID_ARGUMENT); + + auto body = response.substr(headerEnd + 4); + response = body; + + return CHIP_NO_ERROR; +} + +CHIP_ERROR MaybeCheckResponseSize(const std::string & response, const chip::Optional & optionalExpectedSize) +{ + VerifyOrReturnError(optionalExpectedSize.HasValue(), CHIP_NO_ERROR); + VerifyOrReturnError(chip::CanCastTo(response.size()), CHIP_ERROR_INVALID_ARGUMENT); + + uint32_t responseSize = static_cast(response.size()); + uint32_t expectedSize = optionalExpectedSize.Value(); + VerifyOrReturnError(expectedSize == responseSize, CHIP_ERROR_INVALID_ARGUMENT, + ChipLogError(chipTool, "%s%u != %u", kErrorSizeMismatch, responseSize, expectedSize)); + return CHIP_NO_ERROR; +} + +CHIP_ERROR MaybeCheckResponseDigest(const std::string & response, const chip::Optional & optionalExpectedDigest) +{ + VerifyOrReturnError(optionalExpectedDigest.HasValue(), CHIP_NO_ERROR); + VerifyOrReturnError(CanCastTo(strlen(optionalExpectedDigest.Value())), CHIP_ERROR_INVALID_ARGUMENT); + + const char * encodedData = optionalExpectedDigest.Value(); + uint16_t encodedDataSize = static_cast(strlen(encodedData)); + + size_t expectedMaxDecodedSize = BASE64_MAX_DECODED_LEN(encodedDataSize); + chip::Platform::ScopedMemoryBuffer decodedData; + VerifyOrReturnError(decodedData.Calloc(expectedMaxDecodedSize + 1 /* for null */), CHIP_ERROR_INVALID_ARGUMENT); + + size_t decodedDataSize = chip::Base64Decode(encodedData, encodedDataSize, decodedData.Get()); + VerifyOrReturnError(0 != decodedDataSize, CHIP_ERROR_INVALID_ARGUMENT, ChipLogError(chipTool, "%s", kErrorBase64Decode)); + +#ifdef USE_CHIP_CRYPTO + // Compute the SHA-256 hash of the response + unsigned char responseDigest[SHA256_DIGEST_LENGTH]; + SHA256(reinterpret_cast(response.c_str()), response.size(), responseDigest); + + VerifyOrReturnError(memcmp(responseDigest, decodedData.Get(), SHA256_DIGEST_LENGTH) == 0, CHIP_ERROR_INVALID_ARGUMENT, + ChipLogError(chipTool, "%s", kErrorDigestMismatch)); +#else + return CHIP_ERROR_NOT_IMPLEMENTED; +#endif // USE_CHIP_CRYPTO + + return CHIP_NO_ERROR; +} + +CHIP_ERROR ConvertResponseToJSON(std::string & body, Json::Value & jsonResponse) +{ + + Json::CharReaderBuilder readerBuilder; + std::string errors; + std::istringstream jsonStream(body); + bool success = Json::parseFromStream(readerBuilder, jsonStream, &jsonResponse, &errors); + VerifyOrReturnError(success, CHIP_ERROR_INTERNAL, ChipLogError(chipTool, "%s%s", kErrorJsonParse, errors.c_str())); + + return CHIP_NO_ERROR; +} + +CHIP_ERROR ExtractHostAndPath(const std::string & url, std::string & hostAndPort, std::string & outPath) +{ + VerifyOrReturnError(url.compare(0, strlen(kHttpsPrefix), kHttpsPrefix) == 0, CHIP_ERROR_INVALID_ARGUMENT, + ChipLogError(chipTool, "%s%s", kErrorHTTPSPrefix, url.c_str())); + + auto strippedUrl = url.substr(strlen(kHttpsPrefix)); + VerifyOrReturnError("" != strippedUrl, CHIP_ERROR_INVALID_ARGUMENT, ChipLogError(chipTool, "%s", kErrorHTTPSHostName)); + + size_t position = strippedUrl.find('/'); + if (position == std::string::npos) + { + hostAndPort = strippedUrl; + outPath = "/"; + } + else + { + hostAndPort = strippedUrl.substr(0, position); + outPath = strippedUrl.substr(position); + } + + return CHIP_NO_ERROR; +} + +CHIP_ERROR ExtractHostAndPort(const std::string & hostAndPort, std::string & outHostName, uint16_t & outPort) +{ + size_t position = hostAndPort.find(':'); + if (position == std::string::npos) + { + outHostName = hostAndPort; + outPort = kHttpsPort; + } + else + { + outHostName = hostAndPort.substr(0, position); + auto portString = hostAndPort.substr(position + 1); + outPort = static_cast(std::atoi(portString.c_str())); + VerifyOrReturnError(0 != outPort, CHIP_ERROR_INVALID_ARGUMENT, ChipLogError(chipTool, "%s", kErrorHTTPSPort)); + } + + return CHIP_NO_ERROR; +} + +CHIP_ERROR ExtractHostNamePortPath(std::string url, std::string & outHostName, uint16_t & outPort, std::string & outPath) +{ + std::string hostAndPort; + ReturnErrorOnFailure(ExtractHostAndPath(url, hostAndPort, outPath)); + ReturnErrorOnFailure(ExtractHostAndPort(hostAndPort, outHostName, outPort)); + + return CHIP_NO_ERROR; +} +} // namespace + +CHIP_ERROR Request(std::string url, Json::Value & jsonResponse, const Optional & optionalExpectedSize, + const Optional & optionalExpectedDigest) +{ + std::string hostname; + uint16_t port; + std::string path; + ReturnErrorOnFailure(ExtractHostNamePortPath(url, hostname, port, path)); + return Request(hostname, port, path, jsonResponse, optionalExpectedSize, optionalExpectedDigest); +} + +CHIP_ERROR Request(std::string hostname, uint16_t port, std::string path, Json::Value & jsonResponse, + const Optional & optionalExpectedSize, const Optional & optionalExpectedDigest) +{ + VerifyOrDo(port != 0, port = kHttpsPort); + + ChipLogDetail(chipTool, "HTTPS request to %s:%u%s", hostname.c_str(), port, path.c_str()); + + std::string request = BuildRequest(hostname, path); + std::string response; + + HTTPSSessionHolder session; + ReturnErrorOnFailure(session.Init(hostname, port)); + ReturnErrorOnFailure(session.SendRequest(request)); + ReturnErrorOnFailure(session.ReceiveResponse(response)); + ReturnErrorOnFailure(RemoveHeader(response)); + ReturnErrorOnFailure(MaybeCheckResponseSize(response, optionalExpectedSize)); + ReturnErrorOnFailure(MaybeCheckResponseDigest(response, optionalExpectedDigest)); + ReturnErrorOnFailure(ConvertResponseToJSON(response, jsonResponse)); + return CHIP_NO_ERROR; +} + +} // namespace https +} // namespace tool +} // namespace chip diff --git a/examples/chip-tool/commands/dcl/HTTPSRequest.h b/examples/chip-tool/commands/dcl/HTTPSRequest.h new file mode 100644 index 00000000000000..f11e3b33d354bb --- /dev/null +++ b/examples/chip-tool/commands/dcl/HTTPSRequest.h @@ -0,0 +1,39 @@ +/* + * 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 + +namespace chip { +namespace tool { +namespace https { + +CHIP_ERROR Request(std::string url, Json::Value & jsonResponse, + const chip::Optional & optionalExpectedSize = chip::NullOptional, + const chip::Optional & optionalExpectedDigest = chip::NullOptional); + +CHIP_ERROR Request(std::string hostname, uint16_t port, std::string path, Json::Value & jsonResponse, + const chip::Optional & optionalExpectedSize = chip::NullOptional, + const chip::Optional & optionalExpectedDigest = chip::NullOptional); + +} // namespace https +} // namespace tool +} // namespace chip diff --git a/examples/chip-tool/commands/dcl/JsonSchemaMacros.cpp b/examples/chip-tool/commands/dcl/JsonSchemaMacros.cpp new file mode 100644 index 00000000000000..f73fb4dac9d116 --- /dev/null +++ b/examples/chip-tool/commands/dcl/JsonSchemaMacros.cpp @@ -0,0 +1,64 @@ +/* + * 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 "JsonSchemaMacros.h" + +namespace { +constexpr const char * kJsonTypeNull = "Null"; +constexpr const char * kJsonTypeInt = "Int"; +constexpr const char * kJsonTypeUInt = "UInt"; +constexpr const char * kJsonTypeReal = "Real"; +constexpr const char * kJsonTypeString = "String"; +constexpr const char * kJsonTypeBool = "Bool"; +constexpr const char * kJsonTypeArray = "Array"; +constexpr const char * kJsonTypeObject = "Object"; +constexpr const char * kJsonTypeUnknown = "Unknown"; +} // namespace + +namespace chip { +namespace json { +const char * GetTypeName(const Json::Value & value) +{ + const char * type = kJsonTypeUnknown; + + switch (value.type()) + { + case Json::nullValue: + return kJsonTypeNull; + case Json::intValue: + return kJsonTypeInt; + case Json::uintValue: + return kJsonTypeUInt; + case Json::realValue: + return kJsonTypeReal; + case Json::stringValue: + return kJsonTypeString; + case Json::booleanValue: + return kJsonTypeBool; + case Json::arrayValue: + return kJsonTypeArray; + case Json::objectValue: + return kJsonTypeObject; + default: + return kJsonTypeUnknown; + } + + return type; +} +} // namespace json +} // namespace chip diff --git a/examples/chip-tool/commands/dcl/JsonSchemaMacros.h b/examples/chip-tool/commands/dcl/JsonSchemaMacros.h new file mode 100644 index 00000000000000..812cf516787c98 --- /dev/null +++ b/examples/chip-tool/commands/dcl/JsonSchemaMacros.h @@ -0,0 +1,41 @@ +/* + * 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 + +#define CHECK_TYPE(source, fieldName, fieldType) \ + VerifyOrReturnError(source.is##fieldType(), CHIP_ERROR_SCHEMA_MISMATCH, \ + ChipLogError(chipTool, "Type mismatch for field '%s': expected '%s', got '%s'", #fieldName, #fieldType, \ + chip::json::GetTypeName(source))); + +#define CHECK_REQUIRED_TYPE(source, fieldName, fieldType) \ + VerifyOrReturnError(source.isMember(#fieldName), CHIP_ERROR_SCHEMA_MISMATCH, \ + ChipLogError(chipTool, "Missing required field: '%s'", #fieldName)); \ + CHECK_TYPE(source[#fieldName], fieldName, fieldType) + +#define CHECK_REQUIRED_VALUE(source, fieldName, expectedValue) \ + CHECK_REQUIRED_TYPE(source, fieldName, UInt); \ + VerifyOrReturnError(source[#fieldName].asUInt() == expectedValue, CHIP_ERROR_INCORRECT_STATE, \ + ChipLogError(chipTool, "Value mismatch for '%s': expected '%u', got '%u'", #fieldName, expectedValue, \ + source[#fieldName].asUInt())); + +namespace chip { +namespace json { +const char * GetTypeName(const Json::Value & value); +} // namespace json +} // namespace chip diff --git a/examples/chip-tool/commands/dcl/test_dcl_server.py b/examples/chip-tool/commands/dcl/test_dcl_server.py new file mode 100755 index 00000000000000..f22f2d2a8e9390 --- /dev/null +++ b/examples/chip-tool/commands/dcl/test_dcl_server.py @@ -0,0 +1,245 @@ +#!/usr/bin/env -S python3 -B + +# Copyright (c) 2025 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. + +import base64 +import hashlib +import http.server +import json +import os +import re +import ssl + +DEFAULT_HOSTNAME = "localhost" +DEFAULT_PORT = 4443 + + +TC = { + 0XFFF1: { + 0x8001: { + "schemaVersion": 1, + "esfRevision": 1, + "defaultCountry": "US", + "countryEntries": { + "US": { + "defaultLanguage": "en", + "languageEntries": { + "en": [ + { + "ordinal": 0, + "required": True, + "title": "Terms and Conditions", + "text": "

Feature 1 Text

Please accept these.

" + }, + { + "ordinal": 1, + "required": False, + "title": "Privacy Policy", + "text": "

Feature 2 Text

" + } + ], + "es": [ + { + "ordinal": 0, + "required": True, + "title": "Términos y condiciones", + "text": "

Característica 1 Texto

Por favor acéptelos.

" + }, + { + "ordinal": 1, + "required": False, + "title": "Política de privacidad", + "text": "

Característica 2 Texto

" + } + ] + } + }, + "MX": { + "defaultLanguage": "es", + "languageEntries": { + "es": [ + { + "ordinal": 0, + "required": True, + "title": "Términos y condiciones", + "text": "

Característica 1 Texto

Por favor acéptelos.

" + } + ] + } + }, + "CN": { + "defaultLanguage": "zh", + "languageEntries": { + "zh": [ + { + "ordinal": 0, + "required": True, + "title": "条款和条件", + "text": "

产品1文字

" + }, + { + "ordinal": 1, + "required": False, + "title": "隐私条款", + "text": "

产品2文字

" + } + ] + } + }, + "RU": { + "defaultLanguage": "ru", + "languageEntries": { + "ru": [ + { + "ordinal": 0, + "required": True, + "title": "Условия и положения", + "text": "

Текст функции 1

Пожалуйста, примите эти условия пользования.

" + }, + { + "ordinal": 1, + "required": False, + "title": "Положение о конфиденциальности", + "text": "

Текст функции 2

" + } + ] + } + } + } + } + } +} + +MODELS = { + 0XFFF1: { + 0x8001: { + "model": + { + "vid": 65521, + "pid": 32769, + "deviceTypeId": 65535, + "productName": "TEST_PRODUCT", + "productLabel": "All Clusters App", + "partNumber": "", + "commissioningCustomFlow": 2, + "commissioningCustomFlowUrl": "", + "commissioningModeInitialStepsHint": 0, + "commissioningModeInitialStepsInstruction": "", + "commissioningModeSecondaryStepsHint": 0, + "commissioningModeSecondaryStepsInstruction": "", + "creator": "chip project", + "lsfRevision": 0, + "lsfUrl": "", + "productUrl": "https://github.com/project-chip/connectedhomeip/tree/master/examples/all-clusters-app", + "supportUrl": "https://github.com/project-chip/connectedhomeip/", + "userManualUrl": "", + "enhancedSetupFlowOptions": 1, + "enhancedSetupFlowTCUrl": f"https://{DEFAULT_HOSTNAME}:{DEFAULT_PORT}/tc/65521/32769", + "enhancedSetupFlowTCRevision": 1, + "enhancedSetupFlowTCDigest": "", + "enhancedSetupFlowTCFileSize": 0, + "enhancedSetupFlowMaintenanceUrl": "" + } + } + } +} + + +class RESTRequestHandler(http.server.BaseHTTPRequestHandler): + def __init__(self, *args, **kwargs): + self.routes = { + r"/dcl/model/models/(\d+)/(\d+)": self.handle_model_request, + r"/tc/(\d+)/(\d+)": self.handle_tc_request, + } + super().__init__(*args, **kwargs) + + def do_GET(self): + for pattern, handler in self.routes.items(): + match = re.match(pattern, self.path) + if match: + response = handler(*match.groups()) + if response: + self.send_response(200) + self.send_header("Content-Type", "application/json") + self.end_headers() + self.wfile.write(json.dumps(response).encode("utf-8")) + return + + # Handle 404 for unmatched paths + self.send_response(404) + self.send_header("Content-Type", "application/json") + self.end_headers() + self.wfile.write(json.dumps({"error": "Not found"}).encode("utf-8")) + + def handle_model_request(self, vendor_id, product_id): + vendor_id = int(vendor_id) + product_id = int(product_id) + if vendor_id in MODELS and product_id in MODELS[vendor_id]: + model = MODELS[int(vendor_id)][int(product_id)] + # We will return a model that contains the file size and the digest of the TC. + # Instead of manually setting them, it is calculated on the fly. + tc = TC[int(vendor_id)][int(product_id)] + tc_encoded = json.dumps(tc).encode("utf-8") + sha256_hash = hashlib.sha256(tc_encoded).digest() + model['model']['enhancedSetupFlowTCFileSize'] = len(tc_encoded) + model['model']['enhancedSetupFlowTCDigest'] = base64.b64encode( + sha256_hash).decode("utf-8") + + return model + + return None + + def handle_tc_request(self, vendor_id, product_id): + vendor_id = int(vendor_id) + product_id = int(product_id) + if vendor_id in TC and product_id in TC[vendor_id]: + return TC[int(vendor_id)][int(product_id)] + + return None + + +def run_https_server(cert_file="cert.pem", key_file="key.pem"): + httpd = http.server.HTTPServer( + (DEFAULT_HOSTNAME, DEFAULT_PORT), RESTRequestHandler) + + httpd.socket = ssl.wrap_socket( + httpd.socket, + server_side=True, + certfile=cert_file, + keyfile=key_file, + ssl_version=ssl.PROTOCOL_TLS, + ) + + print(f"Serving on https://{DEFAULT_HOSTNAME}:{DEFAULT_PORT}") + httpd.serve_forever() + + +# Generate self-signed certificates if needed +def generate_self_signed_cert(cert_file="cert.pem", key_file="key.pem"): + from subprocess import run + run([ + "openssl", "req", "-x509", "-nodes", "-days", "365", "-newkey", "rsa:2048", + "-keyout", key_file, "-out", cert_file, + "-subj", f"/C=US/ST=Test/L=Test/O=Test/OU=Test/CN={DEFAULT_HOSTNAME}" + ]) + + +# Check if certificates exist; if not, generate them +if not os.path.exists("cert.pem") or not os.path.exists("key.pem"): + print("Generating self-signed certificates...") + generate_self_signed_cert() + +# Run the server +run_https_server() diff --git a/examples/chip-tool/commands/pairing/PairingCommand.cpp b/examples/chip-tool/commands/pairing/PairingCommand.cpp index 96ccd6965d395c..7ebf74433ade7e 100644 --- a/examples/chip-tool/commands/pairing/PairingCommand.cpp +++ b/examples/chip-tool/commands/pairing/PairingCommand.cpp @@ -28,6 +28,9 @@ #include #include +#include "../dcl/DCLClient.h" +#include "../dcl/DisplayTermsAndConditions.h" + #include using namespace ::chip; @@ -232,6 +235,7 @@ CHIP_ERROR PairingCommand::PairWithCode(NodeId remoteId) discoveryType = DiscoveryType::kDiscoveryNetworkOnlyWithoutPASEAutoRetry; } + ReturnErrorOnFailure(MaybeDisplayTermsAndConditions(commissioningParams)); return CurrentCommissioner().PairDevice(remoteId, mOnboardingPayload, commissioningParams, discoveryType); } @@ -585,3 +589,26 @@ void PairingCommand::OnDeviceAttestationCompleted(Controller::DeviceCommissioner SetCommandExitStatus(err); } } + +CHIP_ERROR PairingCommand::MaybeDisplayTermsAndConditions(CommissioningParameters & params) +{ + VerifyOrReturnError(mUseDCL.ValueOr(false), CHIP_NO_ERROR); + + Json::Value tc; + auto client = tool::dcl::DCLClient(mDCLHostName, mDCLPort); + ReturnErrorOnFailure(client.TermsAndConditions(mOnboardingPayload, tc)); + if (tc != Json::nullValue) + { + uint16_t version = 0; + uint16_t userResponse = 0; + ReturnErrorOnFailure(tool::dcl::DisplayTermsAndConditions(tc, version, userResponse, mCountryCode)); + + TermsAndConditionsAcknowledgement termsAndConditionsAcknowledgement = { + .acceptedTermsAndConditions = userResponse, + .acceptedTermsAndConditionsVersion = version, + }; + params.SetTermsAndConditionsAcknowledgement(termsAndConditionsAcknowledgement); + } + + return CHIP_NO_ERROR; +} diff --git a/examples/chip-tool/commands/pairing/PairingCommand.h b/examples/chip-tool/commands/pairing/PairingCommand.h index 5572a724e918dd..3b0f58936cfac2 100644 --- a/examples/chip-tool/commands/pairing/PairingCommand.h +++ b/examples/chip-tool/commands/pairing/PairingCommand.h @@ -106,6 +106,10 @@ class PairingCommand : public CHIPCommand, break; case PairingMode::Code: AddArgument("skip-commissioning-complete", 0, 1, &mSkipCommissioningComplete); + AddArgument("dcl-hostname", &mDCLHostName, + "Hostname of the DCL server to fetch information from. Defaults to 'on.dcl.csa-iot.org'."); + AddArgument("dcl-port", 0, UINT16_MAX, &mDCLPort, "Port number for connecting to the DCL server. Defaults to '443'."); + AddArgument("use-dcl", 0, 1, &mUseDCL, "Use DCL to fetch onboarding information"); FALLTHROUGH; case PairingMode::CodePaseOnly: AddArgument("payload", &mOnboardingPayload); @@ -247,6 +251,7 @@ class PairingCommand : public CHIPCommand, CHIP_ERROR PairWithMdnsOrBleByIndexWithCode(NodeId remoteId, uint16_t index); CHIP_ERROR Unpair(NodeId remoteId); chip::Controller::CommissioningParameters GetCommissioningParameters(); + CHIP_ERROR MaybeDisplayTermsAndConditions(chip::Controller::CommissioningParameters & params); const PairingMode mPairingMode; const PairingNetworkType mNetworkType; @@ -269,6 +274,9 @@ class PairingCommand : public CHIPCommand, chip::Optional mICDStayActiveDurationMsec; chip::Optional mTCAcknowledgements; chip::Optional mTCAcknowledgementVersion; + chip::Optional mDCLHostName; + chip::Optional mDCLPort; + chip::Optional mUseDCL; chip::app::DataModel::List mTimeZoneList; TypedComplexArgument> mComplex_TimeZones; diff --git a/examples/chip-tool/main.cpp b/examples/chip-tool/main.cpp index 6a52941e8b8d9c..cb296f3f31bdcf 100644 --- a/examples/chip-tool/main.cpp +++ b/examples/chip-tool/main.cpp @@ -20,6 +20,7 @@ #include "commands/example/ExampleCredentialIssuerCommands.h" #include "commands/clusters/SubscriptionsCommands.h" +#include "commands/dcl/Commands.h" #include "commands/delay/Commands.h" #include "commands/discover/Commands.h" #include "commands/group/Commands.h" @@ -39,6 +40,7 @@ int main(int argc, char * argv[]) { ExampleCredentialIssuerCommands credIssuerCommands; Commands commands; + registerCommandsDCL(commands); registerCommandsDelay(commands, &credIssuerCommands); registerCommandsDiscover(commands, &credIssuerCommands); registerCommandsICD(commands, &credIssuerCommands); diff --git a/examples/platform/linux/AppMain.cpp b/examples/platform/linux/AppMain.cpp index 07ac781f3509b3..b4fb0cb13b7027 100644 --- a/examples/platform/linux/AppMain.cpp +++ b/examples/platform/linux/AppMain.cpp @@ -111,6 +111,10 @@ #include "ExampleAccessRestrictionProvider.h" #endif +#if CHIP_CONFIG_TERMS_AND_CONDITIONS_REQUIRED +#include // nogncheck +#endif + #if CHIP_DEVICE_LAYER_TARGET_DARWIN #include #if CHIP_DEVICE_CONFIG_ENABLE_WIFI @@ -542,6 +546,16 @@ void ChipLinuxAppMainLoop(AppMainLoopImplementation * impl) VerifyOrDie(initParams.InitializeStaticResourcesBeforeServerInit() == CHIP_NO_ERROR); initParams.dataModelProvider = app::CodegenDataModelProviderInstance(initParams.persistentStorageDelegate); +#if CHIP_CONFIG_TERMS_AND_CONDITIONS_REQUIRED + if (LinuxDeviceOptions::GetInstance().tcVersion.HasValue() && LinuxDeviceOptions::GetInstance().tcRequired.HasValue()) + { + uint16_t version = LinuxDeviceOptions::GetInstance().tcVersion.Value(); + uint16_t required = LinuxDeviceOptions::GetInstance().tcRequired.Value(); + Optional requiredAcknowledgements(app::TermsAndConditions(required, version)); + app::TermsAndConditionsManager::GetInstance()->Init(initParams.persistentStorageDelegate, requiredAcknowledgements); + } +#endif // CHIP_CONFIG_TERMS_AND_CONDITIONS_REQUIRED + #if defined(ENABLE_CHIP_SHELL) Engine::Root().Init(); Shell::RegisterCommissioneeCommands(); diff --git a/examples/platform/linux/Options.cpp b/examples/platform/linux/Options.cpp index e3b7ba42675f41..fa56b62feac4c1 100644 --- a/examples/platform/linux/Options.cpp +++ b/examples/platform/linux/Options.cpp @@ -128,6 +128,10 @@ enum kDeviceOption_WiFi_PAF, #endif kDeviceOption_DacProvider, +#if CHIP_CONFIG_TERMS_AND_CONDITIONS_REQUIRED + kDeviceOption_TermsAndConditions_Version, + kDeviceOption_TermsAndConditions_Required, +#endif }; constexpr unsigned kAppUsageLength = 64; @@ -204,6 +208,10 @@ OptionDef sDeviceOptionDefs[] = { { "faults", kArgumentRequired, kDeviceOption_FaultInjection }, #endif { "dac_provider", kArgumentRequired, kDeviceOption_DacProvider }, +#if CHIP_CONFIG_TERMS_AND_CONDITIONS_REQUIRED + { "tc-version", kArgumentRequired, kDeviceOption_TermsAndConditions_Version }, + { "tc-required", kArgumentRequired, kDeviceOption_TermsAndConditions_Required }, +#endif {} }; @@ -362,6 +370,15 @@ const char * sDeviceOptionHelp = " Specifies the time after which the device transitions from active to idle.\n" "\n" #endif +#if CHIP_CONFIG_TERMS_AND_CONDITIONS_REQUIRED + " --tc-version\n" + " Sets the minimum required version of the Terms and Conditions\n" + "\n" + " --tc-required\n" + " Sets the required acknowledgements for the Terms and Conditions as a 16-bit enumeration.\n" + " Each bit represents an ordinal corresponding to a specific acknowledgment requirement.\n" + "\n" +#endif #if CHIP_WITH_NLFAULTINJECTION " --faults \n" " Inject specified fault(s) at runtime.\n" @@ -747,6 +764,17 @@ bool HandleOption(const char * aProgram, OptionSet * aOptions, int aIdentifier, LinuxDeviceOptions::GetInstance().dacProvider = &testDacProvider; break; } +#if CHIP_CONFIG_TERMS_AND_CONDITIONS_REQUIRED + case kDeviceOption_TermsAndConditions_Version: { + LinuxDeviceOptions::GetInstance().tcVersion.SetValue(static_cast(atoi(aValue))); + break; + } + + case kDeviceOption_TermsAndConditions_Required: { + LinuxDeviceOptions::GetInstance().tcRequired.SetValue(static_cast(atoi(aValue))); + break; + } +#endif default: PrintArgError("%s: INTERNAL ERROR: Unhandled option: %s\n", aProgram, aName); retval = false; diff --git a/examples/platform/linux/Options.h b/examples/platform/linux/Options.h index d9b1716bd39e95..6cad0469e02270 100644 --- a/examples/platform/linux/Options.h +++ b/examples/platform/linux/Options.h @@ -29,6 +29,7 @@ #include #include +#include #include #include #include @@ -91,6 +92,10 @@ struct LinuxDeviceOptions #if CHIP_CONFIG_USE_ACCESS_RESTRICTIONS chip::Optional> commissioningArlEntries; chip::Optional> arlEntries; +#endif +#if CHIP_CONFIG_TERMS_AND_CONDITIONS_REQUIRED + chip::Optional tcVersion; + chip::Optional tcRequired; #endif static LinuxDeviceOptions & GetInstance(); }; diff --git a/src/app/clusters/general-commissioning-server/general-commissioning-server.cpp b/src/app/clusters/general-commissioning-server/general-commissioning-server.cpp index 4defc79e911c2f..04f7e4e5df15e4 100644 --- a/src/app/clusters/general-commissioning-server/general-commissioning-server.cpp +++ b/src/app/clusters/general-commissioning-server/general-commissioning-server.cpp @@ -107,6 +107,14 @@ CHIP_ERROR GeneralCommissioningGlobalInstance::Read(const ConcreteReadAttributeP switch (aPath.mAttributeId) { + case FeatureMap::Id: { + BitFlags features; +#if CHIP_CONFIG_TERMS_AND_CONDITIONS_REQUIRED + features.Set(GeneralCommissioning::Feature::kTermsAndConditions); +#endif // CHIP_CONFIG_TERMS_AND_CONDITIONS_REQUIRED + return aEncoder.Encode(features); + } + case RegulatoryConfig::Id: { return ReadIfSupported(&ConfigurationManager::GetRegulatoryLocation, aEncoder); } diff --git a/third_party/boringssl/repo/BUILD.gn b/third_party/boringssl/repo/BUILD.gn index a57807f52b4762..bb315cde989d60 100644 --- a/third_party/boringssl/repo/BUILD.gn +++ b/third_party/boringssl/repo/BUILD.gn @@ -41,6 +41,7 @@ all_sources = crypto_sources all_headers = crypto_headers +# Core BoringSSL library used by the SDK static_library("boringssl") { cflags = [ "-O2" ] @@ -55,3 +56,18 @@ static_library("boringssl") { # on boringssl, not just boringssl itself. configs += [ ":boringssl_config_disable_warnings" ] } + +# Extended version of BoringSSL with additional SSL sources (for optional tools) +static_library("boringssl_with_ssl_sources") { + cflags = [ "-O2" ] + + public = crypto_headers + ssl_headers + sources = crypto_sources + ssl_sources + + public_configs = [ ":boringssl_config" ] + + # The disable-warnings config should not be a public config, since + # that would make it apply to compilations of anything that depends + # on boringssl, not just boringssl itself. + configs += [ ":boringssl_config_disable_warnings" ] +} From 25214056fcd5ee627a021268e8bf87b41aabd5e8 Mon Sep 17 00:00:00 2001 From: Boris Zbarsky Date: Thu, 30 Jan 2025 02:27:18 -0500 Subject: [PATCH 16/36] Update availability annotations for generated Matter.framework APIs. (#37316) * Mark Time Synchronization cluster as exposed. * Mark Energy EVSE cluster as exposed, except for the provisional pieces of it. * Mark Energy EVSE Mode cluster as exposed. * Mark Content App Observer cluster as exposed. * Mark Power Topology cluster as exposed. * Mark Messages cluster as exposed. * Mark Commissioner Control cluster as exposed. * Mark Service Area cluster as exposed, except for one struct field where the spec and the SDK do not match. * Mark Thread Border Router Management cluster as exposed. * Mark Thread Network Directory cluster as exposed. * Mark Water Heater Management cluster as exposed. * Mark Water Heater Mode cluster as exposed. * Mark Wi-Fi Network Management as exposed. * Mark new attributes on the Network Commissioning, Wake On LAN, Media Playback, and Basic Information clusters as exposed. * Mark new commands on the General Diagnostics, Channel, and Media Playback clusters as exposed. * Mark new command fields on the Media Playback, Content Launcher, and Account Login clusters as exposed. * Mark various new structs on the Channel, Media Playback, and Content Launcher clusters as exposed. * Mark various new events on the Account Login, Media Playback, and Target Navigator clusters as exposed. * Mark various new enums on the Thersmostat, Channel, and Media Playback cluster as exposed. * Mark various new bitmaps on the Network Commissioning, Thermostat, and Channel clusters as exposed. * Mark presets/schedules bits on the Thermostat cluster as exposed. * Mark DataModelTest feature bit on the General Diagnostics cluster as exposed. * Mark new feature bits on Access Control, Bridged Device Basic Information, and Occupancy Sensing clusters as exposed. * Mark Access Restriction bits of the Access Control cluster as exposed, except the ones that have spec issues tracking changes to them. * Mark Bridged Device Basic Information bits for dealing with ICDs exposed. * Mark hold time and OccupancyChanged bits in Occupancy Sensing cluster exposed. * Mark global structs and enums needed for AtomicRequest/AtomicResponse as exposed. * Mark some global enums used by RVCs as exposed. * Remove stale annotation for the Scenes cluster, which does not exist anymore (has been replaces by Scenes Management, which is provisional so far). * Mark Camera AV Settings User Level Management cluster as not ready to ship yet. * Mark Push AV Stream Transport cluster as not ready to ship yet. * Mark TLS Certificate Management cluster as not ready to ship yet. --- .../CHIP/templates/availability.yaml | 2149 +++++++++++------ .../CHIP/zap-generated/MTRBaseClusters.h | 1880 +++++++------- .../CHIP/zap-generated/MTRClusterConstants.h | 456 ++-- .../CHIP/zap-generated/MTRClusters.h | 486 ++-- .../zap-generated/MTRCommandPayloadsObjc.h | 342 +-- .../CHIP/zap-generated/MTRStructsObjc.h | 452 ++-- .../zap-generated/cluster/Commands.h | 1254 ---------- 7 files changed, 3240 insertions(+), 3779 deletions(-) diff --git a/src/darwin/Framework/CHIP/templates/availability.yaml b/src/darwin/Framework/CHIP/templates/availability.yaml index bd0863ef5aa2c0..b6c58c20f8d4f8 100644 --- a/src/darwin/Framework/CHIP/templates/availability.yaml +++ b/src/darwin/Framework/CHIP/templates/availability.yaml @@ -161,18 +161,6 @@ - AttributeList - FeatureMap - ClusterRevision - Scenes: - - SceneCount - - CurrentScene - - CurrentGroup - - SceneValid - - NameSupport - - LastConfiguredBy - - GeneratedCommandList - - AcceptedCommandList - - AttributeList - - FeatureMap - - ClusterRevision OnOff: - OnOff - GlobalSceneControl @@ -1312,26 +1300,6 @@ - RemoveGroupResponse - RemoveAllGroups - AddGroupIfIdentifying - Scenes: - - AddScene - - AddSceneResponse - - ViewScene - - ViewSceneResponse - - RemoveScene - - RemoveSceneResponse - - RemoveAllScenes - - RemoveAllScenesResponse - - StoreScene - - StoreSceneResponse - - RecallScene - - GetSceneMembership - - GetSceneMembershipResponse - - EnhancedAddScene - - EnhancedAddSceneResponse - - EnhancedViewScene - - EnhancedViewSceneResponse - - CopyScene - - CopySceneResponse OnOff: - Off - On @@ -1611,87 +1579,6 @@ AddGroupIfIdentifying: - groupId - groupName - Scenes: - AddScene: - - groupId - - sceneId - - transitionTime - - sceneName - - extensionFieldSets - AddSceneResponse: - - status - - groupId - - sceneId - ViewScene: - - groupId - - sceneId - ViewSceneResponse: - - status - - groupId - - sceneId - - transitionTime - - sceneName - - extensionFieldSets - RemoveScene: - - groupId - - sceneId - RemoveSceneResponse: - - status - - groupId - - sceneId - RemoveAllScenes: - - groupId - RemoveAllScenesResponse: - - status - - groupId - StoreScene: - - groupId - - sceneId - StoreSceneResponse: - - status - - groupId - - sceneId - RecallScene: - - groupId - - sceneId - - transitionTime - GetSceneMembership: - - groupId - GetSceneMembershipResponse: - - status - - capacity - - groupId - - sceneList - EnhancedAddScene: - - groupId - - sceneId - - transitionTime - - sceneName - - extensionFieldSets - EnhancedAddSceneResponse: - - status - - groupId - - sceneId - EnhancedViewScene: - - groupId - - sceneId - EnhancedViewSceneResponse: - - status - - groupId - - sceneId - - transitionTime - - sceneName - - extensionFieldSets - CopyScene: - - mode - - groupIdFrom - - sceneIdFrom - - groupIdTo - - sceneIdTo - CopySceneResponse: - - status - - groupIdFrom - - sceneIdFrom OnOff: OffWithEffect: - effectId @@ -2419,9 +2306,6 @@ - id - percentage structs: - Scenes: - - AttributeValuePair - - ExtensionFieldSet Descriptor: - DeviceType Binding: @@ -2509,13 +2393,6 @@ - DoubleNestedStructList - TestListStructOctet struct fields: - Scenes: - AttributeValuePair: - - attributeId - - attributeValue - ExtensionFieldSet: - - clusterId - - attributeValueList Descriptor: DeviceType: - type @@ -4222,8 +4099,6 @@ bitmaps: Groups: - GroupClusterFeature - Scenes: - - ScenesCopyMode OnOff: - OnOffControl # Feature was originally named OnOffFeature, but we generate the @@ -4360,9 +4235,6 @@ Groups: GroupClusterFeature: - GroupNames - Scenes: - ScenesCopyMode: - - CopyAllScenes OnOff: OnOffControl: - AcceptOnlyWhenOn @@ -4785,9 +4657,6 @@ clusters: # PulseWidthModulation is not in the Matter specification. - PulseWidthModulation - # TimeSynchronization provisional until spec and SDK are aligned. - # See https://github.com/CHIP-Specifications/connectedhomeip-spec/pull/10707 - - TimeSynchronization - release: "FD8D09B4-6CF7-4EBA-BD4F-7EDE872E3098" versions: @@ -5285,62 +5154,6 @@ LauncherResponse: - status - data - Scenes: - AddScene: - - groupID - - sceneID - ViewScene: - - groupID - - sceneID - RemoveScene: - - groupID - - sceneID - RemoveAllScenes: - - groupID - StoreScene: - - groupID - - sceneID - RecallScene: - - groupID - - sceneID - GetSceneMembership: - - groupID - EnhancedAddScene: - - groupID - - sceneID - EnhancedViewScene: - - groupID - - sceneID - CopyScene: - - groupIdentifierFrom - - sceneIdentifierFrom - - groupIdentifierTo - - sceneIdentifierTo - AddSceneResponse: - - groupID - - sceneID - ViewSceneResponse: - - groupID - - sceneID - RemoveSceneResponse: - - groupID - - sceneID - RemoveAllScenesResponse: - - groupID - StoreSceneResponse: - - groupID - - sceneID - GetSceneMembershipResponse: - - groupID - EnhancedAddSceneResponse: - - groupID - - sceneID - EnhancedViewSceneResponse: - - groupID - - sceneID - CopySceneResponse: - - groupIdentifierFrom - - sceneIdentifierFrom structs: OTASoftwareUpdateRequestor: - ProviderLocation @@ -5578,11 +5391,6 @@ # introduced them in this release. - catalogVendorId - applicationId - Scenes: - AttributeValuePair: - - attributeID - ExtensionFieldSet: - - clusterID events: OTASoftwareUpdateRequestor: - StateTransition @@ -6137,62 +5945,6 @@ AnnounceOTAProvider: - providerNodeId - vendorId - Scenes: - AddScene: - - groupId - - sceneId - ViewScene: - - groupId - - sceneId - RemoveScene: - - groupId - - sceneId - RemoveAllScenes: - - groupId - StoreScene: - - groupId - - sceneId - RecallScene: - - groupId - - sceneId - GetSceneMembership: - - groupId - EnhancedAddScene: - - groupId - - sceneId - EnhancedViewScene: - - groupId - - sceneId - CopyScene: - - groupIdFrom - - sceneIdFrom - - groupIdTo - - sceneIdTo - AddSceneResponse: - - groupId - - sceneId - ViewSceneResponse: - - groupId - - sceneId - RemoveSceneResponse: - - groupId - - sceneId - RemoveAllScenesResponse: - - groupId - StoreSceneResponse: - - groupId - - sceneId - GetSceneMembershipResponse: - - groupId - EnhancedAddSceneResponse: - - groupId - - sceneId - EnhancedViewSceneResponse: - - groupId - - sceneId - CopySceneResponse: - - groupIdFrom - - sceneIdFrom structs: Descriptor: - DeviceType @@ -6256,11 +6008,6 @@ ApplicationStruct: - catalogVendorId - applicationId - Scenes: - AttributeValuePair: - - attributeId - ExtensionFieldSet: - - clusterId event fields: Switch: MultiPressComplete: @@ -6530,62 +6277,6 @@ ColorControl: MoveToColorTemperature: colorTemperatureMireds: colorTemperature - Scenes: - AddScene: - groupID: groupId - sceneID: sceneId - ViewScene: - groupID: groupId - sceneID: sceneId - RemoveScene: - groupID: groupId - sceneID: sceneId - RemoveAllScenes: - groupID: groupId - StoreScene: - groupID: groupId - sceneID: sceneId - RecallScene: - groupID: groupId - sceneID: sceneId - GetSceneMembership: - groupID: groupId - EnhancedAddScene: - groupID: groupId - sceneID: sceneId - EnhancedViewScene: - groupID: groupId - sceneID: sceneId - CopyScene: - groupIdentifierFrom: groupIdFrom - sceneIdentifierFrom: sceneIdFrom - groupIdentifierTo: groupIdTo - sceneIdentifierTo: sceneIdTo - AddSceneResponse: - groupID: groupId - sceneID: sceneId - ViewSceneResponse: - groupID: groupId - sceneID: sceneId - RemoveSceneResponse: - groupID: groupId - sceneID: sceneId - RemoveAllScenesResponse: - groupID: groupId - StoreSceneResponse: - groupID: groupId - sceneID: sceneId - GetSceneMembershipResponse: - groupID: groupId - EnhancedAddSceneResponse: - groupID: groupId - sceneID: sceneId - EnhancedViewSceneResponse: - groupID: groupId - sceneID: sceneId - CopySceneResponse: - groupIdentifierFrom: groupIdFrom - sceneIdentifierFrom: sceneIdFrom structs: AccessControl: AccessControlEntryStruct: AccessControlEntry @@ -6643,11 +6334,6 @@ ApplicationStruct: catalogVendorID: catalogVendorId applicationID: applicationId - Scenes: - AttributeValuePair: - attributeID: attributeId - ExtensionFieldSet: - clusterID: clusterId event fields: Switch: MultiPressComplete: @@ -7307,8 +6993,6 @@ - Feature PumpConfigurationAndControl: - Feature - Scenes: - - Feature FanControl: - RockBitmap - WindBitmap @@ -7348,9 +7032,6 @@ - ConstantTemperature - Automatic - LocalOperation - Scenes: - Feature: - - SceneNames Thermostat: Feature: - LocalTemperatureNotExposed @@ -7474,48 +7155,6 @@ clusters: # SDK example, not part of the specification. - SampleMEI - attributes: - Scenes: - # New scenes bits not stable yet. - - SceneTableSize - enum values: - TimeSynchronization: - TimeSourceEnum: - - NonMatterSNTP - - NonMatterNTP - - MatterSNTP - - MatterNTP - - MixedNTP - - NonMatterSNTPNTS - - NonMatterNTPNTS - - MatterSNTPNTS - - MatterNTPNTS - - MixedNTPNTS - - PTP - - GNSS - # Once we actually unmark TimeSynchronization as provisional, all these bits should go away too, and we should instead - # mark things as introduced/deprecated as needed. The "ids" entries should go away, in particular. - ids: - attributes: - TimeSynchronization: - - TimeZoneListMaxSize - - DSTOffsetListMaxSize - - SupportsDNSResolve - commands: - TimeSynchronization: - - SetUTCTime - - SetTrustedTimeSource - - SetTimeZone - - SetTimeZoneResponse - - SetDSTOffset - - SetDefaultNTP - events: - TimeSynchronization: - - DSTTableEmpty - - DSTStatus - - TimeZoneStatus - - TimeFailure - - MissingTrustedTimeSource - release: "F7CA8603-6336-4E63-A216-30EE3F77CE8B" versions: @@ -7572,12 +7211,6 @@ GroupKeyManagement: Feature: - CacheAndSync - # Scenes are generally provisional for now. - Scenes: - Feature: - - Explicit - - TableSize - - FabricScenes removed: clusters: # Clusters that really should just not be exposed, even if they're in our XML. @@ -8089,8 +7722,6 @@ - Cool - Both bitmaps: - Scenes: - - CopyModeBitmap AdministratorCommissioning: - Feature ContentLauncher: @@ -8108,9 +7739,6 @@ PumpConfigurationAndControl: PumpStatusBitmap: - SupplyFault - Scenes: - CopyModeBitmap: - - CopyAllScenes SoftwareDiagnostics: Feature: - Watermarks @@ -8160,8 +7788,6 @@ - OffOnAuto - OffOn bitmaps: - Scenes: - - ScenesCopyMode ContentLauncher: - SupportedStreamingProtocol LevelControl: @@ -8178,60 +7804,22 @@ - WaterMarks provisional: clusters: - # DemandResponseLoadControl not finalized as of Fall 2024 Matter release. + # DemandResponseLoadControl not finalized as of Matter 1.4 (Fall 2024). - DemandResponseLoadControl # Timer does not seem to exist in the Matter specification. - Timer - # Targeting Spring 2024 Matter release - - EnergyEVSE + # ContentControl is provisional in Matter 1.4 (Fall 2024). - ContentControl - - ContentAppObserver - # Energy Preference is provisional in the Fall 2024 Matter release. + # Energy Preference is provisional in Matter 1.4 (Fall 2024). - EnergyPreference - # Scenes Management is provisional in the Fall 2024 Matter release. + # Scenes Management is provisional in Matter 1.4 (Fall 2024). - ScenesManagement - attributes: - NetworkCommissioning: - # Targeting Spring 2024 Matter release - - SupportedWiFiBands - - SupportedThreadFeatures - - ThreadVersion - WakeOnLAN: - # Targeting Spring 2024 Matter release - - LinkLocalAddress - BasicInformation: - # Targeting Spring 2024 Matter release - - SpecificationVersion - - MaxPathsPerInvoke - Scenes: - # Targeting Spring 2024 Matter release - - FabricSceneInfo - MediaPlayback: - # Targeting Spring 2024 Matter release - - ActiveAudioTrack - - AvailableAudioTracks - - ActiveTextTrack - - AvailableTextTracks commands: - GeneralDiagnostics: - # Targeting Spring 2024 Matter release - - TimeSnapshot - - TimeSnapshotResponse NetworkCommissioning: - # Targeting Spring 2024 Matter release + # QueryIdentity and QueryIdentityResponse not finalized as of Matter 1.4 (Fall 2024) + # Part of the HRAP feature. - QueryIdentity - QueryIdentityResponse - Channel: - # Targeting Spring 2024 Matter release - - GetProgramGuide - - ProgramGuideResponse - - RecordProgram - - CancelRecordProgram - MediaPlayback: - # Targeting Spring 2024 Matter release - - ActivateAudioTrack - - ActivateTextTrack - - DeactivateTextTrack UnitTesting: # Ideally none of UnitTesting would be exposed as public API, but # for now just start doing that for new additions to it. @@ -8240,7 +7828,7 @@ - TestSecondBatchHelperRequest command fields: NetworkCommissioning: - # Targeting Spring 2024 Matter release + # New command fields for HRAP not finalized as of Matter 1.4 (Fall 2024) AddOrUpdateWiFiNetwork: - networkIdentity - clientIdentifier @@ -8254,147 +7842,24 @@ QueryIdentityResponse: - identity - possessionSignature - MediaPlayback: - # Targeting Spring 2024 Matter release - Rewind: - - audioAdvanceUnmuted - FastForward: - - audioAdvanceUnmuted - ContentLauncher: - # Targeting Spring 2024 Matter release - LaunchContent: - - playbackPreferences - - useCurrentContext - AccountLogin: - # Targeting Spring 2024 Matter release - Login: - - node - Logout: - - node - structs: - Scenes: - # Targeting Spring 2024 Matter release - - SceneInfoStruct - Channel: - # Targeting Spring 2024 Matter release - - ProgramStruct - - SeriesInfoStruct - - ProgramCategoryStruct - - ProgramCastStruct - - PageTokenStruct - - ChannelPagingStruct - - AdditionalInfoStruct - MediaPlayback: - # Targeting Spring 2024 Matter release - - TrackStruct - - TrackAttributesStruct - ContentLauncher: - # Targeting Spring 2024 Matter release - - PlaybackPreferencesStruct - - TrackPreferenceStruct struct fields: NetworkCommissioning: - # Targeting Spring 2024 Matter release + # New struct fields for HRAP not finalized as of Matter 1.4 (Fall 2024) NetworkInfoStruct: - networkIdentifier - clientIdentifier - Channel: - # Targeting Spring 2024 Matter release - ChannelInfoStruct: - - identifier - - type - events: - MediaPlayback: - # Targeting Spring 2024 Matter release - - StateChanged - AccountLogin: - # Targeting Spring 2024 Matter release - - LoggedOut - TargetNavigator: - # Targeting Spring 2024 Matter release - - TargetUpdated - enums: - Thermostat: - # Targeting Spring 2024 Matter release - - StartOfWeekEnum - - TemperatureSetpointHoldEnum - - ACCapacityFormatEnum - - ACCompressorTypeEnum - - ACLouverPositionEnum - - ACRefrigerantTypeEnum - - ACTypeEnum - - SetpointChangeSourceEnum - Channel: - # Targeting Spring 2024 Matter release - - ChannelTypeEnum - MediaPlayback: - # Targeting Spring 2024 Matter release - - CharacteristicEnum - ContentLauncher: - # Targeting Spring 2024 Matter release - - CharacteristicEnum - enum values: - ContentLauncher: - # Targeting Spring 2024 Matter release - ParameterEnum: - - Season - - Episode - - Any - StatusEnum: - - TextTrackNotAvailable - - AudioTrackNotAvailable - TimeFormatLocalization: - CalendarTypeEnum: - - UseActiveLocale - HourFormatEnum: - - UseActiveLocale - bitmaps: - NetworkCommissioning: - # Targeting Spring 2024 Matter release - - ThreadCapabilitiesBitmap - Scenes: - # Targeting Spring 2024 Matter release - - NameSupportBitmap - Thermostat: - # Targeting Spring 2024 Matter release - - ACErrorCodeBitmap - - HVACSystemTypeBitmap - - ProgrammingOperationModeBitmap - - RelayStateBitmap - - RemoteSensingBitmap - Channel: - # Targeting Spring 2024 Matter release - - RecordingFlagBitmap bitmap values: - OnOff: - Feature: - # Targeting Spring 2024 Matter release - - OffOnly NetworkCommissioning: - # Targeting Spring 2024 Matter release Feature: + # New feature for HRAP not finalized as of Matter 1.4 (Fall 2024) - PerDeviceCredentials WiFiSecurityBitmap: + # New bit for HRAP not finalized as of Matter 1.4 (Fall 2024) - WPA3MatterPDC - Channel: - # Targeting Spring 2024 Matter release - Feature: - - ElectronicGuide - - RecordProgram - MediaPlayback: - # Targeting Spring 2024 Matter release - Feature: - - TextTracks - - AudioTracks - - AudioAdvance ContentLauncher: - # Targeting Spring 2024 Matter release SupportedProtocolsBitmap: + # Not present in Matter 1.4 (Fall 2024) - WebRTC - Feature: - - AdvancedSeek - - TextTracks - - AudioTracks renames: structs: Thermostat: @@ -8430,8 +7895,6 @@ OffHighAuto: OffOnAuto OffHigh: OffOn bitmaps: - Scenes: - CopyModeBitmap: ScenesCopyMode ContentLauncher: SupportedProtocolsBitmap: SupportedStreamingProtocol LevelControl: @@ -9489,81 +8952,22 @@ - ShortCircuit - CurrentExceeded provisional: - clusters: - # Targeting Spring 2024 Matter release - - EnergyEVSEMode - - Messages - - PowerTopology attributes: - Thermostat: - # Targeting Spring 2024 Matter release - - PresetTypes - - ScheduleTypes - - NumberOfPresets - - NumberOfSchedules - - NumberOfScheduleTransitions - - NumberOfScheduleTransitionPerDay - - ActivePresetHandle - - Presets - - Schedules - - TemperatureSetpointHoldPolicy - - SetpointHoldExpiryTimestamp - - ActiveScheduleHandle UnitTesting: # Ideally none of UnitTesting would be exposed as public API, but # for now just start doing that for new additions to it. - MeiInt8u commands: - Thermostat: - # Targeting Spring 2024 Matter release - - SetActiveScheduleRequest - - SetActivePresetRequest - - StartPresetsSchedulesEditRequest - - CancelPresetsSchedulesEditRequest - - CommitPresetsSchedulesRequest - - SetTemperatureSetpointHoldPolicy UnitTesting: # Ideally none of UnitTesting would be exposed as public API, but # for now just start doing that for new additions to it. - TestDifferentVendorMeiRequest - TestDifferentVendorMeiResponse - GeneralDiagnostics: - # Targeting Spring 2024 Matter release - - PayloadTestRequest - - PayloadTestResponse - structs: - Thermostat: - # Targeting Spring 2024 Matter release - - ScheduleTransitionStruct - - ScheduleStruct - - PresetStruct - - PresetTypeStruct - - ScheduleTypeStruct events: UnitTesting: # Ideally none of UnitTesting would be exposed as public API, but # for now just start doing that for new additions to it. - TestDifferentVendorMeiEvent - enums: - Thermostat: - # Targeting Spring 2024 Matter release - - PresetScenarioEnum - bitmaps: - Thermostat: - # Targeting Spring 2024 Matter release - - PresetTypeFeaturesBitmap - - ScheduleTypeFeaturesBitmap - - TemperatureSetpointHoldPolicyBitmap - GeneralDiagnostics: - # Targeting Spring 2024 Matter release - - Feature - bitmap values: - Thermostat: - Feature: - # Targeting Spring 2024 Matter release - - Setpoints - - Presets - - MatterScheduleConfiguration - release: "6C44AB2F-2F6B-4B57-B523-5CD89584986F" versions: @@ -9698,40 +9102,23 @@ - WindowCoveringController provisional: clusters: - # Targeting 1.4 - - CommissionerControl + # Outstanding issue at https://github.com/CHIP-Specifications/connectedhomeip-spec/issues/10854 + # needs to be addressed to expose this EcosystemInformation. - EcosystemInformation - - ServiceArea - - ThreadBorderRouterManagement - - ThreadNetworkDirectory - - WaterHeaterManagement - - WaterHeaterMode - - WiFiNetworkManagement - # Targeting Camera enablement + # Targeting Camera enablement, not part of Matter 1.4 - CameraAVStreamManagement - Chime - WebRTCTransportProvider - WebRTCTransportRequestor - ZoneManagement attributes: - AccessControl: - # Targeting 1.4 - - CommissioningARL - - ARL - BridgedDeviceBasicInformation: - # Targeting 1.4 - - ProductID GeneralCommissioning: - # Targeting 1.4 + # The TermsAndConditions feature is provisional in Matter 1.4 - TCAcceptedVersion - TCMinRequiredVersion - TCAcknowledgements - TCAcknowledgementsRequired - TCUpdateDeadline - OccupancySensing: - # Targeting 1.4 - - HoldTime - - HoldTimeLimits UnitTesting: # Ideally none of UnitTesting would be exposed as public API, but # for now just start doing that for new additions to it. @@ -9742,21 +9129,10 @@ - ReadFailureCode - FailureInt32U commands: - AccessControl: - # Targeting 1.4 - - ReviewFabricRestrictions - - ReviewFabricRestrictionsResponse - BridgedDeviceBasicInformation: - # Targeting 1.4 - - KeepActive GeneralCommissioning: - # Targeting 1.4 + # The TermsAndConditions feature is provisional in Matter 1.4 - SetTCAcknowledgements - SetTCAcknowledgementsResponse - Thermostat: - # Targeting 1.4 - - AtomicRequest - - AtomicResponse UnitTesting: # Ideally none of UnitTesting would be exposed as public API, but # for now just start doing that for new additions to it. @@ -9764,25 +9140,10 @@ - GlobalEchoResponse - StringEchoRequest - StringEchoResponse - command fields: - DoorLock: - GetCredentialStatusResponse: - - credentialData structs: - AccessControl: - # Targeting 1.4 - - AccessRestrictionEntryStruct - - AccessRestrictionStruct - - CommissioningAccessRestrictionEntryStruct Globals: - # Test-only value + # Test-only value, not to be exposed - TestGlobalStruct - # Targeting 1.4 - - AtomicAttributeStatusStruct - - LocationDescriptorStruct - OccupancySensing: - # Targeting 1.4 - - HoldTimeLimitsStruct struct fields: UnitTesting: # Ideally none of UnitTesting would be exposed as public API, but @@ -9791,74 +9152,37 @@ - i NestedStruct: - d - events: - AccessControl: - # Targeting 1.4 - - AccessRestrictionEntryChanged - - FabricRestrictionReviewUpdate - BridgedDeviceBasicInformation: - # Targeting 1.4 - - ActiveChanged - OccupancySensing: - # Targeting 1.4 - - OccupancyChanged enums: - AccessControl: - # Targeting 1.4 - - AccessRestrictionTypeEnum Globals: # Test-only value - TestGlobalEnum - # Targeting 1.4 - - AreaTypeTag - - AtomicRequestTypeEnum + # Not part of the Matter 1.4 specification. - FloorSurfaceTag - - LandmarkTag - - PositionTag - - RelativePositionTag - # Targeting Camera enablement + # The naming of AreaTypeTag does not match other namespace enum names, + # and the value set does not match the 1.4 specification. + # Those issues need to be sorted out. + - AreaTypeTag + # Targeting Camera enablement, not part of Matter 1.4. - ThreeLevelAutoEnum enum values: - ApplicationLauncher: - StatusEnum: - # Targeting 1.4 - - Downloading - - Installing - - PendingUserApproval GeneralCommissioning: CommissioningErrorEnum: - # Targeting 1.4 + # The TermsAndConditions feature is provisional in Matter 1.4 - RequiredTCNotAccepted - TCAcknowledgementsNotReceived - TCMinVersionNotMet bitmaps: - AccessControl: - # Targeting 1.4 - - Feature - BridgedDeviceBasicInformation: - # Targeting 1.4 - - Feature GeneralCommissioning: - # Targeting 1.4 - - Feature - OccupancySensing: - # Targeting 1.4 + # The only bit (TermsAndConditions) is provisional in Matter 1.4. - Feature - Thermostat: - # Targeting 1.4 - - OccupancyBitmap bitmap values: - Switch: - Feature: - # Targeting 1.4 - - ActionSwitch RVCCleanMode: Feature: - # Targeting 1.4 + # Targeting Summer 2025 Matter release - DirectModeChange RVCRunMode: Feature: - # Targeting 1.4 + # Targeting Summer 2025 Matter release - DirectModeChange renames: enums: @@ -9935,22 +9259,56 @@ tvOS: "18.4" introduced: clusters: + - CommissionerControl + - ContentAppObserver - DeviceEnergyManagement - DeviceEnergyManagementMode - DishwasherAlarm - DishwasherMode + - EnergyEVSE + - EnergyEVSEMode - ICDManagement - LaundryDryerControls - LaundryWasherControls - LaundryWasherMode + - Messages - MicrowaveOvenControl - MicrowaveOvenMode - OvenMode - OvenCavityOperationalState + - PowerTopology - RefrigeratorAlarm - RefrigeratorAndTemperatureControlledCabinetMode + - ServiceArea - TemperatureControl + - ThreadBorderRouterManagement + - ThreadNetworkDirectory + - TimeSynchronization + - WaterHeaterManagement + - WaterHeaterMode + - WiFiNetworkManagement attributes: + AccessControl: + - CommissioningARL + - ARL + BasicInformation: + - SpecificationVersion + - MaxPathsPerInvoke + BridgedDeviceBasicInformation: + - ProductID + CommissionerControl: + - SupportedDeviceCategories + - GeneratedCommandList + - AcceptedCommandList + - AttributeList + - FeatureMap + - ClusterRevision + ContentAppObserver: + - GeneratedCommandList + - AcceptedCommandList + - AttributeList + - FeatureMap + - ClusterRevision DeviceEnergyManagement: - ESAType - ESACanGenerate @@ -10001,6 +9359,37 @@ - AliroBLEAdvertisingVersion - NumberOfAliroCredentialIssuerKeysSupported - NumberOfAliroEndpointKeysSupported + EnergyEVSE: + - State + - SupplyState + - FaultState + - ChargingEnabledUntil + - CircuitCapacity + - MinimumChargeCurrent + - MaximumChargeCurrent + - UserMaximumChargeCurrent + - RandomizationDelayWindow + - NextChargeStartTime + - NextChargeTargetTime + - NextChargeRequiredEnergy + - NextChargeTargetSoC + - ApproximateEVEfficiency + - SessionID + - SessionDuration + - SessionEnergyCharged + - GeneratedCommandList + - AcceptedCommandList + - AttributeList + - FeatureMap + - ClusterRevision + EnergyEVSEMode: + - SupportedModes + - CurrentMode + - GeneratedCommandList + - AcceptedCommandList + - AttributeList + - FeatureMap + - ClusterRevision ICDManagement: - IdleModeDuration - ActiveModeDuration @@ -10043,6 +9432,14 @@ - AttributeList - FeatureMap - ClusterRevision + Messages: + - Messages + - ActiveMessageIDs + - GeneratedCommandList + - AcceptedCommandList + - AttributeList + - FeatureMap + - ClusterRevision MicrowaveOvenControl: - CookTime - MaxCookTime @@ -10065,6 +9462,13 @@ - AttributeList - FeatureMap - ClusterRevision + NetworkCommissioning: + - SupportedWiFiBands + - SupportedThreadFeatures + - ThreadVersion + OccupancySensing: + - HoldTime + - HoldTimeLimits OvenMode: - SupportedModes - CurrentMode @@ -10085,6 +9489,14 @@ - AttributeList - FeatureMap - ClusterRevision + PowerTopology: + - AvailableEndpoints + - ActiveEndpoints + - GeneratedCommandList + - AcceptedCommandList + - AttributeList + - FeatureMap + - ClusterRevision RefrigeratorAlarm: - Mask - State @@ -10102,6 +9514,18 @@ - AttributeList - FeatureMap - ClusterRevision + ServiceArea: + - SupportedAreas + - SupportedMaps + - SelectedAreas + - CurrentArea + - EstimatedEndTime + - Progress + - GeneratedCommandList + - AcceptedCommandList + - AttributeList + - FeatureMap + - ClusterRevision TemperatureControl: - TemperatureSetpoint - MinTemperature @@ -10114,7 +9538,106 @@ - AttributeList - FeatureMap - ClusterRevision + Thermostat: + - PresetTypes + - ScheduleTypes + - NumberOfPresets + - NumberOfSchedules + - NumberOfScheduleTransitions + - NumberOfScheduleTransitionPerDay + - ActivePresetHandle + - ActiveScheduleHandle + - Presets + - Schedules + - SetpointHoldExpiryTimestamp + ThreadBorderRouterManagement: + - BorderRouterName + - BorderAgentID + - ThreadVersion + - InterfaceEnabled + - ActiveDatasetTimestamp + - PendingDatasetTimestamp + - GeneratedCommandList + - AcceptedCommandList + - AttributeList + - FeatureMap + - ClusterRevision + ThreadNetworkDirectory: + - PreferredExtendedPanID + - ThreadNetworks + - ThreadNetworkTableSize + - GeneratedCommandList + - AcceptedCommandList + - AttributeList + - FeatureMap + - ClusterRevision + TimeSynchronization: + - TimeZoneListMaxSize + - DSTOffsetListMaxSize + - SupportsDNSResolve + - UTCTime + - Granularity + - TimeSource + - TrustedTimeSource + - DefaultNTP + - TimeZone + - DSTOffset + - LocalTime + - TimeZoneDatabase + - NTPServerAvailable + - GeneratedCommandList + - AcceptedCommandList + - AttributeList + - FeatureMap + - ClusterRevision + WakeOnLAN: + - LinkLocalAddress + WaterHeaterManagement: + - HeaterTypes + - HeatDemand + - TankVolume + - EstimatedHeatRequired + - TankPercentage + - BoostState + - GeneratedCommandList + - AcceptedCommandList + - AttributeList + - FeatureMap + - ClusterRevision + WaterHeaterMode: + - SupportedModes + - CurrentMode + - GeneratedCommandList + - AcceptedCommandList + - AttributeList + - FeatureMap + - ClusterRevision + WiFiNetworkManagement: + - SSID + - PassphraseSurrogate + - GeneratedCommandList + - AcceptedCommandList + - AttributeList + - FeatureMap + - ClusterRevision commands: + AccessControl: + - ReviewFabricRestrictions + - ReviewFabricRestrictionsResponse + BridgedDeviceBasicInformation: + - KeepActive + Channel: + - GetProgramGuide + - ProgramGuideResponse + - RecordProgram + - CancelRecordProgram + CommissionerControl: + - RequestCommissioningApproval + - CommissionNode + - ReverseOpenCommissioningWindow + ContentAppObserver: + - ContentAppMessage + - ContentAppMessageResponse DeviceEnergyManagement: - PowerAdjustRequest - CancelPowerAdjustRequest @@ -10137,6 +9660,22 @@ - UnboltDoor - SetAliroReaderConfig - ClearAliroReaderConfig + EnergyEVSE: + - Disable + - EnableCharging + - StartDiagnostics + - SetTargets + - GetTargets + - ClearTargets + - GetTargetsResponse + EnergyEVSEMode: + - ChangeToMode + - ChangeToModeResponse + GeneralDiagnostics: + - TimeSnapshot + - TimeSnapshotResponse + - PayloadTestRequest + - PayloadTestResponse ICDManagement: - RegisterClient - RegisterClientResponse @@ -10146,6 +9685,13 @@ LaundryWasherMode: - ChangeToMode - ChangeToModeResponse + MediaPlayback: + - ActivateAudioTrack + - ActivateTextTrack + - DeactivateTextTrack + Messages: + - PresentMessagesRequest + - CancelMessagesRequest MicrowaveOvenControl: - SetCookingParameters - AddMoreTime @@ -10161,19 +9707,115 @@ - ChangeToModeResponse RVCOperationalState: - GoHome + ServiceArea: + - SelectAreas + - SelectAreasResponse + - SkipArea + - SkipAreaResponse TemperatureControl: - SetTemperature + Thermostat: + - SetActiveScheduleRequest + - SetActivePresetRequest + - AtomicRequest + - AtomicResponse + ThreadBorderRouterManagement: + - GetActiveDatasetRequest + - GetPendingDatasetRequest + - DatasetResponse + - SetActiveDatasetRequest + - SetPendingDatasetRequest + ThreadNetworkDirectory: + - AddNetwork + - RemoveNetwork + - GetOperationalDataset + - OperationalDatasetResponse + TimeSynchronization: + - SetTrustedTimeSource + - SetTimeZone + - SetTimeZoneResponse + - SetDSTOffset + - SetDefaultNTP + - SetUTCTime + WaterHeaterManagement: + - Boost + - CancelBoost + WaterHeaterMode: + - ChangeToMode + - ChangeToModeResponse + WiFiNetworkManagement: + - NetworkPassphraseRequest + - NetworkPassphraseResponse command fields: - DeviceEnergyManagement: - PowerAdjustRequest: - - power - - duration - - cause - StartTimeAdjustRequest: - - requestedStartTime - - cause - PauseRequest: - - duration + AccessControl: + ReviewFabricRestrictions: + - arl + ReviewFabricRestrictionsResponse: + - token + AccountLogin: + Login: + - node + Logout: + - node + BridgedDeviceBasicInformation: + KeepActive: + - stayActiveDuration + - timeoutMs + Channel: + GetProgramGuide: + - startTime + - endTime + - channelList + - pageToken + - recordingFlag + - data + ProgramGuideResponse: + - paging + - programList + RecordProgram: + - programIdentifier + - shouldRecordSeries + - data + CancelRecordProgram: + - programIdentifier + - shouldRecordSeries + - data + CommissionerControl: + RequestCommissioningApproval: + - requestID + - vendorID + - productID + - label + CommissionNode: + - requestID + - responseTimeoutSeconds + ReverseOpenCommissioningWindow: + - commissioningTimeout + - pakePasscodeVerifier + - discriminator + - iterations + - salt + ContentLauncher: + LaunchContent: + - useCurrentContext + ContentAppObserver: + ContentAppMessage: + - data + - encodingHint + ContentAppMessageResponse: + - status + - data + - encodingHint + DeviceEnergyManagement: + PowerAdjustRequest: + - power + - duration + - cause + StartTimeAdjustRequest: + - requestedStartTime + - cause + PauseRequest: + - duration - cause ModifyForecastRequest: - forecastID @@ -10207,6 +9849,33 @@ - verificationKey - groupIdentifier - groupResolvingKey + GetCredentialStatusResponse: + - credentialData + EnergyEVSE: + EnableCharging: + - chargingEnabledUntil + - minimumChargeCurrent + - maximumChargeCurrent + SetTargets: + - chargingTargetSchedules + GetTargetsResponse: + - chargingTargetSchedules + EnergyEVSEMode: + ChangeToMode: + - newMode + ChangeToModeResponse: + - status + - statusText + GeneralDiagnostics: + TimeSnapshotResponse: + - systemTimeMs + - posixTimeMs + PayloadTestRequest: + - enableKey + - value + - count + PayloadTestResponse: + - payload ICDManagement: RegisterClient: - checkInNodeID @@ -10229,6 +9898,27 @@ ChangeToModeResponse: - status - statusText + MediaPlayback: + ActivateAudioTrack: + - trackID + - audioOutputIndex + ActivateTextTrack: + - trackID + Rewind: + - audioAdvanceUnmuted + FastForward: + - audioAdvanceUnmuted + Messages: + PresentMessagesRequest: + - messageID + - priority + - messageControl + - startTime + - duration + - messageText + - responses + CancelMessagesRequest: + - messageIDs MicrowaveOvenControl: SetCookingParameters: - cookMode @@ -10253,11 +9943,87 @@ ChangeToModeResponse: - status - statusText + ServiceArea: + SelectAreas: + - newAreas + SelectAreasResponse: + - status + - statusText + SkipArea: + - skippedArea + SkipAreaResponse: + - status + - statusText TemperatureControl: SetTemperature: - targetTemperature - targetTemperatureLevel + Thermostat: + SetActiveScheduleRequest: + - scheduleHandle + SetActivePresetRequest: + - presetHandle + AtomicRequest: + - requestType + - attributeRequests + - timeout + AtomicResponse: + - statusCode + - attributeStatus + - timeout + ThreadBorderRouterManagement: + DatasetResponse: + - dataset + SetActiveDatasetRequest: + - activeDataset + - breadcrumb + SetPendingDatasetRequest: + - pendingDataset + ThreadNetworkDirectory: + AddNetwork: + - operationalDataset + RemoveNetwork: + - extendedPanID + GetOperationalDataset: + - extendedPanID + OperationalDatasetResponse: + - operationalDataset + TimeSynchronization: + # NOTE: SetUTCTime fields were introduced earlier. + SetTrustedTimeSource: + - trustedTimeSource + SetTimeZone: + - timeZone + SetTimeZoneResponse: + - dstOffsetRequired + SetDSTOffset: + - dstOffset + SetDefaultNTP: + - defaultNTP + WaterHeaterManagement: + Boost: + - boostInfo + WaterHeaterMode: + ChangeToMode: + - newMode + ChangeToModeResponse: + - status + - statusText + WiFiNetworkManagement: + NetworkPassphraseResponse: + - passphrase structs: + AccessControl: + - AccessRestrictionEntryStruct + - AccessRestrictionStruct + - CommissioningAccessRestrictionEntryStruct + Channel: + - ProgramStruct + - SeriesInfoStruct + - ProgramCategoryStruct + - ProgramCastStruct + - PageTokenStruct + - ChannelPagingStruct DeviceEnergyManagement: - CostStruct - PowerAdjustStruct @@ -10274,14 +10040,28 @@ - ModeTagStruct ElectricalEnergyMeasurement: - MeasurementAccuracyRangeStruct + EnergyEVSE: + - ChargingTargetStruct + - ChargingTargetScheduleStruct + EnergyEVSEMode: + - ModeOptionStruct + - ModeTagStruct + Globals: + - AtomicAttributeStatusStruct + - LocationDescriptorStruct ICDManagement: - MonitoringRegistrationStruct LaundryWasherMode: - ModeOptionStruct - ModeTagStruct + Messages: + - MessageStruct + - MessageResponseOptionStruct MicrowaveOvenMode: - ModeTagStruct - ModeOptionStruct + OccupancySensing: + - HoldTimeLimitsStruct OvenMode: - ModeTagStruct - ModeOptionStruct @@ -10291,7 +10071,78 @@ RefrigeratorAndTemperatureControlledCabinetMode: - ModeOptionStruct - ModeTagStruct + ServiceArea: + - LandmarkInfoStruct + - AreaInfoStruct + - MapStruct + - AreaStruct + - ProgressStruct + Thermostat: + - ScheduleTransitionStruct + - ScheduleStruct + - PresetStruct + - PresetTypeStruct + - ScheduleTypeStruct + ThreadNetworkDirectory: + - ThreadNetworkStruct + TimeSynchronization: + - FabricScopedTrustedTimeSourceStruct + - TrustedTimeSourceStruct + WaterHeaterManagement: + - WaterHeaterBoostInfoStruct + WaterHeaterMode: + - ModeOptionStruct + - ModeTagStruct struct fields: + AccessControl: + AccessRestrictionEntryStruct: + - endpoint + - cluster + - restrictions + - fabricIndex + AccessRestrictionStruct: + - type + - id + CommissioningAccessRestrictionEntryStruct: + - endpoint + - cluster + - restrictions + Channel: + ChannelInfoStruct: + - identifier + - type + ProgramStruct: + - identifier + - channel + - startTime + - endTime + - title + - subtitle + - descriptionString + - audioLanguages + - ratings + - releaseDate + - parentalGuidanceText + - recordingFlag + - seriesInfo + - categoryList + - castList + ProgramCategoryStruct: + - category + - subCategory + SeriesInfoStruct: + - season + - episode + ProgramCastStruct: + - name + - role + PageTokenStruct: + - limit + - after + - before + ChannelPagingStruct: + - previousToken + - nextToken DeviceEnergyManagement: CostStruct: - costType @@ -10371,6 +10222,30 @@ - fixedMax - fixedMin - fixedTypical + EnergyEVSE: + ChargingTargetStruct: + - targetTimeMinutesPastMidnight + - targetSoC + - addedEnergy + ChargingTargetScheduleStruct: + - dayOfWeekForSequence + - chargingTargets + EnergyEVSEMode: + ModeOptionStruct: + - label + - mode + - modeTags + ModeTagStruct: + - mfgCode + - value + Globals: + AtomicAttributeStatusStruct: + - attributeID + - statusCode + LocationDescriptorStruct: + - locationName + - floorNumber + - areaType ICDManagement: MonitoringRegistrationStruct: - checkInNodeID @@ -10385,6 +10260,18 @@ ModeTagStruct: - mfgCode - value + Messages: + MessageStruct: + - messageID + - priority + - messageControl + - startTime + - duration + - messageText + - responses + MessageResponseOptionStruct: + - messageResponseID + - label MicrowaveOvenMode: ModeTagStruct: - mfgCode @@ -10401,6 +10288,11 @@ - label - mode - modeTags + OccupancySensing: + HoldTimeLimitsStruct: + - holdTimeMin + - holdTimeMax + - holdTimeDefault OvenCavityOperationalState: ErrorStateStruct: - errorStateID @@ -10417,7 +10309,93 @@ ModeTagStruct: - mfgCode - value + ServiceArea: + LandmarkInfoStruct: + - landmarkTag + - relativePositionTag + AreaInfoStruct: + - locationInfo + - landmarkInfo + MapStruct: + - mapID + - name + AreaStruct: + - areaID + - mapID + - areaInfo + ProgressStruct: + - areaID + - status + - totalOperationalTime + Thermostat: + ScheduleTransitionStruct: + - dayOfWeek + - transitionTime + - presetHandle + - systemMode + - coolingSetpoint + - heatingSetpoint + ScheduleStruct: + - scheduleHandle + - systemMode + - name + - presetHandle + - transitions + - builtIn + PresetStruct: + - presetHandle + - presetScenario + - name + - coolingSetpoint + - heatingSetpoint + - builtIn + PresetTypeStruct: + - presetScenario + - numberOfPresets + - presetTypeFeatures + ScheduleTypeStruct: + - systemMode + - numberOfSchedules + - scheduleTypeFeatures + ThreadNetworkDirectory: + ThreadNetworkStruct: + - extendedPanID + - networkName + - channel + - activeTimestamp + TimeSynchronization: + FabricScopedTrustedTimeSourceStruct: + - nodeID + - endpoint + TrustedTimeSourceStruct: + - fabricIndex + - nodeID + - endpoint + WaterHeaterManagement: + WaterHeaterBoostInfoStruct: + - duration + - oneShot + - emergencyBoost + - temporarySetpoint + - targetPercentage + - targetReheat + WaterHeaterMode: + ModeOptionStruct: + - label + - mode + - modeTags + ModeTagStruct: + - mfgCode + - value events: + AccessControl: + - FabricRestrictionReviewUpdate + AccountLogin: + - LoggedOut + CommissionerControl: + - CommissioningRequestResult + BridgedDeviceBasicInformation: + - ActiveChanged DeviceEnergyManagement: - PowerAdjustStart - PowerAdjustEnd @@ -10425,12 +10403,55 @@ - Resumed DishwasherAlarm: - Notify + EnergyEVSE: + - EVConnected + - EVNotDetected + - EnergyTransferStarted + - EnergyTransferStopped + - Fault + - RFID + MediaPlayback: + - StateChanged + Messages: + - MessageQueued + - MessagePresented + - MessageComplete + OccupancySensing: + - OccupancyChanged OvenCavityOperationalState: - OperationalError - OperationCompletion RefrigeratorAlarm: - Notify + TargetNavigator: + - TargetUpdated + TimeSynchronization: + - DSTTableEmpty + - DSTStatus + - TimeZoneStatus + - TimeFailure + - MissingTrustedTimeSource + WaterHeaterManagement: + - BoostStarted + - BoostEnded event fields: + AccessControl: + FabricRestrictionReviewUpdate: + - token + - instruction + - fabricIndex + AccountLogin: + LoggedOut: + - node + BridgedDeviceBasicInformation: + ActiveChanged: + - promisedActiveDuration + CommissionerControl: + CommissioningRequestResult: + - requestID + - clientNodeID + - statusCode + - fabricIndex DeviceEnergyManagement: PowerAdjustEnd: - cause @@ -10444,6 +10465,54 @@ - inactive - state - mask + EnergyEVSE: + EVConnected: + - sessionID + EVNotDetected: + - sessionID + - state + - sessionDuration + - sessionEnergyCharged + EnergyTransferStarted: + - sessionID + - state + - maximumCurrent + EnergyTransferStopped: + - sessionID + - state + - reason + - energyTransferred + Fault: + - sessionID + - state + - faultStatePreviousState + - faultStateCurrentState + RFID: + - uid + MediaPlayback: + StateChanged: + - currentState + - startTime + - duration + - sampledPosition + - playbackSpeed + - seekRangeEnd + - seekRangeStart + - data + - audioAdvanceUnmuted + Messages: + MessageQueued: + - messageID + MessagePresented: + - messageID + MessageComplete: + - messageID + - responseID + - reply + - futureMessagesPreference + OccupancySensing: + OccupancyChanged: + - occupancy OvenCavityOperationalState: OperationalError: - errorState @@ -10457,7 +10526,27 @@ - inactive - state - mask + TargetNavigator: + TargetUpdated: + - targetList + - currentTarget + - data + TimeSynchronization: + DSTStatus: + - dstOffsetActive + TimeZoneStatus: + - offset + - name + WaterHeaterManagement: + BoostStarted: + - boostInfo enums: + AccessControl: + - AccessRestrictionTypeEnum + Channel: + - ChannelTypeEnum + ContentAppObserver: + - StatusEnum DeviceEnergyManagement: - CostTypeEnum - ESATypeEnum @@ -10473,9 +10562,26 @@ - ModeTag ElectricalEnergyMeasurement: - MeasurementTypeEnum + EnergyEVSE: + - StateEnum + - SupplyStateEnum + - FaultStateEnum + - EnergyTransferStoppedReasonEnum + EnergyEVSEMode: + - ModeTag + Globals: + - AtomicRequestTypeEnum + - LandmarkTag + - PositionTag + - RelativePositionTag ICDManagement: - ClientTypeEnum - OperatingModeEnum + MediaPlayback: + - CharacteristicEnum + Messages: + - FutureMessagePreferenceEnum + - MessagePriorityEnum MicrowaveOvenMode: - ModeTag OvenMode: @@ -10491,7 +10597,57 @@ - OperationalStateEnum RefrigeratorAndTemperatureControlledCabinetMode: - ModeTag + ServiceArea: + - OperationalStatusEnum + - SelectAreasStatus + - SkipAreaStatus + Thermostat: + - StartOfWeekEnum + - TemperatureSetpointHoldEnum + - ACCapacityFormatEnum + - ACCompressorTypeEnum + - ACLouverPositionEnum + - ACRefrigerantTypeEnum + - ACTypeEnum + - SetpointChangeSourceEnum + - PresetScenarioEnum + TimeSynchronization: + - StatusCode + - TimeZoneDatabaseEnum + WaterHeaterManagement: + - BoostStateEnum + WaterHeaterMode: + - ModeTag enum values: + AccessControl: + AccessRestrictionTypeEnum: + - AttributeAccessForbidden + - AttributeWriteForbidden + - CommandForbidden + - EventForbidden + ApplicationLauncher: + StatusEnum: + - PendingUserApproval + - Downloading + - Installing + Channel: + ChannelTypeEnum: + - Satellite + - Cable + - Terrestrial + - OTT + ContentAppObserver: + StatusEnum: + - Success + - UnexpectedData + ContentLauncher: + ParameterEnum: + - Season + - Episode + - Any + StatusEnum: + - TextTrackNotAvailable + - AudioTrackNotAvailable DeviceEnergyManagement: CostTypeEnum: - Financial @@ -10607,6 +10763,130 @@ - PowerFactor - NeutralCurrent - ElectricalEnergy + EnergyEVSE: + StateEnum: + - NotPluggedIn + - PluggedInNoDemand + - PluggedInDemand + - PluggedInCharging + - SessionEnding + - Fault + SupplyStateEnum: + - Disabled + - ChargingEnabled + - DisabledError + - DisabledDiagnostics + FaultStateEnum: + - NoError + - MeterFailure + - OverVoltage + - UnderVoltage + - OverCurrent + - ContactWetFailure + - ContactDryFailure + - GroundFault + - PowerLoss + - PowerQuality + - PilotShortCircuit + - EmergencyStop + - EVDisconnected + - WrongPowerSupply + - LiveNeutralSwap + - OverTemperature + - Other + EnergyTransferStoppedReasonEnum: + - EVStopped + - EVSEStopped + - Other + EnergyEVSEMode: + ModeTag: + - Auto + - Quick + - Quiet + - LowNoise + - LowEnergy + - Vacation + - Min + - Max + - Night + - Day + - Manual + - TimeOfUse + - SolarCharging + - V2X + Globals: + AtomicRequestTypeEnum: + - BeginWrite + - CommitWrite + - RollbackWrite + LandmarkTag: + - AirConditioner + - AirPurifier + - BackDoor + - BarStool + - BathMat + - Bathtub + - Bed + - Bookshelf + - Chair + - ChristmasTree + - CoatRack + - CoffeeTable + - CookingRange + - Couch + - Countertop + - Cradle + - Crib + - Desk + - DiningTable + - Dishwasher + - Door + - Dresser + - LaundryDryer + - Fan + - Fireplace + - Freezer + - FrontDoor + - HighChair + - KitchenIsland + - Lamp + - LitterBox + - Mirror + - Nightstand + - Oven + - PetBed + - PetBowl + - PetCrate + - Refrigerator + - ScratchingPost + - ShoeRack + - Shower + - SideDoor + - Sink + - Sofa + - Stove + - Table + - Toilet + - TrashCan + - LaundryWasher + - Window + - WineCooler + PositionTag: + - Left + - Right + - Top + - Bottom + - Middle + - Row + - Column + RelativePositionTag: + - Under + - NextTo + - Around + - On + - Above + - FrontOf + - Behind ICDManagement: ClientTypeEnum: - Permanent @@ -10642,6 +10922,38 @@ - Delicate - Heavy - Whites + MediaPlayback: + CharacteristicEnum: + - ForcedSubtitles + - DescribesVideo + - EasyToRead + - FrameBased + - MainProgram + - OriginalContent + - VoiceOverTranslation + - Caption + - Subtitle + - Alternate + - Supplementary + - Commentary + - DubbedTranslation + - Description + - Metadata + - EnhancedAudioIntelligibility + - Emergency + - Karaoke + Messages: + FutureMessagePreferenceEnum: + - Allowed + - Increased + - Reduced + - Disallowed + - Banned + MessagePriorityEnum: + - Low + - Medium + - High + - Critical MicrowaveOvenMode: ModeTag: - Auto @@ -10739,24 +11051,195 @@ - Night - Day - Mapping + ServiceArea: + OperationalStatusEnum: + - Pending + - Operating + - Skipped + - Completed + SelectAreasStatus: + - Success + - UnsupportedArea + - InvalidInMode + - InvalidSet + SkipAreaStatus: + - Success + - InvalidAreaList + - InvalidInMode + - InvalidSkippedArea + Thermostat: + StartOfWeekEnum: + - Sunday + - Monday + - Tuesday + - Wednesday + - Thursday + - Friday + - Saturday + TemperatureSetpointHoldEnum: + - SetpointHoldOff + - SetpointHoldOn + ACCapacityFormatEnum: + - BTUh + ACCompressorTypeEnum: + - Unknown + - T1 + - T2 + - T3 + ACLouverPositionEnum: + - Closed + - Open + - Quarter + - Half + - ThreeQuarters + ACRefrigerantTypeEnum: + - Unknown + - R22 + - R410a + - R407c + ACTypeEnum: + - Unknown + - CoolingFixed + - HeatPumpFixed + - CoolingInverter + - HeatPumpInverter + SetpointChangeSourceEnum: + - Manual + - Schedule + - External + PresetScenarioEnum: + - Occupied + - Unoccupied + - Sleep + - Wake + - Vacation + - GoingToSleep + - UserDefined + TimeFormatLocalization: + CalendarTypeEnum: + - UseActiveLocale + HourFormatEnum: + - UseActiveLocale + TimeSynchronization: + TimeSourceEnum: + - NonMatterSNTP + - NonMatterNTP + - MatterSNTP + - MatterNTP + - MixedNTP + - NonMatterSNTPNTS + - NonMatterNTPNTS + - MatterSNTPNTS + - MatterNTPNTS + - MixedNTPNTS + - PTP + - GNSS + StatusCode: + - TimeNotAccepted + TimeZoneDatabaseEnum: + - Full + - Partial + - None + WaterHeaterManagement: + BoostStateEnum: + - Inactive + - Active + WaterHeaterMode: + ModeTag: + - Auto + - Quick + - Quiet + - LowNoise + - LowEnergy + - Vacation + - Min + - Max + - Night + - Day + - Off + - Manual + - Timed bitmaps: + AccessControl: + - Feature + BridgedDeviceBasicInformation: + - Feature + Channel: + - RecordingFlagBitmap + CommissionerControl: + - SupportedDeviceCategoryBitmap DeviceEnergyManagement: - Feature DishwasherAlarm: - AlarmBitmap - Feature + EnergyEVSE: + - TargetDayOfWeekBitmap + - Feature + GeneralDiagnostics: + - Feature ICDManagement: - UserActiveModeTriggerBitmap - Feature LaundryWasherControls: - Feature + Messages: + - MessageControlBitmap + - Feature MicrowaveOvenControl: - Feature + NetworkCommissioning: + - ThreadCapabilitiesBitmap + OccupancySensing: + - Feature + PowerTopology: + - Feature RefrigeratorAlarm: - AlarmBitmap + ServiceArea: + - Feature TemperatureControl: - Feature + Thermostat: + - ACErrorCodeBitmap + - HVACSystemTypeBitmap + - ProgrammingOperationModeBitmap + - RelayStateBitmap + - RemoteSensingBitmap + - PresetTypeFeaturesBitmap + - ScheduleTypeFeaturesBitmap + - OccupancyBitmap + ThreadBorderRouterManagement: + - Feature + TimeSynchronization: + - Feature + WaterHeaterManagement: + - WaterHeaterHeatSourceBitmap + - Feature bitmap values: + AccessControl: + Feature: + - Extension + - ManagedDevice + BridgedDeviceBasicInformation: + Feature: + - BridgedICDSupport + Channel: + RecordingFlagBitmap: + - Scheduled + - RecordSeries + - Recorded + Feature: + - ElectronicGuide + - RecordProgram + CommissionerControl: + SupportedDeviceCategoryBitmap: + - FabricSynchronization + ContentLauncher: + Feature: + - AdvancedSeek + - TextTracks + - AudioTracks DeviceEnergyManagement: Feature: - PowerAdjustment @@ -10776,6 +11259,21 @@ - Unbolt - AliroProvisioning - AliroBLEUWB + EnergyEVSE: + TargetDayOfWeekBitmap: + - Sunday + - Monday + - Tuesday + - Wednesday + - Thursday + - Friday + - Saturday + Feature: + - ChargingPreferences + - RFID + GeneralDiagnostics: + Feature: + - DataModelTest ICDManagement: UserActiveModeTriggerBitmap: - PowerCycle @@ -10804,30 +11302,241 @@ Feature: - Spin - Rinse + Messages: + MessageControlBitmap: + - ConfirmationRequired + - ResponseRequired + - ReplyMessage + - MessageConfirmed + - MessageProtected + Feature: + - ReceivedConfirmation + - ConfirmationResponse + - ConfirmationReply + - ProtectedMessages + MediaPlayback: + Feature: + - TextTracks + - AudioTracks + - AudioAdvance MicrowaveOvenControl: Feature: - PowerAsNumber # PowerInWatts is provisional because WATTS is provisional in Matter 1.4 - PowerNumberLimits + NetworkCommissioning: + ThreadCapabilitiesBitmap: + - IsBorderRouterCapable + - IsRouterCapable + - IsSleepyEndDeviceCapable + - IsFullThreadDevice + - IsSynchronizedSleepyEndDeviceCapable + OccupancySensing: + Feature: + - Other + - PassiveInfrared + - Ultrasonic + - PhysicalContact + - ActiveInfrared + - Radar + - RFSensing + - Vision + OnOff: + Feature: + - OffOnly + PowerTopology: + Feature: + - NodeTopology + - TreeTopology + - SetTopology + - DynamicPowerFlow RefrigeratorAlarm: AlarmBitmap: - DoorOpen + ServiceArea: + Feature: + - SelectWhileRunning + - ProgressReporting + - Maps + Switch: + Feature: + - ActionSwitch TemperatureControl: Feature: - TemperatureNumber - TemperatureLevel - TemperatureStep + Thermostat: + ACErrorCodeBitmap: + - CompressorFail + - RoomSensorFail + - OutdoorSensorFail + - CoilSensorFail + - FanFail + HVACSystemTypeBitmap: + - CoolingStage + - HeatingStage + - HeatingIsHeatPump + - HeatingUsesFuel + ProgrammingOperationModeBitmap: + - ScheduleActive + - AutoRecovery + - Economy + RelayStateBitmap: + - Heat + - Cool + - Fan + - HeatStage2 + - CoolStage2 + - FanStage2 + - FanStage3 + RemoteSensingBitmap: + - LocalTemperature + - OutdoorTemperature + - Occupancy + PresetTypeFeaturesBitmap: + - Automatic + - SupportsNames + ScheduleTypeFeaturesBitmap: + - SupportsPresets + - SupportsSetpoints + - SupportsNames + - SupportsOff + OccupancyBitmap: + - Occupied + Feature: + - Presets + - MatterScheduleConfiguration + ThreadBorderRouterManagement: + Feature: + - PANChange + TimeSynchronization: + Feature: + - TimeZone + - NTPClient + - NTPServer + - TimeSyncClient + WaterHeaterManagement: + WaterHeaterHeatSourceBitmap: + - ImmersionElement1 + - ImmersionElement2 + - HeatPump + - Boiler + - Other + Feature: + - EnergyManagement + - TankPercent provisional: + clusters: + # Targeting camera enablement, not part of Matter 1.4. + - CameraAVSettingsUserLevelManagement + - PushAVStreamTransport + - TLSCertificateManagement attributes: + EnergyEVSE: + # Depend on the V2X feature, which is provisional in Matter 1.4. + - DischargingEnabledUntil + - MaximumDischargeCurrent + - SessionEnergyDischarged + # Depend on the SoCReporting feature, which is provisional in Matter 1.4. + - StateOfCharge + - BatteryCapacity + # Depends on the PlugAndCharge feature, which is provisional in Matter 1.4. + - VehicleID + MediaPlayback: + # These attributes need to stay provisional while TrackStruct is provisional + - ActiveAudioTrack + - AvailableAudioTracks + - ActiveTextTrack + - AvailableTextTracks MicrowaveOvenControl: # SupportedWatts and SelectedWattIndex are provisional because WATTS is provisional in Matter 1.4 - SupportedWatts - SelectedWattIndex + commands: + EnergyEVSE: + # Depends on the V2X feature, which is provisional in Matter 1.4. + - EnableDischarging command fields: MicrowaveOvenControl: SetCookingParameters: # wattSettingIndex is provisional because WATTS is provisional in Matter 1.4 - wattSettingIndex + Channel: + GetProgramGuide: + # Needs to stay provisional until AdditionalInfoStruct becomes non-provisional. + - externalIDList + RecordProgram: + # Needs to stay provisional until AdditionalInfoStruct becomes non-provisional. + - externalIDList + CancelRecordProgram: + # Needs to stay provisional until AdditionalInfoStruct becomes non-provisional. + - externalIDList + ContentLauncher: + LaunchContent: + # Needs to stay provisional as long as PlaybackPreferencesStruct is provisional. + - playbackPreferences + structs: + Channel: + # SDK does not match spec here: spec is trying to use a struct from the Content Launcher cluster. + # Tracked in https://github.com/CHIP-Specifications/connectedhomeip-spec/issues/10841 + - AdditionalInfoStruct + ContentLauncher: + # Needs to stay provisional as long as CharacteristicEnum is provisional. + - TrackPreferenceStruct + # Needs to stay provisional as long as TrackPreferenceStruct is provisional. + - PlaybackPreferencesStruct + MediaPlayback: + # SDK does not match spec: https://github.com/CHIP-Specifications/connectedhomeip-spec/issues/10844 + - TrackAttributesStruct + # Needs to stay provisional while TrackAttributesStruct is provisional + - TrackStruct + struct fields: + Channel: + ProgramStruct: + # Naming of fields ending in "Url" might change, breaking compat. + # See https://github.com/CHIP-Specifications/connectedhomeip-spec/issues/10842 + - thumbnailUrl + - posterArtUrl + - dvbiUrl + # Needs to stay provisional until AdditionalInfoStruct becomes non-provisional. + - externalIDList + ServiceArea: + ProgressStruct: + # Spec has a different name for this field. + # See https://github.com/CHIP-Specifications/connectedhomeip-spec/issues/10855 + - estimatedTime + event fields: + AccessControl: + FabricRestrictionReviewUpdate: + # There's an outstanding spec issue on the naming of this field. + # See https://github.com/CHIP-Specifications/connectedhomeip-spec/issues/10389 + # See https://github.com/project-chip/connectedhomeip/issues/35418 + - arlRequestFlowUrl + EnergyEVSE: + EVNotDetected: + # Depends on the V2X feature, which is provisional in Matter 1.4. + - sessionEnergyDischarged + EnergyTransferStarted: + # Depends on the V2X feature, which is provisional in Matter 1.4. + - maximumDischargeCurrent + EnergyTransferStopped: + # Depends on the V2X feature, which is provisional in Matter 1.4. + - energyDischarged + enums: + ContentLauncher: + # SDK does not match spec here: spec is trying to use an enum from Media Playback cluster. + # Tracked in https://github.com/CHIP-Specifications/connectedhomeip-spec/issues/10843 + - CharacteristicEnum + enum values: + EnergyEVSE: + StateEnum: + # Depends on the V2X feature, which is provisional in Matter 1.4. + - PluggedInDischarging + SupplyStateEnum: + # Depend on the V2X feature, which is provisional in Matter 1.4. + - DischargingEnabled + - Enabled bitmap values: DishwasherAlarm: AlarmBitmap: @@ -10841,6 +11550,12 @@ Feature: # PowerInWatts is provisional because WATTS is provisional in Matter 1.4 - PowerInWatts + EnergyEVSE: + Feature: + # These features are provisional in Matter 1.4 + - SoCReporting + - PlugAndCharge + - V2X device types: - BatteryStorage - HeatPump @@ -10878,6 +11593,10 @@ # The one bit in this bitmap is marked X in the spec, but we can't have # an empty bitmap. - Feature + EnergyEVSEMode: + # The one bit in this bitmap is marked X in the spec, but we can't have + # an empty bitmap. + - Feature LaundryWasherMode: # The one bit in this bitmap is marked X in the spec, but we can't have # an empty bitmap. @@ -10894,6 +11613,10 @@ # The one bit in this bitmap is marked X in the spec, but we can't have # an empty bitmap. - Feature + WaterHeaterMode: + # The one bit in this bitmap is marked X in the spec, but we can't have + # an empty bitmap. + - Feature - release: "Future" versions: "future" diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.h b/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.h index 54e4e59c1e5a68..7bd0546659845c 100644 --- a/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.h +++ b/src/darwin/Framework/CHIP/zap-generated/MTRBaseClusters.h @@ -768,7 +768,7 @@ MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) * * 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. */ -- (void)reviewFabricRestrictionsWithParams:(MTRAccessControlClusterReviewFabricRestrictionsParams *)params completion:(void (^)(MTRAccessControlClusterReviewFabricRestrictionsResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)reviewFabricRestrictionsWithParams:(MTRAccessControlClusterReviewFabricRestrictionsParams *)params completion:(void (^)(MTRAccessControlClusterReviewFabricRestrictionsResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)readAttributeACLWithParams:(MTRReadParams * _Nullable)params completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)); - (void)writeAttributeACLWithValue:(NSArray * _Nonnull)value completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)); @@ -804,17 +804,17 @@ MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)); + (void)readAttributeAccessControlEntriesPerFabricWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)); -- (void)readAttributeCommissioningARLWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeCommissioningARLWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeCommissioningARLWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeCommissioningARLWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeCommissioningARLWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeARLWithParams:(MTRReadParams * _Nullable)params completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeARLWithParams:(MTRReadParams * _Nullable)params completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeARLWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeARLWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeARLWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)); - (void)subscribeAttributeGeneratedCommandListWithParams:(MTRSubscribeParams *)params @@ -1151,17 +1151,17 @@ MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) reportHandler:(void (^)(MTRBasicInformationClusterProductAppearanceStruct * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(17.0), macos(14.0), watchos(10.0), tvos(17.0)); + (void)readAttributeProductAppearanceWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(MTRBasicInformationClusterProductAppearanceStruct * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(17.0), macos(14.0), watchos(10.0), tvos(17.0)); -- (void)readAttributeSpecificationVersionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeSpecificationVersionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeSpecificationVersionWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeSpecificationVersionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeSpecificationVersionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeMaxPathsPerInvokeWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeMaxPathsPerInvokeWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeMaxPathsPerInvokeWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeMaxPathsPerInvokeWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeMaxPathsPerInvokeWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)); - (void)subscribeAttributeGeneratedCommandListWithParams:(MTRSubscribeParams *)params @@ -2145,23 +2145,23 @@ MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)); + (void)readAttributeLastConnectErrorValueWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)); -- (void)readAttributeSupportedWiFiBandsWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeSupportedWiFiBandsWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeSupportedWiFiBandsWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeSupportedWiFiBandsWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeSupportedWiFiBandsWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeSupportedThreadFeaturesWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeSupportedThreadFeaturesWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeSupportedThreadFeaturesWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeSupportedThreadFeaturesWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeSupportedThreadFeaturesWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeThreadVersionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeThreadVersionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeThreadVersionWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeThreadVersionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeThreadVersionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)); - (void)subscribeAttributeGeneratedCommandListWithParams:(MTRSubscribeParams *)params @@ -2291,15 +2291,15 @@ MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) * * Take a snapshot of system time and epoch time. */ -- (void)timeSnapshotWithParams:(MTRGeneralDiagnosticsClusterTimeSnapshotParams * _Nullable)params completion:(void (^)(MTRGeneralDiagnosticsClusterTimeSnapshotResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)timeSnapshotWithParams:(MTRGeneralDiagnosticsClusterTimeSnapshotParams * _Nullable)params completion:(void (^)(MTRGeneralDiagnosticsClusterTimeSnapshotResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)timeSnapshotWithCompletion:(void (^)(MTRGeneralDiagnosticsClusterTimeSnapshotResponseParams * _Nullable data, NSError * _Nullable error))completion - MTR_PROVISIONALLY_AVAILABLE; + MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Command PayloadTestRequest * * Request a variable length payload response. */ -- (void)payloadTestRequestWithParams:(MTRGeneralDiagnosticsClusterPayloadTestRequestParams *)params completion:(void (^)(MTRGeneralDiagnosticsClusterPayloadTestResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)payloadTestRequestWithParams:(MTRGeneralDiagnosticsClusterPayloadTestRequestParams *)params completion:(void (^)(MTRGeneralDiagnosticsClusterPayloadTestResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)readAttributeNetworkInterfacesWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)); - (void)subscribeAttributeNetworkInterfacesWithParams:(MTRSubscribeParams *)params @@ -3197,7 +3197,7 @@ MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) * * Accurate time is required for a number of reasons, including scheduling, display and validating security materials. */ -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRBaseClusterTimeSynchronization : MTRGenericBaseCluster /** @@ -3205,139 +3205,139 @@ MTR_PROVISIONALLY_AVAILABLE * * This command MAY be issued by Administrator to set the time. */ -- (void)setUTCTimeWithParams:(MTRTimeSynchronizationClusterSetUTCTimeParams *)params completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; +- (void)setUTCTimeWithParams:(MTRTimeSynchronizationClusterSetUTCTimeParams *)params completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Command SetTrustedTimeSource * * This command SHALL set TrustedTimeSource. */ -- (void)setTrustedTimeSourceWithParams:(MTRTimeSynchronizationClusterSetTrustedTimeSourceParams *)params completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; +- (void)setTrustedTimeSourceWithParams:(MTRTimeSynchronizationClusterSetTrustedTimeSourceParams *)params completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Command SetTimeZone * * This command SHALL set TimeZone. */ -- (void)setTimeZoneWithParams:(MTRTimeSynchronizationClusterSetTimeZoneParams *)params completion:(void (^)(MTRTimeSynchronizationClusterSetTimeZoneResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)setTimeZoneWithParams:(MTRTimeSynchronizationClusterSetTimeZoneParams *)params completion:(void (^)(MTRTimeSynchronizationClusterSetTimeZoneResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Command SetDSTOffset * * This command SHALL set DSTOffset. */ -- (void)setDSTOffsetWithParams:(MTRTimeSynchronizationClusterSetDSTOffsetParams *)params completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; +- (void)setDSTOffsetWithParams:(MTRTimeSynchronizationClusterSetDSTOffsetParams *)params completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Command SetDefaultNTP * * This command is used to set DefaultNTP. */ -- (void)setDefaultNTPWithParams:(MTRTimeSynchronizationClusterSetDefaultNTPParams *)params completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; +- (void)setDefaultNTPWithParams:(MTRTimeSynchronizationClusterSetDefaultNTPParams *)params completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeUTCTimeWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeUTCTimeWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeUTCTimeWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeUTCTimeWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeUTCTimeWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeGranularityWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeGranularityWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeGranularityWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeGranularityWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeGranularityWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeTimeSourceWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeTimeSourceWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeTimeSourceWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeTimeSourceWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeTimeSourceWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeTrustedTimeSourceWithCompletion:(void (^)(MTRTimeSynchronizationClusterTrustedTimeSourceStruct * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeTrustedTimeSourceWithCompletion:(void (^)(MTRTimeSynchronizationClusterTrustedTimeSourceStruct * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeTrustedTimeSourceWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(MTRTimeSynchronizationClusterTrustedTimeSourceStruct * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeTrustedTimeSourceWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(MTRTimeSynchronizationClusterTrustedTimeSourceStruct * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(MTRTimeSynchronizationClusterTrustedTimeSourceStruct * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeTrustedTimeSourceWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(MTRTimeSynchronizationClusterTrustedTimeSourceStruct * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeDefaultNTPWithCompletion:(void (^)(NSString * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeDefaultNTPWithCompletion:(void (^)(NSString * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeDefaultNTPWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSString * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeDefaultNTPWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSString * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSString * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeDefaultNTPWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSString * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeTimeZoneWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeTimeZoneWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeTimeZoneWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeTimeZoneWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeTimeZoneWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeDSTOffsetWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeDSTOffsetWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeDSTOffsetWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeDSTOffsetWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeDSTOffsetWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeLocalTimeWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeLocalTimeWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeLocalTimeWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeLocalTimeWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeLocalTimeWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeTimeZoneDatabaseWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeTimeZoneDatabaseWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeTimeZoneDatabaseWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeTimeZoneDatabaseWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeTimeZoneDatabaseWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeNTPServerAvailableWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeNTPServerAvailableWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeNTPServerAvailableWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeNTPServerAvailableWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeNTPServerAvailableWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeTimeZoneListMaxSizeWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeTimeZoneListMaxSizeWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeTimeZoneListMaxSizeWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeTimeZoneListMaxSizeWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeTimeZoneListMaxSizeWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeDSTOffsetListMaxSizeWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeDSTOffsetListMaxSizeWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeDSTOffsetListMaxSizeWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeDSTOffsetListMaxSizeWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeDSTOffsetListMaxSizeWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeSupportsDNSResolveWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeSupportsDNSResolveWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeSupportsDNSResolveWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeSupportsDNSResolveWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeSupportsDNSResolveWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeGeneratedCommandListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeGeneratedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeGeneratedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeAcceptedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAcceptedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeAcceptedCommandListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAcceptedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeAcceptedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeAttributeListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAttributeListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeAttributeListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAttributeListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeAttributeListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeFeatureMapWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeFeatureMapWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeFeatureMapWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeFeatureMapWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeFeatureMapWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeClusterRevisionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeClusterRevisionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeClusterRevisionWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeClusterRevisionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeClusterRevisionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (instancetype)init NS_UNAVAILABLE; + (instancetype)new NS_UNAVAILABLE; @@ -3352,7 +3352,7 @@ MTR_PROVISIONALLY_AVAILABLE */ - (instancetype _Nullable)initWithDevice:(MTRBaseDevice *)device endpointID:(NSNumber *)endpointID - queue:(dispatch_queue_t)queue MTR_PROVISIONALLY_AVAILABLE; + queue:(dispatch_queue_t)queue MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end @@ -3372,7 +3372,7 @@ MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) * * The server SHALL attempt to keep the devices specified active for StayActiveDuration milliseconds when they are next active. */ -- (void)keepActiveWithParams:(MTRBridgedDeviceBasicInformationClusterKeepActiveParams *)params completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; +- (void)keepActiveWithParams:(MTRBridgedDeviceBasicInformationClusterKeepActiveParams *)params completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)readAttributeVendorNameWithCompletion:(void (^)(NSString * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)); - (void)subscribeAttributeVendorNameWithParams:(MTRSubscribeParams *)params @@ -3392,11 +3392,11 @@ MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) reportHandler:(void (^)(NSString * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)); + (void)readAttributeProductNameWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSString * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)); -- (void)readAttributeProductIDWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeProductIDWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeProductIDWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeProductIDWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeProductIDWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)readAttributeNodeLabelWithCompletion:(void (^)(NSString * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)); - (void)writeAttributeNodeLabelWithValue:(NSString * _Nonnull)value completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)); @@ -6927,7 +6927,7 @@ MTR_AVAILABLE(ios(17.6), macos(14.6), watchos(10.6), tvos(17.6)) * * 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. */ -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRBaseClusterWaterHeaterManagement : MTRGenericBaseCluster /** @@ -6935,81 +6935,81 @@ MTR_PROVISIONALLY_AVAILABLE * * Allows a client to request that the water heater is put into a Boost state. */ -- (void)boostWithParams:(MTRWaterHeaterManagementClusterBoostParams *)params completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; +- (void)boostWithParams:(MTRWaterHeaterManagementClusterBoostParams *)params completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Command CancelBoost * * Allows a client to cancel an ongoing Boost operation. */ -- (void)cancelBoostWithParams:(MTRWaterHeaterManagementClusterCancelBoostParams * _Nullable)params completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; +- (void)cancelBoostWithParams:(MTRWaterHeaterManagementClusterCancelBoostParams * _Nullable)params completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)cancelBoostWithCompletion:(MTRStatusCompletion)completion - MTR_PROVISIONALLY_AVAILABLE; + MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeHeaterTypesWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeHeaterTypesWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeHeaterTypesWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeHeaterTypesWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeHeaterTypesWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeHeatDemandWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeHeatDemandWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeHeatDemandWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeHeatDemandWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeHeatDemandWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeTankVolumeWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeTankVolumeWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeTankVolumeWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeTankVolumeWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeTankVolumeWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeEstimatedHeatRequiredWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeEstimatedHeatRequiredWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeEstimatedHeatRequiredWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeEstimatedHeatRequiredWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeEstimatedHeatRequiredWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeTankPercentageWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeTankPercentageWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeTankPercentageWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeTankPercentageWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeTankPercentageWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeBoostStateWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeBoostStateWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeBoostStateWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeBoostStateWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeBoostStateWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeGeneratedCommandListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeGeneratedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeGeneratedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeAcceptedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAcceptedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeAcceptedCommandListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAcceptedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeAcceptedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeAttributeListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAttributeListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeAttributeListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAttributeListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeAttributeListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeFeatureMapWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeFeatureMapWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeFeatureMapWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeFeatureMapWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeFeatureMapWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeClusterRevisionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeClusterRevisionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeClusterRevisionWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeClusterRevisionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeClusterRevisionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (instancetype)init NS_UNAVAILABLE; + (instancetype)new NS_UNAVAILABLE; @@ -7024,7 +7024,7 @@ MTR_PROVISIONALLY_AVAILABLE */ - (instancetype _Nullable)initWithDevice:(MTRBaseDevice *)device endpointID:(NSNumber *)endpointID - queue:(dispatch_queue_t)queue MTR_PROVISIONALLY_AVAILABLE; + queue:(dispatch_queue_t)queue MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end @@ -7173,7 +7173,7 @@ MTR_PROVISIONALLY_AVAILABLE * * This cluster provides an interface for passing messages to be presented by a device. */ -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRBaseClusterMessages : MTRGenericBaseCluster /** @@ -7181,55 +7181,55 @@ MTR_PROVISIONALLY_AVAILABLE * * Command for requesting messages be presented */ -- (void)presentMessagesRequestWithParams:(MTRMessagesClusterPresentMessagesRequestParams *)params completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; +- (void)presentMessagesRequestWithParams:(MTRMessagesClusterPresentMessagesRequestParams *)params completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Command CancelMessagesRequest * * Command for cancelling message present requests */ -- (void)cancelMessagesRequestWithParams:(MTRMessagesClusterCancelMessagesRequestParams *)params completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; +- (void)cancelMessagesRequestWithParams:(MTRMessagesClusterCancelMessagesRequestParams *)params completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeMessagesWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeMessagesWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeMessagesWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeMessagesWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeMessagesWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeActiveMessageIDsWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeActiveMessageIDsWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeActiveMessageIDsWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeActiveMessageIDsWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeActiveMessageIDsWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeGeneratedCommandListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeGeneratedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeGeneratedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeAcceptedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAcceptedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeAcceptedCommandListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAcceptedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeAcceptedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeAttributeListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAttributeListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeAttributeListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAttributeListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeAttributeListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeFeatureMapWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeFeatureMapWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeFeatureMapWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeFeatureMapWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeFeatureMapWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeClusterRevisionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeClusterRevisionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeClusterRevisionWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeClusterRevisionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeClusterRevisionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (instancetype)init NS_UNAVAILABLE; + (instancetype)new NS_UNAVAILABLE; @@ -7244,7 +7244,7 @@ MTR_PROVISIONALLY_AVAILABLE */ - (instancetype _Nullable)initWithDevice:(MTRBaseDevice *)device endpointID:(NSNumber *)endpointID - queue:(dispatch_queue_t)queue MTR_PROVISIONALLY_AVAILABLE; + queue:(dispatch_queue_t)queue MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end @@ -7411,7 +7411,7 @@ MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) * * Electric Vehicle Supply Equipment (EVSE) is equipment used to charge an Electric Vehicle (EV) or Plug-In Hybrid Electric Vehicle. This cluster provides an interface to the functionality of Electric Vehicle Supply Equipment (EVSE) management. */ -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRBaseClusterEnergyEVSE : MTRGenericBaseCluster /** @@ -7419,15 +7419,15 @@ MTR_PROVISIONALLY_AVAILABLE * * Allows a client to disable the EVSE from charging and discharging. */ -- (void)disableWithParams:(MTREnergyEVSEClusterDisableParams * _Nullable)params completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; +- (void)disableWithParams:(MTREnergyEVSEClusterDisableParams * _Nullable)params completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)disableWithCompletion:(MTRStatusCompletion)completion - MTR_PROVISIONALLY_AVAILABLE; + MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Command EnableCharging * * This command allows a client to enable the EVSE to charge an EV, and to provide or update the maximum and minimum charge current. */ -- (void)enableChargingWithParams:(MTREnergyEVSEClusterEnableChargingParams *)params completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; +- (void)enableChargingWithParams:(MTREnergyEVSEClusterEnableChargingParams *)params completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Command EnableDischarging * @@ -7439,55 +7439,55 @@ MTR_PROVISIONALLY_AVAILABLE * * Allows a client to put the EVSE into a self-diagnostics mode. */ -- (void)startDiagnosticsWithParams:(MTREnergyEVSEClusterStartDiagnosticsParams * _Nullable)params completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; +- (void)startDiagnosticsWithParams:(MTREnergyEVSEClusterStartDiagnosticsParams * _Nullable)params completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)startDiagnosticsWithCompletion:(MTRStatusCompletion)completion - MTR_PROVISIONALLY_AVAILABLE; + MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Command SetTargets * * Allows a client to set the user specified charging targets. */ -- (void)setTargetsWithParams:(MTREnergyEVSEClusterSetTargetsParams *)params completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; +- (void)setTargetsWithParams:(MTREnergyEVSEClusterSetTargetsParams *)params completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Command GetTargets * * Allows a client to retrieve the current set of charging targets. */ -- (void)getTargetsWithParams:(MTREnergyEVSEClusterGetTargetsParams * _Nullable)params completion:(void (^)(MTREnergyEVSEClusterGetTargetsResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)getTargetsWithParams:(MTREnergyEVSEClusterGetTargetsParams * _Nullable)params completion:(void (^)(MTREnergyEVSEClusterGetTargetsResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)getTargetsWithCompletion:(void (^)(MTREnergyEVSEClusterGetTargetsResponseParams * _Nullable data, NSError * _Nullable error))completion - MTR_PROVISIONALLY_AVAILABLE; + MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Command ClearTargets * * Allows a client to clear all stored charging targets. */ -- (void)clearTargetsWithParams:(MTREnergyEVSEClusterClearTargetsParams * _Nullable)params completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; +- (void)clearTargetsWithParams:(MTREnergyEVSEClusterClearTargetsParams * _Nullable)params completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)clearTargetsWithCompletion:(MTRStatusCompletion)completion - MTR_PROVISIONALLY_AVAILABLE; + MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeStateWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeStateWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeStateWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeStateWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeStateWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeSupplyStateWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeSupplyStateWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeSupplyStateWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeSupplyStateWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeSupplyStateWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeFaultStateWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeFaultStateWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeFaultStateWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeFaultStateWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeFaultStateWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeChargingEnabledUntilWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeChargingEnabledUntilWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeChargingEnabledUntilWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeChargingEnabledUntilWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeChargingEnabledUntilWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)readAttributeDischargingEnabledUntilWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; - (void)subscribeAttributeDischargingEnabledUntilWithParams:(MTRSubscribeParams *)params @@ -7495,23 +7495,23 @@ MTR_PROVISIONALLY_AVAILABLE reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; + (void)readAttributeDischargingEnabledUntilWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; -- (void)readAttributeCircuitCapacityWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeCircuitCapacityWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeCircuitCapacityWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeCircuitCapacityWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeCircuitCapacityWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeMinimumChargeCurrentWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeMinimumChargeCurrentWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeMinimumChargeCurrentWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeMinimumChargeCurrentWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeMinimumChargeCurrentWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeMaximumChargeCurrentWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeMaximumChargeCurrentWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeMaximumChargeCurrentWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeMaximumChargeCurrentWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeMaximumChargeCurrentWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)readAttributeMaximumDischargeCurrentWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; - (void)subscribeAttributeMaximumDischargeCurrentWithParams:(MTRSubscribeParams *)params @@ -7519,53 +7519,53 @@ MTR_PROVISIONALLY_AVAILABLE reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; + (void)readAttributeMaximumDischargeCurrentWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; -- (void)readAttributeUserMaximumChargeCurrentWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; -- (void)writeAttributeUserMaximumChargeCurrentWithValue:(NSNumber * _Nonnull)value completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; -- (void)writeAttributeUserMaximumChargeCurrentWithValue:(NSNumber * _Nonnull)value params:(MTRWriteParams * _Nullable)params completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeUserMaximumChargeCurrentWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +- (void)writeAttributeUserMaximumChargeCurrentWithValue:(NSNumber * _Nonnull)value completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +- (void)writeAttributeUserMaximumChargeCurrentWithValue:(NSNumber * _Nonnull)value params:(MTRWriteParams * _Nullable)params completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeUserMaximumChargeCurrentWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeUserMaximumChargeCurrentWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeUserMaximumChargeCurrentWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeRandomizationDelayWindowWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; -- (void)writeAttributeRandomizationDelayWindowWithValue:(NSNumber * _Nonnull)value completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; -- (void)writeAttributeRandomizationDelayWindowWithValue:(NSNumber * _Nonnull)value params:(MTRWriteParams * _Nullable)params completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeRandomizationDelayWindowWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +- (void)writeAttributeRandomizationDelayWindowWithValue:(NSNumber * _Nonnull)value completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +- (void)writeAttributeRandomizationDelayWindowWithValue:(NSNumber * _Nonnull)value params:(MTRWriteParams * _Nullable)params completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeRandomizationDelayWindowWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeRandomizationDelayWindowWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeRandomizationDelayWindowWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeNextChargeStartTimeWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeNextChargeStartTimeWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeNextChargeStartTimeWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeNextChargeStartTimeWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeNextChargeStartTimeWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeNextChargeTargetTimeWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeNextChargeTargetTimeWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeNextChargeTargetTimeWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeNextChargeTargetTimeWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeNextChargeTargetTimeWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeNextChargeRequiredEnergyWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeNextChargeRequiredEnergyWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeNextChargeRequiredEnergyWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeNextChargeRequiredEnergyWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeNextChargeRequiredEnergyWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeNextChargeTargetSoCWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeNextChargeTargetSoCWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeNextChargeTargetSoCWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeNextChargeTargetSoCWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeNextChargeTargetSoCWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeApproximateEVEfficiencyWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; -- (void)writeAttributeApproximateEVEfficiencyWithValue:(NSNumber * _Nullable)value completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; -- (void)writeAttributeApproximateEVEfficiencyWithValue:(NSNumber * _Nullable)value params:(MTRWriteParams * _Nullable)params completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeApproximateEVEfficiencyWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +- (void)writeAttributeApproximateEVEfficiencyWithValue:(NSNumber * _Nullable)value completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +- (void)writeAttributeApproximateEVEfficiencyWithValue:(NSNumber * _Nullable)value params:(MTRWriteParams * _Nullable)params completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeApproximateEVEfficiencyWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeApproximateEVEfficiencyWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeApproximateEVEfficiencyWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)readAttributeStateOfChargeWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; - (void)subscribeAttributeStateOfChargeWithParams:(MTRSubscribeParams *)params @@ -7585,23 +7585,23 @@ MTR_PROVISIONALLY_AVAILABLE reportHandler:(void (^)(NSString * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; + (void)readAttributeVehicleIDWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSString * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; -- (void)readAttributeSessionIDWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeSessionIDWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeSessionIDWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeSessionIDWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeSessionIDWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeSessionDurationWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeSessionDurationWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeSessionDurationWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeSessionDurationWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeSessionDurationWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeSessionEnergyChargedWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeSessionEnergyChargedWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeSessionEnergyChargedWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeSessionEnergyChargedWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeSessionEnergyChargedWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)readAttributeSessionEnergyDischargedWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; - (void)subscribeAttributeSessionEnergyDischargedWithParams:(MTRSubscribeParams *)params @@ -7609,35 +7609,35 @@ MTR_PROVISIONALLY_AVAILABLE reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; + (void)readAttributeSessionEnergyDischargedWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; -- (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeGeneratedCommandListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeGeneratedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeGeneratedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeAcceptedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAcceptedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeAcceptedCommandListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAcceptedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeAcceptedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeAttributeListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAttributeListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeAttributeListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAttributeListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeAttributeListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeFeatureMapWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeFeatureMapWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeFeatureMapWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeFeatureMapWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeFeatureMapWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeClusterRevisionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeClusterRevisionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeClusterRevisionWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeClusterRevisionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeClusterRevisionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (instancetype)init NS_UNAVAILABLE; + (instancetype)new NS_UNAVAILABLE; @@ -7652,7 +7652,7 @@ MTR_PROVISIONALLY_AVAILABLE */ - (instancetype _Nullable)initWithDevice:(MTRBaseDevice *)device endpointID:(NSNumber *)endpointID - queue:(dispatch_queue_t)queue MTR_PROVISIONALLY_AVAILABLE; + queue:(dispatch_queue_t)queue MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end @@ -7750,50 +7750,50 @@ MTR_PROVISIONALLY_AVAILABLE * * The Power Topology Cluster provides a mechanism for expressing how power is flowing between endpoints. */ -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRBaseClusterPowerTopology : MTRGenericBaseCluster -- (void)readAttributeAvailableEndpointsWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAvailableEndpointsWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeAvailableEndpointsWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAvailableEndpointsWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeAvailableEndpointsWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeActiveEndpointsWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeActiveEndpointsWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeActiveEndpointsWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeActiveEndpointsWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeActiveEndpointsWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeGeneratedCommandListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeGeneratedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeGeneratedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeAcceptedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAcceptedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeAcceptedCommandListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAcceptedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeAcceptedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeAttributeListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAttributeListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeAttributeListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAttributeListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeAttributeListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeFeatureMapWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeFeatureMapWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeFeatureMapWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeFeatureMapWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeFeatureMapWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeClusterRevisionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeClusterRevisionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeClusterRevisionWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeClusterRevisionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeClusterRevisionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (instancetype)init NS_UNAVAILABLE; + (instancetype)new NS_UNAVAILABLE; @@ -7808,7 +7808,7 @@ MTR_PROVISIONALLY_AVAILABLE */ - (instancetype _Nullable)initWithDevice:(MTRBaseDevice *)device endpointID:(NSNumber *)endpointID - queue:(dispatch_queue_t)queue MTR_PROVISIONALLY_AVAILABLE; + queue:(dispatch_queue_t)queue MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end @@ -7817,7 +7817,7 @@ MTR_PROVISIONALLY_AVAILABLE * * Attributes and commands for selecting a mode from a list of supported options. */ -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRBaseClusterEnergyEVSEMode : MTRGenericBaseCluster /** @@ -7825,49 +7825,49 @@ MTR_PROVISIONALLY_AVAILABLE * * This command is used to change device modes. */ -- (void)changeToModeWithParams:(MTREnergyEVSEModeClusterChangeToModeParams *)params completion:(void (^)(MTREnergyEVSEModeClusterChangeToModeResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)changeToModeWithParams:(MTREnergyEVSEModeClusterChangeToModeParams *)params completion:(void (^)(MTREnergyEVSEModeClusterChangeToModeResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeSupportedModesWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeSupportedModesWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeSupportedModesWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeSupportedModesWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeSupportedModesWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeCurrentModeWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeCurrentModeWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeCurrentModeWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeCurrentModeWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeCurrentModeWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeGeneratedCommandListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeGeneratedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeGeneratedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeAcceptedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAcceptedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeAcceptedCommandListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAcceptedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeAcceptedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeAttributeListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAttributeListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeAttributeListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAttributeListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeAttributeListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeFeatureMapWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeFeatureMapWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeFeatureMapWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeFeatureMapWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeFeatureMapWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeClusterRevisionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeClusterRevisionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeClusterRevisionWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeClusterRevisionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeClusterRevisionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (instancetype)init NS_UNAVAILABLE; + (instancetype)new NS_UNAVAILABLE; @@ -7882,7 +7882,7 @@ MTR_PROVISIONALLY_AVAILABLE */ - (instancetype _Nullable)initWithDevice:(MTRBaseDevice *)device endpointID:(NSNumber *)endpointID - queue:(dispatch_queue_t)queue MTR_PROVISIONALLY_AVAILABLE; + queue:(dispatch_queue_t)queue MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end @@ -7891,7 +7891,7 @@ MTR_PROVISIONALLY_AVAILABLE * * Attributes and commands for selecting a mode from a list of supported options. */ -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRBaseClusterWaterHeaterMode : MTRGenericBaseCluster /** @@ -7899,49 +7899,49 @@ MTR_PROVISIONALLY_AVAILABLE * * This command is used to change device modes. */ -- (void)changeToModeWithParams:(MTRWaterHeaterModeClusterChangeToModeParams *)params completion:(void (^)(MTRWaterHeaterModeClusterChangeToModeResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)changeToModeWithParams:(MTRWaterHeaterModeClusterChangeToModeParams *)params completion:(void (^)(MTRWaterHeaterModeClusterChangeToModeResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeSupportedModesWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeSupportedModesWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeSupportedModesWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeSupportedModesWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeSupportedModesWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeCurrentModeWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeCurrentModeWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeCurrentModeWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeCurrentModeWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeCurrentModeWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeGeneratedCommandListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeGeneratedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeGeneratedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeAcceptedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAcceptedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeAcceptedCommandListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAcceptedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeAcceptedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeAttributeListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAttributeListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeAttributeListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAttributeListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeAttributeListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeFeatureMapWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeFeatureMapWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeFeatureMapWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeFeatureMapWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeFeatureMapWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeClusterRevisionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeClusterRevisionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeClusterRevisionWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeClusterRevisionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeClusterRevisionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (instancetype)init NS_UNAVAILABLE; + (instancetype)new NS_UNAVAILABLE; @@ -7956,7 +7956,7 @@ MTR_PROVISIONALLY_AVAILABLE */ - (instancetype _Nullable)initWithDevice:(MTRBaseDevice *)device endpointID:(NSNumber *)endpointID - queue:(dispatch_queue_t)queue MTR_PROVISIONALLY_AVAILABLE; + queue:(dispatch_queue_t)queue MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end @@ -8773,7 +8773,7 @@ MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) * * The Service Area cluster provides an interface for controlling the areas where a device should operate, and for querying the current area being serviced. */ -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRBaseClusterServiceArea : MTRGenericBaseCluster /** @@ -8781,79 +8781,79 @@ MTR_PROVISIONALLY_AVAILABLE * * Command used to select a set of device areas, where the device is to operate. */ -- (void)selectAreasWithParams:(MTRServiceAreaClusterSelectAreasParams *)params completion:(void (^)(MTRServiceAreaClusterSelectAreasResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)selectAreasWithParams:(MTRServiceAreaClusterSelectAreasParams *)params completion:(void (^)(MTRServiceAreaClusterSelectAreasResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Command SkipArea * * This command is used to skip an area where the device operates. */ -- (void)skipAreaWithParams:(MTRServiceAreaClusterSkipAreaParams *)params completion:(void (^)(MTRServiceAreaClusterSkipAreaResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)skipAreaWithParams:(MTRServiceAreaClusterSkipAreaParams *)params completion:(void (^)(MTRServiceAreaClusterSkipAreaResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeSupportedAreasWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeSupportedAreasWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeSupportedAreasWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeSupportedAreasWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeSupportedAreasWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeSupportedMapsWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeSupportedMapsWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeSupportedMapsWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeSupportedMapsWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeSupportedMapsWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeSelectedAreasWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeSelectedAreasWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeSelectedAreasWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeSelectedAreasWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeSelectedAreasWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeCurrentAreaWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeCurrentAreaWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeCurrentAreaWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeCurrentAreaWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeCurrentAreaWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeEstimatedEndTimeWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeEstimatedEndTimeWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeEstimatedEndTimeWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeEstimatedEndTimeWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeEstimatedEndTimeWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeProgressWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeProgressWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeProgressWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeProgressWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeProgressWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeGeneratedCommandListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeGeneratedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeGeneratedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeAcceptedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAcceptedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeAcceptedCommandListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAcceptedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeAcceptedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeAttributeListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAttributeListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeAttributeListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAttributeListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeAttributeListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeFeatureMapWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeFeatureMapWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeFeatureMapWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeFeatureMapWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeFeatureMapWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeClusterRevisionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeClusterRevisionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeClusterRevisionWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeClusterRevisionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeClusterRevisionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (instancetype)init NS_UNAVAILABLE; + (instancetype)new NS_UNAVAILABLE; @@ -8868,7 +8868,7 @@ MTR_PROVISIONALLY_AVAILABLE */ - (instancetype _Nullable)initWithDevice:(MTRBaseDevice *)device endpointID:(NSNumber *)endpointID - queue:(dispatch_queue_t)queue MTR_PROVISIONALLY_AVAILABLE; + queue:(dispatch_queue_t)queue MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end @@ -9112,19 +9112,19 @@ MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) * * Upon receipt, if the Schedules attribute contains a ScheduleStruct whose ScheduleHandle field matches the value of the ScheduleHandle field, the server SHALL set the thermostat's ActiveScheduleHandle attribute to the value of the ScheduleHandle field. */ -- (void)setActiveScheduleRequestWithParams:(MTRThermostatClusterSetActiveScheduleRequestParams *)params completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; +- (void)setActiveScheduleRequestWithParams:(MTRThermostatClusterSetActiveScheduleRequestParams *)params completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Command SetActivePresetRequest * * ID */ -- (void)setActivePresetRequestWithParams:(MTRThermostatClusterSetActivePresetRequestParams *)params completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; +- (void)setActivePresetRequestWithParams:(MTRThermostatClusterSetActivePresetRequestParams *)params completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Command AtomicRequest * * Begins, Commits or Cancels an atomic write */ -- (void)atomicRequestWithParams:(MTRThermostatClusterAtomicRequestParams *)params completion:(void (^)(MTRThermostatClusterAtomicResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)atomicRequestWithParams:(MTRThermostatClusterAtomicRequestParams *)params completion:(void (^)(MTRThermostatClusterAtomicResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)readAttributeLocalTemperatureWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)); - (void)subscribeAttributeLocalTemperatureWithParams:(MTRSubscribeParams *)params @@ -9474,75 +9474,75 @@ MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)); + (void)readAttributeACCapacityformatWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)); -- (void)readAttributePresetTypesWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributePresetTypesWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributePresetTypesWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributePresetTypesWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributePresetTypesWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeScheduleTypesWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeScheduleTypesWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeScheduleTypesWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeScheduleTypesWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeScheduleTypesWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeNumberOfPresetsWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeNumberOfPresetsWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeNumberOfPresetsWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeNumberOfPresetsWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeNumberOfPresetsWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeNumberOfSchedulesWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeNumberOfSchedulesWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeNumberOfSchedulesWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeNumberOfSchedulesWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeNumberOfSchedulesWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeNumberOfScheduleTransitionsWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeNumberOfScheduleTransitionsWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeNumberOfScheduleTransitionsWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeNumberOfScheduleTransitionsWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeNumberOfScheduleTransitionsWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeNumberOfScheduleTransitionPerDayWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeNumberOfScheduleTransitionPerDayWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeNumberOfScheduleTransitionPerDayWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeNumberOfScheduleTransitionPerDayWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeNumberOfScheduleTransitionPerDayWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeActivePresetHandleWithCompletion:(void (^)(NSData * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeActivePresetHandleWithCompletion:(void (^)(NSData * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeActivePresetHandleWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSData * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeActivePresetHandleWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSData * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSData * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeActivePresetHandleWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSData * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeActiveScheduleHandleWithCompletion:(void (^)(NSData * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeActiveScheduleHandleWithCompletion:(void (^)(NSData * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeActiveScheduleHandleWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSData * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeActiveScheduleHandleWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSData * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSData * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeActiveScheduleHandleWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSData * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributePresetsWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; -- (void)writeAttributePresetsWithValue:(NSArray * _Nonnull)value completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; -- (void)writeAttributePresetsWithValue:(NSArray * _Nonnull)value params:(MTRWriteParams * _Nullable)params completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributePresetsWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +- (void)writeAttributePresetsWithValue:(NSArray * _Nonnull)value completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +- (void)writeAttributePresetsWithValue:(NSArray * _Nonnull)value params:(MTRWriteParams * _Nullable)params completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributePresetsWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributePresetsWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributePresetsWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeSchedulesWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; -- (void)writeAttributeSchedulesWithValue:(NSArray * _Nonnull)value completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; -- (void)writeAttributeSchedulesWithValue:(NSArray * _Nonnull)value params:(MTRWriteParams * _Nullable)params completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeSchedulesWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +- (void)writeAttributeSchedulesWithValue:(NSArray * _Nonnull)value completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +- (void)writeAttributeSchedulesWithValue:(NSArray * _Nonnull)value params:(MTRWriteParams * _Nullable)params completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeSchedulesWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeSchedulesWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeSchedulesWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeSetpointHoldExpiryTimestampWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeSetpointHoldExpiryTimestampWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeSetpointHoldExpiryTimestampWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeSetpointHoldExpiryTimestampWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeSetpointHoldExpiryTimestampWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)); - (void)subscribeAttributeGeneratedCommandListWithParams:(MTRSubscribeParams *)params @@ -10942,19 +10942,19 @@ MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)); + (void)readAttributeOccupancySensorTypeBitmapWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)); -- (void)readAttributeHoldTimeWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; -- (void)writeAttributeHoldTimeWithValue:(NSNumber * _Nonnull)value completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; -- (void)writeAttributeHoldTimeWithValue:(NSNumber * _Nonnull)value params:(MTRWriteParams * _Nullable)params completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeHoldTimeWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +- (void)writeAttributeHoldTimeWithValue:(NSNumber * _Nonnull)value completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +- (void)writeAttributeHoldTimeWithValue:(NSNumber * _Nonnull)value params:(MTRWriteParams * _Nullable)params completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeHoldTimeWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeHoldTimeWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeHoldTimeWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeHoldTimeLimitsWithCompletion:(void (^)(MTROccupancySensingClusterHoldTimeLimitsStruct * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeHoldTimeLimitsWithCompletion:(void (^)(MTROccupancySensingClusterHoldTimeLimitsStruct * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeHoldTimeLimitsWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(MTROccupancySensingClusterHoldTimeLimitsStruct * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeHoldTimeLimitsWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(MTROccupancySensingClusterHoldTimeLimitsStruct * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(MTROccupancySensingClusterHoldTimeLimitsStruct * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeHoldTimeLimitsWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(MTROccupancySensingClusterHoldTimeLimitsStruct * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)readAttributePIROccupiedToUnoccupiedDelayWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)); - (void)writeAttributePIROccupiedToUnoccupiedDelayWithValue:(NSNumber * _Nonnull)value completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)); @@ -12290,7 +12290,7 @@ MTR_AVAILABLE(ios(17.6), macos(14.6), watchos(10.6), tvos(17.6)) * * Functionality to retrieve operational information about a managed Wi-Fi network. */ -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRBaseClusterWiFiNetworkManagement : MTRGenericBaseCluster /** @@ -12298,51 +12298,51 @@ MTR_PROVISIONALLY_AVAILABLE * * Request the current WPA-Personal passphrase or PSK associated with the managed Wi-Fi network. */ -- (void)networkPassphraseRequestWithParams:(MTRWiFiNetworkManagementClusterNetworkPassphraseRequestParams * _Nullable)params completion:(void (^)(MTRWiFiNetworkManagementClusterNetworkPassphraseResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)networkPassphraseRequestWithParams:(MTRWiFiNetworkManagementClusterNetworkPassphraseRequestParams * _Nullable)params completion:(void (^)(MTRWiFiNetworkManagementClusterNetworkPassphraseResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)networkPassphraseRequestWithCompletion:(void (^)(MTRWiFiNetworkManagementClusterNetworkPassphraseResponseParams * _Nullable data, NSError * _Nullable error))completion - MTR_PROVISIONALLY_AVAILABLE; + MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeSSIDWithCompletion:(void (^)(NSData * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeSSIDWithCompletion:(void (^)(NSData * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeSSIDWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSData * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeSSIDWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSData * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSData * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeSSIDWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSData * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributePassphraseSurrogateWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributePassphraseSurrogateWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributePassphraseSurrogateWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributePassphraseSurrogateWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributePassphraseSurrogateWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeGeneratedCommandListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeGeneratedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeGeneratedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeAcceptedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAcceptedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeAcceptedCommandListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAcceptedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeAcceptedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeAttributeListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAttributeListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeAttributeListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAttributeListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeAttributeListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeFeatureMapWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeFeatureMapWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeFeatureMapWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeFeatureMapWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeFeatureMapWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeClusterRevisionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeClusterRevisionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeClusterRevisionWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeClusterRevisionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeClusterRevisionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (instancetype)init NS_UNAVAILABLE; + (instancetype)new NS_UNAVAILABLE; @@ -12357,7 +12357,7 @@ MTR_PROVISIONALLY_AVAILABLE */ - (instancetype _Nullable)initWithDevice:(MTRBaseDevice *)device endpointID:(NSNumber *)endpointID - queue:(dispatch_queue_t)queue MTR_PROVISIONALLY_AVAILABLE; + queue:(dispatch_queue_t)queue MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end @@ -12366,7 +12366,7 @@ MTR_PROVISIONALLY_AVAILABLE * * Manage the Thread network of Thread Border Router */ -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRBaseClusterThreadBorderRouterManagement : MTRGenericBaseCluster /** @@ -12374,95 +12374,95 @@ MTR_PROVISIONALLY_AVAILABLE * * Command to request the active operational dataset of the Thread network to which the border router is connected. This command must be sent over a valid CASE session */ -- (void)getActiveDatasetRequestWithParams:(MTRThreadBorderRouterManagementClusterGetActiveDatasetRequestParams * _Nullable)params completion:(void (^)(MTRThreadBorderRouterManagementClusterDatasetResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)getActiveDatasetRequestWithParams:(MTRThreadBorderRouterManagementClusterGetActiveDatasetRequestParams * _Nullable)params completion:(void (^)(MTRThreadBorderRouterManagementClusterDatasetResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)getActiveDatasetRequestWithCompletion:(void (^)(MTRThreadBorderRouterManagementClusterDatasetResponseParams * _Nullable data, NSError * _Nullable error))completion - MTR_PROVISIONALLY_AVAILABLE; + MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Command GetPendingDatasetRequest * * Command to request the pending dataset of the Thread network to which the border router is connected. This command must be sent over a valid CASE session */ -- (void)getPendingDatasetRequestWithParams:(MTRThreadBorderRouterManagementClusterGetPendingDatasetRequestParams * _Nullable)params completion:(void (^)(MTRThreadBorderRouterManagementClusterDatasetResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)getPendingDatasetRequestWithParams:(MTRThreadBorderRouterManagementClusterGetPendingDatasetRequestParams * _Nullable)params completion:(void (^)(MTRThreadBorderRouterManagementClusterDatasetResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)getPendingDatasetRequestWithCompletion:(void (^)(MTRThreadBorderRouterManagementClusterDatasetResponseParams * _Nullable data, NSError * _Nullable error))completion - MTR_PROVISIONALLY_AVAILABLE; + MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Command SetActiveDatasetRequest * * Command to set or update the active Dataset of the Thread network to which the Border Router is connected. */ -- (void)setActiveDatasetRequestWithParams:(MTRThreadBorderRouterManagementClusterSetActiveDatasetRequestParams *)params completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; +- (void)setActiveDatasetRequestWithParams:(MTRThreadBorderRouterManagementClusterSetActiveDatasetRequestParams *)params completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Command SetPendingDatasetRequest * * Command set or update the pending Dataset of the Thread network to which the Border Router is connected. */ -- (void)setPendingDatasetRequestWithParams:(MTRThreadBorderRouterManagementClusterSetPendingDatasetRequestParams *)params completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; +- (void)setPendingDatasetRequestWithParams:(MTRThreadBorderRouterManagementClusterSetPendingDatasetRequestParams *)params completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeBorderRouterNameWithCompletion:(void (^)(NSString * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeBorderRouterNameWithCompletion:(void (^)(NSString * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeBorderRouterNameWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSString * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeBorderRouterNameWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSString * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSString * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeBorderRouterNameWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSString * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeBorderAgentIDWithCompletion:(void (^)(NSData * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeBorderAgentIDWithCompletion:(void (^)(NSData * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeBorderAgentIDWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSData * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeBorderAgentIDWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSData * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSData * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeBorderAgentIDWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSData * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeThreadVersionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeThreadVersionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeThreadVersionWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeThreadVersionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeThreadVersionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeInterfaceEnabledWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeInterfaceEnabledWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeInterfaceEnabledWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeInterfaceEnabledWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeInterfaceEnabledWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeActiveDatasetTimestampWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeActiveDatasetTimestampWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeActiveDatasetTimestampWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeActiveDatasetTimestampWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeActiveDatasetTimestampWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributePendingDatasetTimestampWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributePendingDatasetTimestampWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributePendingDatasetTimestampWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributePendingDatasetTimestampWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributePendingDatasetTimestampWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeGeneratedCommandListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeGeneratedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeGeneratedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeAcceptedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAcceptedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeAcceptedCommandListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAcceptedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeAcceptedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeAttributeListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAttributeListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeAttributeListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAttributeListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeAttributeListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeFeatureMapWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeFeatureMapWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeFeatureMapWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeFeatureMapWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeFeatureMapWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeClusterRevisionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeClusterRevisionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeClusterRevisionWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeClusterRevisionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeClusterRevisionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (instancetype)init NS_UNAVAILABLE; + (instancetype)new NS_UNAVAILABLE; @@ -12477,7 +12477,7 @@ MTR_PROVISIONALLY_AVAILABLE */ - (instancetype _Nullable)initWithDevice:(MTRBaseDevice *)device endpointID:(NSNumber *)endpointID - queue:(dispatch_queue_t)queue MTR_PROVISIONALLY_AVAILABLE; + queue:(dispatch_queue_t)queue MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end @@ -12486,7 +12486,7 @@ MTR_PROVISIONALLY_AVAILABLE * * Manages the names and credentials of Thread networks visible to the user. */ -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRBaseClusterThreadNetworkDirectory : MTRGenericBaseCluster /** @@ -12494,69 +12494,69 @@ MTR_PROVISIONALLY_AVAILABLE * * Adds an entry to the ThreadNetworks list. */ -- (void)addNetworkWithParams:(MTRThreadNetworkDirectoryClusterAddNetworkParams *)params completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; +- (void)addNetworkWithParams:(MTRThreadNetworkDirectoryClusterAddNetworkParams *)params completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Command RemoveNetwork * * Removes an entry from the ThreadNetworks list. */ -- (void)removeNetworkWithParams:(MTRThreadNetworkDirectoryClusterRemoveNetworkParams *)params completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; +- (void)removeNetworkWithParams:(MTRThreadNetworkDirectoryClusterRemoveNetworkParams *)params completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Command GetOperationalDataset * * Retrieves a Thread Operational Dataset from the ThreadNetworks list. */ -- (void)getOperationalDatasetWithParams:(MTRThreadNetworkDirectoryClusterGetOperationalDatasetParams *)params completion:(void (^)(MTRThreadNetworkDirectoryClusterOperationalDatasetResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)getOperationalDatasetWithParams:(MTRThreadNetworkDirectoryClusterGetOperationalDatasetParams *)params completion:(void (^)(MTRThreadNetworkDirectoryClusterOperationalDatasetResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributePreferredExtendedPanIDWithCompletion:(void (^)(NSData * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; -- (void)writeAttributePreferredExtendedPanIDWithValue:(NSData * _Nullable)value completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; -- (void)writeAttributePreferredExtendedPanIDWithValue:(NSData * _Nullable)value params:(MTRWriteParams * _Nullable)params completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributePreferredExtendedPanIDWithCompletion:(void (^)(NSData * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +- (void)writeAttributePreferredExtendedPanIDWithValue:(NSData * _Nullable)value completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +- (void)writeAttributePreferredExtendedPanIDWithValue:(NSData * _Nullable)value params:(MTRWriteParams * _Nullable)params completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributePreferredExtendedPanIDWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSData * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributePreferredExtendedPanIDWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSData * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSData * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributePreferredExtendedPanIDWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSData * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeThreadNetworksWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeThreadNetworksWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeThreadNetworksWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeThreadNetworksWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeThreadNetworksWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeThreadNetworkTableSizeWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeThreadNetworkTableSizeWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeThreadNetworkTableSizeWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeThreadNetworkTableSizeWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeThreadNetworkTableSizeWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeGeneratedCommandListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeGeneratedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeGeneratedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeAcceptedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAcceptedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeAcceptedCommandListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAcceptedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeAcceptedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeAttributeListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAttributeListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeAttributeListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAttributeListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeAttributeListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeFeatureMapWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeFeatureMapWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeFeatureMapWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeFeatureMapWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeFeatureMapWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeClusterRevisionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeClusterRevisionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeClusterRevisionWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeClusterRevisionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeClusterRevisionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (instancetype)init NS_UNAVAILABLE; + (instancetype)new NS_UNAVAILABLE; @@ -12571,7 +12571,7 @@ MTR_PROVISIONALLY_AVAILABLE */ - (instancetype _Nullable)initWithDevice:(MTRBaseDevice *)device endpointID:(NSNumber *)endpointID - queue:(dispatch_queue_t)queue MTR_PROVISIONALLY_AVAILABLE; + queue:(dispatch_queue_t)queue MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end @@ -12589,11 +12589,11 @@ MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) reportHandler:(void (^)(NSString * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)); + (void)readAttributeMACAddressWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSString * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)); -- (void)readAttributeLinkLocalAddressWithCompletion:(void (^)(NSData * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeLinkLocalAddressWithCompletion:(void (^)(NSData * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeLinkLocalAddressWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSData * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeLinkLocalAddressWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSData * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSData * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeLinkLocalAddressWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSData * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)); - (void)subscribeAttributeGeneratedCommandListWithParams:(MTRSubscribeParams *)params @@ -12673,21 +12673,21 @@ MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) * * This command retrieves the program guide. It accepts several filter parameters to return specific schedule and program information from a content app. The command shall receive in response a ProgramGuideResponse. */ -- (void)getProgramGuideWithParams:(MTRChannelClusterGetProgramGuideParams * _Nullable)params completion:(void (^)(MTRChannelClusterProgramGuideResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)getProgramGuideWithParams:(MTRChannelClusterGetProgramGuideParams * _Nullable)params completion:(void (^)(MTRChannelClusterProgramGuideResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)getProgramGuideWithCompletion:(void (^)(MTRChannelClusterProgramGuideResponseParams * _Nullable data, NSError * _Nullable error))completion - MTR_PROVISIONALLY_AVAILABLE; + MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Command RecordProgram * * Record a specific program or series when it goes live. This functionality enables DVR recording features. */ -- (void)recordProgramWithParams:(MTRChannelClusterRecordProgramParams *)params completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; +- (void)recordProgramWithParams:(MTRChannelClusterRecordProgramParams *)params completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Command CancelRecordProgram * * Cancel recording for a specific program or series. */ -- (void)cancelRecordProgramWithParams:(MTRChannelClusterCancelRecordProgramParams *)params completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; +- (void)cancelRecordProgramWithParams:(MTRChannelClusterCancelRecordProgramParams *)params completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)readAttributeChannelListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)); - (void)subscribeAttributeChannelListWithParams:(MTRSubscribeParams *)params @@ -12923,21 +12923,21 @@ MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) * * Upon receipt, the server SHALL set the active Audio Track to the one identified by the TrackID in the Track catalog for the streaming media. If the TrackID does not exist in the Track catalog, OR does not correspond to the streaming media OR no media is being streamed at the time of receipt of this command, the server will return an error status of INVALID_ARGUMENT. */ -- (void)activateAudioTrackWithParams:(MTRMediaPlaybackClusterActivateAudioTrackParams *)params completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; +- (void)activateAudioTrackWithParams:(MTRMediaPlaybackClusterActivateAudioTrackParams *)params completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Command ActivateTextTrack * * Upon receipt, the server SHALL set the active Text Track to the one identified by the TrackID in the Track catalog for the streaming media. If the TrackID does not exist in the Track catalog, OR does not correspond to the streaming media OR no media is being streamed at the time of receipt of this command, the server SHALL return an error status of INVALID_ARGUMENT. */ -- (void)activateTextTrackWithParams:(MTRMediaPlaybackClusterActivateTextTrackParams *)params completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; +- (void)activateTextTrackWithParams:(MTRMediaPlaybackClusterActivateTextTrackParams *)params completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Command DeactivateTextTrack * * If a Text Track is active (i.e. being displayed), upon receipt of this command, the server SHALL stop displaying it. */ -- (void)deactivateTextTrackWithParams:(MTRMediaPlaybackClusterDeactivateTextTrackParams * _Nullable)params completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; +- (void)deactivateTextTrackWithParams:(MTRMediaPlaybackClusterDeactivateTextTrackParams * _Nullable)params completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)deactivateTextTrackWithCompletion:(MTRStatusCompletion)completion - MTR_PROVISIONALLY_AVAILABLE; + MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)readAttributeCurrentStateWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)); - (void)subscribeAttributeCurrentStateWithParams:(MTRSubscribeParams *)params @@ -13890,7 +13890,7 @@ MTR_PROVISIONALLY_AVAILABLE * * This cluster provides an interface for sending targeted commands to an Observer of a Content App on a Video Player device such as a Streaming Media Player, Smart TV or Smart Screen. The cluster server for Content App Observer is implemented by an endpoint that communicates with a Content App, such as a Casting Video Client. The cluster client for Content App Observer is implemented by a Content App endpoint. A Content App is informed of the NodeId of an Observer when a binding is set on the Content App. The Content App can then send the ContentAppMessage to the Observer (server cluster), and the Observer responds with a ContentAppMessageResponse. */ -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRBaseClusterContentAppObserver : MTRGenericBaseCluster /** @@ -13898,37 +13898,37 @@ MTR_PROVISIONALLY_AVAILABLE * * Upon receipt, the data field MAY be parsed and interpreted. Message encoding is specific to the Content App. A Content App MAY when possible read attributes from the Basic Information Cluster on the Observer and use this to determine the Message encoding. */ -- (void)contentAppMessageWithParams:(MTRContentAppObserverClusterContentAppMessageParams *)params completion:(void (^)(MTRContentAppObserverClusterContentAppMessageResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)contentAppMessageWithParams:(MTRContentAppObserverClusterContentAppMessageParams *)params completion:(void (^)(MTRContentAppObserverClusterContentAppMessageResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeGeneratedCommandListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeGeneratedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeGeneratedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeAcceptedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAcceptedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeAcceptedCommandListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAcceptedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeAcceptedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeAttributeListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAttributeListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeAttributeListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAttributeListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeAttributeListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeFeatureMapWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeFeatureMapWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeFeatureMapWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeFeatureMapWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeFeatureMapWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeClusterRevisionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeClusterRevisionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeClusterRevisionWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeClusterRevisionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeClusterRevisionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (instancetype)init NS_UNAVAILABLE; + (instancetype)new NS_UNAVAILABLE; @@ -13943,7 +13943,7 @@ MTR_PROVISIONALLY_AVAILABLE */ - (instancetype _Nullable)initWithDevice:(MTRBaseDevice *)device endpointID:(NSNumber *)endpointID - queue:(dispatch_queue_t)queue MTR_PROVISIONALLY_AVAILABLE; + queue:(dispatch_queue_t)queue MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end @@ -15053,7 +15053,7 @@ MTR_PROVISIONALLY_AVAILABLE * * Supports the ability for clients to request the commissioning of themselves or other nodes onto a fabric which the cluster server can commission onto. */ -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRBaseClusterCommissionerControl : MTRGenericBaseCluster /** @@ -15061,49 +15061,49 @@ MTR_PROVISIONALLY_AVAILABLE * * This command is sent by a client to request approval for a future CommissionNode call. */ -- (void)requestCommissioningApprovalWithParams:(MTRCommissionerControlClusterRequestCommissioningApprovalParams *)params completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; +- (void)requestCommissioningApprovalWithParams:(MTRCommissionerControlClusterRequestCommissioningApprovalParams *)params completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Command CommissionNode * * This command is sent by a client to request that the server begins commissioning a previously approved request. */ -- (void)commissionNodeWithParams:(MTRCommissionerControlClusterCommissionNodeParams *)params completion:(void (^)(MTRCommissionerControlClusterReverseOpenCommissioningWindowParams * _Nullable data, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)commissionNodeWithParams:(MTRCommissionerControlClusterCommissionNodeParams *)params completion:(void (^)(MTRCommissionerControlClusterReverseOpenCommissioningWindowParams * _Nullable data, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeSupportedDeviceCategoriesWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeSupportedDeviceCategoriesWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeSupportedDeviceCategoriesWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeSupportedDeviceCategoriesWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeSupportedDeviceCategoriesWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeGeneratedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeGeneratedCommandListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeGeneratedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeGeneratedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeAcceptedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAcceptedCommandListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeAcceptedCommandListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAcceptedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeAcceptedCommandListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeAttributeListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeAttributeListWithCompletion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeAttributeListWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeAttributeListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeAttributeListWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSArray * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeFeatureMapWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeFeatureMapWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeFeatureMapWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeFeatureMapWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeFeatureMapWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (void)readAttributeClusterRevisionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)readAttributeClusterRevisionWithCompletion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)subscribeAttributeClusterRevisionWithParams:(MTRSubscribeParams *)params subscriptionEstablished:(MTRSubscriptionEstablishedHandler _Nullable)subscriptionEstablished - reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_PROVISIONALLY_AVAILABLE; -+ (void)readAttributeClusterRevisionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + reportHandler:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))reportHandler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); ++ (void)readAttributeClusterRevisionWithClusterStateCache:(MTRClusterStateCacheContainer *)clusterStateCacheContainer endpoint:(NSNumber *)endpoint queue:(dispatch_queue_t)queue completion:(void (^)(NSNumber * _Nullable value, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (instancetype)init NS_UNAVAILABLE; + (instancetype)new NS_UNAVAILABLE; @@ -15118,7 +15118,7 @@ MTR_PROVISIONALLY_AVAILABLE */ - (instancetype _Nullable)initWithDevice:(MTRBaseDevice *)device endpointID:(NSNumber *)endpointID - queue:(dispatch_queue_t)queue MTR_PROVISIONALLY_AVAILABLE; + queue:(dispatch_queue_t)queue MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end @@ -16427,10 +16427,10 @@ typedef NS_ENUM(uint8_t, MTRDataTypeAreaTypeTag) { } MTR_PROVISIONALLY_AVAILABLE; typedef NS_ENUM(uint8_t, MTRDataTypeAtomicRequestTypeEnum) { - MTRDataTypeAtomicRequestTypeEnumBeginWrite MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTRDataTypeAtomicRequestTypeEnumCommitWrite MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTRDataTypeAtomicRequestTypeEnumRollbackWrite MTR_PROVISIONALLY_AVAILABLE = 0x02, -} MTR_PROVISIONALLY_AVAILABLE; + MTRDataTypeAtomicRequestTypeEnumBeginWrite MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00, + MTRDataTypeAtomicRequestTypeEnumCommitWrite MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x01, + MTRDataTypeAtomicRequestTypeEnumRollbackWrite MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x02, +} MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); typedef NS_ENUM(uint8_t, MTRDataTypeFloorSurfaceTag) { MTRDataTypeFloorSurfaceTagCarpet MTR_PROVISIONALLY_AVAILABLE = 0x00, @@ -16460,78 +16460,78 @@ typedef NS_ENUM(uint8_t, MTRDataTypeFloorSurfaceTag) { } MTR_PROVISIONALLY_AVAILABLE; typedef NS_ENUM(uint8_t, MTRDataTypeLandmarkTag) { - MTRDataTypeLandmarkTagAirConditioner MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTRDataTypeLandmarkTagAirPurifier MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTRDataTypeLandmarkTagBackDoor MTR_PROVISIONALLY_AVAILABLE = 0x02, - MTRDataTypeLandmarkTagBarStool MTR_PROVISIONALLY_AVAILABLE = 0x03, - MTRDataTypeLandmarkTagBathMat MTR_PROVISIONALLY_AVAILABLE = 0x04, - MTRDataTypeLandmarkTagBathtub MTR_PROVISIONALLY_AVAILABLE = 0x05, - MTRDataTypeLandmarkTagBed MTR_PROVISIONALLY_AVAILABLE = 0x06, - MTRDataTypeLandmarkTagBookshelf MTR_PROVISIONALLY_AVAILABLE = 0x07, - MTRDataTypeLandmarkTagChair MTR_PROVISIONALLY_AVAILABLE = 0x08, - MTRDataTypeLandmarkTagChristmasTree MTR_PROVISIONALLY_AVAILABLE = 0x09, - MTRDataTypeLandmarkTagCoatRack MTR_PROVISIONALLY_AVAILABLE = 0x0A, - MTRDataTypeLandmarkTagCoffeeTable MTR_PROVISIONALLY_AVAILABLE = 0x0B, - MTRDataTypeLandmarkTagCookingRange MTR_PROVISIONALLY_AVAILABLE = 0x0C, - MTRDataTypeLandmarkTagCouch MTR_PROVISIONALLY_AVAILABLE = 0x0D, - MTRDataTypeLandmarkTagCountertop MTR_PROVISIONALLY_AVAILABLE = 0x0E, - MTRDataTypeLandmarkTagCradle MTR_PROVISIONALLY_AVAILABLE = 0x0F, - MTRDataTypeLandmarkTagCrib MTR_PROVISIONALLY_AVAILABLE = 0x10, - MTRDataTypeLandmarkTagDesk MTR_PROVISIONALLY_AVAILABLE = 0x11, - MTRDataTypeLandmarkTagDiningTable MTR_PROVISIONALLY_AVAILABLE = 0x12, - MTRDataTypeLandmarkTagDishwasher MTR_PROVISIONALLY_AVAILABLE = 0x13, - MTRDataTypeLandmarkTagDoor MTR_PROVISIONALLY_AVAILABLE = 0x14, - MTRDataTypeLandmarkTagDresser MTR_PROVISIONALLY_AVAILABLE = 0x15, - MTRDataTypeLandmarkTagLaundryDryer MTR_PROVISIONALLY_AVAILABLE = 0x16, - MTRDataTypeLandmarkTagFan MTR_PROVISIONALLY_AVAILABLE = 0x17, - MTRDataTypeLandmarkTagFireplace MTR_PROVISIONALLY_AVAILABLE = 0x18, - MTRDataTypeLandmarkTagFreezer MTR_PROVISIONALLY_AVAILABLE = 0x19, - MTRDataTypeLandmarkTagFrontDoor MTR_PROVISIONALLY_AVAILABLE = 0x1A, - MTRDataTypeLandmarkTagHighChair MTR_PROVISIONALLY_AVAILABLE = 0x1B, - MTRDataTypeLandmarkTagKitchenIsland MTR_PROVISIONALLY_AVAILABLE = 0x1C, - MTRDataTypeLandmarkTagLamp MTR_PROVISIONALLY_AVAILABLE = 0x1D, - MTRDataTypeLandmarkTagLitterBox MTR_PROVISIONALLY_AVAILABLE = 0x1E, - MTRDataTypeLandmarkTagMirror MTR_PROVISIONALLY_AVAILABLE = 0x1F, - MTRDataTypeLandmarkTagNightstand MTR_PROVISIONALLY_AVAILABLE = 0x20, - MTRDataTypeLandmarkTagOven MTR_PROVISIONALLY_AVAILABLE = 0x21, - MTRDataTypeLandmarkTagPetBed MTR_PROVISIONALLY_AVAILABLE = 0x22, - MTRDataTypeLandmarkTagPetBowl MTR_PROVISIONALLY_AVAILABLE = 0x23, - MTRDataTypeLandmarkTagPetCrate MTR_PROVISIONALLY_AVAILABLE = 0x24, - MTRDataTypeLandmarkTagRefrigerator MTR_PROVISIONALLY_AVAILABLE = 0x25, - MTRDataTypeLandmarkTagScratchingPost MTR_PROVISIONALLY_AVAILABLE = 0x26, - MTRDataTypeLandmarkTagShoeRack MTR_PROVISIONALLY_AVAILABLE = 0x27, - MTRDataTypeLandmarkTagShower MTR_PROVISIONALLY_AVAILABLE = 0x28, - MTRDataTypeLandmarkTagSideDoor MTR_PROVISIONALLY_AVAILABLE = 0x29, - MTRDataTypeLandmarkTagSink MTR_PROVISIONALLY_AVAILABLE = 0x2A, - MTRDataTypeLandmarkTagSofa MTR_PROVISIONALLY_AVAILABLE = 0x2B, - MTRDataTypeLandmarkTagStove MTR_PROVISIONALLY_AVAILABLE = 0x2C, - MTRDataTypeLandmarkTagTable MTR_PROVISIONALLY_AVAILABLE = 0x2D, - MTRDataTypeLandmarkTagToilet MTR_PROVISIONALLY_AVAILABLE = 0x2E, - MTRDataTypeLandmarkTagTrashCan MTR_PROVISIONALLY_AVAILABLE = 0x2F, - MTRDataTypeLandmarkTagLaundryWasher MTR_PROVISIONALLY_AVAILABLE = 0x30, - MTRDataTypeLandmarkTagWindow MTR_PROVISIONALLY_AVAILABLE = 0x31, - MTRDataTypeLandmarkTagWineCooler MTR_PROVISIONALLY_AVAILABLE = 0x32, -} MTR_PROVISIONALLY_AVAILABLE; + MTRDataTypeLandmarkTagAirConditioner MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00, + MTRDataTypeLandmarkTagAirPurifier MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x01, + MTRDataTypeLandmarkTagBackDoor MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x02, + MTRDataTypeLandmarkTagBarStool MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x03, + MTRDataTypeLandmarkTagBathMat MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x04, + MTRDataTypeLandmarkTagBathtub MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x05, + MTRDataTypeLandmarkTagBed MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x06, + MTRDataTypeLandmarkTagBookshelf MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x07, + MTRDataTypeLandmarkTagChair MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x08, + MTRDataTypeLandmarkTagChristmasTree MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x09, + MTRDataTypeLandmarkTagCoatRack MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x0A, + MTRDataTypeLandmarkTagCoffeeTable MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x0B, + MTRDataTypeLandmarkTagCookingRange MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x0C, + MTRDataTypeLandmarkTagCouch MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x0D, + MTRDataTypeLandmarkTagCountertop MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x0E, + MTRDataTypeLandmarkTagCradle MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x0F, + MTRDataTypeLandmarkTagCrib MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x10, + MTRDataTypeLandmarkTagDesk MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x11, + MTRDataTypeLandmarkTagDiningTable MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x12, + MTRDataTypeLandmarkTagDishwasher MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x13, + MTRDataTypeLandmarkTagDoor MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x14, + MTRDataTypeLandmarkTagDresser MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x15, + MTRDataTypeLandmarkTagLaundryDryer MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x16, + MTRDataTypeLandmarkTagFan MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x17, + MTRDataTypeLandmarkTagFireplace MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x18, + MTRDataTypeLandmarkTagFreezer MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x19, + MTRDataTypeLandmarkTagFrontDoor MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x1A, + MTRDataTypeLandmarkTagHighChair MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x1B, + MTRDataTypeLandmarkTagKitchenIsland MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x1C, + MTRDataTypeLandmarkTagLamp MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x1D, + MTRDataTypeLandmarkTagLitterBox MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x1E, + MTRDataTypeLandmarkTagMirror MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x1F, + MTRDataTypeLandmarkTagNightstand MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x20, + MTRDataTypeLandmarkTagOven MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x21, + MTRDataTypeLandmarkTagPetBed MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x22, + MTRDataTypeLandmarkTagPetBowl MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x23, + MTRDataTypeLandmarkTagPetCrate MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x24, + MTRDataTypeLandmarkTagRefrigerator MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x25, + MTRDataTypeLandmarkTagScratchingPost MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x26, + MTRDataTypeLandmarkTagShoeRack MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x27, + MTRDataTypeLandmarkTagShower MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x28, + MTRDataTypeLandmarkTagSideDoor MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x29, + MTRDataTypeLandmarkTagSink MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x2A, + MTRDataTypeLandmarkTagSofa MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x2B, + MTRDataTypeLandmarkTagStove MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x2C, + MTRDataTypeLandmarkTagTable MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x2D, + MTRDataTypeLandmarkTagToilet MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x2E, + MTRDataTypeLandmarkTagTrashCan MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x2F, + MTRDataTypeLandmarkTagLaundryWasher MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x30, + MTRDataTypeLandmarkTagWindow MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x31, + MTRDataTypeLandmarkTagWineCooler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x32, +} MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); typedef NS_ENUM(uint8_t, MTRDataTypePositionTag) { - MTRDataTypePositionTagLeft MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTRDataTypePositionTagRight MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTRDataTypePositionTagTop MTR_PROVISIONALLY_AVAILABLE = 0x02, - MTRDataTypePositionTagBottom MTR_PROVISIONALLY_AVAILABLE = 0x03, - MTRDataTypePositionTagMiddle MTR_PROVISIONALLY_AVAILABLE = 0x04, - MTRDataTypePositionTagRow MTR_PROVISIONALLY_AVAILABLE = 0x05, - MTRDataTypePositionTagColumn MTR_PROVISIONALLY_AVAILABLE = 0x06, -} MTR_PROVISIONALLY_AVAILABLE; + MTRDataTypePositionTagLeft MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00, + MTRDataTypePositionTagRight MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x01, + MTRDataTypePositionTagTop MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x02, + MTRDataTypePositionTagBottom MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x03, + MTRDataTypePositionTagMiddle MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x04, + MTRDataTypePositionTagRow MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x05, + MTRDataTypePositionTagColumn MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x06, +} MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); typedef NS_ENUM(uint8_t, MTRDataTypeRelativePositionTag) { - MTRDataTypeRelativePositionTagUnder MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTRDataTypeRelativePositionTagNextTo MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTRDataTypeRelativePositionTagAround MTR_PROVISIONALLY_AVAILABLE = 0x02, - MTRDataTypeRelativePositionTagOn MTR_PROVISIONALLY_AVAILABLE = 0x03, - MTRDataTypeRelativePositionTagAbove MTR_PROVISIONALLY_AVAILABLE = 0x04, - MTRDataTypeRelativePositionTagFrontOf MTR_PROVISIONALLY_AVAILABLE = 0x05, - MTRDataTypeRelativePositionTagBehind MTR_PROVISIONALLY_AVAILABLE = 0x06, -} MTR_PROVISIONALLY_AVAILABLE; + MTRDataTypeRelativePositionTagUnder MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00, + MTRDataTypeRelativePositionTagNextTo MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x01, + MTRDataTypeRelativePositionTagAround MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x02, + MTRDataTypeRelativePositionTagOn MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x03, + MTRDataTypeRelativePositionTagAbove MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x04, + MTRDataTypeRelativePositionTagFrontOf MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x05, + MTRDataTypeRelativePositionTagBehind MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x06, +} MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); typedef NS_ENUM(uint8_t, MTRDataTypeTestGlobalEnum) { MTRDataTypeTestGlobalEnumSomeValue MTR_PROVISIONALLY_AVAILABLE = 0x00, @@ -16611,7 +16611,7 @@ typedef NS_OPTIONS(uint32_t, MTROnOffFeature) { MTROnOffFeatureLighting MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) = 0x1, MTROnOffFeatureDeadFrontBehavior MTR_AVAILABLE(ios(17.2), macos(14.2), watchos(10.2), tvos(17.2)) = 0x2, MTROnOffFeatureDeadFront MTR_DEPRECATED("Please use MTROnOffFeatureDeadFrontBehavior", ios(17.1, 17.2), macos(14.1, 14.2), watchos(10.1, 10.2), tvos(17.1, 17.2)) = 0x2, - MTROnOffFeatureOffOnly MTR_PROVISIONALLY_AVAILABLE = 0x4, + MTROnOffFeatureOffOnly MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x4, } MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)); typedef NS_OPTIONS(uint8_t, MTROnOffControlBitmap) { @@ -16681,11 +16681,11 @@ typedef NS_ENUM(uint8_t, MTRAccessControlPrivilege) { } MTR_DEPRECATED("Please use MTRAccessControlEntryPrivilege", ios(16.1, 16.4), macos(13.0, 13.3), watchos(9.1, 9.4), tvos(16.1, 16.4)); typedef NS_ENUM(uint8_t, MTRAccessControlAccessRestrictionType) { - MTRAccessControlAccessRestrictionTypeAttributeAccessForbidden MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTRAccessControlAccessRestrictionTypeAttributeWriteForbidden MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTRAccessControlAccessRestrictionTypeCommandForbidden MTR_PROVISIONALLY_AVAILABLE = 0x02, - MTRAccessControlAccessRestrictionTypeEventForbidden MTR_PROVISIONALLY_AVAILABLE = 0x03, -} MTR_PROVISIONALLY_AVAILABLE; + MTRAccessControlAccessRestrictionTypeAttributeAccessForbidden MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00, + MTRAccessControlAccessRestrictionTypeAttributeWriteForbidden MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x01, + MTRAccessControlAccessRestrictionTypeCommandForbidden MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x02, + MTRAccessControlAccessRestrictionTypeEventForbidden MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x03, +} MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); typedef NS_ENUM(uint8_t, MTRAccessControlChangeType) { MTRAccessControlChangeTypeChanged MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) = 0x00, @@ -16694,9 +16694,9 @@ typedef NS_ENUM(uint8_t, MTRAccessControlChangeType) { } MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)); typedef NS_OPTIONS(uint32_t, MTRAccessControlFeature) { - MTRAccessControlFeatureExtension MTR_PROVISIONALLY_AVAILABLE = 0x1, - MTRAccessControlFeatureManagedDevice MTR_PROVISIONALLY_AVAILABLE = 0x2, -} MTR_PROVISIONALLY_AVAILABLE; + MTRAccessControlFeatureExtension MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x1, + MTRAccessControlFeatureManagedDevice MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x2, +} MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); typedef NS_ENUM(uint8_t, MTRActionsActionError) { MTRActionsActionErrorUnknown MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) = 0x00, @@ -16879,13 +16879,13 @@ typedef NS_ENUM(uint8_t, MTRTimeFormatLocalizationCalendarType) { MTRTimeFormatLocalizationCalendarTypeKorean MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) = 0x09, MTRTimeFormatLocalizationCalendarTypePersian MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) = 0x0A, MTRTimeFormatLocalizationCalendarTypeTaiwanese MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) = 0x0B, - MTRTimeFormatLocalizationCalendarTypeUseActiveLocale MTR_PROVISIONALLY_AVAILABLE = 0xFF, + MTRTimeFormatLocalizationCalendarTypeUseActiveLocale MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0xFF, } MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)); typedef NS_ENUM(uint8_t, MTRTimeFormatLocalizationHourFormat) { MTRTimeFormatLocalizationHourFormat12hr MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) = 0x00, MTRTimeFormatLocalizationHourFormat24hr MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) = 0x01, - MTRTimeFormatLocalizationHourFormatUseActiveLocale MTR_PROVISIONALLY_AVAILABLE = 0xFF, + MTRTimeFormatLocalizationHourFormatUseActiveLocale MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0xFF, } MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)); typedef NS_OPTIONS(uint32_t, MTRTimeFormatLocalizationFeature) { @@ -17147,12 +17147,12 @@ typedef NS_OPTIONS(uint32_t, MTRNetworkCommissioningFeature) { } MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)); typedef NS_OPTIONS(uint16_t, MTRNetworkCommissioningThreadCapabilitiesBitmap) { - MTRNetworkCommissioningThreadCapabilitiesBitmapIsBorderRouterCapable MTR_PROVISIONALLY_AVAILABLE = 0x1, - MTRNetworkCommissioningThreadCapabilitiesBitmapIsRouterCapable MTR_PROVISIONALLY_AVAILABLE = 0x2, - MTRNetworkCommissioningThreadCapabilitiesBitmapIsSleepyEndDeviceCapable MTR_PROVISIONALLY_AVAILABLE = 0x4, - MTRNetworkCommissioningThreadCapabilitiesBitmapIsFullThreadDevice MTR_PROVISIONALLY_AVAILABLE = 0x8, - MTRNetworkCommissioningThreadCapabilitiesBitmapIsSynchronizedSleepyEndDeviceCapable MTR_PROVISIONALLY_AVAILABLE = 0x10, -} MTR_PROVISIONALLY_AVAILABLE; + MTRNetworkCommissioningThreadCapabilitiesBitmapIsBorderRouterCapable MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x1, + MTRNetworkCommissioningThreadCapabilitiesBitmapIsRouterCapable MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x2, + MTRNetworkCommissioningThreadCapabilitiesBitmapIsSleepyEndDeviceCapable MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x4, + MTRNetworkCommissioningThreadCapabilitiesBitmapIsFullThreadDevice MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x8, + MTRNetworkCommissioningThreadCapabilitiesBitmapIsSynchronizedSleepyEndDeviceCapable MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x10, +} MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); typedef NS_OPTIONS(uint8_t, MTRNetworkCommissioningWiFiSecurityBitmap) { MTRNetworkCommissioningWiFiSecurityBitmapUnencrypted MTR_AVAILABLE(ios(17.0), macos(14.0), watchos(10.0), tvos(17.0)) = 0x1, @@ -17304,8 +17304,8 @@ typedef NS_ENUM(uint8_t, MTRGeneralDiagnosticsRadioFaultType) { } MTR_DEPRECATED("Please use MTRGeneralDiagnosticsRadioFault", ios(16.1, 16.4), macos(13.0, 13.3), watchos(9.1, 9.4), tvos(16.1, 16.4)); typedef NS_OPTIONS(uint32_t, MTRGeneralDiagnosticsFeature) { - MTRGeneralDiagnosticsFeatureDataModelTest MTR_PROVISIONALLY_AVAILABLE = 0x1, -} MTR_PROVISIONALLY_AVAILABLE; + MTRGeneralDiagnosticsFeatureDataModelTest MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x1, +} MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); typedef NS_OPTIONS(uint32_t, MTRSoftwareDiagnosticsFeature) { MTRSoftwareDiagnosticsFeatureWatermarks MTR_AVAILABLE(ios(17.4), macos(14.4), watchos(10.4), tvos(17.4)) = 0x1, @@ -17442,53 +17442,53 @@ typedef NS_ENUM(uint8_t, MTRTimeSynchronizationGranularity) { } MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)); typedef NS_ENUM(uint8_t, MTRTimeSynchronizationStatusCode) { - MTRTimeSynchronizationStatusCodeTimeNotAccepted MTR_PROVISIONALLY_AVAILABLE = 0x02, -} MTR_PROVISIONALLY_AVAILABLE; + MTRTimeSynchronizationStatusCodeTimeNotAccepted MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x02, +} MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); typedef NS_ENUM(uint8_t, MTRTimeSynchronizationTimeSource) { MTRTimeSynchronizationTimeSourceNone MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) = 0x00, MTRTimeSynchronizationTimeSourceUnknown MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) = 0x01, MTRTimeSynchronizationTimeSourceAdmin MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) = 0x02, MTRTimeSynchronizationTimeSourceNodeTimeCluster MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) = 0x03, - MTRTimeSynchronizationTimeSourceNonMatterSNTP MTR_PROVISIONALLY_AVAILABLE = 0x04, + MTRTimeSynchronizationTimeSourceNonMatterSNTP MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x04, MTRTimeSynchronizationTimeSourceNonFabricSntp MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) = 0x04, - MTRTimeSynchronizationTimeSourceNonMatterNTP MTR_PROVISIONALLY_AVAILABLE = 0x05, + MTRTimeSynchronizationTimeSourceNonMatterNTP MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x05, MTRTimeSynchronizationTimeSourceNonFabricNtp MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) = 0x05, - MTRTimeSynchronizationTimeSourceMatterSNTP MTR_PROVISIONALLY_AVAILABLE = 0x06, + MTRTimeSynchronizationTimeSourceMatterSNTP MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x06, MTRTimeSynchronizationTimeSourceFabricSntp MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) = 0x06, - MTRTimeSynchronizationTimeSourceMatterNTP MTR_PROVISIONALLY_AVAILABLE = 0x07, + MTRTimeSynchronizationTimeSourceMatterNTP MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x07, MTRTimeSynchronizationTimeSourceFabricNtp MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) = 0x07, - MTRTimeSynchronizationTimeSourceMixedNTP MTR_PROVISIONALLY_AVAILABLE = 0x08, + MTRTimeSynchronizationTimeSourceMixedNTP MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x08, MTRTimeSynchronizationTimeSourceMixedNtp MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) = 0x08, - MTRTimeSynchronizationTimeSourceNonMatterSNTPNTS MTR_PROVISIONALLY_AVAILABLE = 0x09, + MTRTimeSynchronizationTimeSourceNonMatterSNTPNTS MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x09, MTRTimeSynchronizationTimeSourceNonFabricSntpNts MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) = 0x09, - MTRTimeSynchronizationTimeSourceNonMatterNTPNTS MTR_PROVISIONALLY_AVAILABLE = 0x0A, + MTRTimeSynchronizationTimeSourceNonMatterNTPNTS MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x0A, MTRTimeSynchronizationTimeSourceNonFabricNtpNts MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) = 0x0A, - MTRTimeSynchronizationTimeSourceMatterSNTPNTS MTR_PROVISIONALLY_AVAILABLE = 0x0B, + MTRTimeSynchronizationTimeSourceMatterSNTPNTS MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x0B, MTRTimeSynchronizationTimeSourceFabricSntpNts MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) = 0x0B, - MTRTimeSynchronizationTimeSourceMatterNTPNTS MTR_PROVISIONALLY_AVAILABLE = 0x0C, + MTRTimeSynchronizationTimeSourceMatterNTPNTS MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x0C, MTRTimeSynchronizationTimeSourceFabricNtpNts MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) = 0x0C, - MTRTimeSynchronizationTimeSourceMixedNTPNTS MTR_PROVISIONALLY_AVAILABLE = 0x0D, + MTRTimeSynchronizationTimeSourceMixedNTPNTS MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x0D, MTRTimeSynchronizationTimeSourceMixedNtpNts MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) = 0x0D, MTRTimeSynchronizationTimeSourceCloudSource MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) = 0x0E, - MTRTimeSynchronizationTimeSourcePTP MTR_PROVISIONALLY_AVAILABLE = 0x0F, + MTRTimeSynchronizationTimeSourcePTP MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x0F, MTRTimeSynchronizationTimeSourcePtp MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) = 0x0F, - MTRTimeSynchronizationTimeSourceGNSS MTR_PROVISIONALLY_AVAILABLE = 0x10, + MTRTimeSynchronizationTimeSourceGNSS MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x10, MTRTimeSynchronizationTimeSourceGnss MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) = 0x10, } MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)); typedef NS_ENUM(uint8_t, MTRTimeSynchronizationTimeZoneDatabase) { - MTRTimeSynchronizationTimeZoneDatabaseFull MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTRTimeSynchronizationTimeZoneDatabasePartial MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTRTimeSynchronizationTimeZoneDatabaseNone MTR_PROVISIONALLY_AVAILABLE = 0x02, -} MTR_PROVISIONALLY_AVAILABLE; + MTRTimeSynchronizationTimeZoneDatabaseFull MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00, + MTRTimeSynchronizationTimeZoneDatabasePartial MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x01, + MTRTimeSynchronizationTimeZoneDatabaseNone MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x02, +} MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); typedef NS_OPTIONS(uint32_t, MTRTimeSynchronizationFeature) { - MTRTimeSynchronizationFeatureTimeZone MTR_PROVISIONALLY_AVAILABLE = 0x1, - MTRTimeSynchronizationFeatureNTPClient MTR_PROVISIONALLY_AVAILABLE = 0x2, - MTRTimeSynchronizationFeatureNTPServer MTR_PROVISIONALLY_AVAILABLE = 0x4, - MTRTimeSynchronizationFeatureTimeSyncClient MTR_PROVISIONALLY_AVAILABLE = 0x8, -} MTR_PROVISIONALLY_AVAILABLE; + MTRTimeSynchronizationFeatureTimeZone MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x1, + MTRTimeSynchronizationFeatureNTPClient MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x2, + MTRTimeSynchronizationFeatureNTPServer MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x4, + MTRTimeSynchronizationFeatureTimeSyncClient MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x8, +} MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); typedef NS_ENUM(uint8_t, MTRBridgedDeviceBasicInformationColor) { MTRBridgedDeviceBasicInformationColorBlack MTR_AVAILABLE(ios(17.0), macos(14.0), watchos(10.0), tvos(17.0)) = 0x00, @@ -17524,8 +17524,8 @@ typedef NS_ENUM(uint8_t, MTRBridgedDeviceBasicInformationProductFinish) { } MTR_AVAILABLE(ios(17.0), macos(14.0), watchos(10.0), tvos(17.0)); typedef NS_OPTIONS(uint32_t, MTRBridgedDeviceBasicInformationFeature) { - MTRBridgedDeviceBasicInformationFeatureBridgedICDSupport MTR_PROVISIONALLY_AVAILABLE = 0x100000, -} MTR_PROVISIONALLY_AVAILABLE; + MTRBridgedDeviceBasicInformationFeatureBridgedICDSupport MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x100000, +} MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); typedef NS_OPTIONS(uint32_t, MTRSwitchFeature) { MTRSwitchFeatureLatchingSwitch MTR_AVAILABLE(ios(16.2), macos(13.1), watchos(9.2), tvos(16.2)) = 0x1, @@ -17533,7 +17533,7 @@ typedef NS_OPTIONS(uint32_t, MTRSwitchFeature) { MTRSwitchFeatureMomentarySwitchRelease MTR_AVAILABLE(ios(16.2), macos(13.1), watchos(9.2), tvos(16.2)) = 0x4, MTRSwitchFeatureMomentarySwitchLongPress MTR_AVAILABLE(ios(16.2), macos(13.1), watchos(9.2), tvos(16.2)) = 0x8, MTRSwitchFeatureMomentarySwitchMultiPress MTR_AVAILABLE(ios(16.2), macos(13.1), watchos(9.2), tvos(16.2)) = 0x10, - MTRSwitchFeatureActionSwitch MTR_PROVISIONALLY_AVAILABLE = 0x20, + MTRSwitchFeatureActionSwitch MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x20, } MTR_AVAILABLE(ios(16.2), macos(13.1), watchos(9.2), tvos(16.2)); typedef NS_ENUM(uint8_t, MTRAdministratorCommissioningCommissioningWindowStatus) { @@ -18105,22 +18105,22 @@ typedef NS_OPTIONS(uint32_t, MTRElectricalEnergyMeasurementFeature) { } MTR_AVAILABLE(ios(17.6), macos(14.6), watchos(10.6), tvos(17.6)); typedef NS_ENUM(uint8_t, MTRWaterHeaterManagementBoostState) { - MTRWaterHeaterManagementBoostStateInactive MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTRWaterHeaterManagementBoostStateActive MTR_PROVISIONALLY_AVAILABLE = 0x01, -} MTR_PROVISIONALLY_AVAILABLE; + MTRWaterHeaterManagementBoostStateInactive MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00, + MTRWaterHeaterManagementBoostStateActive MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x01, +} MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); typedef NS_OPTIONS(uint32_t, MTRWaterHeaterManagementFeature) { - MTRWaterHeaterManagementFeatureEnergyManagement MTR_PROVISIONALLY_AVAILABLE = 0x1, - MTRWaterHeaterManagementFeatureTankPercent MTR_PROVISIONALLY_AVAILABLE = 0x2, -} MTR_PROVISIONALLY_AVAILABLE; + MTRWaterHeaterManagementFeatureEnergyManagement MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x1, + MTRWaterHeaterManagementFeatureTankPercent MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x2, +} MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); typedef NS_OPTIONS(uint8_t, MTRWaterHeaterManagementWaterHeaterHeatSourceBitmap) { - MTRWaterHeaterManagementWaterHeaterHeatSourceBitmapImmersionElement1 MTR_PROVISIONALLY_AVAILABLE = 0x1, - MTRWaterHeaterManagementWaterHeaterHeatSourceBitmapImmersionElement2 MTR_PROVISIONALLY_AVAILABLE = 0x2, - MTRWaterHeaterManagementWaterHeaterHeatSourceBitmapHeatPump MTR_PROVISIONALLY_AVAILABLE = 0x4, - MTRWaterHeaterManagementWaterHeaterHeatSourceBitmapBoiler MTR_PROVISIONALLY_AVAILABLE = 0x8, - MTRWaterHeaterManagementWaterHeaterHeatSourceBitmapOther MTR_PROVISIONALLY_AVAILABLE = 0x10, -} MTR_PROVISIONALLY_AVAILABLE; + MTRWaterHeaterManagementWaterHeaterHeatSourceBitmapImmersionElement1 MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x1, + MTRWaterHeaterManagementWaterHeaterHeatSourceBitmapImmersionElement2 MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x2, + MTRWaterHeaterManagementWaterHeaterHeatSourceBitmapHeatPump MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x4, + MTRWaterHeaterManagementWaterHeaterHeatSourceBitmapBoiler MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x8, + MTRWaterHeaterManagementWaterHeaterHeatSourceBitmapOther MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x10, +} MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); typedef NS_ENUM(uint8_t, MTRDemandResponseLoadControlCriticalityLevel) { MTRDemandResponseLoadControlCriticalityLevelUnknown MTR_PROVISIONALLY_AVAILABLE = 0x00, @@ -18206,34 +18206,34 @@ typedef NS_OPTIONS(uint32_t, MTRDemandResponseLoadControlFeature) { } MTR_PROVISIONALLY_AVAILABLE; typedef NS_ENUM(uint8_t, MTRMessagesFutureMessagePreference) { - MTRMessagesFutureMessagePreferenceAllowed MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTRMessagesFutureMessagePreferenceIncreased MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTRMessagesFutureMessagePreferenceReduced MTR_PROVISIONALLY_AVAILABLE = 0x02, - MTRMessagesFutureMessagePreferenceDisallowed MTR_PROVISIONALLY_AVAILABLE = 0x03, - MTRMessagesFutureMessagePreferenceBanned MTR_PROVISIONALLY_AVAILABLE = 0x04, -} MTR_PROVISIONALLY_AVAILABLE; + MTRMessagesFutureMessagePreferenceAllowed MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00, + MTRMessagesFutureMessagePreferenceIncreased MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x01, + MTRMessagesFutureMessagePreferenceReduced MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x02, + MTRMessagesFutureMessagePreferenceDisallowed MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x03, + MTRMessagesFutureMessagePreferenceBanned MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x04, +} MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); typedef NS_ENUM(uint8_t, MTRMessagesMessagePriority) { - MTRMessagesMessagePriorityLow MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTRMessagesMessagePriorityMedium MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTRMessagesMessagePriorityHigh MTR_PROVISIONALLY_AVAILABLE = 0x02, - MTRMessagesMessagePriorityCritical MTR_PROVISIONALLY_AVAILABLE = 0x03, -} MTR_PROVISIONALLY_AVAILABLE; + MTRMessagesMessagePriorityLow MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00, + MTRMessagesMessagePriorityMedium MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x01, + MTRMessagesMessagePriorityHigh MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x02, + MTRMessagesMessagePriorityCritical MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x03, +} MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); typedef NS_OPTIONS(uint32_t, MTRMessagesFeature) { - MTRMessagesFeatureReceivedConfirmation MTR_PROVISIONALLY_AVAILABLE = 0x1, - MTRMessagesFeatureConfirmationResponse MTR_PROVISIONALLY_AVAILABLE = 0x2, - MTRMessagesFeatureConfirmationReply MTR_PROVISIONALLY_AVAILABLE = 0x4, - MTRMessagesFeatureProtectedMessages MTR_PROVISIONALLY_AVAILABLE = 0x8, -} MTR_PROVISIONALLY_AVAILABLE; + MTRMessagesFeatureReceivedConfirmation MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x1, + MTRMessagesFeatureConfirmationResponse MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x2, + MTRMessagesFeatureConfirmationReply MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x4, + MTRMessagesFeatureProtectedMessages MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x8, +} MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); typedef NS_OPTIONS(uint8_t, MTRMessagesMessageControlBitmap) { - MTRMessagesMessageControlBitmapConfirmationRequired MTR_PROVISIONALLY_AVAILABLE = 0x1, - MTRMessagesMessageControlBitmapResponseRequired MTR_PROVISIONALLY_AVAILABLE = 0x2, - MTRMessagesMessageControlBitmapReplyMessage MTR_PROVISIONALLY_AVAILABLE = 0x4, - MTRMessagesMessageControlBitmapMessageConfirmed MTR_PROVISIONALLY_AVAILABLE = 0x8, - MTRMessagesMessageControlBitmapMessageProtected MTR_PROVISIONALLY_AVAILABLE = 0x10, -} MTR_PROVISIONALLY_AVAILABLE; + MTRMessagesMessageControlBitmapConfirmationRequired MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x1, + MTRMessagesMessageControlBitmapResponseRequired MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x2, + MTRMessagesMessageControlBitmapReplyMessage MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x4, + MTRMessagesMessageControlBitmapMessageConfirmed MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x8, + MTRMessagesMessageControlBitmapMessageProtected MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x10, +} MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); typedef NS_ENUM(uint8_t, MTRDeviceEnergyManagementAdjustmentCause) { MTRDeviceEnergyManagementAdjustmentCauseLocalOptimization MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00, @@ -18311,67 +18311,67 @@ typedef NS_OPTIONS(uint32_t, MTRDeviceEnergyManagementFeature) { } MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); typedef NS_ENUM(uint8_t, MTREnergyEVSEEnergyTransferStoppedReason) { - MTREnergyEVSEEnergyTransferStoppedReasonEVStopped MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTREnergyEVSEEnergyTransferStoppedReasonEVSEStopped MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTREnergyEVSEEnergyTransferStoppedReasonOther MTR_PROVISIONALLY_AVAILABLE = 0x02, -} MTR_PROVISIONALLY_AVAILABLE; + MTREnergyEVSEEnergyTransferStoppedReasonEVStopped MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00, + MTREnergyEVSEEnergyTransferStoppedReasonEVSEStopped MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x01, + MTREnergyEVSEEnergyTransferStoppedReasonOther MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x02, +} MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); typedef NS_ENUM(uint8_t, MTREnergyEVSEFaultState) { - MTREnergyEVSEFaultStateNoError MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTREnergyEVSEFaultStateMeterFailure MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTREnergyEVSEFaultStateOverVoltage MTR_PROVISIONALLY_AVAILABLE = 0x02, - MTREnergyEVSEFaultStateUnderVoltage MTR_PROVISIONALLY_AVAILABLE = 0x03, - MTREnergyEVSEFaultStateOverCurrent MTR_PROVISIONALLY_AVAILABLE = 0x04, - MTREnergyEVSEFaultStateContactWetFailure MTR_PROVISIONALLY_AVAILABLE = 0x05, - MTREnergyEVSEFaultStateContactDryFailure MTR_PROVISIONALLY_AVAILABLE = 0x06, - MTREnergyEVSEFaultStateGroundFault MTR_PROVISIONALLY_AVAILABLE = 0x07, - MTREnergyEVSEFaultStatePowerLoss MTR_PROVISIONALLY_AVAILABLE = 0x08, - MTREnergyEVSEFaultStatePowerQuality MTR_PROVISIONALLY_AVAILABLE = 0x09, - MTREnergyEVSEFaultStatePilotShortCircuit MTR_PROVISIONALLY_AVAILABLE = 0x0A, - MTREnergyEVSEFaultStateEmergencyStop MTR_PROVISIONALLY_AVAILABLE = 0x0B, - MTREnergyEVSEFaultStateEVDisconnected MTR_PROVISIONALLY_AVAILABLE = 0x0C, - MTREnergyEVSEFaultStateWrongPowerSupply MTR_PROVISIONALLY_AVAILABLE = 0x0D, - MTREnergyEVSEFaultStateLiveNeutralSwap MTR_PROVISIONALLY_AVAILABLE = 0x0E, - MTREnergyEVSEFaultStateOverTemperature MTR_PROVISIONALLY_AVAILABLE = 0x0F, - MTREnergyEVSEFaultStateOther MTR_PROVISIONALLY_AVAILABLE = 0xFF, -} MTR_PROVISIONALLY_AVAILABLE; + MTREnergyEVSEFaultStateNoError MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00, + MTREnergyEVSEFaultStateMeterFailure MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x01, + MTREnergyEVSEFaultStateOverVoltage MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x02, + MTREnergyEVSEFaultStateUnderVoltage MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x03, + MTREnergyEVSEFaultStateOverCurrent MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x04, + MTREnergyEVSEFaultStateContactWetFailure MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x05, + MTREnergyEVSEFaultStateContactDryFailure MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x06, + MTREnergyEVSEFaultStateGroundFault MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x07, + MTREnergyEVSEFaultStatePowerLoss MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x08, + MTREnergyEVSEFaultStatePowerQuality MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x09, + MTREnergyEVSEFaultStatePilotShortCircuit MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x0A, + MTREnergyEVSEFaultStateEmergencyStop MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x0B, + MTREnergyEVSEFaultStateEVDisconnected MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x0C, + MTREnergyEVSEFaultStateWrongPowerSupply MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x0D, + MTREnergyEVSEFaultStateLiveNeutralSwap MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x0E, + MTREnergyEVSEFaultStateOverTemperature MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x0F, + MTREnergyEVSEFaultStateOther MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0xFF, +} MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); typedef NS_ENUM(uint8_t, MTREnergyEVSEState) { - MTREnergyEVSEStateNotPluggedIn MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTREnergyEVSEStatePluggedInNoDemand MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTREnergyEVSEStatePluggedInDemand MTR_PROVISIONALLY_AVAILABLE = 0x02, - MTREnergyEVSEStatePluggedInCharging MTR_PROVISIONALLY_AVAILABLE = 0x03, + MTREnergyEVSEStateNotPluggedIn MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00, + MTREnergyEVSEStatePluggedInNoDemand MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x01, + MTREnergyEVSEStatePluggedInDemand MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x02, + MTREnergyEVSEStatePluggedInCharging MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x03, MTREnergyEVSEStatePluggedInDischarging MTR_PROVISIONALLY_AVAILABLE = 0x04, - MTREnergyEVSEStateSessionEnding MTR_PROVISIONALLY_AVAILABLE = 0x05, - MTREnergyEVSEStateFault MTR_PROVISIONALLY_AVAILABLE = 0x06, -} MTR_PROVISIONALLY_AVAILABLE; + MTREnergyEVSEStateSessionEnding MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x05, + MTREnergyEVSEStateFault MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x06, +} MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); typedef NS_ENUM(uint8_t, MTREnergyEVSESupplyState) { - MTREnergyEVSESupplyStateDisabled MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTREnergyEVSESupplyStateChargingEnabled MTR_PROVISIONALLY_AVAILABLE = 0x01, + MTREnergyEVSESupplyStateDisabled MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00, + MTREnergyEVSESupplyStateChargingEnabled MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x01, MTREnergyEVSESupplyStateDischargingEnabled MTR_PROVISIONALLY_AVAILABLE = 0x02, - MTREnergyEVSESupplyStateDisabledError MTR_PROVISIONALLY_AVAILABLE = 0x03, - MTREnergyEVSESupplyStateDisabledDiagnostics MTR_PROVISIONALLY_AVAILABLE = 0x04, + MTREnergyEVSESupplyStateDisabledError MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x03, + MTREnergyEVSESupplyStateDisabledDiagnostics MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x04, MTREnergyEVSESupplyStateEnabled MTR_PROVISIONALLY_AVAILABLE = 0x05, -} MTR_PROVISIONALLY_AVAILABLE; +} MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); typedef NS_OPTIONS(uint32_t, MTREnergyEVSEFeature) { - MTREnergyEVSEFeatureChargingPreferences MTR_PROVISIONALLY_AVAILABLE = 0x1, + MTREnergyEVSEFeatureChargingPreferences MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x1, MTREnergyEVSEFeatureSoCReporting MTR_PROVISIONALLY_AVAILABLE = 0x2, MTREnergyEVSEFeaturePlugAndCharge MTR_PROVISIONALLY_AVAILABLE = 0x4, - MTREnergyEVSEFeatureRFID MTR_PROVISIONALLY_AVAILABLE = 0x8, + MTREnergyEVSEFeatureRFID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x8, MTREnergyEVSEFeatureV2X MTR_PROVISIONALLY_AVAILABLE = 0x10, -} MTR_PROVISIONALLY_AVAILABLE; +} MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); typedef NS_OPTIONS(uint8_t, MTREnergyEVSETargetDayOfWeekBitmap) { - MTREnergyEVSETargetDayOfWeekBitmapSunday MTR_PROVISIONALLY_AVAILABLE = 0x1, - MTREnergyEVSETargetDayOfWeekBitmapMonday MTR_PROVISIONALLY_AVAILABLE = 0x2, - MTREnergyEVSETargetDayOfWeekBitmapTuesday MTR_PROVISIONALLY_AVAILABLE = 0x4, - MTREnergyEVSETargetDayOfWeekBitmapWednesday MTR_PROVISIONALLY_AVAILABLE = 0x8, - MTREnergyEVSETargetDayOfWeekBitmapThursday MTR_PROVISIONALLY_AVAILABLE = 0x10, - MTREnergyEVSETargetDayOfWeekBitmapFriday MTR_PROVISIONALLY_AVAILABLE = 0x20, - MTREnergyEVSETargetDayOfWeekBitmapSaturday MTR_PROVISIONALLY_AVAILABLE = 0x40, -} MTR_PROVISIONALLY_AVAILABLE; + MTREnergyEVSETargetDayOfWeekBitmapSunday MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x1, + MTREnergyEVSETargetDayOfWeekBitmapMonday MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x2, + MTREnergyEVSETargetDayOfWeekBitmapTuesday MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x4, + MTREnergyEVSETargetDayOfWeekBitmapWednesday MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x8, + MTREnergyEVSETargetDayOfWeekBitmapThursday MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x10, + MTREnergyEVSETargetDayOfWeekBitmapFriday MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x20, + MTREnergyEVSETargetDayOfWeekBitmapSaturday MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x40, +} MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); typedef NS_ENUM(uint8_t, MTREnergyPreferenceEnergyPriority) { MTREnergyPreferenceEnergyPriorityComfort MTR_PROVISIONALLY_AVAILABLE = 0x00, @@ -18386,52 +18386,44 @@ typedef NS_OPTIONS(uint32_t, MTREnergyPreferenceFeature) { } MTR_PROVISIONALLY_AVAILABLE; typedef NS_OPTIONS(uint32_t, MTRPowerTopologyFeature) { - MTRPowerTopologyFeatureNodeTopology MTR_PROVISIONALLY_AVAILABLE = 0x1, - MTRPowerTopologyFeatureTreeTopology MTR_PROVISIONALLY_AVAILABLE = 0x2, - MTRPowerTopologyFeatureSetTopology MTR_PROVISIONALLY_AVAILABLE = 0x4, - MTRPowerTopologyFeatureDynamicPowerFlow MTR_PROVISIONALLY_AVAILABLE = 0x8, -} MTR_PROVISIONALLY_AVAILABLE; + MTRPowerTopologyFeatureNodeTopology MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x1, + MTRPowerTopologyFeatureTreeTopology MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x2, + MTRPowerTopologyFeatureSetTopology MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x4, + MTRPowerTopologyFeatureDynamicPowerFlow MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x8, +} MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); typedef NS_ENUM(uint16_t, MTREnergyEVSEModeModeTag) { - MTREnergyEVSEModeModeTagAuto MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTREnergyEVSEModeModeTagQuick MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTREnergyEVSEModeModeTagQuiet MTR_PROVISIONALLY_AVAILABLE = 0x02, - MTREnergyEVSEModeModeTagLowNoise MTR_PROVISIONALLY_AVAILABLE = 0x03, - MTREnergyEVSEModeModeTagLowEnergy MTR_PROVISIONALLY_AVAILABLE = 0x04, - MTREnergyEVSEModeModeTagVacation MTR_PROVISIONALLY_AVAILABLE = 0x05, - MTREnergyEVSEModeModeTagMin MTR_PROVISIONALLY_AVAILABLE = 0x06, - MTREnergyEVSEModeModeTagMax MTR_PROVISIONALLY_AVAILABLE = 0x07, - MTREnergyEVSEModeModeTagNight MTR_PROVISIONALLY_AVAILABLE = 0x08, - MTREnergyEVSEModeModeTagDay MTR_PROVISIONALLY_AVAILABLE = 0x09, - MTREnergyEVSEModeModeTagManual MTR_PROVISIONALLY_AVAILABLE = 0x4000, - MTREnergyEVSEModeModeTagTimeOfUse MTR_PROVISIONALLY_AVAILABLE = 0x4001, - MTREnergyEVSEModeModeTagSolarCharging MTR_PROVISIONALLY_AVAILABLE = 0x4002, - MTREnergyEVSEModeModeTagV2X MTR_PROVISIONALLY_AVAILABLE = 0x4003, -} MTR_PROVISIONALLY_AVAILABLE; - -typedef NS_OPTIONS(uint32_t, MTREnergyEVSEModeFeature) { - MTREnergyEVSEModeFeatureOnOff MTR_PROVISIONALLY_AVAILABLE = 0x1, -} MTR_PROVISIONALLY_AVAILABLE; + MTREnergyEVSEModeModeTagAuto MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00, + MTREnergyEVSEModeModeTagQuick MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x01, + MTREnergyEVSEModeModeTagQuiet MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x02, + MTREnergyEVSEModeModeTagLowNoise MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x03, + MTREnergyEVSEModeModeTagLowEnergy MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x04, + MTREnergyEVSEModeModeTagVacation MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x05, + MTREnergyEVSEModeModeTagMin MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x06, + MTREnergyEVSEModeModeTagMax MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x07, + MTREnergyEVSEModeModeTagNight MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x08, + MTREnergyEVSEModeModeTagDay MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x09, + MTREnergyEVSEModeModeTagManual MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x4000, + MTREnergyEVSEModeModeTagTimeOfUse MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x4001, + MTREnergyEVSEModeModeTagSolarCharging MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x4002, + MTREnergyEVSEModeModeTagV2X MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x4003, +} MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); typedef NS_ENUM(uint16_t, MTRWaterHeaterModeModeTag) { - MTRWaterHeaterModeModeTagAuto MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTRWaterHeaterModeModeTagQuick MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTRWaterHeaterModeModeTagQuiet MTR_PROVISIONALLY_AVAILABLE = 0x02, - MTRWaterHeaterModeModeTagLowNoise MTR_PROVISIONALLY_AVAILABLE = 0x03, - MTRWaterHeaterModeModeTagLowEnergy MTR_PROVISIONALLY_AVAILABLE = 0x04, - MTRWaterHeaterModeModeTagVacation MTR_PROVISIONALLY_AVAILABLE = 0x05, - MTRWaterHeaterModeModeTagMin MTR_PROVISIONALLY_AVAILABLE = 0x06, - MTRWaterHeaterModeModeTagMax MTR_PROVISIONALLY_AVAILABLE = 0x07, - MTRWaterHeaterModeModeTagNight MTR_PROVISIONALLY_AVAILABLE = 0x08, - MTRWaterHeaterModeModeTagDay MTR_PROVISIONALLY_AVAILABLE = 0x09, - MTRWaterHeaterModeModeTagOff MTR_PROVISIONALLY_AVAILABLE = 0x4000, - MTRWaterHeaterModeModeTagManual MTR_PROVISIONALLY_AVAILABLE = 0x4001, - MTRWaterHeaterModeModeTagTimed MTR_PROVISIONALLY_AVAILABLE = 0x4002, -} MTR_PROVISIONALLY_AVAILABLE; - -typedef NS_OPTIONS(uint32_t, MTRWaterHeaterModeFeature) { - MTRWaterHeaterModeFeatureOnOff MTR_PROVISIONALLY_AVAILABLE = 0x1, -} MTR_PROVISIONALLY_AVAILABLE; + MTRWaterHeaterModeModeTagAuto MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00, + MTRWaterHeaterModeModeTagQuick MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x01, + MTRWaterHeaterModeModeTagQuiet MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x02, + MTRWaterHeaterModeModeTagLowNoise MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x03, + MTRWaterHeaterModeModeTagLowEnergy MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x04, + MTRWaterHeaterModeModeTagVacation MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x05, + MTRWaterHeaterModeModeTagMin MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x06, + MTRWaterHeaterModeModeTagMax MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x07, + MTRWaterHeaterModeModeTagNight MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x08, + MTRWaterHeaterModeModeTagDay MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x09, + MTRWaterHeaterModeModeTagOff MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x4000, + MTRWaterHeaterModeModeTagManual MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x4001, + MTRWaterHeaterModeModeTagTimed MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x4002, +} MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); typedef NS_ENUM(uint16_t, MTRDeviceEnergyManagementModeModeTag) { MTRDeviceEnergyManagementModeModeTagAuto MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00, @@ -18995,31 +18987,31 @@ typedef NS_OPTIONS(uint16_t, MTRWindowCoveringSafetyStatus) { } MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)); typedef NS_ENUM(uint8_t, MTRServiceAreaOperationalStatus) { - MTRServiceAreaOperationalStatusPending MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTRServiceAreaOperationalStatusOperating MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTRServiceAreaOperationalStatusSkipped MTR_PROVISIONALLY_AVAILABLE = 0x02, - MTRServiceAreaOperationalStatusCompleted MTR_PROVISIONALLY_AVAILABLE = 0x03, -} MTR_PROVISIONALLY_AVAILABLE; + MTRServiceAreaOperationalStatusPending MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00, + MTRServiceAreaOperationalStatusOperating MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x01, + MTRServiceAreaOperationalStatusSkipped MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x02, + MTRServiceAreaOperationalStatusCompleted MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x03, +} MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); typedef NS_ENUM(uint8_t, MTRServiceAreaSelectAreasStatus) { - MTRServiceAreaSelectAreasStatusSuccess MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTRServiceAreaSelectAreasStatusUnsupportedArea MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTRServiceAreaSelectAreasStatusInvalidInMode MTR_PROVISIONALLY_AVAILABLE = 0x02, - MTRServiceAreaSelectAreasStatusInvalidSet MTR_PROVISIONALLY_AVAILABLE = 0x03, -} MTR_PROVISIONALLY_AVAILABLE; + MTRServiceAreaSelectAreasStatusSuccess MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00, + MTRServiceAreaSelectAreasStatusUnsupportedArea MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x01, + MTRServiceAreaSelectAreasStatusInvalidInMode MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x02, + MTRServiceAreaSelectAreasStatusInvalidSet MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x03, +} MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); typedef NS_ENUM(uint8_t, MTRServiceAreaSkipAreaStatus) { - MTRServiceAreaSkipAreaStatusSuccess MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTRServiceAreaSkipAreaStatusInvalidAreaList MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTRServiceAreaSkipAreaStatusInvalidInMode MTR_PROVISIONALLY_AVAILABLE = 0x02, - MTRServiceAreaSkipAreaStatusInvalidSkippedArea MTR_PROVISIONALLY_AVAILABLE = 0x03, -} MTR_PROVISIONALLY_AVAILABLE; + MTRServiceAreaSkipAreaStatusSuccess MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00, + MTRServiceAreaSkipAreaStatusInvalidAreaList MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x01, + MTRServiceAreaSkipAreaStatusInvalidInMode MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x02, + MTRServiceAreaSkipAreaStatusInvalidSkippedArea MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x03, +} MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); typedef NS_OPTIONS(uint32_t, MTRServiceAreaFeature) { - MTRServiceAreaFeatureSelectWhileRunning MTR_PROVISIONALLY_AVAILABLE = 0x1, - MTRServiceAreaFeatureProgressReporting MTR_PROVISIONALLY_AVAILABLE = 0x2, - MTRServiceAreaFeatureMaps MTR_PROVISIONALLY_AVAILABLE = 0x4, -} MTR_PROVISIONALLY_AVAILABLE; + MTRServiceAreaFeatureSelectWhileRunning MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x1, + MTRServiceAreaFeatureProgressReporting MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x2, + MTRServiceAreaFeatureMaps MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x4, +} MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); typedef NS_ENUM(uint8_t, MTRPumpConfigurationAndControlControlMode) { MTRPumpConfigurationAndControlControlModeConstantSpeed MTR_AVAILABLE(ios(16.5), macos(13.4), watchos(9.5), tvos(16.5)) = 0x00, @@ -19100,38 +19092,38 @@ typedef NS_OPTIONS(uint16_t, MTRPumpConfigurationAndControlPumpStatus) { } MTR_DEPRECATED("Please use MTRPumpConfigurationAndControlPumpStatusBitmap", ios(16.1, 16.5), macos(13.0, 13.4), watchos(9.1, 9.5), tvos(16.1, 16.5)); typedef NS_ENUM(uint8_t, MTRThermostatACCapacityFormat) { - MTRThermostatACCapacityFormatBTUh MTR_PROVISIONALLY_AVAILABLE = 0x00, -} MTR_PROVISIONALLY_AVAILABLE; + MTRThermostatACCapacityFormatBTUh MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00, +} MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); typedef NS_ENUM(uint8_t, MTRThermostatACCompressorType) { - MTRThermostatACCompressorTypeUnknown MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTRThermostatACCompressorTypeT1 MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTRThermostatACCompressorTypeT2 MTR_PROVISIONALLY_AVAILABLE = 0x02, - MTRThermostatACCompressorTypeT3 MTR_PROVISIONALLY_AVAILABLE = 0x03, -} MTR_PROVISIONALLY_AVAILABLE; + MTRThermostatACCompressorTypeUnknown MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00, + MTRThermostatACCompressorTypeT1 MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x01, + MTRThermostatACCompressorTypeT2 MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x02, + MTRThermostatACCompressorTypeT3 MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x03, +} MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); typedef NS_ENUM(uint8_t, MTRThermostatACLouverPosition) { - MTRThermostatACLouverPositionClosed MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTRThermostatACLouverPositionOpen MTR_PROVISIONALLY_AVAILABLE = 0x02, - MTRThermostatACLouverPositionQuarter MTR_PROVISIONALLY_AVAILABLE = 0x03, - MTRThermostatACLouverPositionHalf MTR_PROVISIONALLY_AVAILABLE = 0x04, - MTRThermostatACLouverPositionThreeQuarters MTR_PROVISIONALLY_AVAILABLE = 0x05, -} MTR_PROVISIONALLY_AVAILABLE; + MTRThermostatACLouverPositionClosed MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x01, + MTRThermostatACLouverPositionOpen MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x02, + MTRThermostatACLouverPositionQuarter MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x03, + MTRThermostatACLouverPositionHalf MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x04, + MTRThermostatACLouverPositionThreeQuarters MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x05, +} MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); typedef NS_ENUM(uint8_t, MTRThermostatACRefrigerantType) { - MTRThermostatACRefrigerantTypeUnknown MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTRThermostatACRefrigerantTypeR22 MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTRThermostatACRefrigerantTypeR410a MTR_PROVISIONALLY_AVAILABLE = 0x02, - MTRThermostatACRefrigerantTypeR407c MTR_PROVISIONALLY_AVAILABLE = 0x03, -} MTR_PROVISIONALLY_AVAILABLE; + MTRThermostatACRefrigerantTypeUnknown MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00, + MTRThermostatACRefrigerantTypeR22 MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x01, + MTRThermostatACRefrigerantTypeR410a MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x02, + MTRThermostatACRefrigerantTypeR407c MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x03, +} MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); typedef NS_ENUM(uint8_t, MTRThermostatACType) { - MTRThermostatACTypeUnknown MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTRThermostatACTypeCoolingFixed MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTRThermostatACTypeHeatPumpFixed MTR_PROVISIONALLY_AVAILABLE = 0x02, - MTRThermostatACTypeCoolingInverter MTR_PROVISIONALLY_AVAILABLE = 0x03, - MTRThermostatACTypeHeatPumpInverter MTR_PROVISIONALLY_AVAILABLE = 0x04, -} MTR_PROVISIONALLY_AVAILABLE; + MTRThermostatACTypeUnknown MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00, + MTRThermostatACTypeCoolingFixed MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x01, + MTRThermostatACTypeHeatPumpFixed MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x02, + MTRThermostatACTypeCoolingInverter MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x03, + MTRThermostatACTypeHeatPumpInverter MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x04, +} MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); typedef NS_ENUM(uint8_t, MTRThermostatControlSequenceOfOperation) { MTRThermostatControlSequenceOfOperationCoolingOnly MTR_AVAILABLE(ios(17.4), macos(14.4), watchos(10.4), tvos(17.4)) = 0x00, @@ -19152,20 +19144,20 @@ typedef NS_ENUM(uint8_t, MTRThermostatControlSequence) { } MTR_DEPRECATED("Please use MTRThermostatControlSequenceOfOperation", ios(16.1, 17.4), macos(13.0, 14.4), watchos(9.1, 10.4), tvos(16.1, 17.4)); typedef NS_ENUM(uint8_t, MTRThermostatPresetScenario) { - MTRThermostatPresetScenarioOccupied MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTRThermostatPresetScenarioUnoccupied MTR_PROVISIONALLY_AVAILABLE = 0x02, - MTRThermostatPresetScenarioSleep MTR_PROVISIONALLY_AVAILABLE = 0x03, - MTRThermostatPresetScenarioWake MTR_PROVISIONALLY_AVAILABLE = 0x04, - MTRThermostatPresetScenarioVacation MTR_PROVISIONALLY_AVAILABLE = 0x05, - MTRThermostatPresetScenarioGoingToSleep MTR_PROVISIONALLY_AVAILABLE = 0x06, - MTRThermostatPresetScenarioUserDefined MTR_PROVISIONALLY_AVAILABLE = 0xFE, -} MTR_PROVISIONALLY_AVAILABLE; + MTRThermostatPresetScenarioOccupied MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x01, + MTRThermostatPresetScenarioUnoccupied MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x02, + MTRThermostatPresetScenarioSleep MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x03, + MTRThermostatPresetScenarioWake MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x04, + MTRThermostatPresetScenarioVacation MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x05, + MTRThermostatPresetScenarioGoingToSleep MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x06, + MTRThermostatPresetScenarioUserDefined MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0xFE, +} MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); typedef NS_ENUM(uint8_t, MTRThermostatSetpointChangeSource) { - MTRThermostatSetpointChangeSourceManual MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTRThermostatSetpointChangeSourceSchedule MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTRThermostatSetpointChangeSourceExternal MTR_PROVISIONALLY_AVAILABLE = 0x02, -} MTR_PROVISIONALLY_AVAILABLE; + MTRThermostatSetpointChangeSourceManual MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00, + MTRThermostatSetpointChangeSourceSchedule MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x01, + MTRThermostatSetpointChangeSourceExternal MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x02, +} MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); typedef NS_ENUM(uint8_t, MTRThermostatSetpointRaiseLowerMode) { MTRThermostatSetpointRaiseLowerModeHeat MTR_AVAILABLE(ios(17.4), macos(14.4), watchos(10.4), tvos(17.4)) = 0x00, @@ -19183,14 +19175,14 @@ typedef NS_ENUM(uint8_t, MTRThermostatSetpointAdjustMode) { } MTR_DEPRECATED("Please use MTRThermostatSetpointRaiseLowerMode", ios(16.1, 17.4), macos(13.0, 14.4), watchos(9.1, 10.4), tvos(16.1, 17.4)); typedef NS_ENUM(uint8_t, MTRThermostatStartOfWeek) { - MTRThermostatStartOfWeekSunday MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTRThermostatStartOfWeekMonday MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTRThermostatStartOfWeekTuesday MTR_PROVISIONALLY_AVAILABLE = 0x02, - MTRThermostatStartOfWeekWednesday MTR_PROVISIONALLY_AVAILABLE = 0x03, - MTRThermostatStartOfWeekThursday MTR_PROVISIONALLY_AVAILABLE = 0x04, - MTRThermostatStartOfWeekFriday MTR_PROVISIONALLY_AVAILABLE = 0x05, - MTRThermostatStartOfWeekSaturday MTR_PROVISIONALLY_AVAILABLE = 0x06, -} MTR_PROVISIONALLY_AVAILABLE; + MTRThermostatStartOfWeekSunday MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00, + MTRThermostatStartOfWeekMonday MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x01, + MTRThermostatStartOfWeekTuesday MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x02, + MTRThermostatStartOfWeekWednesday MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x03, + MTRThermostatStartOfWeekThursday MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x04, + MTRThermostatStartOfWeekFriday MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x05, + MTRThermostatStartOfWeekSaturday MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x06, +} MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); typedef NS_ENUM(uint8_t, MTRThermostatSystemMode) { MTRThermostatSystemModeOff MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) = 0x00, @@ -19206,9 +19198,9 @@ typedef NS_ENUM(uint8_t, MTRThermostatSystemMode) { } MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)); typedef NS_ENUM(uint8_t, MTRThermostatTemperatureSetpointHold) { - MTRThermostatTemperatureSetpointHoldSetpointHoldOff MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTRThermostatTemperatureSetpointHoldSetpointHoldOn MTR_PROVISIONALLY_AVAILABLE = 0x01, -} MTR_PROVISIONALLY_AVAILABLE; + MTRThermostatTemperatureSetpointHoldSetpointHoldOff MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00, + MTRThermostatTemperatureSetpointHoldSetpointHoldOn MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x01, +} MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); typedef NS_ENUM(uint8_t, MTRThermostatRunningMode) { MTRThermostatRunningModeOff MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) = 0x00, @@ -19217,12 +19209,12 @@ typedef NS_ENUM(uint8_t, MTRThermostatRunningMode) { } MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)); typedef NS_OPTIONS(uint32_t, MTRThermostatACErrorCodeBitmap) { - MTRThermostatACErrorCodeBitmapCompressorFail MTR_PROVISIONALLY_AVAILABLE = 0x1, - MTRThermostatACErrorCodeBitmapRoomSensorFail MTR_PROVISIONALLY_AVAILABLE = 0x2, - MTRThermostatACErrorCodeBitmapOutdoorSensorFail MTR_PROVISIONALLY_AVAILABLE = 0x4, - MTRThermostatACErrorCodeBitmapCoilSensorFail MTR_PROVISIONALLY_AVAILABLE = 0x8, - MTRThermostatACErrorCodeBitmapFanFail MTR_PROVISIONALLY_AVAILABLE = 0x10, -} MTR_PROVISIONALLY_AVAILABLE; + MTRThermostatACErrorCodeBitmapCompressorFail MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x1, + MTRThermostatACErrorCodeBitmapRoomSensorFail MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x2, + MTRThermostatACErrorCodeBitmapOutdoorSensorFail MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x4, + MTRThermostatACErrorCodeBitmapCoilSensorFail MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x8, + MTRThermostatACErrorCodeBitmapFanFail MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x10, +} MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); typedef NS_OPTIONS(uint32_t, MTRThermostatFeature) { MTRThermostatFeatureHeating MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) = 0x1, @@ -19234,47 +19226,47 @@ typedef NS_OPTIONS(uint32_t, MTRThermostatFeature) { MTRThermostatFeatureAutoMode MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x20, MTRThermostatFeatureAutomode MTR_DEPRECATED("Please use MTRThermostatFeatureAutoMode", ios(16.1, 16.4), macos(13.0, 13.3), watchos(9.1, 9.4), tvos(16.1, 16.4)) = 0x20, MTRThermostatFeatureLocalTemperatureNotExposed MTR_AVAILABLE(ios(17.0), macos(14.0), watchos(10.0), tvos(17.0)) = 0x40, - MTRThermostatFeatureMatterScheduleConfiguration MTR_PROVISIONALLY_AVAILABLE = 0x80, - MTRThermostatFeaturePresets MTR_PROVISIONALLY_AVAILABLE = 0x100, + MTRThermostatFeatureMatterScheduleConfiguration MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x80, + MTRThermostatFeaturePresets MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x100, } MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)); typedef NS_OPTIONS(uint8_t, MTRThermostatHVACSystemTypeBitmap) { - MTRThermostatHVACSystemTypeBitmapCoolingStage MTR_PROVISIONALLY_AVAILABLE = 0x3, - MTRThermostatHVACSystemTypeBitmapHeatingStage MTR_PROVISIONALLY_AVAILABLE = 0xC, - MTRThermostatHVACSystemTypeBitmapHeatingIsHeatPump MTR_PROVISIONALLY_AVAILABLE = 0x10, - MTRThermostatHVACSystemTypeBitmapHeatingUsesFuel MTR_PROVISIONALLY_AVAILABLE = 0x20, -} MTR_PROVISIONALLY_AVAILABLE; + MTRThermostatHVACSystemTypeBitmapCoolingStage MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x3, + MTRThermostatHVACSystemTypeBitmapHeatingStage MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0xC, + MTRThermostatHVACSystemTypeBitmapHeatingIsHeatPump MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x10, + MTRThermostatHVACSystemTypeBitmapHeatingUsesFuel MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x20, +} MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); typedef NS_OPTIONS(uint8_t, MTRThermostatOccupancyBitmap) { - MTRThermostatOccupancyBitmapOccupied MTR_PROVISIONALLY_AVAILABLE = 0x1, -} MTR_PROVISIONALLY_AVAILABLE; + MTRThermostatOccupancyBitmapOccupied MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x1, +} MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); typedef NS_OPTIONS(uint16_t, MTRThermostatPresetTypeFeaturesBitmap) { - MTRThermostatPresetTypeFeaturesBitmapAutomatic MTR_PROVISIONALLY_AVAILABLE = 0x1, - MTRThermostatPresetTypeFeaturesBitmapSupportsNames MTR_PROVISIONALLY_AVAILABLE = 0x2, -} MTR_PROVISIONALLY_AVAILABLE; + MTRThermostatPresetTypeFeaturesBitmapAutomatic MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x1, + MTRThermostatPresetTypeFeaturesBitmapSupportsNames MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x2, +} MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); typedef NS_OPTIONS(uint8_t, MTRThermostatProgrammingOperationModeBitmap) { - MTRThermostatProgrammingOperationModeBitmapScheduleActive MTR_PROVISIONALLY_AVAILABLE = 0x1, - MTRThermostatProgrammingOperationModeBitmapAutoRecovery MTR_PROVISIONALLY_AVAILABLE = 0x2, - MTRThermostatProgrammingOperationModeBitmapEconomy MTR_PROVISIONALLY_AVAILABLE = 0x4, -} MTR_PROVISIONALLY_AVAILABLE; + MTRThermostatProgrammingOperationModeBitmapScheduleActive MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x1, + MTRThermostatProgrammingOperationModeBitmapAutoRecovery MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x2, + MTRThermostatProgrammingOperationModeBitmapEconomy MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x4, +} MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); typedef NS_OPTIONS(uint16_t, MTRThermostatRelayStateBitmap) { - MTRThermostatRelayStateBitmapHeat MTR_PROVISIONALLY_AVAILABLE = 0x1, - MTRThermostatRelayStateBitmapCool MTR_PROVISIONALLY_AVAILABLE = 0x2, - MTRThermostatRelayStateBitmapFan MTR_PROVISIONALLY_AVAILABLE = 0x4, - MTRThermostatRelayStateBitmapHeatStage2 MTR_PROVISIONALLY_AVAILABLE = 0x8, - MTRThermostatRelayStateBitmapCoolStage2 MTR_PROVISIONALLY_AVAILABLE = 0x10, - MTRThermostatRelayStateBitmapFanStage2 MTR_PROVISIONALLY_AVAILABLE = 0x20, - MTRThermostatRelayStateBitmapFanStage3 MTR_PROVISIONALLY_AVAILABLE = 0x40, -} MTR_PROVISIONALLY_AVAILABLE; + MTRThermostatRelayStateBitmapHeat MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x1, + MTRThermostatRelayStateBitmapCool MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x2, + MTRThermostatRelayStateBitmapFan MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x4, + MTRThermostatRelayStateBitmapHeatStage2 MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x8, + MTRThermostatRelayStateBitmapCoolStage2 MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x10, + MTRThermostatRelayStateBitmapFanStage2 MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x20, + MTRThermostatRelayStateBitmapFanStage3 MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x40, +} MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); typedef NS_OPTIONS(uint8_t, MTRThermostatRemoteSensingBitmap) { - MTRThermostatRemoteSensingBitmapLocalTemperature MTR_PROVISIONALLY_AVAILABLE = 0x1, - MTRThermostatRemoteSensingBitmapOutdoorTemperature MTR_PROVISIONALLY_AVAILABLE = 0x2, - MTRThermostatRemoteSensingBitmapOccupancy MTR_PROVISIONALLY_AVAILABLE = 0x4, -} MTR_PROVISIONALLY_AVAILABLE; + MTRThermostatRemoteSensingBitmapLocalTemperature MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x1, + MTRThermostatRemoteSensingBitmapOutdoorTemperature MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x2, + MTRThermostatRemoteSensingBitmapOccupancy MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x4, +} MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); typedef NS_OPTIONS(uint8_t, MTRThermostatScheduleDayOfWeekBitmap) { MTRThermostatScheduleDayOfWeekBitmapSunday MTR_AVAILABLE(ios(17.4), macos(14.4), watchos(10.4), tvos(17.4)) = 0x1, @@ -19312,11 +19304,11 @@ typedef NS_OPTIONS(uint8_t, MTRThermostatModeForSequence) { } MTR_DEPRECATED("Please use MTRThermostatScheduleModeBitmap", ios(16.1, 17.4), macos(13.0, 14.4), watchos(9.1, 10.4), tvos(16.1, 17.4)); typedef NS_OPTIONS(uint16_t, MTRThermostatScheduleTypeFeaturesBitmap) { - MTRThermostatScheduleTypeFeaturesBitmapSupportsPresets MTR_PROVISIONALLY_AVAILABLE = 0x1, - MTRThermostatScheduleTypeFeaturesBitmapSupportsSetpoints MTR_PROVISIONALLY_AVAILABLE = 0x2, - MTRThermostatScheduleTypeFeaturesBitmapSupportsNames MTR_PROVISIONALLY_AVAILABLE = 0x4, - MTRThermostatScheduleTypeFeaturesBitmapSupportsOff MTR_PROVISIONALLY_AVAILABLE = 0x8, -} MTR_PROVISIONALLY_AVAILABLE; + MTRThermostatScheduleTypeFeaturesBitmapSupportsPresets MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x1, + MTRThermostatScheduleTypeFeaturesBitmapSupportsSetpoints MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x2, + MTRThermostatScheduleTypeFeaturesBitmapSupportsNames MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x4, + MTRThermostatScheduleTypeFeaturesBitmapSupportsOff MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x8, +} MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); typedef NS_ENUM(uint8_t, MTRFanControlAirflowDirection) { MTRFanControlAirflowDirectionForward MTR_AVAILABLE(ios(17.6), macos(14.6), watchos(10.6), tvos(17.6)) = 0x00, @@ -19562,15 +19554,15 @@ typedef NS_ENUM(uint8_t, MTROccupancySensingOccupancySensorType) { } MTR_AVAILABLE(ios(16.5), macos(13.4), watchos(9.5), tvos(16.5)); typedef NS_OPTIONS(uint32_t, MTROccupancySensingFeature) { - MTROccupancySensingFeatureOther MTR_PROVISIONALLY_AVAILABLE = 0x1, - MTROccupancySensingFeaturePassiveInfrared MTR_PROVISIONALLY_AVAILABLE = 0x2, - MTROccupancySensingFeatureUltrasonic MTR_PROVISIONALLY_AVAILABLE = 0x4, - MTROccupancySensingFeaturePhysicalContact MTR_PROVISIONALLY_AVAILABLE = 0x8, - MTROccupancySensingFeatureActiveInfrared MTR_PROVISIONALLY_AVAILABLE = 0x10, - MTROccupancySensingFeatureRadar MTR_PROVISIONALLY_AVAILABLE = 0x20, - MTROccupancySensingFeatureRFSensing MTR_PROVISIONALLY_AVAILABLE = 0x40, - MTROccupancySensingFeatureVision MTR_PROVISIONALLY_AVAILABLE = 0x80, -} MTR_PROVISIONALLY_AVAILABLE; + MTROccupancySensingFeatureOther MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x1, + MTROccupancySensingFeaturePassiveInfrared MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x2, + MTROccupancySensingFeatureUltrasonic MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x4, + MTROccupancySensingFeaturePhysicalContact MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x8, + MTROccupancySensingFeatureActiveInfrared MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x10, + MTROccupancySensingFeatureRadar MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x20, + MTROccupancySensingFeatureRFSensing MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x40, + MTROccupancySensingFeatureVision MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x80, +} MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); typedef NS_OPTIONS(uint8_t, MTROccupancySensingOccupancyBitmap) { MTROccupancySensingOccupancyBitmapOccupied MTR_AVAILABLE(ios(16.5), macos(13.4), watchos(9.5), tvos(16.5)) = 0x1, @@ -19923,15 +19915,15 @@ typedef NS_OPTIONS(uint32_t, MTRRadonConcentrationMeasurementFeature) { } MTR_AVAILABLE(ios(17.6), macos(14.6), watchos(10.6), tvos(17.6)); typedef NS_OPTIONS(uint32_t, MTRThreadBorderRouterManagementFeature) { - MTRThreadBorderRouterManagementFeaturePANChange MTR_PROVISIONALLY_AVAILABLE = 0x1, -} MTR_PROVISIONALLY_AVAILABLE; + MTRThreadBorderRouterManagementFeaturePANChange MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x1, +} MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); typedef NS_ENUM(uint8_t, MTRChannelType) { - MTRChannelTypeSatellite MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTRChannelTypeCable MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTRChannelTypeTerrestrial MTR_PROVISIONALLY_AVAILABLE = 0x02, - MTRChannelTypeOTT MTR_PROVISIONALLY_AVAILABLE = 0x03, -} MTR_PROVISIONALLY_AVAILABLE; + MTRChannelTypeSatellite MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00, + MTRChannelTypeCable MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x01, + MTRChannelTypeTerrestrial MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x02, + MTRChannelTypeOTT MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x03, +} MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); typedef NS_ENUM(uint8_t, MTRChannelLineupInfoType) { MTRChannelLineupInfoTypeMSO MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x00, @@ -19947,15 +19939,15 @@ typedef NS_ENUM(uint8_t, MTRChannelStatus) { typedef NS_OPTIONS(uint32_t, MTRChannelFeature) { MTRChannelFeatureChannelList MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) = 0x1, MTRChannelFeatureLineupInfo MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) = 0x2, - MTRChannelFeatureElectronicGuide MTR_PROVISIONALLY_AVAILABLE = 0x4, - MTRChannelFeatureRecordProgram MTR_PROVISIONALLY_AVAILABLE = 0x8, + MTRChannelFeatureElectronicGuide MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x4, + MTRChannelFeatureRecordProgram MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x8, } MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)); typedef NS_OPTIONS(uint32_t, MTRChannelRecordingFlagBitmap) { - MTRChannelRecordingFlagBitmapScheduled MTR_PROVISIONALLY_AVAILABLE = 0x1, - MTRChannelRecordingFlagBitmapRecordSeries MTR_PROVISIONALLY_AVAILABLE = 0x2, - MTRChannelRecordingFlagBitmapRecorded MTR_PROVISIONALLY_AVAILABLE = 0x4, -} MTR_PROVISIONALLY_AVAILABLE; + MTRChannelRecordingFlagBitmapScheduled MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x1, + MTRChannelRecordingFlagBitmapRecordSeries MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x2, + MTRChannelRecordingFlagBitmapRecorded MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x4, +} MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); typedef NS_ENUM(uint8_t, MTRTargetNavigatorStatus) { MTRTargetNavigatorStatusSuccess MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) = 0x00, @@ -19964,25 +19956,25 @@ typedef NS_ENUM(uint8_t, MTRTargetNavigatorStatus) { } MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)); typedef NS_ENUM(uint8_t, MTRMediaPlaybackCharacteristic) { - MTRMediaPlaybackCharacteristicForcedSubtitles MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTRMediaPlaybackCharacteristicDescribesVideo MTR_PROVISIONALLY_AVAILABLE = 0x01, - MTRMediaPlaybackCharacteristicEasyToRead MTR_PROVISIONALLY_AVAILABLE = 0x02, - MTRMediaPlaybackCharacteristicFrameBased MTR_PROVISIONALLY_AVAILABLE = 0x03, - MTRMediaPlaybackCharacteristicMainProgram MTR_PROVISIONALLY_AVAILABLE = 0x04, - MTRMediaPlaybackCharacteristicOriginalContent MTR_PROVISIONALLY_AVAILABLE = 0x05, - MTRMediaPlaybackCharacteristicVoiceOverTranslation MTR_PROVISIONALLY_AVAILABLE = 0x06, - MTRMediaPlaybackCharacteristicCaption MTR_PROVISIONALLY_AVAILABLE = 0x07, - MTRMediaPlaybackCharacteristicSubtitle MTR_PROVISIONALLY_AVAILABLE = 0x08, - MTRMediaPlaybackCharacteristicAlternate MTR_PROVISIONALLY_AVAILABLE = 0x09, - MTRMediaPlaybackCharacteristicSupplementary MTR_PROVISIONALLY_AVAILABLE = 0x0A, - MTRMediaPlaybackCharacteristicCommentary MTR_PROVISIONALLY_AVAILABLE = 0x0B, - MTRMediaPlaybackCharacteristicDubbedTranslation MTR_PROVISIONALLY_AVAILABLE = 0x0C, - MTRMediaPlaybackCharacteristicDescription MTR_PROVISIONALLY_AVAILABLE = 0x0D, - MTRMediaPlaybackCharacteristicMetadata MTR_PROVISIONALLY_AVAILABLE = 0x0E, - MTRMediaPlaybackCharacteristicEnhancedAudioIntelligibility MTR_PROVISIONALLY_AVAILABLE = 0x0F, - MTRMediaPlaybackCharacteristicEmergency MTR_PROVISIONALLY_AVAILABLE = 0x10, - MTRMediaPlaybackCharacteristicKaraoke MTR_PROVISIONALLY_AVAILABLE = 0x11, -} MTR_PROVISIONALLY_AVAILABLE; + MTRMediaPlaybackCharacteristicForcedSubtitles MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00, + MTRMediaPlaybackCharacteristicDescribesVideo MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x01, + MTRMediaPlaybackCharacteristicEasyToRead MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x02, + MTRMediaPlaybackCharacteristicFrameBased MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x03, + MTRMediaPlaybackCharacteristicMainProgram MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x04, + MTRMediaPlaybackCharacteristicOriginalContent MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x05, + MTRMediaPlaybackCharacteristicVoiceOverTranslation MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x06, + MTRMediaPlaybackCharacteristicCaption MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x07, + MTRMediaPlaybackCharacteristicSubtitle MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x08, + MTRMediaPlaybackCharacteristicAlternate MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x09, + MTRMediaPlaybackCharacteristicSupplementary MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x0A, + MTRMediaPlaybackCharacteristicCommentary MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x0B, + MTRMediaPlaybackCharacteristicDubbedTranslation MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x0C, + MTRMediaPlaybackCharacteristicDescription MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x0D, + MTRMediaPlaybackCharacteristicMetadata MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x0E, + MTRMediaPlaybackCharacteristicEnhancedAudioIntelligibility MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x0F, + MTRMediaPlaybackCharacteristicEmergency MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x10, + MTRMediaPlaybackCharacteristicKaraoke MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x11, +} MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); typedef NS_ENUM(uint8_t, MTRMediaPlaybackPlaybackState) { MTRMediaPlaybackPlaybackStatePlaying MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) = 0x00, @@ -20003,9 +19995,9 @@ typedef NS_ENUM(uint8_t, MTRMediaPlaybackStatus) { typedef NS_OPTIONS(uint32_t, MTRMediaPlaybackFeature) { MTRMediaPlaybackFeatureAdvancedSeek MTR_AVAILABLE(ios(16.2), macos(13.1), watchos(9.2), tvos(16.2)) = 0x1, MTRMediaPlaybackFeatureVariableSpeed MTR_AVAILABLE(ios(16.2), macos(13.1), watchos(9.2), tvos(16.2)) = 0x2, - MTRMediaPlaybackFeatureTextTracks MTR_PROVISIONALLY_AVAILABLE = 0x4, - MTRMediaPlaybackFeatureAudioTracks MTR_PROVISIONALLY_AVAILABLE = 0x8, - MTRMediaPlaybackFeatureAudioAdvance MTR_PROVISIONALLY_AVAILABLE = 0x10, + MTRMediaPlaybackFeatureTextTracks MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x4, + MTRMediaPlaybackFeatureAudioTracks MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x8, + MTRMediaPlaybackFeatureAudioAdvance MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x10, } MTR_AVAILABLE(ios(16.2), macos(13.1), watchos(9.2), tvos(16.2)); typedef NS_ENUM(uint8_t, MTRMediaInputInputType) { @@ -20263,17 +20255,17 @@ typedef NS_ENUM(uint8_t, MTRContentLauncherParameter) { MTRContentLauncherParameterSportsTeam MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) = 0x0B, MTRContentLauncherParameterType MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) = 0x0C, MTRContentLauncherParameterVideo MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x0D, - MTRContentLauncherParameterSeason MTR_PROVISIONALLY_AVAILABLE = 0x0E, - MTRContentLauncherParameterEpisode MTR_PROVISIONALLY_AVAILABLE = 0x0F, - MTRContentLauncherParameterAny MTR_PROVISIONALLY_AVAILABLE = 0x10, + MTRContentLauncherParameterSeason MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x0E, + MTRContentLauncherParameterEpisode MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x0F, + MTRContentLauncherParameterAny MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x10, } MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)); typedef NS_ENUM(uint8_t, MTRContentLauncherStatus) { MTRContentLauncherStatusSuccess MTR_AVAILABLE(ios(17.4), macos(14.4), watchos(10.4), tvos(17.4)) = 0x00, MTRContentLauncherStatusURLNotAvailable MTR_AVAILABLE(ios(17.4), macos(14.4), watchos(10.4), tvos(17.4)) = 0x01, MTRContentLauncherStatusAuthFailed MTR_AVAILABLE(ios(17.4), macos(14.4), watchos(10.4), tvos(17.4)) = 0x02, - MTRContentLauncherStatusTextTrackNotAvailable MTR_PROVISIONALLY_AVAILABLE = 0x03, - MTRContentLauncherStatusAudioTrackNotAvailable MTR_PROVISIONALLY_AVAILABLE = 0x04, + MTRContentLauncherStatusTextTrackNotAvailable MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x03, + MTRContentLauncherStatusAudioTrackNotAvailable MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x04, } MTR_AVAILABLE(ios(17.4), macos(14.4), watchos(10.4), tvos(17.4)); typedef NS_ENUM(uint8_t, MTRContentLauncherContentLaunchStatus) { @@ -20285,9 +20277,9 @@ typedef NS_ENUM(uint8_t, MTRContentLauncherContentLaunchStatus) { typedef NS_OPTIONS(uint32_t, MTRContentLauncherFeature) { MTRContentLauncherFeatureContentSearch MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) = 0x1, MTRContentLauncherFeatureURLPlayback MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) = 0x2, - MTRContentLauncherFeatureAdvancedSeek MTR_PROVISIONALLY_AVAILABLE = 0x4, - MTRContentLauncherFeatureTextTracks MTR_PROVISIONALLY_AVAILABLE = 0x8, - MTRContentLauncherFeatureAudioTracks MTR_PROVISIONALLY_AVAILABLE = 0x10, + MTRContentLauncherFeatureAdvancedSeek MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x4, + MTRContentLauncherFeatureTextTracks MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x8, + MTRContentLauncherFeatureAudioTracks MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x10, } MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)); typedef NS_OPTIONS(uint32_t, MTRContentLauncherSupportedProtocolsBitmap) { @@ -20319,9 +20311,9 @@ typedef NS_ENUM(uint8_t, MTRApplicationLauncherStatus) { MTRApplicationLauncherStatusSuccess MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) = 0x00, MTRApplicationLauncherStatusAppNotAvailable MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) = 0x01, MTRApplicationLauncherStatusSystemBusy MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) = 0x02, - MTRApplicationLauncherStatusPendingUserApproval MTR_PROVISIONALLY_AVAILABLE = 0x03, - MTRApplicationLauncherStatusDownloading MTR_PROVISIONALLY_AVAILABLE = 0x04, - MTRApplicationLauncherStatusInstalling MTR_PROVISIONALLY_AVAILABLE = 0x05, + MTRApplicationLauncherStatusPendingUserApproval MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x03, + MTRApplicationLauncherStatusDownloading MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x04, + MTRApplicationLauncherStatusInstalling MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x05, } MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)); typedef NS_OPTIONS(uint32_t, MTRApplicationLauncherFeature) { @@ -20344,9 +20336,9 @@ typedef NS_OPTIONS(uint32_t, MTRContentControlFeature) { } MTR_PROVISIONALLY_AVAILABLE; typedef NS_ENUM(uint8_t, MTRContentAppObserverStatus) { - MTRContentAppObserverStatusSuccess MTR_PROVISIONALLY_AVAILABLE = 0x00, - MTRContentAppObserverStatusUnexpectedData MTR_PROVISIONALLY_AVAILABLE = 0x01, -} MTR_PROVISIONALLY_AVAILABLE; + MTRContentAppObserverStatusSuccess MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00, + MTRContentAppObserverStatusUnexpectedData MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x01, +} MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); typedef NS_ENUM(uint8_t, MTRZoneManagementStatusCode) { MTRZoneManagementStatusCodeZoneNotFound MTR_PROVISIONALLY_AVAILABLE = 0x02, @@ -20550,8 +20542,8 @@ typedef NS_OPTIONS(uint8_t, MTRPushAVStreamTransportSupportedIngestMethodsBitmap } MTR_PROVISIONALLY_AVAILABLE; typedef NS_OPTIONS(uint32_t, MTRCommissionerControlSupportedDeviceCategoryBitmap) { - MTRCommissionerControlSupportedDeviceCategoryBitmapFabricSynchronization MTR_PROVISIONALLY_AVAILABLE = 0x1, -} MTR_PROVISIONALLY_AVAILABLE; + MTRCommissionerControlSupportedDeviceCategoryBitmapFabricSynchronization MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x1, +} MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); typedef NS_ENUM(uint8_t, MTRUnitTestingSimple) { MTRUnitTestingSimpleUnspecified MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x00, diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRClusterConstants.h b/src/darwin/Framework/CHIP/zap-generated/MTRClusterConstants.h index 1f1e93e1059df2..d6f8f73697ae22 100644 --- a/src/darwin/Framework/CHIP/zap-generated/MTRClusterConstants.h +++ b/src/darwin/Framework/CHIP/zap-generated/MTRClusterConstants.h @@ -145,19 +145,19 @@ typedef NS_ENUM(uint32_t, MTRClusterIDType) { MTRClusterIDTypeValveConfigurationAndControlID MTR_AVAILABLE(ios(17.6), macos(14.6), watchos(10.6), tvos(17.6)) = 0x00000081, MTRClusterIDTypeElectricalPowerMeasurementID MTR_AVAILABLE(ios(17.6), macos(14.6), watchos(10.6), tvos(17.6)) = 0x00000090, MTRClusterIDTypeElectricalEnergyMeasurementID MTR_AVAILABLE(ios(17.6), macos(14.6), watchos(10.6), tvos(17.6)) = 0x00000091, - MTRClusterIDTypeWaterHeaterManagementID MTR_PROVISIONALLY_AVAILABLE = 0x00000094, + MTRClusterIDTypeWaterHeaterManagementID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000094, MTRClusterIDTypeDemandResponseLoadControlID MTR_PROVISIONALLY_AVAILABLE = 0x00000096, - MTRClusterIDTypeMessagesID MTR_PROVISIONALLY_AVAILABLE = 0x00000097, + MTRClusterIDTypeMessagesID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000097, MTRClusterIDTypeDeviceEnergyManagementID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000098, - MTRClusterIDTypeEnergyEVSEID MTR_PROVISIONALLY_AVAILABLE = 0x00000099, + MTRClusterIDTypeEnergyEVSEID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000099, MTRClusterIDTypeEnergyPreferenceID MTR_PROVISIONALLY_AVAILABLE = 0x0000009B, - MTRClusterIDTypePowerTopologyID MTR_PROVISIONALLY_AVAILABLE = 0x0000009C, - MTRClusterIDTypeEnergyEVSEModeID MTR_PROVISIONALLY_AVAILABLE = 0x0000009D, - MTRClusterIDTypeWaterHeaterModeID MTR_PROVISIONALLY_AVAILABLE = 0x0000009E, + MTRClusterIDTypePowerTopologyID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x0000009C, + MTRClusterIDTypeEnergyEVSEModeID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x0000009D, + MTRClusterIDTypeWaterHeaterModeID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x0000009E, MTRClusterIDTypeDeviceEnergyManagementModeID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x0000009F, MTRClusterIDTypeDoorLockID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x00000101, MTRClusterIDTypeWindowCoveringID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x00000102, - MTRClusterIDTypeServiceAreaID MTR_PROVISIONALLY_AVAILABLE = 0x00000150, + MTRClusterIDTypeServiceAreaID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000150, MTRClusterIDTypePumpConfigurationAndControlID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x00000200, MTRClusterIDTypeThermostatID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x00000201, MTRClusterIDTypeFanControlID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x00000202, @@ -180,9 +180,9 @@ typedef NS_ENUM(uint32_t, MTRClusterIDType) { MTRClusterIDTypePM10ConcentrationMeasurementID MTR_AVAILABLE(ios(17.6), macos(14.6), watchos(10.6), tvos(17.6)) = 0x0000042D, MTRClusterIDTypeTotalVolatileOrganicCompoundsConcentrationMeasurementID MTR_AVAILABLE(ios(17.6), macos(14.6), watchos(10.6), tvos(17.6)) = 0x0000042E, MTRClusterIDTypeRadonConcentrationMeasurementID MTR_AVAILABLE(ios(17.6), macos(14.6), watchos(10.6), tvos(17.6)) = 0x0000042F, - MTRClusterIDTypeWiFiNetworkManagementID MTR_PROVISIONALLY_AVAILABLE = 0x00000451, - MTRClusterIDTypeThreadBorderRouterManagementID MTR_PROVISIONALLY_AVAILABLE = 0x00000452, - MTRClusterIDTypeThreadNetworkDirectoryID MTR_PROVISIONALLY_AVAILABLE = 0x00000453, + MTRClusterIDTypeWiFiNetworkManagementID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000451, + MTRClusterIDTypeThreadBorderRouterManagementID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000452, + MTRClusterIDTypeThreadNetworkDirectoryID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000453, MTRClusterIDTypeWakeOnLANID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x00000503, MTRClusterIDTypeChannelID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x00000504, MTRClusterIDTypeTargetNavigatorID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x00000505, @@ -196,7 +196,7 @@ typedef NS_ENUM(uint32_t, MTRClusterIDType) { MTRClusterIDTypeApplicationBasicID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x0000050D, MTRClusterIDTypeAccountLoginID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x0000050E, MTRClusterIDTypeContentControlID MTR_PROVISIONALLY_AVAILABLE = 0x0000050F, - MTRClusterIDTypeContentAppObserverID MTR_PROVISIONALLY_AVAILABLE = 0x00000510, + MTRClusterIDTypeContentAppObserverID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000510, MTRClusterIDTypeZoneManagementID MTR_PROVISIONALLY_AVAILABLE = 0x00000550, MTRClusterIDTypeCameraAVStreamManagementID MTR_PROVISIONALLY_AVAILABLE = 0x00000551, MTRClusterIDTypeCameraAVSettingsUserLevelManagementID MTR_PROVISIONALLY_AVAILABLE = 0x00000552, @@ -205,7 +205,7 @@ typedef NS_ENUM(uint32_t, MTRClusterIDType) { MTRClusterIDTypePushAVStreamTransportID MTR_PROVISIONALLY_AVAILABLE = 0x00000555, MTRClusterIDTypeChimeID MTR_PROVISIONALLY_AVAILABLE = 0x00000556, MTRClusterIDTypeEcosystemInformationID MTR_PROVISIONALLY_AVAILABLE = 0x00000750, - MTRClusterIDTypeCommissionerControlID MTR_PROVISIONALLY_AVAILABLE = 0x00000751, + MTRClusterIDTypeCommissionerControlID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000751, MTRClusterIDTypeTLSCertificateManagementID MTR_PROVISIONALLY_AVAILABLE = 0x00000801, MTRClusterIDTypeUnitTestingID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0xFFF1FC05, MTRClusterIDTypeSampleMEIID MTR_PROVISIONALLY_AVAILABLE = 0xFFF1FC20, @@ -565,8 +565,8 @@ typedef NS_ENUM(uint32_t, MTRAttributeIDType) { MTRAttributeIDTypeClusterAccessControlAttributeSubjectsPerAccessControlEntryID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x00000002, MTRAttributeIDTypeClusterAccessControlAttributeTargetsPerAccessControlEntryID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x00000003, MTRAttributeIDTypeClusterAccessControlAttributeAccessControlEntriesPerFabricID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x00000004, - MTRAttributeIDTypeClusterAccessControlAttributeCommissioningARLID MTR_PROVISIONALLY_AVAILABLE = 0x00000005, - MTRAttributeIDTypeClusterAccessControlAttributeARLID MTR_PROVISIONALLY_AVAILABLE = 0x00000006, + MTRAttributeIDTypeClusterAccessControlAttributeCommissioningARLID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000005, + MTRAttributeIDTypeClusterAccessControlAttributeARLID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000006, MTRAttributeIDTypeClusterAccessControlAttributeGeneratedCommandListID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID, MTRAttributeIDTypeClusterAccessControlAttributeAcceptedCommandListID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID, MTRAttributeIDTypeClusterAccessControlAttributeAttributeListID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = MTRAttributeIDTypeGlobalAttributeAttributeListID, @@ -708,8 +708,8 @@ typedef NS_ENUM(uint32_t, MTRAttributeIDType) { MTRAttributeIDTypeClusterBasicInformationAttributeUniqueIDID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x00000012, MTRAttributeIDTypeClusterBasicInformationAttributeCapabilityMinimaID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x00000013, MTRAttributeIDTypeClusterBasicInformationAttributeProductAppearanceID MTR_AVAILABLE(ios(17.0), macos(14.0), watchos(10.0), tvos(17.0)) = 0x00000014, - MTRAttributeIDTypeClusterBasicInformationAttributeSpecificationVersionID MTR_PROVISIONALLY_AVAILABLE = 0x00000015, - MTRAttributeIDTypeClusterBasicInformationAttributeMaxPathsPerInvokeID MTR_PROVISIONALLY_AVAILABLE = 0x00000016, + MTRAttributeIDTypeClusterBasicInformationAttributeSpecificationVersionID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000015, + MTRAttributeIDTypeClusterBasicInformationAttributeMaxPathsPerInvokeID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000016, MTRAttributeIDTypeClusterBasicInformationAttributeGeneratedCommandListID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID, MTRAttributeIDTypeClusterBasicInformationAttributeAcceptedCommandListID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID, MTRAttributeIDTypeClusterBasicInformationAttributeAttributeListID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = MTRAttributeIDTypeGlobalAttributeAttributeListID, @@ -1152,9 +1152,9 @@ typedef NS_ENUM(uint32_t, MTRAttributeIDType) { MTRAttributeIDTypeClusterNetworkCommissioningAttributeLastNetworkingStatusID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x00000005, MTRAttributeIDTypeClusterNetworkCommissioningAttributeLastNetworkIDID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x00000006, MTRAttributeIDTypeClusterNetworkCommissioningAttributeLastConnectErrorValueID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x00000007, - MTRAttributeIDTypeClusterNetworkCommissioningAttributeSupportedWiFiBandsID MTR_PROVISIONALLY_AVAILABLE = 0x00000008, - MTRAttributeIDTypeClusterNetworkCommissioningAttributeSupportedThreadFeaturesID MTR_PROVISIONALLY_AVAILABLE = 0x00000009, - MTRAttributeIDTypeClusterNetworkCommissioningAttributeThreadVersionID MTR_PROVISIONALLY_AVAILABLE = 0x0000000A, + MTRAttributeIDTypeClusterNetworkCommissioningAttributeSupportedWiFiBandsID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000008, + MTRAttributeIDTypeClusterNetworkCommissioningAttributeSupportedThreadFeaturesID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000009, + MTRAttributeIDTypeClusterNetworkCommissioningAttributeThreadVersionID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x0000000A, MTRAttributeIDTypeClusterNetworkCommissioningAttributeGeneratedCommandListID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID, MTRAttributeIDTypeClusterNetworkCommissioningAttributeAcceptedCommandListID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID, MTRAttributeIDTypeClusterNetworkCommissioningAttributeAttributeListID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = MTRAttributeIDTypeGlobalAttributeAttributeListID, @@ -1759,9 +1759,9 @@ typedef NS_ENUM(uint32_t, MTRAttributeIDType) { MTRAttributeIDTypeClusterTimeSynchronizationAttributeTimeZoneDatabaseID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x00000008, MTRAttributeIDTypeClusterTimeSynchronizationAttributeNTPServerAvailableID MTR_AVAILABLE(ios(17.0), macos(14.0), watchos(10.0), tvos(17.0)) = 0x00000009, MTRAttributeIDTypeClusterTimeSynchronizationAttributeNtpServerPortID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = MTRAttributeIDTypeClusterTimeSynchronizationAttributeNTPServerAvailableID, - MTRAttributeIDTypeClusterTimeSynchronizationAttributeTimeZoneListMaxSizeID MTR_PROVISIONALLY_AVAILABLE = 0x0000000A, - MTRAttributeIDTypeClusterTimeSynchronizationAttributeDSTOffsetListMaxSizeID MTR_PROVISIONALLY_AVAILABLE = 0x0000000B, - MTRAttributeIDTypeClusterTimeSynchronizationAttributeSupportsDNSResolveID MTR_PROVISIONALLY_AVAILABLE = 0x0000000C, + MTRAttributeIDTypeClusterTimeSynchronizationAttributeTimeZoneListMaxSizeID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x0000000A, + MTRAttributeIDTypeClusterTimeSynchronizationAttributeDSTOffsetListMaxSizeID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x0000000B, + MTRAttributeIDTypeClusterTimeSynchronizationAttributeSupportsDNSResolveID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x0000000C, MTRAttributeIDTypeClusterTimeSynchronizationAttributeGeneratedCommandListID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID, MTRAttributeIDTypeClusterTimeSynchronizationAttributeAcceptedCommandListID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID, MTRAttributeIDTypeClusterTimeSynchronizationAttributeAttributeListID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = MTRAttributeIDTypeGlobalAttributeAttributeListID, @@ -1834,7 +1834,7 @@ typedef NS_ENUM(uint32_t, MTRAttributeIDType) { MTRAttributeIDTypeClusterBridgedDeviceBasicInformationAttributeVendorNameID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x00000001, MTRAttributeIDTypeClusterBridgedDeviceBasicInformationAttributeVendorIDID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x00000002, MTRAttributeIDTypeClusterBridgedDeviceBasicInformationAttributeProductNameID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x00000003, - MTRAttributeIDTypeClusterBridgedDeviceBasicInformationAttributeProductIDID MTR_PROVISIONALLY_AVAILABLE = 0x00000004, + MTRAttributeIDTypeClusterBridgedDeviceBasicInformationAttributeProductIDID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000004, MTRAttributeIDTypeClusterBridgedDeviceBasicInformationAttributeNodeLabelID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x00000005, MTRAttributeIDTypeClusterBridgedDeviceBasicInformationAttributeHardwareVersionID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x00000007, MTRAttributeIDTypeClusterBridgedDeviceBasicInformationAttributeHardwareVersionStringID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x00000008, @@ -2482,17 +2482,17 @@ typedef NS_ENUM(uint32_t, MTRAttributeIDType) { MTRAttributeIDTypeClusterElectricalEnergyMeasurementAttributeClusterRevisionID MTR_AVAILABLE(ios(17.6), macos(14.6), watchos(10.6), tvos(17.6)) = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, // Cluster WaterHeaterManagement attributes - MTRAttributeIDTypeClusterWaterHeaterManagementAttributeHeaterTypesID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, - MTRAttributeIDTypeClusterWaterHeaterManagementAttributeHeatDemandID MTR_PROVISIONALLY_AVAILABLE = 0x00000001, - MTRAttributeIDTypeClusterWaterHeaterManagementAttributeTankVolumeID MTR_PROVISIONALLY_AVAILABLE = 0x00000002, - MTRAttributeIDTypeClusterWaterHeaterManagementAttributeEstimatedHeatRequiredID MTR_PROVISIONALLY_AVAILABLE = 0x00000003, - MTRAttributeIDTypeClusterWaterHeaterManagementAttributeTankPercentageID MTR_PROVISIONALLY_AVAILABLE = 0x00000004, - MTRAttributeIDTypeClusterWaterHeaterManagementAttributeBoostStateID MTR_PROVISIONALLY_AVAILABLE = 0x00000005, - MTRAttributeIDTypeClusterWaterHeaterManagementAttributeGeneratedCommandListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID, - MTRAttributeIDTypeClusterWaterHeaterManagementAttributeAcceptedCommandListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID, - MTRAttributeIDTypeClusterWaterHeaterManagementAttributeAttributeListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAttributeListID, - MTRAttributeIDTypeClusterWaterHeaterManagementAttributeFeatureMapID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeFeatureMapID, - MTRAttributeIDTypeClusterWaterHeaterManagementAttributeClusterRevisionID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, + MTRAttributeIDTypeClusterWaterHeaterManagementAttributeHeaterTypesID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000000, + MTRAttributeIDTypeClusterWaterHeaterManagementAttributeHeatDemandID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000001, + MTRAttributeIDTypeClusterWaterHeaterManagementAttributeTankVolumeID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000002, + MTRAttributeIDTypeClusterWaterHeaterManagementAttributeEstimatedHeatRequiredID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000003, + MTRAttributeIDTypeClusterWaterHeaterManagementAttributeTankPercentageID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000004, + MTRAttributeIDTypeClusterWaterHeaterManagementAttributeBoostStateID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000005, + MTRAttributeIDTypeClusterWaterHeaterManagementAttributeGeneratedCommandListID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID, + MTRAttributeIDTypeClusterWaterHeaterManagementAttributeAcceptedCommandListID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID, + MTRAttributeIDTypeClusterWaterHeaterManagementAttributeAttributeListID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = MTRAttributeIDTypeGlobalAttributeAttributeListID, + MTRAttributeIDTypeClusterWaterHeaterManagementAttributeFeatureMapID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = MTRAttributeIDTypeGlobalAttributeFeatureMapID, + MTRAttributeIDTypeClusterWaterHeaterManagementAttributeClusterRevisionID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, // Cluster DemandResponseLoadControl attributes MTRAttributeIDTypeClusterDemandResponseLoadControlAttributeLoadControlProgramsID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, @@ -2510,13 +2510,13 @@ typedef NS_ENUM(uint32_t, MTRAttributeIDType) { MTRAttributeIDTypeClusterDemandResponseLoadControlAttributeClusterRevisionID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, // Cluster Messages attributes - MTRAttributeIDTypeClusterMessagesAttributeMessagesID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, - MTRAttributeIDTypeClusterMessagesAttributeActiveMessageIDsID MTR_PROVISIONALLY_AVAILABLE = 0x00000001, - MTRAttributeIDTypeClusterMessagesAttributeGeneratedCommandListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID, - MTRAttributeIDTypeClusterMessagesAttributeAcceptedCommandListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID, - MTRAttributeIDTypeClusterMessagesAttributeAttributeListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAttributeListID, - MTRAttributeIDTypeClusterMessagesAttributeFeatureMapID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeFeatureMapID, - MTRAttributeIDTypeClusterMessagesAttributeClusterRevisionID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, + MTRAttributeIDTypeClusterMessagesAttributeMessagesID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000000, + MTRAttributeIDTypeClusterMessagesAttributeActiveMessageIDsID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000001, + MTRAttributeIDTypeClusterMessagesAttributeGeneratedCommandListID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID, + MTRAttributeIDTypeClusterMessagesAttributeAcceptedCommandListID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID, + MTRAttributeIDTypeClusterMessagesAttributeAttributeListID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = MTRAttributeIDTypeGlobalAttributeAttributeListID, + MTRAttributeIDTypeClusterMessagesAttributeFeatureMapID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = MTRAttributeIDTypeGlobalAttributeFeatureMapID, + MTRAttributeIDTypeClusterMessagesAttributeClusterRevisionID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, // Cluster DeviceEnergyManagement attributes MTRAttributeIDTypeClusterDeviceEnergyManagementAttributeESATypeID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000000, @@ -2534,34 +2534,34 @@ typedef NS_ENUM(uint32_t, MTRAttributeIDType) { MTRAttributeIDTypeClusterDeviceEnergyManagementAttributeClusterRevisionID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, // Cluster EnergyEVSE attributes - MTRAttributeIDTypeClusterEnergyEVSEAttributeStateID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, - MTRAttributeIDTypeClusterEnergyEVSEAttributeSupplyStateID MTR_PROVISIONALLY_AVAILABLE = 0x00000001, - MTRAttributeIDTypeClusterEnergyEVSEAttributeFaultStateID MTR_PROVISIONALLY_AVAILABLE = 0x00000002, - MTRAttributeIDTypeClusterEnergyEVSEAttributeChargingEnabledUntilID MTR_PROVISIONALLY_AVAILABLE = 0x00000003, + MTRAttributeIDTypeClusterEnergyEVSEAttributeStateID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000000, + MTRAttributeIDTypeClusterEnergyEVSEAttributeSupplyStateID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000001, + MTRAttributeIDTypeClusterEnergyEVSEAttributeFaultStateID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000002, + MTRAttributeIDTypeClusterEnergyEVSEAttributeChargingEnabledUntilID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000003, MTRAttributeIDTypeClusterEnergyEVSEAttributeDischargingEnabledUntilID MTR_PROVISIONALLY_AVAILABLE = 0x00000004, - MTRAttributeIDTypeClusterEnergyEVSEAttributeCircuitCapacityID MTR_PROVISIONALLY_AVAILABLE = 0x00000005, - MTRAttributeIDTypeClusterEnergyEVSEAttributeMinimumChargeCurrentID MTR_PROVISIONALLY_AVAILABLE = 0x00000006, - MTRAttributeIDTypeClusterEnergyEVSEAttributeMaximumChargeCurrentID MTR_PROVISIONALLY_AVAILABLE = 0x00000007, + MTRAttributeIDTypeClusterEnergyEVSEAttributeCircuitCapacityID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000005, + MTRAttributeIDTypeClusterEnergyEVSEAttributeMinimumChargeCurrentID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000006, + MTRAttributeIDTypeClusterEnergyEVSEAttributeMaximumChargeCurrentID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000007, MTRAttributeIDTypeClusterEnergyEVSEAttributeMaximumDischargeCurrentID MTR_PROVISIONALLY_AVAILABLE = 0x00000008, - MTRAttributeIDTypeClusterEnergyEVSEAttributeUserMaximumChargeCurrentID MTR_PROVISIONALLY_AVAILABLE = 0x00000009, - MTRAttributeIDTypeClusterEnergyEVSEAttributeRandomizationDelayWindowID MTR_PROVISIONALLY_AVAILABLE = 0x0000000A, - MTRAttributeIDTypeClusterEnergyEVSEAttributeNextChargeStartTimeID MTR_PROVISIONALLY_AVAILABLE = 0x00000023, - MTRAttributeIDTypeClusterEnergyEVSEAttributeNextChargeTargetTimeID MTR_PROVISIONALLY_AVAILABLE = 0x00000024, - MTRAttributeIDTypeClusterEnergyEVSEAttributeNextChargeRequiredEnergyID MTR_PROVISIONALLY_AVAILABLE = 0x00000025, - MTRAttributeIDTypeClusterEnergyEVSEAttributeNextChargeTargetSoCID MTR_PROVISIONALLY_AVAILABLE = 0x00000026, - MTRAttributeIDTypeClusterEnergyEVSEAttributeApproximateEVEfficiencyID MTR_PROVISIONALLY_AVAILABLE = 0x00000027, + MTRAttributeIDTypeClusterEnergyEVSEAttributeUserMaximumChargeCurrentID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000009, + MTRAttributeIDTypeClusterEnergyEVSEAttributeRandomizationDelayWindowID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x0000000A, + MTRAttributeIDTypeClusterEnergyEVSEAttributeNextChargeStartTimeID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000023, + MTRAttributeIDTypeClusterEnergyEVSEAttributeNextChargeTargetTimeID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000024, + MTRAttributeIDTypeClusterEnergyEVSEAttributeNextChargeRequiredEnergyID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000025, + MTRAttributeIDTypeClusterEnergyEVSEAttributeNextChargeTargetSoCID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000026, + MTRAttributeIDTypeClusterEnergyEVSEAttributeApproximateEVEfficiencyID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000027, MTRAttributeIDTypeClusterEnergyEVSEAttributeStateOfChargeID MTR_PROVISIONALLY_AVAILABLE = 0x00000030, MTRAttributeIDTypeClusterEnergyEVSEAttributeBatteryCapacityID MTR_PROVISIONALLY_AVAILABLE = 0x00000031, MTRAttributeIDTypeClusterEnergyEVSEAttributeVehicleIDID MTR_PROVISIONALLY_AVAILABLE = 0x00000032, - MTRAttributeIDTypeClusterEnergyEVSEAttributeSessionIDID MTR_PROVISIONALLY_AVAILABLE = 0x00000040, - MTRAttributeIDTypeClusterEnergyEVSEAttributeSessionDurationID MTR_PROVISIONALLY_AVAILABLE = 0x00000041, - MTRAttributeIDTypeClusterEnergyEVSEAttributeSessionEnergyChargedID MTR_PROVISIONALLY_AVAILABLE = 0x00000042, + MTRAttributeIDTypeClusterEnergyEVSEAttributeSessionIDID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000040, + MTRAttributeIDTypeClusterEnergyEVSEAttributeSessionDurationID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000041, + MTRAttributeIDTypeClusterEnergyEVSEAttributeSessionEnergyChargedID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000042, MTRAttributeIDTypeClusterEnergyEVSEAttributeSessionEnergyDischargedID MTR_PROVISIONALLY_AVAILABLE = 0x00000043, - MTRAttributeIDTypeClusterEnergyEVSEAttributeGeneratedCommandListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID, - MTRAttributeIDTypeClusterEnergyEVSEAttributeAcceptedCommandListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID, - MTRAttributeIDTypeClusterEnergyEVSEAttributeAttributeListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAttributeListID, - MTRAttributeIDTypeClusterEnergyEVSEAttributeFeatureMapID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeFeatureMapID, - MTRAttributeIDTypeClusterEnergyEVSEAttributeClusterRevisionID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, + MTRAttributeIDTypeClusterEnergyEVSEAttributeGeneratedCommandListID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID, + MTRAttributeIDTypeClusterEnergyEVSEAttributeAcceptedCommandListID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID, + MTRAttributeIDTypeClusterEnergyEVSEAttributeAttributeListID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = MTRAttributeIDTypeGlobalAttributeAttributeListID, + MTRAttributeIDTypeClusterEnergyEVSEAttributeFeatureMapID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = MTRAttributeIDTypeGlobalAttributeFeatureMapID, + MTRAttributeIDTypeClusterEnergyEVSEAttributeClusterRevisionID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, // Cluster EnergyPreference attributes MTRAttributeIDTypeClusterEnergyPreferenceAttributeEnergyBalancesID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, @@ -2576,31 +2576,31 @@ typedef NS_ENUM(uint32_t, MTRAttributeIDType) { MTRAttributeIDTypeClusterEnergyPreferenceAttributeClusterRevisionID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, // Cluster PowerTopology attributes - MTRAttributeIDTypeClusterPowerTopologyAttributeAvailableEndpointsID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, - MTRAttributeIDTypeClusterPowerTopologyAttributeActiveEndpointsID MTR_PROVISIONALLY_AVAILABLE = 0x00000001, - MTRAttributeIDTypeClusterPowerTopologyAttributeGeneratedCommandListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID, - MTRAttributeIDTypeClusterPowerTopologyAttributeAcceptedCommandListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID, - MTRAttributeIDTypeClusterPowerTopologyAttributeAttributeListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAttributeListID, - MTRAttributeIDTypeClusterPowerTopologyAttributeFeatureMapID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeFeatureMapID, - MTRAttributeIDTypeClusterPowerTopologyAttributeClusterRevisionID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, + MTRAttributeIDTypeClusterPowerTopologyAttributeAvailableEndpointsID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000000, + MTRAttributeIDTypeClusterPowerTopologyAttributeActiveEndpointsID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000001, + MTRAttributeIDTypeClusterPowerTopologyAttributeGeneratedCommandListID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID, + MTRAttributeIDTypeClusterPowerTopologyAttributeAcceptedCommandListID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID, + MTRAttributeIDTypeClusterPowerTopologyAttributeAttributeListID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = MTRAttributeIDTypeGlobalAttributeAttributeListID, + MTRAttributeIDTypeClusterPowerTopologyAttributeFeatureMapID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = MTRAttributeIDTypeGlobalAttributeFeatureMapID, + MTRAttributeIDTypeClusterPowerTopologyAttributeClusterRevisionID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, // Cluster EnergyEVSEMode attributes - MTRAttributeIDTypeClusterEnergyEVSEModeAttributeSupportedModesID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, - MTRAttributeIDTypeClusterEnergyEVSEModeAttributeCurrentModeID MTR_PROVISIONALLY_AVAILABLE = 0x00000001, - MTRAttributeIDTypeClusterEnergyEVSEModeAttributeGeneratedCommandListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID, - MTRAttributeIDTypeClusterEnergyEVSEModeAttributeAcceptedCommandListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID, - MTRAttributeIDTypeClusterEnergyEVSEModeAttributeAttributeListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAttributeListID, - MTRAttributeIDTypeClusterEnergyEVSEModeAttributeFeatureMapID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeFeatureMapID, - MTRAttributeIDTypeClusterEnergyEVSEModeAttributeClusterRevisionID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, + MTRAttributeIDTypeClusterEnergyEVSEModeAttributeSupportedModesID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000000, + MTRAttributeIDTypeClusterEnergyEVSEModeAttributeCurrentModeID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000001, + MTRAttributeIDTypeClusterEnergyEVSEModeAttributeGeneratedCommandListID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID, + MTRAttributeIDTypeClusterEnergyEVSEModeAttributeAcceptedCommandListID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID, + MTRAttributeIDTypeClusterEnergyEVSEModeAttributeAttributeListID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = MTRAttributeIDTypeGlobalAttributeAttributeListID, + MTRAttributeIDTypeClusterEnergyEVSEModeAttributeFeatureMapID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = MTRAttributeIDTypeGlobalAttributeFeatureMapID, + MTRAttributeIDTypeClusterEnergyEVSEModeAttributeClusterRevisionID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, // Cluster WaterHeaterMode attributes - MTRAttributeIDTypeClusterWaterHeaterModeAttributeSupportedModesID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, - MTRAttributeIDTypeClusterWaterHeaterModeAttributeCurrentModeID MTR_PROVISIONALLY_AVAILABLE = 0x00000001, - MTRAttributeIDTypeClusterWaterHeaterModeAttributeGeneratedCommandListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID, - MTRAttributeIDTypeClusterWaterHeaterModeAttributeAcceptedCommandListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID, - MTRAttributeIDTypeClusterWaterHeaterModeAttributeAttributeListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAttributeListID, - MTRAttributeIDTypeClusterWaterHeaterModeAttributeFeatureMapID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeFeatureMapID, - MTRAttributeIDTypeClusterWaterHeaterModeAttributeClusterRevisionID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, + MTRAttributeIDTypeClusterWaterHeaterModeAttributeSupportedModesID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000000, + MTRAttributeIDTypeClusterWaterHeaterModeAttributeCurrentModeID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000001, + MTRAttributeIDTypeClusterWaterHeaterModeAttributeGeneratedCommandListID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID, + MTRAttributeIDTypeClusterWaterHeaterModeAttributeAcceptedCommandListID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID, + MTRAttributeIDTypeClusterWaterHeaterModeAttributeAttributeListID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = MTRAttributeIDTypeGlobalAttributeAttributeListID, + MTRAttributeIDTypeClusterWaterHeaterModeAttributeFeatureMapID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = MTRAttributeIDTypeGlobalAttributeFeatureMapID, + MTRAttributeIDTypeClusterWaterHeaterModeAttributeClusterRevisionID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, // Cluster DeviceEnergyManagementMode attributes MTRAttributeIDTypeClusterDeviceEnergyManagementModeAttributeSupportedModesID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000000, @@ -2901,17 +2901,17 @@ typedef NS_ENUM(uint32_t, MTRAttributeIDType) { MTRAttributeIDTypeClusterWindowCoveringAttributeClusterRevisionID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, // Cluster ServiceArea attributes - MTRAttributeIDTypeClusterServiceAreaAttributeSupportedAreasID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, - MTRAttributeIDTypeClusterServiceAreaAttributeSupportedMapsID MTR_PROVISIONALLY_AVAILABLE = 0x00000001, - MTRAttributeIDTypeClusterServiceAreaAttributeSelectedAreasID MTR_PROVISIONALLY_AVAILABLE = 0x00000002, - MTRAttributeIDTypeClusterServiceAreaAttributeCurrentAreaID MTR_PROVISIONALLY_AVAILABLE = 0x00000003, - MTRAttributeIDTypeClusterServiceAreaAttributeEstimatedEndTimeID MTR_PROVISIONALLY_AVAILABLE = 0x00000004, - MTRAttributeIDTypeClusterServiceAreaAttributeProgressID MTR_PROVISIONALLY_AVAILABLE = 0x00000005, - MTRAttributeIDTypeClusterServiceAreaAttributeGeneratedCommandListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID, - MTRAttributeIDTypeClusterServiceAreaAttributeAcceptedCommandListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID, - MTRAttributeIDTypeClusterServiceAreaAttributeAttributeListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAttributeListID, - MTRAttributeIDTypeClusterServiceAreaAttributeFeatureMapID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeFeatureMapID, - MTRAttributeIDTypeClusterServiceAreaAttributeClusterRevisionID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, + MTRAttributeIDTypeClusterServiceAreaAttributeSupportedAreasID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000000, + MTRAttributeIDTypeClusterServiceAreaAttributeSupportedMapsID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000001, + MTRAttributeIDTypeClusterServiceAreaAttributeSelectedAreasID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000002, + MTRAttributeIDTypeClusterServiceAreaAttributeCurrentAreaID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000003, + MTRAttributeIDTypeClusterServiceAreaAttributeEstimatedEndTimeID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000004, + MTRAttributeIDTypeClusterServiceAreaAttributeProgressID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000005, + MTRAttributeIDTypeClusterServiceAreaAttributeGeneratedCommandListID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID, + MTRAttributeIDTypeClusterServiceAreaAttributeAcceptedCommandListID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID, + MTRAttributeIDTypeClusterServiceAreaAttributeAttributeListID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = MTRAttributeIDTypeGlobalAttributeAttributeListID, + MTRAttributeIDTypeClusterServiceAreaAttributeFeatureMapID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = MTRAttributeIDTypeGlobalAttributeFeatureMapID, + MTRAttributeIDTypeClusterServiceAreaAttributeClusterRevisionID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, // Cluster PumpConfigurationAndControl deprecated attribute names MTRClusterPumpConfigurationAndControlAttributeMaxPressureID @@ -3243,17 +3243,17 @@ typedef NS_ENUM(uint32_t, MTRAttributeIDType) { MTRAttributeIDTypeClusterThermostatAttributeACLouverPositionID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x00000045, MTRAttributeIDTypeClusterThermostatAttributeACCoilTemperatureID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x00000046, MTRAttributeIDTypeClusterThermostatAttributeACCapacityformatID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x00000047, - MTRAttributeIDTypeClusterThermostatAttributePresetTypesID MTR_PROVISIONALLY_AVAILABLE = 0x00000048, - MTRAttributeIDTypeClusterThermostatAttributeScheduleTypesID MTR_PROVISIONALLY_AVAILABLE = 0x00000049, - MTRAttributeIDTypeClusterThermostatAttributeNumberOfPresetsID MTR_PROVISIONALLY_AVAILABLE = 0x0000004A, - MTRAttributeIDTypeClusterThermostatAttributeNumberOfSchedulesID MTR_PROVISIONALLY_AVAILABLE = 0x0000004B, - MTRAttributeIDTypeClusterThermostatAttributeNumberOfScheduleTransitionsID MTR_PROVISIONALLY_AVAILABLE = 0x0000004C, - MTRAttributeIDTypeClusterThermostatAttributeNumberOfScheduleTransitionPerDayID MTR_PROVISIONALLY_AVAILABLE = 0x0000004D, - MTRAttributeIDTypeClusterThermostatAttributeActivePresetHandleID MTR_PROVISIONALLY_AVAILABLE = 0x0000004E, - MTRAttributeIDTypeClusterThermostatAttributeActiveScheduleHandleID MTR_PROVISIONALLY_AVAILABLE = 0x0000004F, - MTRAttributeIDTypeClusterThermostatAttributePresetsID MTR_PROVISIONALLY_AVAILABLE = 0x00000050, - MTRAttributeIDTypeClusterThermostatAttributeSchedulesID MTR_PROVISIONALLY_AVAILABLE = 0x00000051, - MTRAttributeIDTypeClusterThermostatAttributeSetpointHoldExpiryTimestampID MTR_PROVISIONALLY_AVAILABLE = 0x00000052, + MTRAttributeIDTypeClusterThermostatAttributePresetTypesID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000048, + MTRAttributeIDTypeClusterThermostatAttributeScheduleTypesID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000049, + MTRAttributeIDTypeClusterThermostatAttributeNumberOfPresetsID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x0000004A, + MTRAttributeIDTypeClusterThermostatAttributeNumberOfSchedulesID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x0000004B, + MTRAttributeIDTypeClusterThermostatAttributeNumberOfScheduleTransitionsID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x0000004C, + MTRAttributeIDTypeClusterThermostatAttributeNumberOfScheduleTransitionPerDayID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x0000004D, + MTRAttributeIDTypeClusterThermostatAttributeActivePresetHandleID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x0000004E, + MTRAttributeIDTypeClusterThermostatAttributeActiveScheduleHandleID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x0000004F, + MTRAttributeIDTypeClusterThermostatAttributePresetsID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000050, + MTRAttributeIDTypeClusterThermostatAttributeSchedulesID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000051, + MTRAttributeIDTypeClusterThermostatAttributeSetpointHoldExpiryTimestampID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000052, MTRAttributeIDTypeClusterThermostatAttributeGeneratedCommandListID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID, MTRAttributeIDTypeClusterThermostatAttributeAcceptedCommandListID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID, MTRAttributeIDTypeClusterThermostatAttributeAttributeListID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = MTRAttributeIDTypeGlobalAttributeAttributeListID, @@ -3958,8 +3958,8 @@ typedef NS_ENUM(uint32_t, MTRAttributeIDType) { MTRAttributeIDTypeClusterOccupancySensingAttributeOccupancyID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x00000000, MTRAttributeIDTypeClusterOccupancySensingAttributeOccupancySensorTypeID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x00000001, MTRAttributeIDTypeClusterOccupancySensingAttributeOccupancySensorTypeBitmapID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x00000002, - MTRAttributeIDTypeClusterOccupancySensingAttributeHoldTimeID MTR_PROVISIONALLY_AVAILABLE = 0x00000003, - MTRAttributeIDTypeClusterOccupancySensingAttributeHoldTimeLimitsID MTR_PROVISIONALLY_AVAILABLE = 0x00000004, + MTRAttributeIDTypeClusterOccupancySensingAttributeHoldTimeID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000003, + MTRAttributeIDTypeClusterOccupancySensingAttributeHoldTimeLimitsID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000004, MTRAttributeIDTypeClusterOccupancySensingAttributePIROccupiedToUnoccupiedDelayID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x00000010, MTRAttributeIDTypeClusterOccupancySensingAttributePIRUnoccupiedToOccupiedDelayID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x00000011, MTRAttributeIDTypeClusterOccupancySensingAttributePIRUnoccupiedToOccupiedThresholdID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x00000012, @@ -4156,36 +4156,36 @@ typedef NS_ENUM(uint32_t, MTRAttributeIDType) { MTRAttributeIDTypeClusterRadonConcentrationMeasurementAttributeClusterRevisionID MTR_AVAILABLE(ios(17.6), macos(14.6), watchos(10.6), tvos(17.6)) = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, // Cluster WiFiNetworkManagement attributes - MTRAttributeIDTypeClusterWiFiNetworkManagementAttributeSSIDID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, - MTRAttributeIDTypeClusterWiFiNetworkManagementAttributePassphraseSurrogateID MTR_PROVISIONALLY_AVAILABLE = 0x00000001, - MTRAttributeIDTypeClusterWiFiNetworkManagementAttributeGeneratedCommandListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID, - MTRAttributeIDTypeClusterWiFiNetworkManagementAttributeAcceptedCommandListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID, - MTRAttributeIDTypeClusterWiFiNetworkManagementAttributeAttributeListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAttributeListID, - MTRAttributeIDTypeClusterWiFiNetworkManagementAttributeFeatureMapID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeFeatureMapID, - MTRAttributeIDTypeClusterWiFiNetworkManagementAttributeClusterRevisionID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, + MTRAttributeIDTypeClusterWiFiNetworkManagementAttributeSSIDID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000000, + MTRAttributeIDTypeClusterWiFiNetworkManagementAttributePassphraseSurrogateID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000001, + MTRAttributeIDTypeClusterWiFiNetworkManagementAttributeGeneratedCommandListID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID, + MTRAttributeIDTypeClusterWiFiNetworkManagementAttributeAcceptedCommandListID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID, + MTRAttributeIDTypeClusterWiFiNetworkManagementAttributeAttributeListID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = MTRAttributeIDTypeGlobalAttributeAttributeListID, + MTRAttributeIDTypeClusterWiFiNetworkManagementAttributeFeatureMapID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = MTRAttributeIDTypeGlobalAttributeFeatureMapID, + MTRAttributeIDTypeClusterWiFiNetworkManagementAttributeClusterRevisionID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, // Cluster ThreadBorderRouterManagement attributes - MTRAttributeIDTypeClusterThreadBorderRouterManagementAttributeBorderRouterNameID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, - MTRAttributeIDTypeClusterThreadBorderRouterManagementAttributeBorderAgentIDID MTR_PROVISIONALLY_AVAILABLE = 0x00000001, - MTRAttributeIDTypeClusterThreadBorderRouterManagementAttributeThreadVersionID MTR_PROVISIONALLY_AVAILABLE = 0x00000002, - MTRAttributeIDTypeClusterThreadBorderRouterManagementAttributeInterfaceEnabledID MTR_PROVISIONALLY_AVAILABLE = 0x00000003, - MTRAttributeIDTypeClusterThreadBorderRouterManagementAttributeActiveDatasetTimestampID MTR_PROVISIONALLY_AVAILABLE = 0x00000004, - MTRAttributeIDTypeClusterThreadBorderRouterManagementAttributePendingDatasetTimestampID MTR_PROVISIONALLY_AVAILABLE = 0x00000005, - MTRAttributeIDTypeClusterThreadBorderRouterManagementAttributeGeneratedCommandListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID, - MTRAttributeIDTypeClusterThreadBorderRouterManagementAttributeAcceptedCommandListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID, - MTRAttributeIDTypeClusterThreadBorderRouterManagementAttributeAttributeListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAttributeListID, - MTRAttributeIDTypeClusterThreadBorderRouterManagementAttributeFeatureMapID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeFeatureMapID, - MTRAttributeIDTypeClusterThreadBorderRouterManagementAttributeClusterRevisionID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, + MTRAttributeIDTypeClusterThreadBorderRouterManagementAttributeBorderRouterNameID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000000, + MTRAttributeIDTypeClusterThreadBorderRouterManagementAttributeBorderAgentIDID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000001, + MTRAttributeIDTypeClusterThreadBorderRouterManagementAttributeThreadVersionID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000002, + MTRAttributeIDTypeClusterThreadBorderRouterManagementAttributeInterfaceEnabledID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000003, + MTRAttributeIDTypeClusterThreadBorderRouterManagementAttributeActiveDatasetTimestampID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000004, + MTRAttributeIDTypeClusterThreadBorderRouterManagementAttributePendingDatasetTimestampID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000005, + MTRAttributeIDTypeClusterThreadBorderRouterManagementAttributeGeneratedCommandListID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID, + MTRAttributeIDTypeClusterThreadBorderRouterManagementAttributeAcceptedCommandListID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID, + MTRAttributeIDTypeClusterThreadBorderRouterManagementAttributeAttributeListID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = MTRAttributeIDTypeGlobalAttributeAttributeListID, + MTRAttributeIDTypeClusterThreadBorderRouterManagementAttributeFeatureMapID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = MTRAttributeIDTypeGlobalAttributeFeatureMapID, + MTRAttributeIDTypeClusterThreadBorderRouterManagementAttributeClusterRevisionID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, // Cluster ThreadNetworkDirectory attributes - MTRAttributeIDTypeClusterThreadNetworkDirectoryAttributePreferredExtendedPanIDID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, - MTRAttributeIDTypeClusterThreadNetworkDirectoryAttributeThreadNetworksID MTR_PROVISIONALLY_AVAILABLE = 0x00000001, - MTRAttributeIDTypeClusterThreadNetworkDirectoryAttributeThreadNetworkTableSizeID MTR_PROVISIONALLY_AVAILABLE = 0x00000002, - MTRAttributeIDTypeClusterThreadNetworkDirectoryAttributeGeneratedCommandListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID, - MTRAttributeIDTypeClusterThreadNetworkDirectoryAttributeAcceptedCommandListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID, - MTRAttributeIDTypeClusterThreadNetworkDirectoryAttributeAttributeListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAttributeListID, - MTRAttributeIDTypeClusterThreadNetworkDirectoryAttributeFeatureMapID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeFeatureMapID, - MTRAttributeIDTypeClusterThreadNetworkDirectoryAttributeClusterRevisionID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, + MTRAttributeIDTypeClusterThreadNetworkDirectoryAttributePreferredExtendedPanIDID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000000, + MTRAttributeIDTypeClusterThreadNetworkDirectoryAttributeThreadNetworksID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000001, + MTRAttributeIDTypeClusterThreadNetworkDirectoryAttributeThreadNetworkTableSizeID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000002, + MTRAttributeIDTypeClusterThreadNetworkDirectoryAttributeGeneratedCommandListID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID, + MTRAttributeIDTypeClusterThreadNetworkDirectoryAttributeAcceptedCommandListID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID, + MTRAttributeIDTypeClusterThreadNetworkDirectoryAttributeAttributeListID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = MTRAttributeIDTypeGlobalAttributeAttributeListID, + MTRAttributeIDTypeClusterThreadNetworkDirectoryAttributeFeatureMapID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = MTRAttributeIDTypeGlobalAttributeFeatureMapID, + MTRAttributeIDTypeClusterThreadNetworkDirectoryAttributeClusterRevisionID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, // Cluster WakeOnLan deprecated attribute names MTRClusterWakeOnLanAttributeMACAddressID @@ -4209,7 +4209,7 @@ typedef NS_ENUM(uint32_t, MTRAttributeIDType) { // Cluster WakeOnLAN attributes MTRAttributeIDTypeClusterWakeOnLANAttributeMACAddressID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x00000000, - MTRAttributeIDTypeClusterWakeOnLANAttributeLinkLocalAddressID MTR_PROVISIONALLY_AVAILABLE = 0x00000001, + MTRAttributeIDTypeClusterWakeOnLANAttributeLinkLocalAddressID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000001, MTRAttributeIDTypeClusterWakeOnLANAttributeGeneratedCommandListID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID, MTRAttributeIDTypeClusterWakeOnLANAttributeAcceptedCommandListID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID, MTRAttributeIDTypeClusterWakeOnLANAttributeAttributeListID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = MTRAttributeIDTypeGlobalAttributeAttributeListID, @@ -4612,11 +4612,11 @@ typedef NS_ENUM(uint32_t, MTRAttributeIDType) { MTRAttributeIDTypeClusterContentControlAttributeClusterRevisionID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, // Cluster ContentAppObserver attributes - MTRAttributeIDTypeClusterContentAppObserverAttributeGeneratedCommandListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID, - MTRAttributeIDTypeClusterContentAppObserverAttributeAcceptedCommandListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID, - MTRAttributeIDTypeClusterContentAppObserverAttributeAttributeListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAttributeListID, - MTRAttributeIDTypeClusterContentAppObserverAttributeFeatureMapID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeFeatureMapID, - MTRAttributeIDTypeClusterContentAppObserverAttributeClusterRevisionID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, + MTRAttributeIDTypeClusterContentAppObserverAttributeGeneratedCommandListID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID, + MTRAttributeIDTypeClusterContentAppObserverAttributeAcceptedCommandListID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID, + MTRAttributeIDTypeClusterContentAppObserverAttributeAttributeListID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = MTRAttributeIDTypeGlobalAttributeAttributeListID, + MTRAttributeIDTypeClusterContentAppObserverAttributeFeatureMapID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = MTRAttributeIDTypeGlobalAttributeFeatureMapID, + MTRAttributeIDTypeClusterContentAppObserverAttributeClusterRevisionID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, // Cluster ZoneManagement attributes MTRAttributeIDTypeClusterZoneManagementAttributeSupportedZoneSourcesID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, @@ -4739,12 +4739,12 @@ typedef NS_ENUM(uint32_t, MTRAttributeIDType) { MTRAttributeIDTypeClusterEcosystemInformationAttributeClusterRevisionID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, // Cluster CommissionerControl attributes - MTRAttributeIDTypeClusterCommissionerControlAttributeSupportedDeviceCategoriesID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, - MTRAttributeIDTypeClusterCommissionerControlAttributeGeneratedCommandListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID, - MTRAttributeIDTypeClusterCommissionerControlAttributeAcceptedCommandListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID, - MTRAttributeIDTypeClusterCommissionerControlAttributeAttributeListID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeAttributeListID, - MTRAttributeIDTypeClusterCommissionerControlAttributeFeatureMapID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeFeatureMapID, - MTRAttributeIDTypeClusterCommissionerControlAttributeClusterRevisionID MTR_PROVISIONALLY_AVAILABLE = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, + MTRAttributeIDTypeClusterCommissionerControlAttributeSupportedDeviceCategoriesID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000000, + MTRAttributeIDTypeClusterCommissionerControlAttributeGeneratedCommandListID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = MTRAttributeIDTypeGlobalAttributeGeneratedCommandListID, + MTRAttributeIDTypeClusterCommissionerControlAttributeAcceptedCommandListID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = MTRAttributeIDTypeGlobalAttributeAcceptedCommandListID, + MTRAttributeIDTypeClusterCommissionerControlAttributeAttributeListID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = MTRAttributeIDTypeGlobalAttributeAttributeListID, + MTRAttributeIDTypeClusterCommissionerControlAttributeFeatureMapID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = MTRAttributeIDTypeGlobalAttributeFeatureMapID, + MTRAttributeIDTypeClusterCommissionerControlAttributeClusterRevisionID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = MTRAttributeIDTypeGlobalAttributeClusterRevisionID, // Cluster TLSCertificateManagement attributes MTRAttributeIDTypeClusterTLSCertificateManagementAttributeMaxRootCertificatesID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, @@ -5948,8 +5948,8 @@ typedef NS_ENUM(uint32_t, MTRCommandIDType) { // Cluster AccessControl deprecated command id names // Cluster AccessControl commands - MTRCommandIDTypeClusterAccessControlCommandReviewFabricRestrictionsID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, - MTRCommandIDTypeClusterAccessControlCommandReviewFabricRestrictionsResponseID MTR_PROVISIONALLY_AVAILABLE = 0x00000001, + MTRCommandIDTypeClusterAccessControlCommandReviewFabricRestrictionsID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000000, + MTRCommandIDTypeClusterAccessControlCommandReviewFabricRestrictionsResponseID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000001, // Cluster Actions deprecated command id names MTRClusterActionsCommandInstantActionID @@ -6133,10 +6133,10 @@ typedef NS_ENUM(uint32_t, MTRCommandIDType) { // Cluster GeneralDiagnostics commands MTRCommandIDTypeClusterGeneralDiagnosticsCommandTestEventTriggerID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x00000000, - MTRCommandIDTypeClusterGeneralDiagnosticsCommandTimeSnapshotID MTR_PROVISIONALLY_AVAILABLE = 0x00000001, - MTRCommandIDTypeClusterGeneralDiagnosticsCommandTimeSnapshotResponseID MTR_PROVISIONALLY_AVAILABLE = 0x00000002, - MTRCommandIDTypeClusterGeneralDiagnosticsCommandPayloadTestRequestID MTR_PROVISIONALLY_AVAILABLE = 0x00000003, - MTRCommandIDTypeClusterGeneralDiagnosticsCommandPayloadTestResponseID MTR_PROVISIONALLY_AVAILABLE = 0x00000004, + MTRCommandIDTypeClusterGeneralDiagnosticsCommandTimeSnapshotID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000001, + MTRCommandIDTypeClusterGeneralDiagnosticsCommandTimeSnapshotResponseID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000002, + MTRCommandIDTypeClusterGeneralDiagnosticsCommandPayloadTestRequestID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000003, + MTRCommandIDTypeClusterGeneralDiagnosticsCommandPayloadTestResponseID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000004, // Cluster SoftwareDiagnostics deprecated command id names MTRClusterSoftwareDiagnosticsCommandResetWatermarksID @@ -6176,18 +6176,18 @@ typedef NS_ENUM(uint32_t, MTRCommandIDType) { = 0x00000000, // Cluster TimeSynchronization commands - MTRCommandIDTypeClusterTimeSynchronizationCommandSetUTCTimeID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, + MTRCommandIDTypeClusterTimeSynchronizationCommandSetUTCTimeID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000000, MTRCommandIDTypeClusterTimeSynchronizationCommandSetUtcTimeID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x00000000, - MTRCommandIDTypeClusterTimeSynchronizationCommandSetTrustedTimeSourceID MTR_PROVISIONALLY_AVAILABLE = 0x00000001, - MTRCommandIDTypeClusterTimeSynchronizationCommandSetTimeZoneID MTR_PROVISIONALLY_AVAILABLE = 0x00000002, - MTRCommandIDTypeClusterTimeSynchronizationCommandSetTimeZoneResponseID MTR_PROVISIONALLY_AVAILABLE = 0x00000003, - MTRCommandIDTypeClusterTimeSynchronizationCommandSetDSTOffsetID MTR_PROVISIONALLY_AVAILABLE = 0x00000004, - MTRCommandIDTypeClusterTimeSynchronizationCommandSetDefaultNTPID MTR_PROVISIONALLY_AVAILABLE = 0x00000005, + MTRCommandIDTypeClusterTimeSynchronizationCommandSetTrustedTimeSourceID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000001, + MTRCommandIDTypeClusterTimeSynchronizationCommandSetTimeZoneID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000002, + MTRCommandIDTypeClusterTimeSynchronizationCommandSetTimeZoneResponseID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000003, + MTRCommandIDTypeClusterTimeSynchronizationCommandSetDSTOffsetID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000004, + MTRCommandIDTypeClusterTimeSynchronizationCommandSetDefaultNTPID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000005, // Cluster BridgedDeviceBasic deprecated command id names // Cluster BridgedDeviceBasicInformation commands - MTRCommandIDTypeClusterBridgedDeviceBasicInformationCommandKeepActiveID MTR_PROVISIONALLY_AVAILABLE = 0x00000080, + MTRCommandIDTypeClusterBridgedDeviceBasicInformationCommandKeepActiveID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000080, // Cluster AdministratorCommissioning deprecated command id names MTRClusterAdministratorCommissioningCommandOpenCommissioningWindowID @@ -6394,8 +6394,8 @@ typedef NS_ENUM(uint32_t, MTRCommandIDType) { MTRCommandIDTypeClusterValveConfigurationAndControlCommandCloseID MTR_AVAILABLE(ios(17.6), macos(14.6), watchos(10.6), tvos(17.6)) = 0x00000001, // Cluster WaterHeaterManagement commands - MTRCommandIDTypeClusterWaterHeaterManagementCommandBoostID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, - MTRCommandIDTypeClusterWaterHeaterManagementCommandCancelBoostID MTR_PROVISIONALLY_AVAILABLE = 0x00000001, + MTRCommandIDTypeClusterWaterHeaterManagementCommandBoostID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000000, + MTRCommandIDTypeClusterWaterHeaterManagementCommandCancelBoostID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000001, // Cluster DemandResponseLoadControl commands MTRCommandIDTypeClusterDemandResponseLoadControlCommandRegisterLoadControlProgramRequestID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, @@ -6405,8 +6405,8 @@ typedef NS_ENUM(uint32_t, MTRCommandIDType) { MTRCommandIDTypeClusterDemandResponseLoadControlCommandClearLoadControlEventsRequestID MTR_PROVISIONALLY_AVAILABLE = 0x00000004, // Cluster Messages commands - MTRCommandIDTypeClusterMessagesCommandPresentMessagesRequestID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, - MTRCommandIDTypeClusterMessagesCommandCancelMessagesRequestID MTR_PROVISIONALLY_AVAILABLE = 0x00000001, + MTRCommandIDTypeClusterMessagesCommandPresentMessagesRequestID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000000, + MTRCommandIDTypeClusterMessagesCommandCancelMessagesRequestID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000001, // Cluster DeviceEnergyManagement commands MTRCommandIDTypeClusterDeviceEnergyManagementCommandPowerAdjustRequestID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000000, @@ -6419,22 +6419,22 @@ typedef NS_ENUM(uint32_t, MTRCommandIDType) { MTRCommandIDTypeClusterDeviceEnergyManagementCommandCancelRequestID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000007, // Cluster EnergyEVSE commands - MTRCommandIDTypeClusterEnergyEVSECommandGetTargetsResponseID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, - MTRCommandIDTypeClusterEnergyEVSECommandDisableID MTR_PROVISIONALLY_AVAILABLE = 0x00000001, - MTRCommandIDTypeClusterEnergyEVSECommandEnableChargingID MTR_PROVISIONALLY_AVAILABLE = 0x00000002, + MTRCommandIDTypeClusterEnergyEVSECommandGetTargetsResponseID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000000, + MTRCommandIDTypeClusterEnergyEVSECommandDisableID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000001, + MTRCommandIDTypeClusterEnergyEVSECommandEnableChargingID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000002, MTRCommandIDTypeClusterEnergyEVSECommandEnableDischargingID MTR_PROVISIONALLY_AVAILABLE = 0x00000003, - MTRCommandIDTypeClusterEnergyEVSECommandStartDiagnosticsID MTR_PROVISIONALLY_AVAILABLE = 0x00000004, - MTRCommandIDTypeClusterEnergyEVSECommandSetTargetsID MTR_PROVISIONALLY_AVAILABLE = 0x00000005, - MTRCommandIDTypeClusterEnergyEVSECommandGetTargetsID MTR_PROVISIONALLY_AVAILABLE = 0x00000006, - MTRCommandIDTypeClusterEnergyEVSECommandClearTargetsID MTR_PROVISIONALLY_AVAILABLE = 0x00000007, + MTRCommandIDTypeClusterEnergyEVSECommandStartDiagnosticsID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000004, + MTRCommandIDTypeClusterEnergyEVSECommandSetTargetsID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000005, + MTRCommandIDTypeClusterEnergyEVSECommandGetTargetsID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000006, + MTRCommandIDTypeClusterEnergyEVSECommandClearTargetsID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000007, // Cluster EnergyEVSEMode commands - MTRCommandIDTypeClusterEnergyEVSEModeCommandChangeToModeID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, - MTRCommandIDTypeClusterEnergyEVSEModeCommandChangeToModeResponseID MTR_PROVISIONALLY_AVAILABLE = 0x00000001, + MTRCommandIDTypeClusterEnergyEVSEModeCommandChangeToModeID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000000, + MTRCommandIDTypeClusterEnergyEVSEModeCommandChangeToModeResponseID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000001, // Cluster WaterHeaterMode commands - MTRCommandIDTypeClusterWaterHeaterModeCommandChangeToModeID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, - MTRCommandIDTypeClusterWaterHeaterModeCommandChangeToModeResponseID MTR_PROVISIONALLY_AVAILABLE = 0x00000001, + MTRCommandIDTypeClusterWaterHeaterModeCommandChangeToModeID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000000, + MTRCommandIDTypeClusterWaterHeaterModeCommandChangeToModeResponseID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000001, // Cluster DeviceEnergyManagementMode commands MTRCommandIDTypeClusterDeviceEnergyManagementModeCommandChangeToModeID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000000, @@ -6576,10 +6576,10 @@ typedef NS_ENUM(uint32_t, MTRCommandIDType) { MTRCommandIDTypeClusterWindowCoveringCommandGoToTiltPercentageID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x00000008, // Cluster ServiceArea commands - MTRCommandIDTypeClusterServiceAreaCommandSelectAreasID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, - MTRCommandIDTypeClusterServiceAreaCommandSelectAreasResponseID MTR_PROVISIONALLY_AVAILABLE = 0x00000001, - MTRCommandIDTypeClusterServiceAreaCommandSkipAreaID MTR_PROVISIONALLY_AVAILABLE = 0x00000002, - MTRCommandIDTypeClusterServiceAreaCommandSkipAreaResponseID MTR_PROVISIONALLY_AVAILABLE = 0x00000003, + MTRCommandIDTypeClusterServiceAreaCommandSelectAreasID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000000, + MTRCommandIDTypeClusterServiceAreaCommandSelectAreasResponseID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000001, + MTRCommandIDTypeClusterServiceAreaCommandSkipAreaID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000002, + MTRCommandIDTypeClusterServiceAreaCommandSkipAreaResponseID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000003, // Cluster Thermostat deprecated command id names MTRClusterThermostatCommandSetpointRaiseLowerID @@ -6604,10 +6604,10 @@ typedef NS_ENUM(uint32_t, MTRCommandIDType) { MTRCommandIDTypeClusterThermostatCommandSetWeeklyScheduleID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x00000001, MTRCommandIDTypeClusterThermostatCommandGetWeeklyScheduleID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x00000002, MTRCommandIDTypeClusterThermostatCommandClearWeeklyScheduleID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x00000003, - MTRCommandIDTypeClusterThermostatCommandSetActiveScheduleRequestID MTR_PROVISIONALLY_AVAILABLE = 0x00000005, - MTRCommandIDTypeClusterThermostatCommandSetActivePresetRequestID MTR_PROVISIONALLY_AVAILABLE = 0x00000006, - MTRCommandIDTypeClusterThermostatCommandAtomicResponseID MTR_PROVISIONALLY_AVAILABLE = 0x000000FD, - MTRCommandIDTypeClusterThermostatCommandAtomicRequestID MTR_PROVISIONALLY_AVAILABLE = 0x000000FE, + MTRCommandIDTypeClusterThermostatCommandSetActiveScheduleRequestID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000005, + MTRCommandIDTypeClusterThermostatCommandSetActivePresetRequestID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000006, + MTRCommandIDTypeClusterThermostatCommandAtomicResponseID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x000000FD, + MTRCommandIDTypeClusterThermostatCommandAtomicRequestID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x000000FE, // Cluster FanControl deprecated command id names @@ -6695,21 +6695,21 @@ typedef NS_ENUM(uint32_t, MTRCommandIDType) { MTRCommandIDTypeClusterColorControlCommandStepColorTemperatureID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x0000004C, // Cluster WiFiNetworkManagement commands - MTRCommandIDTypeClusterWiFiNetworkManagementCommandNetworkPassphraseRequestID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, - MTRCommandIDTypeClusterWiFiNetworkManagementCommandNetworkPassphraseResponseID MTR_PROVISIONALLY_AVAILABLE = 0x00000001, + MTRCommandIDTypeClusterWiFiNetworkManagementCommandNetworkPassphraseRequestID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000000, + MTRCommandIDTypeClusterWiFiNetworkManagementCommandNetworkPassphraseResponseID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000001, // Cluster ThreadBorderRouterManagement commands - MTRCommandIDTypeClusterThreadBorderRouterManagementCommandGetActiveDatasetRequestID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, - MTRCommandIDTypeClusterThreadBorderRouterManagementCommandGetPendingDatasetRequestID MTR_PROVISIONALLY_AVAILABLE = 0x00000001, - MTRCommandIDTypeClusterThreadBorderRouterManagementCommandDatasetResponseID MTR_PROVISIONALLY_AVAILABLE = 0x00000002, - MTRCommandIDTypeClusterThreadBorderRouterManagementCommandSetActiveDatasetRequestID MTR_PROVISIONALLY_AVAILABLE = 0x00000003, - MTRCommandIDTypeClusterThreadBorderRouterManagementCommandSetPendingDatasetRequestID MTR_PROVISIONALLY_AVAILABLE = 0x00000004, + MTRCommandIDTypeClusterThreadBorderRouterManagementCommandGetActiveDatasetRequestID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000000, + MTRCommandIDTypeClusterThreadBorderRouterManagementCommandGetPendingDatasetRequestID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000001, + MTRCommandIDTypeClusterThreadBorderRouterManagementCommandDatasetResponseID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000002, + MTRCommandIDTypeClusterThreadBorderRouterManagementCommandSetActiveDatasetRequestID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000003, + MTRCommandIDTypeClusterThreadBorderRouterManagementCommandSetPendingDatasetRequestID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000004, // Cluster ThreadNetworkDirectory commands - MTRCommandIDTypeClusterThreadNetworkDirectoryCommandAddNetworkID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, - MTRCommandIDTypeClusterThreadNetworkDirectoryCommandRemoveNetworkID MTR_PROVISIONALLY_AVAILABLE = 0x00000001, - MTRCommandIDTypeClusterThreadNetworkDirectoryCommandGetOperationalDatasetID MTR_PROVISIONALLY_AVAILABLE = 0x00000002, - MTRCommandIDTypeClusterThreadNetworkDirectoryCommandOperationalDatasetResponseID MTR_PROVISIONALLY_AVAILABLE = 0x00000003, + MTRCommandIDTypeClusterThreadNetworkDirectoryCommandAddNetworkID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000000, + MTRCommandIDTypeClusterThreadNetworkDirectoryCommandRemoveNetworkID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000001, + MTRCommandIDTypeClusterThreadNetworkDirectoryCommandGetOperationalDatasetID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000002, + MTRCommandIDTypeClusterThreadNetworkDirectoryCommandOperationalDatasetResponseID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000003, // Cluster Channel deprecated command id names MTRClusterChannelCommandChangeChannelID @@ -6730,10 +6730,10 @@ typedef NS_ENUM(uint32_t, MTRCommandIDType) { MTRCommandIDTypeClusterChannelCommandChangeChannelResponseID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x00000001, MTRCommandIDTypeClusterChannelCommandChangeChannelByNumberID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x00000002, MTRCommandIDTypeClusterChannelCommandSkipChannelID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x00000003, - MTRCommandIDTypeClusterChannelCommandGetProgramGuideID MTR_PROVISIONALLY_AVAILABLE = 0x00000004, - MTRCommandIDTypeClusterChannelCommandProgramGuideResponseID MTR_PROVISIONALLY_AVAILABLE = 0x00000005, - MTRCommandIDTypeClusterChannelCommandRecordProgramID MTR_PROVISIONALLY_AVAILABLE = 0x00000006, - MTRCommandIDTypeClusterChannelCommandCancelRecordProgramID MTR_PROVISIONALLY_AVAILABLE = 0x00000007, + MTRCommandIDTypeClusterChannelCommandGetProgramGuideID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000004, + MTRCommandIDTypeClusterChannelCommandProgramGuideResponseID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000005, + MTRCommandIDTypeClusterChannelCommandRecordProgramID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000006, + MTRCommandIDTypeClusterChannelCommandCancelRecordProgramID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000007, // Cluster TargetNavigator deprecated command id names MTRClusterTargetNavigatorCommandNavigateTargetID @@ -6798,9 +6798,9 @@ typedef NS_ENUM(uint32_t, MTRCommandIDType) { MTRCommandIDTypeClusterMediaPlaybackCommandSkipBackwardID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x00000009, MTRCommandIDTypeClusterMediaPlaybackCommandPlaybackResponseID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x0000000A, MTRCommandIDTypeClusterMediaPlaybackCommandSeekID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x0000000B, - MTRCommandIDTypeClusterMediaPlaybackCommandActivateAudioTrackID MTR_PROVISIONALLY_AVAILABLE = 0x0000000C, - MTRCommandIDTypeClusterMediaPlaybackCommandActivateTextTrackID MTR_PROVISIONALLY_AVAILABLE = 0x0000000D, - MTRCommandIDTypeClusterMediaPlaybackCommandDeactivateTextTrackID MTR_PROVISIONALLY_AVAILABLE = 0x0000000E, + MTRCommandIDTypeClusterMediaPlaybackCommandActivateAudioTrackID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x0000000C, + MTRCommandIDTypeClusterMediaPlaybackCommandActivateTextTrackID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x0000000D, + MTRCommandIDTypeClusterMediaPlaybackCommandDeactivateTextTrackID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x0000000E, // Cluster MediaInput deprecated command id names MTRClusterMediaInputCommandSelectInputID @@ -6924,8 +6924,8 @@ typedef NS_ENUM(uint32_t, MTRCommandIDType) { MTRCommandIDTypeClusterContentControlCommandSetScheduledContentRatingThresholdID MTR_PROVISIONALLY_AVAILABLE = 0x0000000A, // Cluster ContentAppObserver commands - MTRCommandIDTypeClusterContentAppObserverCommandContentAppMessageID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, - MTRCommandIDTypeClusterContentAppObserverCommandContentAppMessageResponseID MTR_PROVISIONALLY_AVAILABLE = 0x00000001, + MTRCommandIDTypeClusterContentAppObserverCommandContentAppMessageID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000000, + MTRCommandIDTypeClusterContentAppObserverCommandContentAppMessageResponseID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000001, // Cluster ZoneManagement commands MTRCommandIDTypeClusterZoneManagementCommandCreateTwoDCartesianZoneID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, @@ -6988,9 +6988,9 @@ typedef NS_ENUM(uint32_t, MTRCommandIDType) { MTRCommandIDTypeClusterChimeCommandPlayChimeSoundID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, // Cluster CommissionerControl commands - MTRCommandIDTypeClusterCommissionerControlCommandRequestCommissioningApprovalID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, - MTRCommandIDTypeClusterCommissionerControlCommandCommissionNodeID MTR_PROVISIONALLY_AVAILABLE = 0x00000001, - MTRCommandIDTypeClusterCommissionerControlCommandReverseOpenCommissioningWindowID MTR_PROVISIONALLY_AVAILABLE = 0x00000002, + MTRCommandIDTypeClusterCommissionerControlCommandRequestCommissioningApprovalID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000000, + MTRCommandIDTypeClusterCommissionerControlCommandCommissionNodeID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000001, + MTRCommandIDTypeClusterCommissionerControlCommandReverseOpenCommissioningWindowID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000002, // Cluster TLSCertificateManagement commands MTRCommandIDTypeClusterTLSCertificateManagementCommandProvisionRootCertificateID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, @@ -7212,7 +7212,7 @@ typedef NS_ENUM(uint32_t, MTREventIDType) { // Cluster AccessControl events MTREventIDTypeClusterAccessControlEventAccessControlEntryChangedID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x00000000, MTREventIDTypeClusterAccessControlEventAccessControlExtensionChangedID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x00000001, - MTREventIDTypeClusterAccessControlEventFabricRestrictionReviewUpdateID MTR_PROVISIONALLY_AVAILABLE = 0x00000002, + MTREventIDTypeClusterAccessControlEventFabricRestrictionReviewUpdateID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000002, // Cluster Actions deprecated event names MTRClusterActionsEventStateChangedID @@ -7328,11 +7328,11 @@ typedef NS_ENUM(uint32_t, MTREventIDType) { // Cluster TimeSynchronization deprecated event names // Cluster TimeSynchronization events - MTREventIDTypeClusterTimeSynchronizationEventDSTTableEmptyID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, - MTREventIDTypeClusterTimeSynchronizationEventDSTStatusID MTR_PROVISIONALLY_AVAILABLE = 0x00000001, - MTREventIDTypeClusterTimeSynchronizationEventTimeZoneStatusID MTR_PROVISIONALLY_AVAILABLE = 0x00000002, - MTREventIDTypeClusterTimeSynchronizationEventTimeFailureID MTR_PROVISIONALLY_AVAILABLE = 0x00000003, - MTREventIDTypeClusterTimeSynchronizationEventMissingTrustedTimeSourceID MTR_PROVISIONALLY_AVAILABLE = 0x00000004, + MTREventIDTypeClusterTimeSynchronizationEventDSTTableEmptyID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000000, + MTREventIDTypeClusterTimeSynchronizationEventDSTStatusID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000001, + MTREventIDTypeClusterTimeSynchronizationEventTimeZoneStatusID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000002, + MTREventIDTypeClusterTimeSynchronizationEventTimeFailureID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000003, + MTREventIDTypeClusterTimeSynchronizationEventMissingTrustedTimeSourceID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000004, // Cluster BridgedDeviceBasic deprecated event names MTRClusterBridgedDeviceBasicEventStartUpID @@ -7353,7 +7353,7 @@ typedef NS_ENUM(uint32_t, MTREventIDType) { MTREventIDTypeClusterBridgedDeviceBasicInformationEventShutDownID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x00000001, MTREventIDTypeClusterBridgedDeviceBasicInformationEventLeaveID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x00000002, MTREventIDTypeClusterBridgedDeviceBasicInformationEventReachableChangedID MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) = 0x00000003, - MTREventIDTypeClusterBridgedDeviceBasicInformationEventActiveChangedID MTR_PROVISIONALLY_AVAILABLE = 0x00000080, + MTREventIDTypeClusterBridgedDeviceBasicInformationEventActiveChangedID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000080, // Cluster Switch deprecated event names MTRClusterSwitchEventSwitchLatchedID @@ -7442,16 +7442,16 @@ typedef NS_ENUM(uint32_t, MTREventIDType) { MTREventIDTypeClusterElectricalEnergyMeasurementEventPeriodicEnergyMeasuredID MTR_AVAILABLE(ios(17.6), macos(14.6), watchos(10.6), tvos(17.6)) = 0x00000001, // Cluster WaterHeaterManagement events - MTREventIDTypeClusterWaterHeaterManagementEventBoostStartedID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, - MTREventIDTypeClusterWaterHeaterManagementEventBoostEndedID MTR_PROVISIONALLY_AVAILABLE = 0x00000001, + MTREventIDTypeClusterWaterHeaterManagementEventBoostStartedID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000000, + MTREventIDTypeClusterWaterHeaterManagementEventBoostEndedID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000001, // Cluster DemandResponseLoadControl events MTREventIDTypeClusterDemandResponseLoadControlEventLoadControlEventStatusChangeID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, // Cluster Messages events - MTREventIDTypeClusterMessagesEventMessageQueuedID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, - MTREventIDTypeClusterMessagesEventMessagePresentedID MTR_PROVISIONALLY_AVAILABLE = 0x00000001, - MTREventIDTypeClusterMessagesEventMessageCompleteID MTR_PROVISIONALLY_AVAILABLE = 0x00000002, + MTREventIDTypeClusterMessagesEventMessageQueuedID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000000, + MTREventIDTypeClusterMessagesEventMessagePresentedID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000001, + MTREventIDTypeClusterMessagesEventMessageCompleteID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000002, // Cluster DeviceEnergyManagement events MTREventIDTypeClusterDeviceEnergyManagementEventPowerAdjustStartID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000000, @@ -7460,12 +7460,12 @@ typedef NS_ENUM(uint32_t, MTREventIDType) { MTREventIDTypeClusterDeviceEnergyManagementEventResumedID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000003, // Cluster EnergyEVSE events - MTREventIDTypeClusterEnergyEVSEEventEVConnectedID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, - MTREventIDTypeClusterEnergyEVSEEventEVNotDetectedID MTR_PROVISIONALLY_AVAILABLE = 0x00000001, - MTREventIDTypeClusterEnergyEVSEEventEnergyTransferStartedID MTR_PROVISIONALLY_AVAILABLE = 0x00000002, - MTREventIDTypeClusterEnergyEVSEEventEnergyTransferStoppedID MTR_PROVISIONALLY_AVAILABLE = 0x00000003, - MTREventIDTypeClusterEnergyEVSEEventFaultID MTR_PROVISIONALLY_AVAILABLE = 0x00000004, - MTREventIDTypeClusterEnergyEVSEEventRFIDID MTR_PROVISIONALLY_AVAILABLE = 0x00000005, + MTREventIDTypeClusterEnergyEVSEEventEVConnectedID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000000, + MTREventIDTypeClusterEnergyEVSEEventEVNotDetectedID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000001, + MTREventIDTypeClusterEnergyEVSEEventEnergyTransferStartedID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000002, + MTREventIDTypeClusterEnergyEVSEEventEnergyTransferStoppedID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000003, + MTREventIDTypeClusterEnergyEVSEEventFaultID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000004, + MTREventIDTypeClusterEnergyEVSEEventRFIDID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000005, // Cluster DoorLock deprecated event names MTRClusterDoorLockEventDoorLockAlarmID @@ -7566,22 +7566,22 @@ typedef NS_ENUM(uint32_t, MTREventIDType) { // Cluster OccupancySensing deprecated event names // Cluster OccupancySensing events - MTREventIDTypeClusterOccupancySensingEventOccupancyChangedID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, + MTREventIDTypeClusterOccupancySensingEventOccupancyChangedID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000000, // Cluster TargetNavigator deprecated event names // Cluster TargetNavigator events - MTREventIDTypeClusterTargetNavigatorEventTargetUpdatedID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, + MTREventIDTypeClusterTargetNavigatorEventTargetUpdatedID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000000, // Cluster MediaPlayback deprecated event names // Cluster MediaPlayback events - MTREventIDTypeClusterMediaPlaybackEventStateChangedID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, + MTREventIDTypeClusterMediaPlaybackEventStateChangedID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000000, // Cluster AccountLogin deprecated event names // Cluster AccountLogin events - MTREventIDTypeClusterAccountLoginEventLoggedOutID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, + MTREventIDTypeClusterAccountLoginEventLoggedOutID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000000, // Cluster ContentControl events MTREventIDTypeClusterContentControlEventRemainingScreenTimeExpiredID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, @@ -7600,7 +7600,7 @@ typedef NS_ENUM(uint32_t, MTREventIDType) { MTREventIDTypeClusterPushAVStreamTransportEventPushTransportEndID MTR_PROVISIONALLY_AVAILABLE = 0x00000001, // Cluster CommissionerControl events - MTREventIDTypeClusterCommissionerControlEventCommissioningRequestResultID MTR_PROVISIONALLY_AVAILABLE = 0x00000000, + MTREventIDTypeClusterCommissionerControlEventCommissioningRequestResultID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) = 0x00000000, // Cluster TestCluster deprecated event names MTRClusterTestClusterEventTestEventID diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRClusters.h b/src/darwin/Framework/CHIP/zap-generated/MTRClusters.h index 500436c2afa82a..f1af62ad5191cc 100644 --- a/src/darwin/Framework/CHIP/zap-generated/MTRClusters.h +++ b/src/darwin/Framework/CHIP/zap-generated/MTRClusters.h @@ -388,7 +388,7 @@ MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) @interface MTRClusterAccessControl : MTRGenericCluster -- (void)reviewFabricRestrictionsWithParams:(MTRAccessControlClusterReviewFabricRestrictionsParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(void (^)(MTRAccessControlClusterReviewFabricRestrictionsResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)reviewFabricRestrictionsWithParams:(MTRAccessControlClusterReviewFabricRestrictionsParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(void (^)(MTRAccessControlClusterReviewFabricRestrictionsResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (NSDictionary * _Nullable)readAttributeACLWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)); - (void)writeAttributeACLWithValue:(NSDictionary *)dataValueDictionary expectedValueInterval:(NSNumber *)expectedValueIntervalMs MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)); @@ -404,9 +404,9 @@ MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) - (NSDictionary * _Nullable)readAttributeAccessControlEntriesPerFabricWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)); -- (NSDictionary * _Nullable)readAttributeCommissioningARLWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeCommissioningARLWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeARLWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeARLWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (NSDictionary * _Nullable)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)); @@ -545,9 +545,9 @@ MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) - (NSDictionary * _Nullable)readAttributeProductAppearanceWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(17.0), macos(14.0), watchos(10.0), tvos(17.0)); -- (NSDictionary * _Nullable)readAttributeSpecificationVersionWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeSpecificationVersionWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeMaxPathsPerInvokeWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeMaxPathsPerInvokeWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (NSDictionary * _Nullable)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)); @@ -1023,11 +1023,11 @@ MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) - (NSDictionary * _Nullable)readAttributeLastConnectErrorValueWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)); -- (NSDictionary * _Nullable)readAttributeSupportedWiFiBandsWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeSupportedWiFiBandsWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeSupportedThreadFeaturesWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeSupportedThreadFeaturesWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeThreadVersionWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeThreadVersionWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (NSDictionary * _Nullable)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)); @@ -1100,10 +1100,10 @@ MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) @interface MTRClusterGeneralDiagnostics : MTRGenericCluster - (void)testEventTriggerWithParams:(MTRGeneralDiagnosticsClusterTestEventTriggerParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)); -- (void)timeSnapshotWithParams:(MTRGeneralDiagnosticsClusterTimeSnapshotParams * _Nullable)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(void (^)(MTRGeneralDiagnosticsClusterTimeSnapshotResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)timeSnapshotWithParams:(MTRGeneralDiagnosticsClusterTimeSnapshotParams * _Nullable)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(void (^)(MTRGeneralDiagnosticsClusterTimeSnapshotResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)timeSnapshotWithExpectedValues:(NSArray *> * _Nullable)expectedValues expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(void (^)(MTRGeneralDiagnosticsClusterTimeSnapshotResponseParams * _Nullable data, NSError * _Nullable error))completion - MTR_PROVISIONALLY_AVAILABLE; -- (void)payloadTestRequestWithParams:(MTRGeneralDiagnosticsClusterPayloadTestRequestParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(void (^)(MTRGeneralDiagnosticsClusterPayloadTestResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +- (void)payloadTestRequestWithParams:(MTRGeneralDiagnosticsClusterPayloadTestRequestParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(void (^)(MTRGeneralDiagnosticsClusterPayloadTestResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (NSDictionary * _Nullable)readAttributeNetworkInterfacesWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)); @@ -1484,50 +1484,50 @@ MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) * Cluster Time Synchronization * Accurate time is required for a number of reasons, including scheduling, display and validating security materials. */ -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRClusterTimeSynchronization : MTRGenericCluster -- (void)setUTCTimeWithParams:(MTRTimeSynchronizationClusterSetUTCTimeParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; -- (void)setTrustedTimeSourceWithParams:(MTRTimeSynchronizationClusterSetTrustedTimeSourceParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; -- (void)setTimeZoneWithParams:(MTRTimeSynchronizationClusterSetTimeZoneParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(void (^)(MTRTimeSynchronizationClusterSetTimeZoneResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; -- (void)setDSTOffsetWithParams:(MTRTimeSynchronizationClusterSetDSTOffsetParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; -- (void)setDefaultNTPWithParams:(MTRTimeSynchronizationClusterSetDefaultNTPParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; +- (void)setUTCTimeWithParams:(MTRTimeSynchronizationClusterSetUTCTimeParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +- (void)setTrustedTimeSourceWithParams:(MTRTimeSynchronizationClusterSetTrustedTimeSourceParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +- (void)setTimeZoneWithParams:(MTRTimeSynchronizationClusterSetTimeZoneParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(void (^)(MTRTimeSynchronizationClusterSetTimeZoneResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +- (void)setDSTOffsetWithParams:(MTRTimeSynchronizationClusterSetDSTOffsetParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +- (void)setDefaultNTPWithParams:(MTRTimeSynchronizationClusterSetDefaultNTPParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeUTCTimeWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeUTCTimeWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeGranularityWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeGranularityWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeTimeSourceWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeTimeSourceWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeTrustedTimeSourceWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeTrustedTimeSourceWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeDefaultNTPWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeDefaultNTPWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeTimeZoneWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeTimeZoneWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeDSTOffsetWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeDSTOffsetWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeLocalTimeWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeLocalTimeWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeTimeZoneDatabaseWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeTimeZoneDatabaseWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeNTPServerAvailableWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeNTPServerAvailableWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeTimeZoneListMaxSizeWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeTimeZoneListMaxSizeWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeDSTOffsetListMaxSizeWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeDSTOffsetListMaxSizeWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeSupportsDNSResolveWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeSupportsDNSResolveWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (instancetype)init NS_UNAVAILABLE; + (instancetype)new NS_UNAVAILABLE; @@ -1542,7 +1542,7 @@ MTR_PROVISIONALLY_AVAILABLE */ - (instancetype _Nullable)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID - queue:(dispatch_queue_t)queue MTR_PROVISIONALLY_AVAILABLE; + queue:(dispatch_queue_t)queue MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end @@ -1556,7 +1556,7 @@ MTR_PROVISIONALLY_AVAILABLE MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) @interface MTRClusterBridgedDeviceBasicInformation : MTRGenericCluster -- (void)keepActiveWithParams:(MTRBridgedDeviceBasicInformationClusterKeepActiveParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; +- (void)keepActiveWithParams:(MTRBridgedDeviceBasicInformationClusterKeepActiveParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (NSDictionary * _Nullable)readAttributeVendorNameWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)); @@ -1564,7 +1564,7 @@ MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) - (NSDictionary * _Nullable)readAttributeProductNameWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)); -- (NSDictionary * _Nullable)readAttributeProductIDWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeProductIDWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (NSDictionary * _Nullable)readAttributeNodeLabelWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)); - (void)writeAttributeNodeLabelWithValue:(NSDictionary *)dataValueDictionary expectedValueInterval:(NSNumber *)expectedValueIntervalMs MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)); @@ -3307,35 +3307,35 @@ MTR_AVAILABLE(ios(17.6), macos(14.6), watchos(10.6), tvos(17.6)) * Cluster Water Heater Management * 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. */ -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRClusterWaterHeaterManagement : MTRGenericCluster -- (void)boostWithParams:(MTRWaterHeaterManagementClusterBoostParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; -- (void)cancelBoostWithParams:(MTRWaterHeaterManagementClusterCancelBoostParams * _Nullable)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; +- (void)boostWithParams:(MTRWaterHeaterManagementClusterBoostParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +- (void)cancelBoostWithParams:(MTRWaterHeaterManagementClusterCancelBoostParams * _Nullable)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)cancelBoostWithExpectedValues:(NSArray *> * _Nullable)expectedValues expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion - MTR_PROVISIONALLY_AVAILABLE; + MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeHeaterTypesWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeHeaterTypesWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeHeatDemandWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeHeatDemandWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeTankVolumeWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeTankVolumeWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeEstimatedHeatRequiredWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeEstimatedHeatRequiredWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeTankPercentageWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeTankPercentageWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeBoostStateWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeBoostStateWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (instancetype)init NS_UNAVAILABLE; + (instancetype)new NS_UNAVAILABLE; @@ -3350,7 +3350,7 @@ MTR_PROVISIONALLY_AVAILABLE */ - (instancetype _Nullable)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID - queue:(dispatch_queue_t)queue MTR_PROVISIONALLY_AVAILABLE; + queue:(dispatch_queue_t)queue MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end @@ -3420,25 +3420,25 @@ MTR_PROVISIONALLY_AVAILABLE * Cluster Messages * This cluster provides an interface for passing messages to be presented by a device. */ -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRClusterMessages : MTRGenericCluster -- (void)presentMessagesRequestWithParams:(MTRMessagesClusterPresentMessagesRequestParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; -- (void)cancelMessagesRequestWithParams:(MTRMessagesClusterCancelMessagesRequestParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; +- (void)presentMessagesRequestWithParams:(MTRMessagesClusterPresentMessagesRequestParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +- (void)cancelMessagesRequestWithParams:(MTRMessagesClusterCancelMessagesRequestParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeMessagesWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeMessagesWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeActiveMessageIDsWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeActiveMessageIDsWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (instancetype)init NS_UNAVAILABLE; + (instancetype)new NS_UNAVAILABLE; @@ -3453,7 +3453,7 @@ MTR_PROVISIONALLY_AVAILABLE */ - (instancetype _Nullable)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID - queue:(dispatch_queue_t)queue MTR_PROVISIONALLY_AVAILABLE; + queue:(dispatch_queue_t)queue MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end @@ -3526,62 +3526,62 @@ MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) * Cluster Energy EVSE * Electric Vehicle Supply Equipment (EVSE) is equipment used to charge an Electric Vehicle (EV) or Plug-In Hybrid Electric Vehicle. This cluster provides an interface to the functionality of Electric Vehicle Supply Equipment (EVSE) management. */ -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRClusterEnergyEVSE : MTRGenericCluster -- (void)disableWithParams:(MTREnergyEVSEClusterDisableParams * _Nullable)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; +- (void)disableWithParams:(MTREnergyEVSEClusterDisableParams * _Nullable)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)disableWithExpectedValues:(NSArray *> * _Nullable)expectedValues expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion - MTR_PROVISIONALLY_AVAILABLE; -- (void)enableChargingWithParams:(MTREnergyEVSEClusterEnableChargingParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; + MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +- (void)enableChargingWithParams:(MTREnergyEVSEClusterEnableChargingParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)enableDischargingWithParams:(MTREnergyEVSEClusterEnableDischargingParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; -- (void)startDiagnosticsWithParams:(MTREnergyEVSEClusterStartDiagnosticsParams * _Nullable)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; +- (void)startDiagnosticsWithParams:(MTREnergyEVSEClusterStartDiagnosticsParams * _Nullable)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)startDiagnosticsWithExpectedValues:(NSArray *> * _Nullable)expectedValues expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion - MTR_PROVISIONALLY_AVAILABLE; -- (void)setTargetsWithParams:(MTREnergyEVSEClusterSetTargetsParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; -- (void)getTargetsWithParams:(MTREnergyEVSEClusterGetTargetsParams * _Nullable)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(void (^)(MTREnergyEVSEClusterGetTargetsResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +- (void)setTargetsWithParams:(MTREnergyEVSEClusterSetTargetsParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +- (void)getTargetsWithParams:(MTREnergyEVSEClusterGetTargetsParams * _Nullable)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(void (^)(MTREnergyEVSEClusterGetTargetsResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)getTargetsWithExpectedValues:(NSArray *> * _Nullable)expectedValues expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(void (^)(MTREnergyEVSEClusterGetTargetsResponseParams * _Nullable data, NSError * _Nullable error))completion - MTR_PROVISIONALLY_AVAILABLE; -- (void)clearTargetsWithParams:(MTREnergyEVSEClusterClearTargetsParams * _Nullable)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; + MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +- (void)clearTargetsWithParams:(MTREnergyEVSEClusterClearTargetsParams * _Nullable)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)clearTargetsWithExpectedValues:(NSArray *> * _Nullable)expectedValues expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion - MTR_PROVISIONALLY_AVAILABLE; + MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeStateWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeStateWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeSupplyStateWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeSupplyStateWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeFaultStateWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeFaultStateWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeChargingEnabledUntilWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeChargingEnabledUntilWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (NSDictionary * _Nullable)readAttributeDischargingEnabledUntilWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; -- (NSDictionary * _Nullable)readAttributeCircuitCapacityWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeCircuitCapacityWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeMinimumChargeCurrentWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeMinimumChargeCurrentWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeMaximumChargeCurrentWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeMaximumChargeCurrentWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (NSDictionary * _Nullable)readAttributeMaximumDischargeCurrentWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; -- (NSDictionary * _Nullable)readAttributeUserMaximumChargeCurrentWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; -- (void)writeAttributeUserMaximumChargeCurrentWithValue:(NSDictionary *)dataValueDictionary expectedValueInterval:(NSNumber *)expectedValueIntervalMs MTR_PROVISIONALLY_AVAILABLE; -- (void)writeAttributeUserMaximumChargeCurrentWithValue:(NSDictionary *)dataValueDictionary expectedValueInterval:(NSNumber *)expectedValueIntervalMs params:(MTRWriteParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeUserMaximumChargeCurrentWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +- (void)writeAttributeUserMaximumChargeCurrentWithValue:(NSDictionary *)dataValueDictionary expectedValueInterval:(NSNumber *)expectedValueIntervalMs MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +- (void)writeAttributeUserMaximumChargeCurrentWithValue:(NSDictionary *)dataValueDictionary expectedValueInterval:(NSNumber *)expectedValueIntervalMs params:(MTRWriteParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeRandomizationDelayWindowWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; -- (void)writeAttributeRandomizationDelayWindowWithValue:(NSDictionary *)dataValueDictionary expectedValueInterval:(NSNumber *)expectedValueIntervalMs MTR_PROVISIONALLY_AVAILABLE; -- (void)writeAttributeRandomizationDelayWindowWithValue:(NSDictionary *)dataValueDictionary expectedValueInterval:(NSNumber *)expectedValueIntervalMs params:(MTRWriteParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeRandomizationDelayWindowWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +- (void)writeAttributeRandomizationDelayWindowWithValue:(NSDictionary *)dataValueDictionary expectedValueInterval:(NSNumber *)expectedValueIntervalMs MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +- (void)writeAttributeRandomizationDelayWindowWithValue:(NSDictionary *)dataValueDictionary expectedValueInterval:(NSNumber *)expectedValueIntervalMs params:(MTRWriteParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeNextChargeStartTimeWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeNextChargeStartTimeWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeNextChargeTargetTimeWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeNextChargeTargetTimeWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeNextChargeRequiredEnergyWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeNextChargeRequiredEnergyWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeNextChargeTargetSoCWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeNextChargeTargetSoCWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeApproximateEVEfficiencyWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; -- (void)writeAttributeApproximateEVEfficiencyWithValue:(NSDictionary *)dataValueDictionary expectedValueInterval:(NSNumber *)expectedValueIntervalMs MTR_PROVISIONALLY_AVAILABLE; -- (void)writeAttributeApproximateEVEfficiencyWithValue:(NSDictionary *)dataValueDictionary expectedValueInterval:(NSNumber *)expectedValueIntervalMs params:(MTRWriteParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeApproximateEVEfficiencyWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +- (void)writeAttributeApproximateEVEfficiencyWithValue:(NSDictionary *)dataValueDictionary expectedValueInterval:(NSNumber *)expectedValueIntervalMs MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +- (void)writeAttributeApproximateEVEfficiencyWithValue:(NSDictionary *)dataValueDictionary expectedValueInterval:(NSNumber *)expectedValueIntervalMs params:(MTRWriteParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (NSDictionary * _Nullable)readAttributeStateOfChargeWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; @@ -3589,23 +3589,23 @@ MTR_PROVISIONALLY_AVAILABLE - (NSDictionary * _Nullable)readAttributeVehicleIDWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; -- (NSDictionary * _Nullable)readAttributeSessionIDWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeSessionIDWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeSessionDurationWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeSessionDurationWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeSessionEnergyChargedWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeSessionEnergyChargedWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (NSDictionary * _Nullable)readAttributeSessionEnergyDischargedWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; -- (NSDictionary * _Nullable)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (instancetype)init NS_UNAVAILABLE; + (instancetype)new NS_UNAVAILABLE; @@ -3620,7 +3620,7 @@ MTR_PROVISIONALLY_AVAILABLE */ - (instancetype _Nullable)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID - queue:(dispatch_queue_t)queue MTR_PROVISIONALLY_AVAILABLE; + queue:(dispatch_queue_t)queue MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end @@ -3676,22 +3676,22 @@ MTR_PROVISIONALLY_AVAILABLE * Cluster Power Topology * The Power Topology Cluster provides a mechanism for expressing how power is flowing between endpoints. */ -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRClusterPowerTopology : MTRGenericCluster -- (NSDictionary * _Nullable)readAttributeAvailableEndpointsWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeAvailableEndpointsWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeActiveEndpointsWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeActiveEndpointsWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (instancetype)init NS_UNAVAILABLE; + (instancetype)new NS_UNAVAILABLE; @@ -3706,7 +3706,7 @@ MTR_PROVISIONALLY_AVAILABLE */ - (instancetype _Nullable)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID - queue:(dispatch_queue_t)queue MTR_PROVISIONALLY_AVAILABLE; + queue:(dispatch_queue_t)queue MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end @@ -3714,24 +3714,24 @@ MTR_PROVISIONALLY_AVAILABLE * Cluster Energy EVSE Mode * Attributes and commands for selecting a mode from a list of supported options. */ -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRClusterEnergyEVSEMode : MTRGenericCluster -- (void)changeToModeWithParams:(MTREnergyEVSEModeClusterChangeToModeParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(void (^)(MTREnergyEVSEModeClusterChangeToModeResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)changeToModeWithParams:(MTREnergyEVSEModeClusterChangeToModeParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(void (^)(MTREnergyEVSEModeClusterChangeToModeResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeSupportedModesWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeSupportedModesWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeCurrentModeWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeCurrentModeWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (instancetype)init NS_UNAVAILABLE; + (instancetype)new NS_UNAVAILABLE; @@ -3746,7 +3746,7 @@ MTR_PROVISIONALLY_AVAILABLE */ - (instancetype _Nullable)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID - queue:(dispatch_queue_t)queue MTR_PROVISIONALLY_AVAILABLE; + queue:(dispatch_queue_t)queue MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end @@ -3754,24 +3754,24 @@ MTR_PROVISIONALLY_AVAILABLE * Cluster Water Heater Mode * Attributes and commands for selecting a mode from a list of supported options. */ -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRClusterWaterHeaterMode : MTRGenericCluster -- (void)changeToModeWithParams:(MTRWaterHeaterModeClusterChangeToModeParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(void (^)(MTRWaterHeaterModeClusterChangeToModeResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)changeToModeWithParams:(MTRWaterHeaterModeClusterChangeToModeParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(void (^)(MTRWaterHeaterModeClusterChangeToModeResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeSupportedModesWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeSupportedModesWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeCurrentModeWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeCurrentModeWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (instancetype)init NS_UNAVAILABLE; + (instancetype)new NS_UNAVAILABLE; @@ -3786,7 +3786,7 @@ MTR_PROVISIONALLY_AVAILABLE */ - (instancetype _Nullable)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID - queue:(dispatch_queue_t)queue MTR_PROVISIONALLY_AVAILABLE; + queue:(dispatch_queue_t)queue MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end @@ -4118,33 +4118,33 @@ MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) * Cluster Service Area * The Service Area cluster provides an interface for controlling the areas where a device should operate, and for querying the current area being serviced. */ -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRClusterServiceArea : MTRGenericCluster -- (void)selectAreasWithParams:(MTRServiceAreaClusterSelectAreasParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(void (^)(MTRServiceAreaClusterSelectAreasResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; -- (void)skipAreaWithParams:(MTRServiceAreaClusterSkipAreaParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(void (^)(MTRServiceAreaClusterSkipAreaResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)selectAreasWithParams:(MTRServiceAreaClusterSelectAreasParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(void (^)(MTRServiceAreaClusterSelectAreasResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +- (void)skipAreaWithParams:(MTRServiceAreaClusterSkipAreaParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(void (^)(MTRServiceAreaClusterSkipAreaResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeSupportedAreasWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeSupportedAreasWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeSupportedMapsWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeSupportedMapsWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeSelectedAreasWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeSelectedAreasWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeCurrentAreaWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeCurrentAreaWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeEstimatedEndTimeWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeEstimatedEndTimeWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeProgressWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeProgressWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (instancetype)init NS_UNAVAILABLE; + (instancetype)new NS_UNAVAILABLE; @@ -4159,7 +4159,7 @@ MTR_PROVISIONALLY_AVAILABLE */ - (instancetype _Nullable)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID - queue:(dispatch_queue_t)queue MTR_PROVISIONALLY_AVAILABLE; + queue:(dispatch_queue_t)queue MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end @@ -4264,9 +4264,9 @@ MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) - (void)clearWeeklyScheduleWithParams:(MTRThermostatClusterClearWeeklyScheduleParams * _Nullable)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)); - (void)clearWeeklyScheduleWithExpectedValues:(NSArray *> * _Nullable)expectedValues expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)); -- (void)setActiveScheduleRequestWithParams:(MTRThermostatClusterSetActiveScheduleRequestParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; -- (void)setActivePresetRequestWithParams:(MTRThermostatClusterSetActivePresetRequestParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; -- (void)atomicRequestWithParams:(MTRThermostatClusterAtomicRequestParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(void (^)(MTRThermostatClusterAtomicResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)setActiveScheduleRequestWithParams:(MTRThermostatClusterSetActiveScheduleRequestParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +- (void)setActivePresetRequestWithParams:(MTRThermostatClusterSetActivePresetRequestParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +- (void)atomicRequestWithParams:(MTRThermostatClusterAtomicRequestParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(void (^)(MTRThermostatClusterAtomicResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (NSDictionary * _Nullable)readAttributeLocalTemperatureWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)); @@ -4420,31 +4420,31 @@ MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) - (void)writeAttributeACCapacityformatWithValue:(NSDictionary *)dataValueDictionary expectedValueInterval:(NSNumber *)expectedValueIntervalMs MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)); - (void)writeAttributeACCapacityformatWithValue:(NSDictionary *)dataValueDictionary expectedValueInterval:(NSNumber *)expectedValueIntervalMs params:(MTRWriteParams * _Nullable)params MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)); -- (NSDictionary * _Nullable)readAttributePresetTypesWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributePresetTypesWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeScheduleTypesWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeScheduleTypesWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeNumberOfPresetsWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeNumberOfPresetsWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeNumberOfSchedulesWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeNumberOfSchedulesWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeNumberOfScheduleTransitionsWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeNumberOfScheduleTransitionsWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeNumberOfScheduleTransitionPerDayWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeNumberOfScheduleTransitionPerDayWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeActivePresetHandleWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeActivePresetHandleWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeActiveScheduleHandleWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeActiveScheduleHandleWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributePresetsWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; -- (void)writeAttributePresetsWithValue:(NSDictionary *)dataValueDictionary expectedValueInterval:(NSNumber *)expectedValueIntervalMs MTR_PROVISIONALLY_AVAILABLE; -- (void)writeAttributePresetsWithValue:(NSDictionary *)dataValueDictionary expectedValueInterval:(NSNumber *)expectedValueIntervalMs params:(MTRWriteParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributePresetsWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +- (void)writeAttributePresetsWithValue:(NSDictionary *)dataValueDictionary expectedValueInterval:(NSNumber *)expectedValueIntervalMs MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +- (void)writeAttributePresetsWithValue:(NSDictionary *)dataValueDictionary expectedValueInterval:(NSNumber *)expectedValueIntervalMs params:(MTRWriteParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeSchedulesWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; -- (void)writeAttributeSchedulesWithValue:(NSDictionary *)dataValueDictionary expectedValueInterval:(NSNumber *)expectedValueIntervalMs MTR_PROVISIONALLY_AVAILABLE; -- (void)writeAttributeSchedulesWithValue:(NSDictionary *)dataValueDictionary expectedValueInterval:(NSNumber *)expectedValueIntervalMs params:(MTRWriteParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeSchedulesWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +- (void)writeAttributeSchedulesWithValue:(NSDictionary *)dataValueDictionary expectedValueInterval:(NSNumber *)expectedValueIntervalMs MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +- (void)writeAttributeSchedulesWithValue:(NSDictionary *)dataValueDictionary expectedValueInterval:(NSNumber *)expectedValueIntervalMs params:(MTRWriteParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeSetpointHoldExpiryTimestampWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeSetpointHoldExpiryTimestampWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (NSDictionary * _Nullable)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)); @@ -5094,11 +5094,11 @@ MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) - (NSDictionary * _Nullable)readAttributeOccupancySensorTypeBitmapWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)); -- (NSDictionary * _Nullable)readAttributeHoldTimeWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; -- (void)writeAttributeHoldTimeWithValue:(NSDictionary *)dataValueDictionary expectedValueInterval:(NSNumber *)expectedValueIntervalMs MTR_PROVISIONALLY_AVAILABLE; -- (void)writeAttributeHoldTimeWithValue:(NSDictionary *)dataValueDictionary expectedValueInterval:(NSNumber *)expectedValueIntervalMs params:(MTRWriteParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeHoldTimeWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +- (void)writeAttributeHoldTimeWithValue:(NSDictionary *)dataValueDictionary expectedValueInterval:(NSNumber *)expectedValueIntervalMs MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +- (void)writeAttributeHoldTimeWithValue:(NSDictionary *)dataValueDictionary expectedValueInterval:(NSNumber *)expectedValueIntervalMs params:(MTRWriteParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeHoldTimeLimitsWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeHoldTimeLimitsWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (NSDictionary * _Nullable)readAttributePIROccupiedToUnoccupiedDelayWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)); - (void)writeAttributePIROccupiedToUnoccupiedDelayWithValue:(NSDictionary *)dataValueDictionary expectedValueInterval:(NSNumber *)expectedValueIntervalMs MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)); @@ -5727,26 +5727,26 @@ MTR_AVAILABLE(ios(17.6), macos(14.6), watchos(10.6), tvos(17.6)) * Cluster Wi-Fi Network Management * Functionality to retrieve operational information about a managed Wi-Fi network. */ -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRClusterWiFiNetworkManagement : MTRGenericCluster -- (void)networkPassphraseRequestWithParams:(MTRWiFiNetworkManagementClusterNetworkPassphraseRequestParams * _Nullable)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(void (^)(MTRWiFiNetworkManagementClusterNetworkPassphraseResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)networkPassphraseRequestWithParams:(MTRWiFiNetworkManagementClusterNetworkPassphraseRequestParams * _Nullable)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(void (^)(MTRWiFiNetworkManagementClusterNetworkPassphraseResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)networkPassphraseRequestWithExpectedValues:(NSArray *> * _Nullable)expectedValues expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(void (^)(MTRWiFiNetworkManagementClusterNetworkPassphraseResponseParams * _Nullable data, NSError * _Nullable error))completion - MTR_PROVISIONALLY_AVAILABLE; + MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeSSIDWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeSSIDWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributePassphraseSurrogateWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributePassphraseSurrogateWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (instancetype)init NS_UNAVAILABLE; + (instancetype)new NS_UNAVAILABLE; @@ -5761,7 +5761,7 @@ MTR_PROVISIONALLY_AVAILABLE */ - (instancetype _Nullable)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID - queue:(dispatch_queue_t)queue MTR_PROVISIONALLY_AVAILABLE; + queue:(dispatch_queue_t)queue MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end @@ -5769,39 +5769,39 @@ MTR_PROVISIONALLY_AVAILABLE * Cluster Thread Border Router Management * Manage the Thread network of Thread Border Router */ -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRClusterThreadBorderRouterManagement : MTRGenericCluster -- (void)getActiveDatasetRequestWithParams:(MTRThreadBorderRouterManagementClusterGetActiveDatasetRequestParams * _Nullable)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(void (^)(MTRThreadBorderRouterManagementClusterDatasetResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)getActiveDatasetRequestWithParams:(MTRThreadBorderRouterManagementClusterGetActiveDatasetRequestParams * _Nullable)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(void (^)(MTRThreadBorderRouterManagementClusterDatasetResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)getActiveDatasetRequestWithExpectedValues:(NSArray *> * _Nullable)expectedValues expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(void (^)(MTRThreadBorderRouterManagementClusterDatasetResponseParams * _Nullable data, NSError * _Nullable error))completion - MTR_PROVISIONALLY_AVAILABLE; -- (void)getPendingDatasetRequestWithParams:(MTRThreadBorderRouterManagementClusterGetPendingDatasetRequestParams * _Nullable)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(void (^)(MTRThreadBorderRouterManagementClusterDatasetResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; + MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +- (void)getPendingDatasetRequestWithParams:(MTRThreadBorderRouterManagementClusterGetPendingDatasetRequestParams * _Nullable)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(void (^)(MTRThreadBorderRouterManagementClusterDatasetResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)getPendingDatasetRequestWithExpectedValues:(NSArray *> * _Nullable)expectedValues expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(void (^)(MTRThreadBorderRouterManagementClusterDatasetResponseParams * _Nullable data, NSError * _Nullable error))completion - MTR_PROVISIONALLY_AVAILABLE; -- (void)setActiveDatasetRequestWithParams:(MTRThreadBorderRouterManagementClusterSetActiveDatasetRequestParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; -- (void)setPendingDatasetRequestWithParams:(MTRThreadBorderRouterManagementClusterSetPendingDatasetRequestParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; + MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +- (void)setActiveDatasetRequestWithParams:(MTRThreadBorderRouterManagementClusterSetActiveDatasetRequestParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +- (void)setPendingDatasetRequestWithParams:(MTRThreadBorderRouterManagementClusterSetPendingDatasetRequestParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeBorderRouterNameWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeBorderRouterNameWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeBorderAgentIDWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeBorderAgentIDWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeThreadVersionWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeThreadVersionWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeInterfaceEnabledWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeInterfaceEnabledWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeActiveDatasetTimestampWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeActiveDatasetTimestampWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributePendingDatasetTimestampWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributePendingDatasetTimestampWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (instancetype)init NS_UNAVAILABLE; + (instancetype)new NS_UNAVAILABLE; @@ -5816,7 +5816,7 @@ MTR_PROVISIONALLY_AVAILABLE */ - (instancetype _Nullable)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID - queue:(dispatch_queue_t)queue MTR_PROVISIONALLY_AVAILABLE; + queue:(dispatch_queue_t)queue MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end @@ -5824,30 +5824,30 @@ MTR_PROVISIONALLY_AVAILABLE * Cluster Thread Network Directory * Manages the names and credentials of Thread networks visible to the user. */ -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRClusterThreadNetworkDirectory : MTRGenericCluster -- (void)addNetworkWithParams:(MTRThreadNetworkDirectoryClusterAddNetworkParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; -- (void)removeNetworkWithParams:(MTRThreadNetworkDirectoryClusterRemoveNetworkParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; -- (void)getOperationalDatasetWithParams:(MTRThreadNetworkDirectoryClusterGetOperationalDatasetParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(void (^)(MTRThreadNetworkDirectoryClusterOperationalDatasetResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)addNetworkWithParams:(MTRThreadNetworkDirectoryClusterAddNetworkParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +- (void)removeNetworkWithParams:(MTRThreadNetworkDirectoryClusterRemoveNetworkParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +- (void)getOperationalDatasetWithParams:(MTRThreadNetworkDirectoryClusterGetOperationalDatasetParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(void (^)(MTRThreadNetworkDirectoryClusterOperationalDatasetResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributePreferredExtendedPanIDWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; -- (void)writeAttributePreferredExtendedPanIDWithValue:(NSDictionary *)dataValueDictionary expectedValueInterval:(NSNumber *)expectedValueIntervalMs MTR_PROVISIONALLY_AVAILABLE; -- (void)writeAttributePreferredExtendedPanIDWithValue:(NSDictionary *)dataValueDictionary expectedValueInterval:(NSNumber *)expectedValueIntervalMs params:(MTRWriteParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributePreferredExtendedPanIDWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +- (void)writeAttributePreferredExtendedPanIDWithValue:(NSDictionary *)dataValueDictionary expectedValueInterval:(NSNumber *)expectedValueIntervalMs MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +- (void)writeAttributePreferredExtendedPanIDWithValue:(NSDictionary *)dataValueDictionary expectedValueInterval:(NSNumber *)expectedValueIntervalMs params:(MTRWriteParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeThreadNetworksWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeThreadNetworksWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeThreadNetworkTableSizeWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeThreadNetworkTableSizeWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (instancetype)init NS_UNAVAILABLE; + (instancetype)new NS_UNAVAILABLE; @@ -5862,7 +5862,7 @@ MTR_PROVISIONALLY_AVAILABLE */ - (instancetype _Nullable)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID - queue:(dispatch_queue_t)queue MTR_PROVISIONALLY_AVAILABLE; + queue:(dispatch_queue_t)queue MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end @@ -5875,7 +5875,7 @@ MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) - (NSDictionary * _Nullable)readAttributeMACAddressWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)); -- (NSDictionary * _Nullable)readAttributeLinkLocalAddressWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeLinkLocalAddressWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (NSDictionary * _Nullable)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)); @@ -5914,11 +5914,11 @@ MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) - (void)changeChannelWithParams:(MTRChannelClusterChangeChannelParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(void (^)(MTRChannelClusterChangeChannelResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)); - (void)changeChannelByNumberWithParams:(MTRChannelClusterChangeChannelByNumberParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)); - (void)skipChannelWithParams:(MTRChannelClusterSkipChannelParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)); -- (void)getProgramGuideWithParams:(MTRChannelClusterGetProgramGuideParams * _Nullable)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(void (^)(MTRChannelClusterProgramGuideResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)getProgramGuideWithParams:(MTRChannelClusterGetProgramGuideParams * _Nullable)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(void (^)(MTRChannelClusterProgramGuideResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)getProgramGuideWithExpectedValues:(NSArray *> * _Nullable)expectedValues expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(void (^)(MTRChannelClusterProgramGuideResponseParams * _Nullable data, NSError * _Nullable error))completion - MTR_PROVISIONALLY_AVAILABLE; -- (void)recordProgramWithParams:(MTRChannelClusterRecordProgramParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; -- (void)cancelRecordProgramWithParams:(MTRChannelClusterCancelRecordProgramParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; + MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +- (void)recordProgramWithParams:(MTRChannelClusterRecordProgramParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +- (void)cancelRecordProgramWithParams:(MTRChannelClusterCancelRecordProgramParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (NSDictionary * _Nullable)readAttributeChannelListWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)); @@ -6027,11 +6027,11 @@ MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) - (void)skipForwardWithParams:(MTRMediaPlaybackClusterSkipForwardParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(void (^)(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)); - (void)skipBackwardWithParams:(MTRMediaPlaybackClusterSkipBackwardParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(void (^)(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)); - (void)seekWithParams:(MTRMediaPlaybackClusterSeekParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(void (^)(MTRMediaPlaybackClusterPlaybackResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)); -- (void)activateAudioTrackWithParams:(MTRMediaPlaybackClusterActivateAudioTrackParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; -- (void)activateTextTrackWithParams:(MTRMediaPlaybackClusterActivateTextTrackParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; -- (void)deactivateTextTrackWithParams:(MTRMediaPlaybackClusterDeactivateTextTrackParams * _Nullable)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; +- (void)activateAudioTrackWithParams:(MTRMediaPlaybackClusterActivateAudioTrackParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +- (void)activateTextTrackWithParams:(MTRMediaPlaybackClusterActivateTextTrackParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +- (void)deactivateTextTrackWithParams:(MTRMediaPlaybackClusterDeactivateTextTrackParams * _Nullable)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (void)deactivateTextTrackWithExpectedValues:(NSArray *> * _Nullable)expectedValues expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion - MTR_PROVISIONALLY_AVAILABLE; + MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (NSDictionary * _Nullable)readAttributeCurrentStateWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)); @@ -6504,20 +6504,20 @@ MTR_PROVISIONALLY_AVAILABLE * Cluster Content App Observer * This cluster provides an interface for sending targeted commands to an Observer of a Content App on a Video Player device such as a Streaming Media Player, Smart TV or Smart Screen. The cluster server for Content App Observer is implemented by an endpoint that communicates with a Content App, such as a Casting Video Client. The cluster client for Content App Observer is implemented by a Content App endpoint. A Content App is informed of the NodeId of an Observer when a binding is set on the Content App. The Content App can then send the ContentAppMessage to the Observer (server cluster), and the Observer responds with a ContentAppMessageResponse. */ -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRClusterContentAppObserver : MTRGenericCluster -- (void)contentAppMessageWithParams:(MTRContentAppObserverClusterContentAppMessageParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(void (^)(MTRContentAppObserverClusterContentAppMessageResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)contentAppMessageWithParams:(MTRContentAppObserverClusterContentAppMessageParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(void (^)(MTRContentAppObserverClusterContentAppMessageResponseParams * _Nullable data, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (instancetype)init NS_UNAVAILABLE; + (instancetype)new NS_UNAVAILABLE; @@ -6532,7 +6532,7 @@ MTR_PROVISIONALLY_AVAILABLE */ - (instancetype _Nullable)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID - queue:(dispatch_queue_t)queue MTR_PROVISIONALLY_AVAILABLE; + queue:(dispatch_queue_t)queue MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end @@ -7037,23 +7037,23 @@ MTR_PROVISIONALLY_AVAILABLE * Cluster Commissioner Control * Supports the ability for clients to request the commissioning of themselves or other nodes onto a fabric which the cluster server can commission onto. */ -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRClusterCommissionerControl : MTRGenericCluster -- (void)requestCommissioningApprovalWithParams:(MTRCommissionerControlClusterRequestCommissioningApprovalParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_PROVISIONALLY_AVAILABLE; -- (void)commissionNodeWithParams:(MTRCommissionerControlClusterCommissionNodeParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(void (^)(MTRCommissionerControlClusterReverseOpenCommissioningWindowParams * _Nullable data, NSError * _Nullable error))completion MTR_PROVISIONALLY_AVAILABLE; +- (void)requestCommissioningApprovalWithParams:(MTRCommissionerControlClusterRequestCommissioningApprovalParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(MTRStatusCompletion)completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +- (void)commissionNodeWithParams:(MTRCommissionerControlClusterCommissionNodeParams *)params expectedValues:(NSArray *> * _Nullable)expectedDataValueDictionaries expectedValueInterval:(NSNumber * _Nullable)expectedValueIntervalMs completion:(void (^)(MTRCommissionerControlClusterReverseOpenCommissioningWindowParams * _Nullable data, NSError * _Nullable error))completion MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeSupportedDeviceCategoriesWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeSupportedDeviceCategoriesWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeGeneratedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeAcceptedCommandListWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeAttributeListWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeFeatureMapWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -- (NSDictionary * _Nullable)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params MTR_PROVISIONALLY_AVAILABLE; +- (NSDictionary * _Nullable)readAttributeClusterRevisionWithParams:(MTRReadParams * _Nullable)params MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); - (instancetype)init NS_UNAVAILABLE; + (instancetype)new NS_UNAVAILABLE; @@ -7068,7 +7068,7 @@ MTR_PROVISIONALLY_AVAILABLE */ - (instancetype _Nullable)initWithDevice:(MTRDevice *)device endpointID:(NSNumber *)endpointID - queue:(dispatch_queue_t)queue MTR_PROVISIONALLY_AVAILABLE; + queue:(dispatch_queue_t)queue MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloadsObjc.h b/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloadsObjc.h index 26b4c7e981e130..fd5bb619f514ce 100644 --- a/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloadsObjc.h +++ b/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloadsObjc.h @@ -942,10 +942,10 @@ MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) @property (nonatomic, copy, nullable) NSNumber * serverSideProcessingTimeout; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRAccessControlClusterReviewFabricRestrictionsParams : NSObject -@property (nonatomic, copy) NSArray * _Nonnull arl MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSArray * _Nonnull arl MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Controls whether the command is a timed command (using Timed Invoke). * @@ -972,10 +972,10 @@ MTR_PROVISIONALLY_AVAILABLE @property (nonatomic, copy, nullable) NSNumber * serverSideProcessingTimeout; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRAccessControlClusterReviewFabricRestrictionsResponseParams : NSObject -@property (nonatomic, copy) NSNumber * _Nonnull token MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull token MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Initialize an MTRAccessControlClusterReviewFabricRestrictionsResponseParams with a response-value dictionary @@ -988,7 +988,7 @@ MTR_PROVISIONALLY_AVAILABLE * schema for this command. */ - (nullable instancetype)initWithResponseValue:(NSDictionary *)responseValue - error:(NSError * __autoreleasing *)error MTR_PROVISIONALLY_AVAILABLE; + error:(NSError * __autoreleasing *)error MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) @@ -2594,7 +2594,7 @@ MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) @property (nonatomic, copy, nullable) NSNumber * serverSideProcessingTimeout; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRGeneralDiagnosticsClusterTimeSnapshotParams : NSObject /** * Controls whether the command is a timed command (using Timed Invoke). @@ -2622,12 +2622,12 @@ MTR_PROVISIONALLY_AVAILABLE @property (nonatomic, copy, nullable) NSNumber * serverSideProcessingTimeout; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRGeneralDiagnosticsClusterTimeSnapshotResponseParams : NSObject -@property (nonatomic, copy) NSNumber * _Nonnull systemTimeMs MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull systemTimeMs MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -@property (nonatomic, copy) NSNumber * _Nullable posixTimeMs MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nullable posixTimeMs MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Initialize an MTRGeneralDiagnosticsClusterTimeSnapshotResponseParams with a response-value dictionary @@ -2640,17 +2640,17 @@ MTR_PROVISIONALLY_AVAILABLE * schema for this command. */ - (nullable instancetype)initWithResponseValue:(NSDictionary *)responseValue - error:(NSError * __autoreleasing *)error MTR_PROVISIONALLY_AVAILABLE; + error:(NSError * __autoreleasing *)error MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRGeneralDiagnosticsClusterPayloadTestRequestParams : NSObject -@property (nonatomic, copy) NSData * _Nonnull enableKey MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSData * _Nonnull enableKey MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -@property (nonatomic, copy) NSNumber * _Nonnull value MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull value MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -@property (nonatomic, copy, getter=getCount) NSNumber * _Nonnull count MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy, getter=getCount) NSNumber * _Nonnull count MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Controls whether the command is a timed command (using Timed Invoke). * @@ -2677,10 +2677,10 @@ MTR_PROVISIONALLY_AVAILABLE @property (nonatomic, copy, nullable) NSNumber * serverSideProcessingTimeout; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRGeneralDiagnosticsClusterPayloadTestResponseParams : NSObject -@property (nonatomic, copy) NSData * _Nonnull payload MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSData * _Nonnull payload MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Initialize an MTRGeneralDiagnosticsClusterPayloadTestResponseParams with a response-value dictionary @@ -2693,7 +2693,7 @@ MTR_PROVISIONALLY_AVAILABLE * schema for this command. */ - (nullable instancetype)initWithResponseValue:(NSDictionary *)responseValue - error:(NSError * __autoreleasing *)error MTR_PROVISIONALLY_AVAILABLE; + error:(NSError * __autoreleasing *)error MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) @@ -2876,10 +2876,10 @@ MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) @property (nonatomic, copy, nullable) NSNumber * serverSideProcessingTimeout; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRTimeSynchronizationClusterSetTrustedTimeSourceParams : NSObject -@property (nonatomic, copy) MTRTimeSynchronizationClusterFabricScopedTrustedTimeSourceStruct * _Nullable trustedTimeSource MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) MTRTimeSynchronizationClusterFabricScopedTrustedTimeSourceStruct * _Nullable trustedTimeSource MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Controls whether the command is a timed command (using Timed Invoke). * @@ -2906,10 +2906,10 @@ MTR_PROVISIONALLY_AVAILABLE @property (nonatomic, copy, nullable) NSNumber * serverSideProcessingTimeout; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRTimeSynchronizationClusterSetTimeZoneParams : NSObject -@property (nonatomic, copy) NSArray * _Nonnull timeZone MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSArray * _Nonnull timeZone MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Controls whether the command is a timed command (using Timed Invoke). * @@ -2936,10 +2936,10 @@ MTR_PROVISIONALLY_AVAILABLE @property (nonatomic, copy, nullable) NSNumber * serverSideProcessingTimeout; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRTimeSynchronizationClusterSetTimeZoneResponseParams : NSObject -@property (nonatomic, copy) NSNumber * _Nonnull dstOffsetRequired MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull dstOffsetRequired MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Initialize an MTRTimeSynchronizationClusterSetTimeZoneResponseParams with a response-value dictionary @@ -2952,13 +2952,13 @@ MTR_PROVISIONALLY_AVAILABLE * schema for this command. */ - (nullable instancetype)initWithResponseValue:(NSDictionary *)responseValue - error:(NSError * __autoreleasing *)error MTR_PROVISIONALLY_AVAILABLE; + error:(NSError * __autoreleasing *)error MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRTimeSynchronizationClusterSetDSTOffsetParams : NSObject -@property (nonatomic, copy) NSArray * _Nonnull dstOffset MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSArray * _Nonnull dstOffset MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Controls whether the command is a timed command (using Timed Invoke). * @@ -2985,10 +2985,10 @@ MTR_PROVISIONALLY_AVAILABLE @property (nonatomic, copy, nullable) NSNumber * serverSideProcessingTimeout; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRTimeSynchronizationClusterSetDefaultNTPParams : NSObject -@property (nonatomic, copy) NSString * _Nullable defaultNTP MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSString * _Nullable defaultNTP MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Controls whether the command is a timed command (using Timed Invoke). * @@ -3015,12 +3015,12 @@ MTR_PROVISIONALLY_AVAILABLE @property (nonatomic, copy, nullable) NSNumber * serverSideProcessingTimeout; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRBridgedDeviceBasicInformationClusterKeepActiveParams : NSObject -@property (nonatomic, copy) NSNumber * _Nonnull stayActiveDuration MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull stayActiveDuration MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -@property (nonatomic, copy) NSNumber * _Nonnull timeoutMs MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull timeoutMs MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Controls whether the command is a timed command (using Timed Invoke). * @@ -5438,10 +5438,10 @@ MTR_AVAILABLE(ios(17.6), macos(14.6), watchos(10.6), tvos(17.6)) @property (nonatomic, copy, nullable) NSNumber * serverSideProcessingTimeout; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRWaterHeaterManagementClusterBoostParams : NSObject -@property (nonatomic, copy) MTRWaterHeaterManagementClusterWaterHeaterBoostInfoStruct * _Nonnull boostInfo MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) MTRWaterHeaterManagementClusterWaterHeaterBoostInfoStruct * _Nonnull boostInfo MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Controls whether the command is a timed command (using Timed Invoke). * @@ -5468,7 +5468,7 @@ MTR_PROVISIONALLY_AVAILABLE @property (nonatomic, copy, nullable) NSNumber * serverSideProcessingTimeout; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRWaterHeaterManagementClusterCancelBoostParams : NSObject /** * Controls whether the command is a timed command (using Timed Invoke). @@ -5646,22 +5646,22 @@ MTR_PROVISIONALLY_AVAILABLE @property (nonatomic, copy, nullable) NSNumber * serverSideProcessingTimeout; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRMessagesClusterPresentMessagesRequestParams : NSObject -@property (nonatomic, copy) NSData * _Nonnull messageID MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSData * _Nonnull messageID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -@property (nonatomic, copy) NSNumber * _Nonnull priority MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull priority MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -@property (nonatomic, copy) NSNumber * _Nonnull messageControl MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull messageControl MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -@property (nonatomic, copy) NSNumber * _Nullable startTime MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nullable startTime MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -@property (nonatomic, copy) NSNumber * _Nullable duration MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nullable duration MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -@property (nonatomic, copy) NSString * _Nonnull messageText MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSString * _Nonnull messageText MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -@property (nonatomic, copy) NSArray * _Nullable responses MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSArray * _Nullable responses MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Controls whether the command is a timed command (using Timed Invoke). * @@ -5688,10 +5688,10 @@ MTR_PROVISIONALLY_AVAILABLE @property (nonatomic, copy, nullable) NSNumber * serverSideProcessingTimeout; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRMessagesClusterCancelMessagesRequestParams : NSObject -@property (nonatomic, copy) NSArray * _Nonnull messageIDs MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSArray * _Nonnull messageIDs MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Controls whether the command is a timed command (using Timed Invoke). * @@ -5966,10 +5966,10 @@ MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @property (nonatomic, copy, nullable) NSNumber * serverSideProcessingTimeout; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTREnergyEVSEClusterGetTargetsResponseParams : NSObject -@property (nonatomic, copy) NSArray * _Nonnull chargingTargetSchedules MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSArray * _Nonnull chargingTargetSchedules MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Initialize an MTREnergyEVSEClusterGetTargetsResponseParams with a response-value dictionary @@ -5982,10 +5982,10 @@ MTR_PROVISIONALLY_AVAILABLE * schema for this command. */ - (nullable instancetype)initWithResponseValue:(NSDictionary *)responseValue - error:(NSError * __autoreleasing *)error MTR_PROVISIONALLY_AVAILABLE; + error:(NSError * __autoreleasing *)error MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTREnergyEVSEClusterDisableParams : NSObject /** * Controls whether the command is a timed command (using Timed Invoke). @@ -6013,14 +6013,14 @@ MTR_PROVISIONALLY_AVAILABLE @property (nonatomic, copy, nullable) NSNumber * serverSideProcessingTimeout; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTREnergyEVSEClusterEnableChargingParams : NSObject -@property (nonatomic, copy) NSNumber * _Nullable chargingEnabledUntil MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nullable chargingEnabledUntil MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -@property (nonatomic, copy) NSNumber * _Nonnull minimumChargeCurrent MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull minimumChargeCurrent MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -@property (nonatomic, copy) NSNumber * _Nonnull maximumChargeCurrent MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull maximumChargeCurrent MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Controls whether the command is a timed command (using Timed Invoke). * @@ -6079,7 +6079,7 @@ MTR_PROVISIONALLY_AVAILABLE @property (nonatomic, copy, nullable) NSNumber * serverSideProcessingTimeout; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTREnergyEVSEClusterStartDiagnosticsParams : NSObject /** * Controls whether the command is a timed command (using Timed Invoke). @@ -6107,10 +6107,10 @@ MTR_PROVISIONALLY_AVAILABLE @property (nonatomic, copy, nullable) NSNumber * serverSideProcessingTimeout; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTREnergyEVSEClusterSetTargetsParams : NSObject -@property (nonatomic, copy) NSArray * _Nonnull chargingTargetSchedules MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSArray * _Nonnull chargingTargetSchedules MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Controls whether the command is a timed command (using Timed Invoke). * @@ -6137,7 +6137,7 @@ MTR_PROVISIONALLY_AVAILABLE @property (nonatomic, copy, nullable) NSNumber * serverSideProcessingTimeout; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTREnergyEVSEClusterGetTargetsParams : NSObject /** * Controls whether the command is a timed command (using Timed Invoke). @@ -6165,7 +6165,7 @@ MTR_PROVISIONALLY_AVAILABLE @property (nonatomic, copy, nullable) NSNumber * serverSideProcessingTimeout; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTREnergyEVSEClusterClearTargetsParams : NSObject /** * Controls whether the command is a timed command (using Timed Invoke). @@ -6193,10 +6193,10 @@ MTR_PROVISIONALLY_AVAILABLE @property (nonatomic, copy, nullable) NSNumber * serverSideProcessingTimeout; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTREnergyEVSEModeClusterChangeToModeParams : NSObject -@property (nonatomic, copy, getter=getNewMode) NSNumber * _Nonnull newMode MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy, getter=getNewMode) NSNumber * _Nonnull newMode MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Controls whether the command is a timed command (using Timed Invoke). * @@ -6223,12 +6223,12 @@ MTR_PROVISIONALLY_AVAILABLE @property (nonatomic, copy, nullable) NSNumber * serverSideProcessingTimeout; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTREnergyEVSEModeClusterChangeToModeResponseParams : NSObject -@property (nonatomic, copy) NSNumber * _Nonnull status MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull status MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -@property (nonatomic, copy) NSString * _Nullable statusText MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSString * _Nullable statusText MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Initialize an MTREnergyEVSEModeClusterChangeToModeResponseParams with a response-value dictionary @@ -6241,13 +6241,13 @@ MTR_PROVISIONALLY_AVAILABLE * schema for this command. */ - (nullable instancetype)initWithResponseValue:(NSDictionary *)responseValue - error:(NSError * __autoreleasing *)error MTR_PROVISIONALLY_AVAILABLE; + error:(NSError * __autoreleasing *)error MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRWaterHeaterModeClusterChangeToModeParams : NSObject -@property (nonatomic, copy, getter=getNewMode) NSNumber * _Nonnull newMode MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy, getter=getNewMode) NSNumber * _Nonnull newMode MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Controls whether the command is a timed command (using Timed Invoke). * @@ -6274,12 +6274,12 @@ MTR_PROVISIONALLY_AVAILABLE @property (nonatomic, copy, nullable) NSNumber * serverSideProcessingTimeout; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRWaterHeaterModeClusterChangeToModeResponseParams : NSObject -@property (nonatomic, copy) NSNumber * _Nonnull status MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull status MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -@property (nonatomic, copy) NSString * _Nullable statusText MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSString * _Nullable statusText MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Initialize an MTRWaterHeaterModeClusterChangeToModeResponseParams with a response-value dictionary @@ -6292,7 +6292,7 @@ MTR_PROVISIONALLY_AVAILABLE * schema for this command. */ - (nullable instancetype)initWithResponseValue:(NSDictionary *)responseValue - error:(NSError * __autoreleasing *)error MTR_PROVISIONALLY_AVAILABLE; + error:(NSError * __autoreleasing *)error MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @@ -7157,7 +7157,7 @@ MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) @property (nonatomic, copy) NSNumber * _Nullable nextCredentialIndex MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)); -@property (nonatomic, copy) NSData * _Nullable credentialData MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSData * _Nullable credentialData MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Controls whether the command is a timed command (using Timed Invoke). * @@ -7516,10 +7516,10 @@ MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) @property (nonatomic, copy, nullable) NSNumber * serverSideProcessingTimeout; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRServiceAreaClusterSelectAreasParams : NSObject -@property (nonatomic, copy, getter=getNewAreas) NSArray * _Nonnull newAreas MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy, getter=getNewAreas) NSArray * _Nonnull newAreas MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Controls whether the command is a timed command (using Timed Invoke). * @@ -7546,12 +7546,12 @@ MTR_PROVISIONALLY_AVAILABLE @property (nonatomic, copy, nullable) NSNumber * serverSideProcessingTimeout; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRServiceAreaClusterSelectAreasResponseParams : NSObject -@property (nonatomic, copy) NSNumber * _Nonnull status MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull status MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -@property (nonatomic, copy) NSString * _Nonnull statusText MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSString * _Nonnull statusText MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Initialize an MTRServiceAreaClusterSelectAreasResponseParams with a response-value dictionary @@ -7564,13 +7564,13 @@ MTR_PROVISIONALLY_AVAILABLE * schema for this command. */ - (nullable instancetype)initWithResponseValue:(NSDictionary *)responseValue - error:(NSError * __autoreleasing *)error MTR_PROVISIONALLY_AVAILABLE; + error:(NSError * __autoreleasing *)error MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRServiceAreaClusterSkipAreaParams : NSObject -@property (nonatomic, copy) NSNumber * _Nonnull skippedArea MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull skippedArea MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Controls whether the command is a timed command (using Timed Invoke). * @@ -7597,12 +7597,12 @@ MTR_PROVISIONALLY_AVAILABLE @property (nonatomic, copy, nullable) NSNumber * serverSideProcessingTimeout; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRServiceAreaClusterSkipAreaResponseParams : NSObject -@property (nonatomic, copy) NSNumber * _Nonnull status MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull status MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -@property (nonatomic, copy) NSString * _Nonnull statusText MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSString * _Nonnull statusText MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Initialize an MTRServiceAreaClusterSkipAreaResponseParams with a response-value dictionary @@ -7615,7 +7615,7 @@ MTR_PROVISIONALLY_AVAILABLE * schema for this command. */ - (nullable instancetype)initWithResponseValue:(NSDictionary *)responseValue - error:(NSError * __autoreleasing *)error MTR_PROVISIONALLY_AVAILABLE; + error:(NSError * __autoreleasing *)error MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) @@ -7786,10 +7786,10 @@ MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) @property (nonatomic, copy, nullable) NSNumber * serverSideProcessingTimeout; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRThermostatClusterSetActiveScheduleRequestParams : NSObject -@property (nonatomic, copy) NSData * _Nonnull scheduleHandle MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSData * _Nonnull scheduleHandle MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Controls whether the command is a timed command (using Timed Invoke). * @@ -7816,10 +7816,10 @@ MTR_PROVISIONALLY_AVAILABLE @property (nonatomic, copy, nullable) NSNumber * serverSideProcessingTimeout; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRThermostatClusterSetActivePresetRequestParams : NSObject -@property (nonatomic, copy) NSData * _Nullable presetHandle MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSData * _Nullable presetHandle MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Controls whether the command is a timed command (using Timed Invoke). * @@ -7846,14 +7846,14 @@ MTR_PROVISIONALLY_AVAILABLE @property (nonatomic, copy, nullable) NSNumber * serverSideProcessingTimeout; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRThermostatClusterAtomicResponseParams : NSObject -@property (nonatomic, copy) NSNumber * _Nonnull statusCode MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull statusCode MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -@property (nonatomic, copy) NSArray * _Nonnull attributeStatus MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSArray * _Nonnull attributeStatus MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -@property (nonatomic, copy) NSNumber * _Nullable timeout MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nullable timeout MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Initialize an MTRThermostatClusterAtomicResponseParams with a response-value dictionary @@ -7866,17 +7866,17 @@ MTR_PROVISIONALLY_AVAILABLE * schema for this command. */ - (nullable instancetype)initWithResponseValue:(NSDictionary *)responseValue - error:(NSError * __autoreleasing *)error MTR_PROVISIONALLY_AVAILABLE; + error:(NSError * __autoreleasing *)error MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRThermostatClusterAtomicRequestParams : NSObject -@property (nonatomic, copy) NSNumber * _Nonnull requestType MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull requestType MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -@property (nonatomic, copy) NSArray * _Nonnull attributeRequests MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSArray * _Nonnull attributeRequests MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -@property (nonatomic, copy) NSNumber * _Nullable timeout MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nullable timeout MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Controls whether the command is a timed command (using Timed Invoke). * @@ -8656,7 +8656,7 @@ MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) @property (nonatomic, copy, nullable) NSNumber * serverSideProcessingTimeout; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRWiFiNetworkManagementClusterNetworkPassphraseRequestParams : NSObject /** * Controls whether the command is a timed command (using Timed Invoke). @@ -8684,10 +8684,10 @@ MTR_PROVISIONALLY_AVAILABLE @property (nonatomic, copy, nullable) NSNumber * serverSideProcessingTimeout; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRWiFiNetworkManagementClusterNetworkPassphraseResponseParams : NSObject -@property (nonatomic, copy) NSData * _Nonnull passphrase MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSData * _Nonnull passphrase MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Initialize an MTRWiFiNetworkManagementClusterNetworkPassphraseResponseParams with a response-value dictionary @@ -8700,10 +8700,10 @@ MTR_PROVISIONALLY_AVAILABLE * schema for this command. */ - (nullable instancetype)initWithResponseValue:(NSDictionary *)responseValue - error:(NSError * __autoreleasing *)error MTR_PROVISIONALLY_AVAILABLE; + error:(NSError * __autoreleasing *)error MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRThreadBorderRouterManagementClusterGetActiveDatasetRequestParams : NSObject /** * Controls whether the command is a timed command (using Timed Invoke). @@ -8731,7 +8731,7 @@ MTR_PROVISIONALLY_AVAILABLE @property (nonatomic, copy, nullable) NSNumber * serverSideProcessingTimeout; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRThreadBorderRouterManagementClusterGetPendingDatasetRequestParams : NSObject /** * Controls whether the command is a timed command (using Timed Invoke). @@ -8759,10 +8759,10 @@ MTR_PROVISIONALLY_AVAILABLE @property (nonatomic, copy, nullable) NSNumber * serverSideProcessingTimeout; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRThreadBorderRouterManagementClusterDatasetResponseParams : NSObject -@property (nonatomic, copy) NSData * _Nonnull dataset MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSData * _Nonnull dataset MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Initialize an MTRThreadBorderRouterManagementClusterDatasetResponseParams with a response-value dictionary @@ -8775,15 +8775,15 @@ MTR_PROVISIONALLY_AVAILABLE * schema for this command. */ - (nullable instancetype)initWithResponseValue:(NSDictionary *)responseValue - error:(NSError * __autoreleasing *)error MTR_PROVISIONALLY_AVAILABLE; + error:(NSError * __autoreleasing *)error MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRThreadBorderRouterManagementClusterSetActiveDatasetRequestParams : NSObject -@property (nonatomic, copy) NSData * _Nonnull activeDataset MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSData * _Nonnull activeDataset MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -@property (nonatomic, copy) NSNumber * _Nullable breadcrumb MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nullable breadcrumb MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Controls whether the command is a timed command (using Timed Invoke). * @@ -8810,10 +8810,10 @@ MTR_PROVISIONALLY_AVAILABLE @property (nonatomic, copy, nullable) NSNumber * serverSideProcessingTimeout; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRThreadBorderRouterManagementClusterSetPendingDatasetRequestParams : NSObject -@property (nonatomic, copy) NSData * _Nonnull pendingDataset MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSData * _Nonnull pendingDataset MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Controls whether the command is a timed command (using Timed Invoke). * @@ -8840,10 +8840,10 @@ MTR_PROVISIONALLY_AVAILABLE @property (nonatomic, copy, nullable) NSNumber * serverSideProcessingTimeout; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRThreadNetworkDirectoryClusterAddNetworkParams : NSObject -@property (nonatomic, copy) NSData * _Nonnull operationalDataset MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSData * _Nonnull operationalDataset MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Controls whether the command is a timed command (using Timed Invoke). * @@ -8870,10 +8870,10 @@ MTR_PROVISIONALLY_AVAILABLE @property (nonatomic, copy, nullable) NSNumber * serverSideProcessingTimeout; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRThreadNetworkDirectoryClusterRemoveNetworkParams : NSObject -@property (nonatomic, copy) NSData * _Nonnull extendedPanID MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSData * _Nonnull extendedPanID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Controls whether the command is a timed command (using Timed Invoke). * @@ -8900,10 +8900,10 @@ MTR_PROVISIONALLY_AVAILABLE @property (nonatomic, copy, nullable) NSNumber * serverSideProcessingTimeout; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRThreadNetworkDirectoryClusterGetOperationalDatasetParams : NSObject -@property (nonatomic, copy) NSData * _Nonnull extendedPanID MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSData * _Nonnull extendedPanID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Controls whether the command is a timed command (using Timed Invoke). * @@ -8930,10 +8930,10 @@ MTR_PROVISIONALLY_AVAILABLE @property (nonatomic, copy, nullable) NSNumber * serverSideProcessingTimeout; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRThreadNetworkDirectoryClusterOperationalDatasetResponseParams : NSObject -@property (nonatomic, copy) NSData * _Nonnull operationalDataset MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSData * _Nonnull operationalDataset MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Initialize an MTRThreadNetworkDirectoryClusterOperationalDatasetResponseParams with a response-value dictionary @@ -8946,7 +8946,7 @@ MTR_PROVISIONALLY_AVAILABLE * schema for this command. */ - (nullable instancetype)initWithResponseValue:(NSDictionary *)responseValue - error:(NSError * __autoreleasing *)error MTR_PROVISIONALLY_AVAILABLE; + error:(NSError * __autoreleasing *)error MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) @@ -9077,22 +9077,22 @@ MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) @property (nonatomic, copy, nullable) NSNumber * serverSideProcessingTimeout; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRChannelClusterGetProgramGuideParams : NSObject -@property (nonatomic, copy) NSNumber * _Nullable startTime MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nullable startTime MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -@property (nonatomic, copy) NSNumber * _Nullable endTime MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nullable endTime MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -@property (nonatomic, copy) NSArray * _Nullable channelList MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSArray * _Nullable channelList MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -@property (nonatomic, copy) MTRChannelClusterPageTokenStruct * _Nullable pageToken MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) MTRChannelClusterPageTokenStruct * _Nullable pageToken MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -@property (nonatomic, copy) NSNumber * _Nullable recordingFlag MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nullable recordingFlag MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @property (nonatomic, copy) NSArray * _Nullable externalIDList MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSData * _Nullable data MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSData * _Nullable data MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Controls whether the command is a timed command (using Timed Invoke). * @@ -9119,12 +9119,12 @@ MTR_PROVISIONALLY_AVAILABLE @property (nonatomic, copy, nullable) NSNumber * serverSideProcessingTimeout; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRChannelClusterProgramGuideResponseParams : NSObject -@property (nonatomic, copy) MTRChannelClusterChannelPagingStruct * _Nonnull paging MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) MTRChannelClusterChannelPagingStruct * _Nonnull paging MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -@property (nonatomic, copy) NSArray * _Nonnull programList MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSArray * _Nonnull programList MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Initialize an MTRChannelClusterProgramGuideResponseParams with a response-value dictionary @@ -9137,19 +9137,19 @@ MTR_PROVISIONALLY_AVAILABLE * schema for this command. */ - (nullable instancetype)initWithResponseValue:(NSDictionary *)responseValue - error:(NSError * __autoreleasing *)error MTR_PROVISIONALLY_AVAILABLE; + error:(NSError * __autoreleasing *)error MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRChannelClusterRecordProgramParams : NSObject -@property (nonatomic, copy) NSString * _Nonnull programIdentifier MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSString * _Nonnull programIdentifier MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -@property (nonatomic, copy) NSNumber * _Nonnull shouldRecordSeries MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull shouldRecordSeries MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @property (nonatomic, copy) NSArray * _Nonnull externalIDList MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSData * _Nonnull data MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSData * _Nonnull data MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Controls whether the command is a timed command (using Timed Invoke). * @@ -9176,16 +9176,16 @@ MTR_PROVISIONALLY_AVAILABLE @property (nonatomic, copy, nullable) NSNumber * serverSideProcessingTimeout; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRChannelClusterCancelRecordProgramParams : NSObject -@property (nonatomic, copy) NSString * _Nonnull programIdentifier MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSString * _Nonnull programIdentifier MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -@property (nonatomic, copy) NSNumber * _Nonnull shouldRecordSeries MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull shouldRecordSeries MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @property (nonatomic, copy) NSArray * _Nonnull externalIDList MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSData * _Nonnull data MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSData * _Nonnull data MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Controls whether the command is a timed command (using Timed Invoke). * @@ -9479,7 +9479,7 @@ MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) @interface MTRMediaPlaybackClusterRewindParams : NSObject -@property (nonatomic, copy) NSNumber * _Nullable audioAdvanceUnmuted MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nullable audioAdvanceUnmuted MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Controls whether the command is a timed command (using Timed Invoke). * @@ -9509,7 +9509,7 @@ MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) @interface MTRMediaPlaybackClusterFastForwardParams : NSObject -@property (nonatomic, copy) NSNumber * _Nullable audioAdvanceUnmuted MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nullable audioAdvanceUnmuted MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Controls whether the command is a timed command (using Timed Invoke). * @@ -9662,12 +9662,12 @@ MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) @property (nonatomic, copy, nullable) NSNumber * serverSideProcessingTimeout; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRMediaPlaybackClusterActivateAudioTrackParams : NSObject -@property (nonatomic, copy) NSString * _Nonnull trackID MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSString * _Nonnull trackID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -@property (nonatomic, copy) NSNumber * _Nonnull audioOutputIndex MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull audioOutputIndex MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Controls whether the command is a timed command (using Timed Invoke). * @@ -9694,10 +9694,10 @@ MTR_PROVISIONALLY_AVAILABLE @property (nonatomic, copy, nullable) NSNumber * serverSideProcessingTimeout; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRMediaPlaybackClusterActivateTextTrackParams : NSObject -@property (nonatomic, copy) NSString * _Nonnull trackID MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSString * _Nonnull trackID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Controls whether the command is a timed command (using Timed Invoke). * @@ -9724,7 +9724,7 @@ MTR_PROVISIONALLY_AVAILABLE @property (nonatomic, copy, nullable) NSNumber * serverSideProcessingTimeout; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRMediaPlaybackClusterDeactivateTextTrackParams : NSObject /** * Controls whether the command is a timed command (using Timed Invoke). @@ -9973,7 +9973,7 @@ MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) @property (nonatomic, copy) MTRContentLauncherClusterPlaybackPreferencesStruct * _Nullable playbackPreferences MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nullable useCurrentContext MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nullable useCurrentContext MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Controls whether the command is a timed command (using Timed Invoke). * @@ -10354,7 +10354,7 @@ MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) @property (nonatomic, copy) NSString * _Nonnull setupPIN MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)); -@property (nonatomic, copy) NSNumber * _Nullable node MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nullable node MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Controls whether the command is a timed command (using Timed Invoke). * @@ -10384,7 +10384,7 @@ MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) @interface MTRAccountLoginClusterLogoutParams : NSObject -@property (nonatomic, copy) NSNumber * _Nullable node MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nullable node MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Controls whether the command is a timed command (using Timed Invoke). * @@ -10724,12 +10724,12 @@ MTR_PROVISIONALLY_AVAILABLE @property (nonatomic, copy, nullable) NSNumber * serverSideProcessingTimeout; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRContentAppObserverClusterContentAppMessageParams : NSObject -@property (nonatomic, copy) NSString * _Nullable data MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSString * _Nullable data MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -@property (nonatomic, copy) NSString * _Nonnull encodingHint MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSString * _Nonnull encodingHint MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Controls whether the command is a timed command (using Timed Invoke). * @@ -10756,14 +10756,14 @@ MTR_PROVISIONALLY_AVAILABLE @property (nonatomic, copy, nullable) NSNumber * serverSideProcessingTimeout; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRContentAppObserverClusterContentAppMessageResponseParams : NSObject -@property (nonatomic, copy) NSNumber * _Nonnull status MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull status MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -@property (nonatomic, copy) NSString * _Nullable data MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSString * _Nullable data MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -@property (nonatomic, copy) NSString * _Nullable encodingHint MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSString * _Nullable encodingHint MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Initialize an MTRContentAppObserverClusterContentAppMessageResponseParams with a response-value dictionary @@ -10776,7 +10776,7 @@ MTR_PROVISIONALLY_AVAILABLE * schema for this command. */ - (nullable instancetype)initWithResponseValue:(NSDictionary *)responseValue - error:(NSError * __autoreleasing *)error MTR_PROVISIONALLY_AVAILABLE; + error:(NSError * __autoreleasing *)error MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end MTR_PROVISIONALLY_AVAILABLE @@ -12183,16 +12183,16 @@ MTR_PROVISIONALLY_AVAILABLE @property (nonatomic, copy, nullable) NSNumber * serverSideProcessingTimeout; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRCommissionerControlClusterRequestCommissioningApprovalParams : NSObject -@property (nonatomic, copy) NSNumber * _Nonnull requestID MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull requestID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -@property (nonatomic, copy) NSNumber * _Nonnull vendorID MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull vendorID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -@property (nonatomic, copy) NSNumber * _Nonnull productID MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull productID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -@property (nonatomic, copy) NSString * _Nullable label MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSString * _Nullable label MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Controls whether the command is a timed command (using Timed Invoke). * @@ -12219,12 +12219,12 @@ MTR_PROVISIONALLY_AVAILABLE @property (nonatomic, copy, nullable) NSNumber * serverSideProcessingTimeout; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRCommissionerControlClusterCommissionNodeParams : NSObject -@property (nonatomic, copy) NSNumber * _Nonnull requestID MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull requestID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -@property (nonatomic, copy) NSNumber * _Nonnull responseTimeoutSeconds MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull responseTimeoutSeconds MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Controls whether the command is a timed command (using Timed Invoke). * @@ -12251,18 +12251,18 @@ MTR_PROVISIONALLY_AVAILABLE @property (nonatomic, copy, nullable) NSNumber * serverSideProcessingTimeout; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRCommissionerControlClusterReverseOpenCommissioningWindowParams : NSObject -@property (nonatomic, copy) NSNumber * _Nonnull commissioningTimeout MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull commissioningTimeout MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -@property (nonatomic, copy) NSData * _Nonnull pakePasscodeVerifier MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSData * _Nonnull pakePasscodeVerifier MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -@property (nonatomic, copy) NSNumber * _Nonnull discriminator MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull discriminator MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -@property (nonatomic, copy) NSNumber * _Nonnull iterations MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull iterations MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); -@property (nonatomic, copy) NSData * _Nonnull salt MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSData * _Nonnull salt MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); /** * Initialize an MTRCommissionerControlClusterReverseOpenCommissioningWindowParams with a response-value dictionary @@ -12275,7 +12275,7 @@ MTR_PROVISIONALLY_AVAILABLE * schema for this command. */ - (nullable instancetype)initWithResponseValue:(NSDictionary *)responseValue - error:(NSError * __autoreleasing *)error MTR_PROVISIONALLY_AVAILABLE; + error:(NSError * __autoreleasing *)error MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end MTR_PROVISIONALLY_AVAILABLE diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRStructsObjc.h b/src/darwin/Framework/CHIP/zap-generated/MTRStructsObjc.h index 18a77e2d455530..278527fb387b76 100644 --- a/src/darwin/Framework/CHIP/zap-generated/MTRStructsObjc.h +++ b/src/darwin/Framework/CHIP/zap-generated/MTRStructsObjc.h @@ -26,17 +26,17 @@ MTR_PROVISIONALLY_AVAILABLE @property (nonatomic, copy) NSNumber * _Nullable myEnum MTR_PROVISIONALLY_AVAILABLE; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRDataTypeLocationDescriptorStruct : NSObject -@property (nonatomic, copy) NSString * _Nonnull locationName MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nullable floorNumber MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nullable areaType MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSString * _Nonnull locationName MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nullable floorNumber MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nullable areaType MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRDataTypeAtomicAttributeStatusStruct : NSObject -@property (nonatomic, copy) NSNumber * _Nonnull attributeID MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nonnull statusCode MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull attributeID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nonnull statusCode MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end MTR_AVAILABLE(ios(16.2), macos(13.1), watchos(9.2), tvos(16.2)) @@ -68,25 +68,25 @@ MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) @property (nonatomic, copy) NSNumber * _Nonnull fabricIndex MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)); @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRAccessControlClusterAccessRestrictionStruct : NSObject -@property (nonatomic, copy) NSNumber * _Nonnull type MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nullable id MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull type MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nullable id MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRAccessControlClusterCommissioningAccessRestrictionEntryStruct : NSObject -@property (nonatomic, copy) NSNumber * _Nonnull endpoint MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nonnull cluster MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSArray * _Nonnull restrictions MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull endpoint MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nonnull cluster MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSArray * _Nonnull restrictions MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRAccessControlClusterAccessRestrictionEntryStruct : NSObject -@property (nonatomic, copy) NSNumber * _Nonnull endpoint MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nonnull cluster MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSArray * _Nonnull restrictions MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nonnull fabricIndex MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull endpoint MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nonnull cluster MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSArray * _Nonnull restrictions MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nonnull fabricIndex MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end MTR_AVAILABLE(ios(17.0), macos(14.0), watchos(10.0), tvos(17.0)) @@ -151,12 +151,12 @@ MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) @property (nonatomic, copy) NSNumber * _Nonnull fabricIndex MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)); @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRAccessControlClusterFabricRestrictionReviewUpdateEvent : NSObject -@property (nonatomic, copy) NSNumber * _Nonnull token MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSString * _Nullable instruction MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull token MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSString * _Nullable instruction MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @property (nonatomic, copy) NSString * _Nullable arlRequestFlowUrl MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nonnull fabricIndex MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull fabricIndex MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) @@ -606,10 +606,10 @@ MTR_DEPRECATED("Please use MTRTimeSynchronizationClusterDSTOffsetStruct", ios(16 @property (nonatomic, copy) NSNumber * _Nullable validUntil MTR_DEPRECATED("Please use MTRTimeSynchronizationClusterDSTOffsetStruct", ios(16.1, 16.5), macos(13.0, 13.4), watchos(9.1, 9.5), tvos(16.1, 16.5)); @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRTimeSynchronizationClusterFabricScopedTrustedTimeSourceStruct : NSObject -@property (nonatomic, copy) NSNumber * _Nonnull nodeID MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nonnull endpoint MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull nodeID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nonnull endpoint MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end MTR_AVAILABLE(ios(16.5), macos(13.4), watchos(9.5), tvos(16.5)) @@ -626,33 +626,33 @@ MTR_DEPRECATED("Please use MTRTimeSynchronizationClusterTimeZoneStruct", ios(16. @property (nonatomic, copy) NSString * _Nullable name MTR_DEPRECATED("Please use MTRTimeSynchronizationClusterTimeZoneStruct", ios(16.1, 16.5), macos(13.0, 13.4), watchos(9.1, 9.5), tvos(16.1, 16.5)); @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRTimeSynchronizationClusterTrustedTimeSourceStruct : NSObject -@property (nonatomic, copy) NSNumber * _Nonnull fabricIndex MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nonnull nodeID MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nonnull endpoint MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull fabricIndex MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nonnull nodeID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nonnull endpoint MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRTimeSynchronizationClusterDSTTableEmptyEvent : NSObject @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRTimeSynchronizationClusterDSTStatusEvent : NSObject -@property (nonatomic, copy) NSNumber * _Nonnull dstOffsetActive MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull dstOffsetActive MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRTimeSynchronizationClusterTimeZoneStatusEvent : NSObject -@property (nonatomic, copy) NSNumber * _Nonnull offset MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSString * _Nullable name MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull offset MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSString * _Nullable name MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRTimeSynchronizationClusterTimeFailureEvent : NSObject @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRTimeSynchronizationClusterMissingTrustedTimeSourceEvent : NSObject @end @@ -698,9 +698,9 @@ MTR_DEPRECATED("Please use MTRBridgedDeviceBasicInformationClusterReachableChang @property (nonatomic, copy) NSNumber * _Nonnull reachableNewValue MTR_DEPRECATED("Please use MTRBridgedDeviceBasicInformationClusterReachableChangedEvent", ios(16.1, 17.0), macos(13.0, 14.0), watchos(9.1, 10.0), tvos(16.1, 17.0)); @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRBridgedDeviceBasicInformationClusterActiveChangedEvent : NSObject -@property (nonatomic, copy) NSNumber * _Nonnull promisedActiveDuration MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull promisedActiveDuration MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) @@ -1230,22 +1230,22 @@ MTR_AVAILABLE(ios(17.6), macos(14.6), watchos(10.6), tvos(17.6)) @property (nonatomic, copy) MTRElectricalEnergyMeasurementClusterEnergyMeasurementStruct * _Nullable energyExported MTR_AVAILABLE(ios(17.6), macos(14.6), watchos(10.6), tvos(17.6)); @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRWaterHeaterManagementClusterWaterHeaterBoostInfoStruct : NSObject -@property (nonatomic, copy) NSNumber * _Nonnull duration MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nullable oneShot MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nullable emergencyBoost MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nullable temporarySetpoint MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nullable targetPercentage MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nullable targetReheat MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull duration MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nullable oneShot MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nullable emergencyBoost MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nullable temporarySetpoint MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nullable targetPercentage MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nullable targetReheat MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRWaterHeaterManagementClusterBoostStartedEvent : NSObject -@property (nonatomic, copy) MTRWaterHeaterManagementClusterWaterHeaterBoostInfoStruct * _Nonnull boostInfo MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) MTRWaterHeaterManagementClusterWaterHeaterBoostInfoStruct * _Nonnull boostInfo MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRWaterHeaterManagementClusterBoostEndedEvent : NSObject @end @@ -1323,39 +1323,39 @@ MTR_PROVISIONALLY_AVAILABLE @property (nonatomic, copy) MTRDemandResponseLoadControlClusterHeatingSourceControlStruct * _Nullable heatingSourceControl MTR_PROVISIONALLY_AVAILABLE; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRMessagesClusterMessageResponseOptionStruct : NSObject -@property (nonatomic, copy) NSNumber * _Nullable messageResponseID MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSString * _Nullable label MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nullable messageResponseID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSString * _Nullable label MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRMessagesClusterMessageStruct : NSObject -@property (nonatomic, copy) NSData * _Nonnull messageID MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nonnull priority MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nonnull messageControl MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nullable startTime MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nullable duration MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSString * _Nonnull messageText MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSArray * _Nullable responses MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSData * _Nonnull messageID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nonnull priority MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nonnull messageControl MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nullable startTime MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nullable duration MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSString * _Nonnull messageText MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSArray * _Nullable responses MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRMessagesClusterMessageQueuedEvent : NSObject -@property (nonatomic, copy) NSData * _Nonnull messageID MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSData * _Nonnull messageID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRMessagesClusterMessagePresentedEvent : NSObject -@property (nonatomic, copy) NSData * _Nonnull messageID MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSData * _Nonnull messageID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRMessagesClusterMessageCompleteEvent : NSObject -@property (nonatomic, copy) NSData * _Nonnull messageID MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nullable responseID MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSString * _Nullable reply MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nullable futureMessagesPreference MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSData * _Nonnull messageID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nullable responseID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSString * _Nullable reply MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nullable futureMessagesPreference MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @@ -1451,61 +1451,61 @@ MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @property (nonatomic, copy) NSNumber * _Nonnull cause MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTREnergyEVSEClusterChargingTargetStruct : NSObject -@property (nonatomic, copy) NSNumber * _Nonnull targetTimeMinutesPastMidnight MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nullable targetSoC MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nullable addedEnergy MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull targetTimeMinutesPastMidnight MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nullable targetSoC MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nullable addedEnergy MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTREnergyEVSEClusterChargingTargetScheduleStruct : NSObject -@property (nonatomic, copy) NSNumber * _Nonnull dayOfWeekForSequence MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSArray * _Nonnull chargingTargets MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull dayOfWeekForSequence MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSArray * _Nonnull chargingTargets MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTREnergyEVSEClusterEVConnectedEvent : NSObject -@property (nonatomic, copy) NSNumber * _Nonnull sessionID MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull sessionID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTREnergyEVSEClusterEVNotDetectedEvent : NSObject -@property (nonatomic, copy) NSNumber * _Nonnull sessionID MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nonnull state MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nonnull sessionDuration MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nonnull sessionEnergyCharged MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull sessionID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nonnull state MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nonnull sessionDuration MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nonnull sessionEnergyCharged MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @property (nonatomic, copy) NSNumber * _Nullable sessionEnergyDischarged MTR_PROVISIONALLY_AVAILABLE; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTREnergyEVSEClusterEnergyTransferStartedEvent : NSObject -@property (nonatomic, copy) NSNumber * _Nonnull sessionID MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nonnull state MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nonnull maximumCurrent MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull sessionID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nonnull state MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nonnull maximumCurrent MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @property (nonatomic, copy) NSNumber * _Nullable maximumDischargeCurrent MTR_PROVISIONALLY_AVAILABLE; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTREnergyEVSEClusterEnergyTransferStoppedEvent : NSObject -@property (nonatomic, copy) NSNumber * _Nonnull sessionID MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nonnull state MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nonnull reason MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nonnull energyTransferred MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull sessionID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nonnull state MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nonnull reason MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nonnull energyTransferred MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @property (nonatomic, copy) NSNumber * _Nullable energyDischarged MTR_PROVISIONALLY_AVAILABLE; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTREnergyEVSEClusterFaultEvent : NSObject -@property (nonatomic, copy) NSNumber * _Nullable sessionID MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nonnull state MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nonnull faultStatePreviousState MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nonnull faultStateCurrentState MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nullable sessionID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nonnull state MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nonnull faultStatePreviousState MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nonnull faultStateCurrentState MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTREnergyEVSEClusterRFIDEvent : NSObject -@property (nonatomic, copy) NSData * _Nonnull uid MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSData * _Nonnull uid MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end MTR_PROVISIONALLY_AVAILABLE @@ -1514,30 +1514,30 @@ MTR_PROVISIONALLY_AVAILABLE @property (nonatomic, copy) NSString * _Nullable label MTR_PROVISIONALLY_AVAILABLE; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTREnergyEVSEModeClusterModeTagStruct : NSObject -@property (nonatomic, copy) NSNumber * _Nullable mfgCode MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nonnull value MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nullable mfgCode MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nonnull value MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTREnergyEVSEModeClusterModeOptionStruct : NSObject -@property (nonatomic, copy) NSString * _Nonnull label MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nonnull mode MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSArray * _Nonnull modeTags MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSString * _Nonnull label MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nonnull mode MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSArray * _Nonnull modeTags MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRWaterHeaterModeClusterModeTagStruct : NSObject -@property (nonatomic, copy) NSNumber * _Nullable mfgCode MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nonnull value MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nullable mfgCode MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nonnull value MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRWaterHeaterModeClusterModeOptionStruct : NSObject -@property (nonatomic, copy) NSString * _Nonnull label MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nonnull mode MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSArray * _Nonnull modeTags MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSString * _Nonnull label MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nonnull mode MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSArray * _Nonnull modeTags MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @@ -1607,36 +1607,36 @@ MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) @property (nonatomic, copy) NSNumber * _Nullable dataIndex MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)); @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRServiceAreaClusterLandmarkInfoStruct : NSObject -@property (nonatomic, copy) NSNumber * _Nonnull landmarkTag MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nullable relativePositionTag MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull landmarkTag MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nullable relativePositionTag MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRServiceAreaClusterAreaInfoStruct : NSObject -@property (nonatomic, copy) MTRDataTypeLocationDescriptorStruct * _Nullable locationInfo MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) MTRServiceAreaClusterLandmarkInfoStruct * _Nullable landmarkInfo MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) MTRDataTypeLocationDescriptorStruct * _Nullable locationInfo MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) MTRServiceAreaClusterLandmarkInfoStruct * _Nullable landmarkInfo MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRServiceAreaClusterAreaStruct : NSObject -@property (nonatomic, copy) NSNumber * _Nonnull areaID MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nullable mapID MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) MTRServiceAreaClusterAreaInfoStruct * _Nonnull areaInfo MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull areaID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nullable mapID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) MTRServiceAreaClusterAreaInfoStruct * _Nonnull areaInfo MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRServiceAreaClusterMapStruct : NSObject -@property (nonatomic, copy) NSNumber * _Nonnull mapID MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSString * _Nonnull name MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull mapID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSString * _Nonnull name MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRServiceAreaClusterProgressStruct : NSObject -@property (nonatomic, copy) NSNumber * _Nonnull areaID MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nonnull status MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nullable totalOperationalTime MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull areaID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nonnull status MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nullable totalOperationalTime MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @property (nonatomic, copy) NSNumber * _Nullable estimatedTime MTR_PROVISIONALLY_AVAILABLE; @end @@ -1708,48 +1708,48 @@ MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) @interface MTRPumpConfigurationAndControlClusterTurbineOperationEvent : NSObject @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRThermostatClusterScheduleTransitionStruct : NSObject -@property (nonatomic, copy) NSNumber * _Nonnull dayOfWeek MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nonnull transitionTime MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSData * _Nullable presetHandle MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nullable systemMode MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nullable coolingSetpoint MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nullable heatingSetpoint MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull dayOfWeek MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nonnull transitionTime MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSData * _Nullable presetHandle MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nullable systemMode MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nullable coolingSetpoint MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nullable heatingSetpoint MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRThermostatClusterScheduleStruct : NSObject -@property (nonatomic, copy) NSData * _Nullable scheduleHandle MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nonnull systemMode MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSString * _Nullable name MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSData * _Nullable presetHandle MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSArray * _Nonnull transitions MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nullable builtIn MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSData * _Nullable scheduleHandle MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nonnull systemMode MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSString * _Nullable name MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSData * _Nullable presetHandle MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSArray * _Nonnull transitions MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nullable builtIn MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRThermostatClusterPresetStruct : NSObject -@property (nonatomic, copy) NSData * _Nullable presetHandle MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nonnull presetScenario MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSString * _Nullable name MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nullable coolingSetpoint MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nullable heatingSetpoint MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nullable builtIn MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSData * _Nullable presetHandle MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nonnull presetScenario MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSString * _Nullable name MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nullable coolingSetpoint MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nullable heatingSetpoint MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nullable builtIn MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRThermostatClusterPresetTypeStruct : NSObject -@property (nonatomic, copy) NSNumber * _Nonnull presetScenario MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nonnull numberOfPresets MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nonnull presetTypeFeatures MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull presetScenario MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nonnull numberOfPresets MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nonnull presetTypeFeatures MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRThermostatClusterScheduleTypeStruct : NSObject -@property (nonatomic, copy) NSNumber * _Nonnull systemMode MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nonnull numberOfSchedules MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nonnull scheduleTypeFeatures MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull systemMode MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nonnull numberOfSchedules MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nonnull scheduleTypeFeatures MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end MTR_AVAILABLE(ios(17.4), macos(14.4), watchos(10.4), tvos(17.4)) @@ -1766,42 +1766,42 @@ MTR_DEPRECATED("Please use MTRThermostatClusterWeeklyScheduleTransitionStruct", @property (nonatomic, copy) NSNumber * _Nullable coolSetpoint MTR_DEPRECATED("Please use MTRThermostatClusterWeeklyScheduleTransitionStruct", ios(16.1, 17.4), macos(13.0, 14.4), watchos(9.1, 10.4), tvos(16.1, 17.4)); @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTROccupancySensingClusterHoldTimeLimitsStruct : NSObject -@property (nonatomic, copy) NSNumber * _Nonnull holdTimeMin MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nonnull holdTimeMax MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nonnull holdTimeDefault MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull holdTimeMin MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nonnull holdTimeMax MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nonnull holdTimeDefault MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTROccupancySensingClusterOccupancyChangedEvent : NSObject -@property (nonatomic, copy) NSNumber * _Nonnull occupancy MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull occupancy MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRThreadNetworkDirectoryClusterThreadNetworkStruct : NSObject -@property (nonatomic, copy) NSData * _Nonnull extendedPanID MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSString * _Nonnull networkName MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nonnull channel MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nonnull activeTimestamp MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSData * _Nonnull extendedPanID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSString * _Nonnull networkName MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nonnull channel MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nonnull activeTimestamp MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRChannelClusterProgramCastStruct : NSObject -@property (nonatomic, copy) NSString * _Nonnull name MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSString * _Nonnull role MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSString * _Nonnull name MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSString * _Nonnull role MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRChannelClusterProgramCategoryStruct : NSObject -@property (nonatomic, copy) NSString * _Nonnull category MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSString * _Nullable subCategory MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSString * _Nonnull category MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSString * _Nullable subCategory MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRChannelClusterSeriesInfoStruct : NSObject -@property (nonatomic, copy) NSString * _Nonnull season MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSString * _Nonnull episode MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSString * _Nonnull season MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSString * _Nonnull episode MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) @@ -1811,8 +1811,8 @@ MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) @property (nonatomic, copy) NSString * _Nullable name MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)); @property (nonatomic, copy) NSString * _Nullable callSign MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)); @property (nonatomic, copy) NSString * _Nullable affiliateCallSign MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)); -@property (nonatomic, copy) NSString * _Nullable identifier MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nullable type MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSString * _Nullable identifier MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nullable type MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end MTR_DEPRECATED("Please use MTRChannelClusterChannelInfoStruct", ios(16.1, 16.4), macos(13.0, 13.3), watchos(9.1, 9.4), tvos(16.1, 16.4)) @@ -1824,40 +1824,40 @@ MTR_DEPRECATED("Please use MTRChannelClusterChannelInfoStruct", ios(16.1, 16.4), @property (nonatomic, copy) NSString * _Nullable affiliateCallSign MTR_DEPRECATED("Please use MTRChannelClusterChannelInfoStruct", ios(16.1, 16.4), macos(13.0, 13.3), watchos(9.1, 9.4), tvos(16.1, 16.4)); @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRChannelClusterProgramStruct : NSObject -@property (nonatomic, copy) NSString * _Nonnull identifier MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) MTRChannelClusterChannelInfoStruct * _Nonnull channel MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nonnull startTime MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nonnull endTime MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSString * _Nonnull title MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSString * _Nullable subtitle MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSString * _Nullable descriptionString MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSArray * _Nullable audioLanguages MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSArray * _Nullable ratings MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSString * _Nonnull identifier MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) MTRChannelClusterChannelInfoStruct * _Nonnull channel MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nonnull startTime MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nonnull endTime MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSString * _Nonnull title MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSString * _Nullable subtitle MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSString * _Nullable descriptionString MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSArray * _Nullable audioLanguages MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSArray * _Nullable ratings MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @property (nonatomic, copy) NSString * _Nullable thumbnailUrl MTR_PROVISIONALLY_AVAILABLE; @property (nonatomic, copy) NSString * _Nullable posterArtUrl MTR_PROVISIONALLY_AVAILABLE; @property (nonatomic, copy) NSString * _Nullable dvbiUrl MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSString * _Nullable releaseDate MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSString * _Nullable parentalGuidanceText MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nullable recordingFlag MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) MTRChannelClusterSeriesInfoStruct * _Nullable seriesInfo MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSArray * _Nullable categoryList MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSArray * _Nullable castList MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSString * _Nullable releaseDate MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSString * _Nullable parentalGuidanceText MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nullable recordingFlag MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) MTRChannelClusterSeriesInfoStruct * _Nullable seriesInfo MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSArray * _Nullable categoryList MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSArray * _Nullable castList MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @property (nonatomic, copy) NSArray * _Nullable externalIDList MTR_PROVISIONALLY_AVAILABLE; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRChannelClusterPageTokenStruct : NSObject -@property (nonatomic, copy) NSNumber * _Nullable limit MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSString * _Nullable after MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSString * _Nullable before MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nullable limit MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSString * _Nullable after MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSString * _Nullable before MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRChannelClusterChannelPagingStruct : NSObject -@property (nonatomic, copy) MTRChannelClusterPageTokenStruct * _Nullable previousToken MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) MTRChannelClusterPageTokenStruct * _Nullable nextToken MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) MTRChannelClusterPageTokenStruct * _Nullable previousToken MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) MTRChannelClusterPageTokenStruct * _Nullable nextToken MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end MTR_PROVISIONALLY_AVAILABLE @@ -1894,11 +1894,11 @@ MTR_DEPRECATED("Please use MTRTargetNavigatorClusterTargetInfoStruct", ios(16.1, @property (nonatomic, copy) NSString * _Nonnull name MTR_DEPRECATED("Please use MTRTargetNavigatorClusterTargetInfoStruct", ios(16.1, 16.4), macos(13.0, 13.3), watchos(9.1, 9.4), tvos(16.1, 16.4)); @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRTargetNavigatorClusterTargetUpdatedEvent : NSObject -@property (nonatomic, copy) NSArray * _Nonnull targetList MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nonnull currentTarget MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSData * _Nonnull data MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSArray * _Nonnull targetList MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nonnull currentTarget MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSData * _Nonnull data MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end MTR_PROVISIONALLY_AVAILABLE @@ -1925,17 +1925,17 @@ MTR_DEPRECATED("Please use MTRMediaPlaybackClusterPlaybackPositionStruct", ios(1 @property (nonatomic, copy) NSNumber * _Nullable position MTR_DEPRECATED("Please use MTRMediaPlaybackClusterPlaybackPositionStruct", ios(16.1, 16.4), macos(13.0, 13.3), watchos(9.1, 9.4), tvos(16.1, 16.4)); @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRMediaPlaybackClusterStateChangedEvent : NSObject -@property (nonatomic, copy) NSNumber * _Nonnull currentState MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nonnull startTime MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nonnull duration MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) MTRMediaPlaybackClusterPlaybackPositionStruct * _Nonnull sampledPosition MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nonnull playbackSpeed MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nonnull seekRangeEnd MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nonnull seekRangeStart MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSData * _Nullable data MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nonnull audioAdvanceUnmuted MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull currentState MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nonnull startTime MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nonnull duration MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) MTRMediaPlaybackClusterPlaybackPositionStruct * _Nonnull sampledPosition MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nonnull playbackSpeed MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nonnull seekRangeEnd MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nonnull seekRangeStart MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSData * _Nullable data MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nonnull audioAdvanceUnmuted MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end MTR_AVAILABLE(ios(16.4), macos(13.3), watchos(9.4), tvos(16.4)) @@ -2102,9 +2102,9 @@ MTR_DEPRECATED("Please use MTRApplicationBasicClusterApplicationStruct", ios(16. @interface MTRApplicationBasicClusterApplicationBasicApplication : MTRApplicationBasicClusterApplicationStruct @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRAccountLoginClusterLoggedOutEvent : NSObject -@property (nonatomic, copy) NSNumber * _Nullable node MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nullable node MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end MTR_PROVISIONALLY_AVAILABLE @@ -2453,12 +2453,12 @@ MTR_PROVISIONALLY_AVAILABLE @property (nonatomic, copy) NSNumber * _Nonnull fabricIndex MTR_PROVISIONALLY_AVAILABLE; @end -MTR_PROVISIONALLY_AVAILABLE +MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)) @interface MTRCommissionerControlClusterCommissioningRequestResultEvent : NSObject -@property (nonatomic, copy) NSNumber * _Nonnull requestID MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nonnull clientNodeID MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nonnull statusCode MTR_PROVISIONALLY_AVAILABLE; -@property (nonatomic, copy) NSNumber * _Nonnull fabricIndex MTR_PROVISIONALLY_AVAILABLE; +@property (nonatomic, copy) NSNumber * _Nonnull requestID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nonnull clientNodeID MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nonnull statusCode MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); +@property (nonatomic, copy) NSNumber * _Nonnull fabricIndex MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end MTR_PROVISIONALLY_AVAILABLE diff --git a/zzz_generated/darwin-framework-tool/zap-generated/cluster/Commands.h b/zzz_generated/darwin-framework-tool/zap-generated/cluster/Commands.h index 894e30e8483eaf..a4d1481b6482b7 100644 --- a/zzz_generated/darwin-framework-tool/zap-generated/cluster/Commands.h +++ b/zzz_generated/darwin-framework-tool/zap-generated/cluster/Commands.h @@ -7264,7 +7264,6 @@ class SubscribeAttributeBindingClusterRevision : public SubscribeAttribute { | * FabricRestrictionReviewUpdate | 0x0002 | \*----------------------------------------------------------------------------*/ -#if MTR_ENABLE_PROVISIONAL /* * Command ReviewFabricRestrictions */ @@ -7274,9 +7273,7 @@ class AccessControlReviewFabricRestrictions : public ClusterCommand { : ClusterCommand("review-fabric-restrictions") , mComplex_Arl(&mRequest.arl) { -#if MTR_ENABLE_PROVISIONAL AddArgument("Arl", &mComplex_Arl); -#endif // MTR_ENABLE_PROVISIONAL ClusterCommand::AddArguments(); } @@ -7291,7 +7288,6 @@ class AccessControlReviewFabricRestrictions : public ClusterCommand { __auto_type * cluster = [[MTRBaseClusterAccessControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue]; __auto_type * params = [[MTRAccessControlClusterReviewFabricRestrictionsParams alloc] init]; params.timedInvokeTimeoutMs = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil; -#if MTR_ENABLE_PROVISIONAL { // Scope for our temporary variables auto * array_0 = [NSMutableArray new]; for (auto & entry_0 : mRequest.arl) { @@ -7318,7 +7314,6 @@ class AccessControlReviewFabricRestrictions : public ClusterCommand { } params.arl = array_0; } -#endif // MTR_ENABLE_PROVISIONAL uint16_t repeatCount = mRepeatCount.ValueOr(1); uint16_t __block responsesNeeded = repeatCount; while (repeatCount--) { @@ -7349,8 +7344,6 @@ class AccessControlReviewFabricRestrictions : public ClusterCommand { TypedComplexArgument> mComplex_Arl; }; -#endif // MTR_ENABLE_PROVISIONAL - /* * Attribute Acl */ @@ -7919,8 +7912,6 @@ class SubscribeAttributeAccessControlAccessControlEntriesPerFabric : public Subs } }; -#if MTR_ENABLE_PROVISIONAL - /* * Attribute CommissioningARL */ @@ -8003,9 +7994,6 @@ class SubscribeAttributeAccessControlCommissioningARL : public SubscribeAttribut } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute Arl */ @@ -8092,8 +8080,6 @@ class SubscribeAttributeAccessControlArl : public SubscribeAttribute { } }; -#endif // MTR_ENABLE_PROVISIONAL - /* * Attribute GeneratedCommandList */ @@ -11726,8 +11712,6 @@ class SubscribeAttributeBasicInformationProductAppearance : public SubscribeAttr } }; -#if MTR_ENABLE_PROVISIONAL - /* * Attribute SpecificationVersion */ @@ -11810,9 +11794,6 @@ class SubscribeAttributeBasicInformationSpecificationVersion : public SubscribeA } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute MaxPathsPerInvoke */ @@ -11895,8 +11876,6 @@ class SubscribeAttributeBasicInformationMaxPathsPerInvoke : public SubscribeAttr } }; -#endif // MTR_ENABLE_PROVISIONAL - /* * Attribute GeneratedCommandList */ @@ -22080,8 +22059,6 @@ class SubscribeAttributeNetworkCommissioningLastConnectErrorValue : public Subsc } }; -#if MTR_ENABLE_PROVISIONAL - /* * Attribute SupportedWiFiBands */ @@ -22164,9 +22141,6 @@ class SubscribeAttributeNetworkCommissioningSupportedWiFiBands : public Subscrib } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute SupportedThreadFeatures */ @@ -22249,9 +22223,6 @@ class SubscribeAttributeNetworkCommissioningSupportedThreadFeatures : public Sub } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute ThreadVersion */ @@ -22334,8 +22305,6 @@ class SubscribeAttributeNetworkCommissioningThreadVersion : public SubscribeAttr } }; -#endif // MTR_ENABLE_PROVISIONAL - /* * Attribute GeneratedCommandList */ @@ -23313,7 +23282,6 @@ class GeneralDiagnosticsTestEventTrigger : public ClusterCommand { chip::app::Clusters::GeneralDiagnostics::Commands::TestEventTrigger::Type mRequest; }; -#if MTR_ENABLE_PROVISIONAL /* * Command TimeSnapshot */ @@ -23364,8 +23332,6 @@ class GeneralDiagnosticsTimeSnapshot : public ClusterCommand { private: }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /* * Command PayloadTestRequest */ @@ -23374,15 +23340,9 @@ class GeneralDiagnosticsPayloadTestRequest : public ClusterCommand { GeneralDiagnosticsPayloadTestRequest() : ClusterCommand("payload-test-request") { -#if MTR_ENABLE_PROVISIONAL AddArgument("EnableKey", &mRequest.enableKey); -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL AddArgument("Value", 0, UINT8_MAX, &mRequest.value); -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL AddArgument("Count", 0, UINT16_MAX, &mRequest.count); -#endif // MTR_ENABLE_PROVISIONAL ClusterCommand::AddArguments(); } @@ -23397,15 +23357,9 @@ class GeneralDiagnosticsPayloadTestRequest : public ClusterCommand { __auto_type * cluster = [[MTRBaseClusterGeneralDiagnostics alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue]; __auto_type * params = [[MTRGeneralDiagnosticsClusterPayloadTestRequestParams alloc] init]; params.timedInvokeTimeoutMs = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil; -#if MTR_ENABLE_PROVISIONAL params.enableKey = [NSData dataWithBytes:mRequest.enableKey.data() length:mRequest.enableKey.size()]; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL params.value = [NSNumber numberWithUnsignedChar:mRequest.value]; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL params.count = [NSNumber numberWithUnsignedShort:mRequest.count]; -#endif // MTR_ENABLE_PROVISIONAL uint16_t repeatCount = mRepeatCount.ValueOr(1); uint16_t __block responsesNeeded = repeatCount; while (repeatCount--) { @@ -23435,8 +23389,6 @@ class GeneralDiagnosticsPayloadTestRequest : public ClusterCommand { chip::app::Clusters::GeneralDiagnostics::Commands::PayloadTestRequest::Type mRequest; }; -#endif // MTR_ENABLE_PROVISIONAL - /* * Attribute NetworkInterfaces */ @@ -33858,7 +33810,6 @@ class SubscribeAttributeEthernetNetworkDiagnosticsClusterRevision : public Subsc } }; -#if MTR_ENABLE_PROVISIONAL /*----------------------------------------------------------------------------*\ | Cluster TimeSynchronization | 0x0038 | |------------------------------------------------------------------------------| @@ -33897,7 +33848,6 @@ class SubscribeAttributeEthernetNetworkDiagnosticsClusterRevision : public Subsc | * MissingTrustedTimeSource | 0x0004 | \*----------------------------------------------------------------------------*/ -#if MTR_ENABLE_PROVISIONAL /* * Command SetUTCTime */ @@ -33953,8 +33903,6 @@ class TimeSynchronizationSetUTCTime : public ClusterCommand { chip::app::Clusters::TimeSynchronization::Commands::SetUTCTime::Type mRequest; }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /* * Command SetTrustedTimeSource */ @@ -33964,9 +33912,7 @@ class TimeSynchronizationSetTrustedTimeSource : public ClusterCommand { : ClusterCommand("set-trusted-time-source") , mComplex_TrustedTimeSource(&mRequest.trustedTimeSource) { -#if MTR_ENABLE_PROVISIONAL AddArgument("TrustedTimeSource", &mComplex_TrustedTimeSource); -#endif // MTR_ENABLE_PROVISIONAL ClusterCommand::AddArguments(); } @@ -33981,7 +33927,6 @@ class TimeSynchronizationSetTrustedTimeSource : public ClusterCommand { __auto_type * cluster = [[MTRBaseClusterTimeSynchronization alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue]; __auto_type * params = [[MTRTimeSynchronizationClusterSetTrustedTimeSourceParams alloc] init]; params.timedInvokeTimeoutMs = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil; -#if MTR_ENABLE_PROVISIONAL if (mRequest.trustedTimeSource.IsNull()) { params.trustedTimeSource = nil; } else { @@ -33989,7 +33934,6 @@ class TimeSynchronizationSetTrustedTimeSource : public ClusterCommand { params.trustedTimeSource.nodeID = [NSNumber numberWithUnsignedLongLong:mRequest.trustedTimeSource.Value().nodeID]; params.trustedTimeSource.endpoint = [NSNumber numberWithUnsignedShort:mRequest.trustedTimeSource.Value().endpoint]; } -#endif // MTR_ENABLE_PROVISIONAL uint16_t repeatCount = mRepeatCount.ValueOr(1); uint16_t __block responsesNeeded = repeatCount; while (repeatCount--) { @@ -34014,8 +33958,6 @@ class TimeSynchronizationSetTrustedTimeSource : public ClusterCommand { TypedComplexArgument> mComplex_TrustedTimeSource; }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /* * Command SetTimeZone */ @@ -34025,9 +33967,7 @@ class TimeSynchronizationSetTimeZone : public ClusterCommand { : ClusterCommand("set-time-zone") , mComplex_TimeZone(&mRequest.timeZone) { -#if MTR_ENABLE_PROVISIONAL AddArgument("TimeZone", &mComplex_TimeZone); -#endif // MTR_ENABLE_PROVISIONAL ClusterCommand::AddArguments(); } @@ -34042,7 +33982,6 @@ class TimeSynchronizationSetTimeZone : public ClusterCommand { __auto_type * cluster = [[MTRBaseClusterTimeSynchronization alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue]; __auto_type * params = [[MTRTimeSynchronizationClusterSetTimeZoneParams alloc] init]; params.timedInvokeTimeoutMs = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil; -#if MTR_ENABLE_PROVISIONAL { // Scope for our temporary variables auto * array_0 = [NSMutableArray new]; for (auto & entry_0 : mRequest.timeZone) { @@ -34059,7 +33998,6 @@ class TimeSynchronizationSetTimeZone : public ClusterCommand { } params.timeZone = array_0; } -#endif // MTR_ENABLE_PROVISIONAL uint16_t repeatCount = mRepeatCount.ValueOr(1); uint16_t __block responsesNeeded = repeatCount; while (repeatCount--) { @@ -34090,8 +34028,6 @@ class TimeSynchronizationSetTimeZone : public ClusterCommand { TypedComplexArgument> mComplex_TimeZone; }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /* * Command SetDSTOffset */ @@ -34101,9 +34037,7 @@ class TimeSynchronizationSetDSTOffset : public ClusterCommand { : ClusterCommand("set-dstoffset") , mComplex_DSTOffset(&mRequest.DSTOffset) { -#if MTR_ENABLE_PROVISIONAL AddArgument("DSTOffset", &mComplex_DSTOffset); -#endif // MTR_ENABLE_PROVISIONAL ClusterCommand::AddArguments(); } @@ -34118,7 +34052,6 @@ class TimeSynchronizationSetDSTOffset : public ClusterCommand { __auto_type * cluster = [[MTRBaseClusterTimeSynchronization alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue]; __auto_type * params = [[MTRTimeSynchronizationClusterSetDSTOffsetParams alloc] init]; params.timedInvokeTimeoutMs = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil; -#if MTR_ENABLE_PROVISIONAL { // Scope for our temporary variables auto * array_0 = [NSMutableArray new]; for (auto & entry_0 : mRequest.DSTOffset) { @@ -34135,7 +34068,6 @@ class TimeSynchronizationSetDSTOffset : public ClusterCommand { } params.dstOffset = array_0; } -#endif // MTR_ENABLE_PROVISIONAL uint16_t repeatCount = mRepeatCount.ValueOr(1); uint16_t __block responsesNeeded = repeatCount; while (repeatCount--) { @@ -34160,8 +34092,6 @@ class TimeSynchronizationSetDSTOffset : public ClusterCommand { TypedComplexArgument> mComplex_DSTOffset; }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /* * Command SetDefaultNTP */ @@ -34170,9 +34100,7 @@ class TimeSynchronizationSetDefaultNTP : public ClusterCommand { TimeSynchronizationSetDefaultNTP() : ClusterCommand("set-default-ntp") { -#if MTR_ENABLE_PROVISIONAL AddArgument("DefaultNTP", &mRequest.defaultNTP); -#endif // MTR_ENABLE_PROVISIONAL ClusterCommand::AddArguments(); } @@ -34187,13 +34115,11 @@ class TimeSynchronizationSetDefaultNTP : public ClusterCommand { __auto_type * cluster = [[MTRBaseClusterTimeSynchronization alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue]; __auto_type * params = [[MTRTimeSynchronizationClusterSetDefaultNTPParams alloc] init]; params.timedInvokeTimeoutMs = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil; -#if MTR_ENABLE_PROVISIONAL if (mRequest.defaultNTP.IsNull()) { params.defaultNTP = nil; } else { params.defaultNTP = [[NSString alloc] initWithBytes:mRequest.defaultNTP.Value().data() length:mRequest.defaultNTP.Value().size() encoding:NSUTF8StringEncoding]; } -#endif // MTR_ENABLE_PROVISIONAL uint16_t repeatCount = mRepeatCount.ValueOr(1); uint16_t __block responsesNeeded = repeatCount; while (repeatCount--) { @@ -34217,10 +34143,6 @@ class TimeSynchronizationSetDefaultNTP : public ClusterCommand { chip::app::Clusters::TimeSynchronization::Commands::SetDefaultNTP::Type mRequest; }; -#endif // MTR_ENABLE_PROVISIONAL - -#if MTR_ENABLE_PROVISIONAL - /* * Attribute UTCTime */ @@ -34303,9 +34225,6 @@ class SubscribeAttributeTimeSynchronizationUTCTime : public SubscribeAttribute { } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute Granularity */ @@ -34388,9 +34307,6 @@ class SubscribeAttributeTimeSynchronizationGranularity : public SubscribeAttribu } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute TimeSource */ @@ -34473,9 +34389,6 @@ class SubscribeAttributeTimeSynchronizationTimeSource : public SubscribeAttribut } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute TrustedTimeSource */ @@ -34558,9 +34471,6 @@ class SubscribeAttributeTimeSynchronizationTrustedTimeSource : public SubscribeA } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute DefaultNTP */ @@ -34643,9 +34553,6 @@ class SubscribeAttributeTimeSynchronizationDefaultNTP : public SubscribeAttribut } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute TimeZone */ @@ -34728,9 +34635,6 @@ class SubscribeAttributeTimeSynchronizationTimeZone : public SubscribeAttribute } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute DSTOffset */ @@ -34813,9 +34717,6 @@ class SubscribeAttributeTimeSynchronizationDSTOffset : public SubscribeAttribute } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute LocalTime */ @@ -34898,9 +34799,6 @@ class SubscribeAttributeTimeSynchronizationLocalTime : public SubscribeAttribute } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute TimeZoneDatabase */ @@ -34983,9 +34881,6 @@ class SubscribeAttributeTimeSynchronizationTimeZoneDatabase : public SubscribeAt } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute NTPServerAvailable */ @@ -35068,9 +34963,6 @@ class SubscribeAttributeTimeSynchronizationNTPServerAvailable : public Subscribe } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute TimeZoneListMaxSize */ @@ -35153,9 +35045,6 @@ class SubscribeAttributeTimeSynchronizationTimeZoneListMaxSize : public Subscrib } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute DSTOffsetListMaxSize */ @@ -35238,9 +35127,6 @@ class SubscribeAttributeTimeSynchronizationDSTOffsetListMaxSize : public Subscri } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute SupportsDNSResolve */ @@ -35323,9 +35209,6 @@ class SubscribeAttributeTimeSynchronizationSupportsDNSResolve : public Subscribe } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute GeneratedCommandList */ @@ -35408,9 +35291,6 @@ class SubscribeAttributeTimeSynchronizationGeneratedCommandList : public Subscri } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute AcceptedCommandList */ @@ -35493,9 +35373,6 @@ class SubscribeAttributeTimeSynchronizationAcceptedCommandList : public Subscrib } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute AttributeList */ @@ -35578,9 +35455,6 @@ class SubscribeAttributeTimeSynchronizationAttributeList : public SubscribeAttri } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute FeatureMap */ @@ -35663,9 +35537,6 @@ class SubscribeAttributeTimeSynchronizationFeatureMap : public SubscribeAttribut } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute ClusterRevision */ @@ -35748,8 +35619,6 @@ class SubscribeAttributeTimeSynchronizationClusterRevision : public SubscribeAtt } }; -#endif // MTR_ENABLE_PROVISIONAL -#endif // MTR_ENABLE_PROVISIONAL /*----------------------------------------------------------------------------*\ | Cluster BridgedDeviceBasicInformation | 0x0039 | |------------------------------------------------------------------------------| @@ -35788,7 +35657,6 @@ class SubscribeAttributeTimeSynchronizationClusterRevision : public SubscribeAtt | * ActiveChanged | 0x0080 | \*----------------------------------------------------------------------------*/ -#if MTR_ENABLE_PROVISIONAL /* * Command KeepActive */ @@ -35797,12 +35665,8 @@ class BridgedDeviceBasicInformationKeepActive : public ClusterCommand { BridgedDeviceBasicInformationKeepActive() : ClusterCommand("keep-active") { -#if MTR_ENABLE_PROVISIONAL AddArgument("StayActiveDuration", 0, UINT32_MAX, &mRequest.stayActiveDuration); -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL AddArgument("TimeoutMs", 0, UINT32_MAX, &mRequest.timeoutMs); -#endif // MTR_ENABLE_PROVISIONAL ClusterCommand::AddArguments(); } @@ -35817,12 +35681,8 @@ class BridgedDeviceBasicInformationKeepActive : public ClusterCommand { __auto_type * cluster = [[MTRBaseClusterBridgedDeviceBasicInformation alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue]; __auto_type * params = [[MTRBridgedDeviceBasicInformationClusterKeepActiveParams alloc] init]; params.timedInvokeTimeoutMs = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil; -#if MTR_ENABLE_PROVISIONAL params.stayActiveDuration = [NSNumber numberWithUnsignedInt:mRequest.stayActiveDuration]; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL params.timeoutMs = [NSNumber numberWithUnsignedInt:mRequest.timeoutMs]; -#endif // MTR_ENABLE_PROVISIONAL uint16_t repeatCount = mRepeatCount.ValueOr(1); uint16_t __block responsesNeeded = repeatCount; while (repeatCount--) { @@ -35846,8 +35706,6 @@ class BridgedDeviceBasicInformationKeepActive : public ClusterCommand { chip::app::Clusters::BridgedDeviceBasicInformation::Commands::KeepActive::Type mRequest; }; -#endif // MTR_ENABLE_PROVISIONAL - /* * Attribute VendorName */ @@ -36094,8 +35952,6 @@ class SubscribeAttributeBridgedDeviceBasicInformationProductName : public Subscr } }; -#if MTR_ENABLE_PROVISIONAL - /* * Attribute ProductID */ @@ -36178,8 +36034,6 @@ class SubscribeAttributeBridgedDeviceBasicInformationProductID : public Subscrib } }; -#endif // MTR_ENABLE_PROVISIONAL - /* * Attribute NodeLabel */ @@ -70764,7 +70618,6 @@ class SubscribeAttributeElectricalEnergyMeasurementClusterRevision : public Subs } }; -#if MTR_ENABLE_PROVISIONAL /*----------------------------------------------------------------------------*\ | Cluster WaterHeaterManagement | 0x0094 | |------------------------------------------------------------------------------| @@ -70790,7 +70643,6 @@ class SubscribeAttributeElectricalEnergyMeasurementClusterRevision : public Subs | * BoostEnded | 0x0001 | \*----------------------------------------------------------------------------*/ -#if MTR_ENABLE_PROVISIONAL /* * Command Boost */ @@ -70800,9 +70652,7 @@ class WaterHeaterManagementBoost : public ClusterCommand { : ClusterCommand("boost") , mComplex_BoostInfo(&mRequest.boostInfo) { -#if MTR_ENABLE_PROVISIONAL AddArgument("BoostInfo", &mComplex_BoostInfo); -#endif // MTR_ENABLE_PROVISIONAL ClusterCommand::AddArguments(); } @@ -70817,7 +70667,6 @@ class WaterHeaterManagementBoost : public ClusterCommand { __auto_type * cluster = [[MTRBaseClusterWaterHeaterManagement alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue]; __auto_type * params = [[MTRWaterHeaterManagementClusterBoostParams alloc] init]; params.timedInvokeTimeoutMs = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil; -#if MTR_ENABLE_PROVISIONAL params.boostInfo = [MTRWaterHeaterManagementClusterWaterHeaterBoostInfoStruct new]; params.boostInfo.duration = [NSNumber numberWithUnsignedInt:mRequest.boostInfo.duration]; if (mRequest.boostInfo.oneShot.HasValue()) { @@ -70845,7 +70694,6 @@ class WaterHeaterManagementBoost : public ClusterCommand { } else { params.boostInfo.targetReheat = nil; } -#endif // MTR_ENABLE_PROVISIONAL uint16_t repeatCount = mRepeatCount.ValueOr(1); uint16_t __block responsesNeeded = repeatCount; while (repeatCount--) { @@ -70870,8 +70718,6 @@ class WaterHeaterManagementBoost : public ClusterCommand { TypedComplexArgument mComplex_BoostInfo; }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /* * Command CancelBoost */ @@ -70916,10 +70762,6 @@ class WaterHeaterManagementCancelBoost : public ClusterCommand { private: }; -#endif // MTR_ENABLE_PROVISIONAL - -#if MTR_ENABLE_PROVISIONAL - /* * Attribute HeaterTypes */ @@ -71002,9 +70844,6 @@ class SubscribeAttributeWaterHeaterManagementHeaterTypes : public SubscribeAttri } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute HeatDemand */ @@ -71087,9 +70926,6 @@ class SubscribeAttributeWaterHeaterManagementHeatDemand : public SubscribeAttrib } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute TankVolume */ @@ -71172,9 +71008,6 @@ class SubscribeAttributeWaterHeaterManagementTankVolume : public SubscribeAttrib } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute EstimatedHeatRequired */ @@ -71257,9 +71090,6 @@ class SubscribeAttributeWaterHeaterManagementEstimatedHeatRequired : public Subs } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute TankPercentage */ @@ -71342,9 +71172,6 @@ class SubscribeAttributeWaterHeaterManagementTankPercentage : public SubscribeAt } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute BoostState */ @@ -71427,9 +71254,6 @@ class SubscribeAttributeWaterHeaterManagementBoostState : public SubscribeAttrib } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute GeneratedCommandList */ @@ -71512,9 +71336,6 @@ class SubscribeAttributeWaterHeaterManagementGeneratedCommandList : public Subsc } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute AcceptedCommandList */ @@ -71597,9 +71418,6 @@ class SubscribeAttributeWaterHeaterManagementAcceptedCommandList : public Subscr } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute AttributeList */ @@ -71682,9 +71500,6 @@ class SubscribeAttributeWaterHeaterManagementAttributeList : public SubscribeAtt } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute FeatureMap */ @@ -71767,9 +71582,6 @@ class SubscribeAttributeWaterHeaterManagementFeatureMap : public SubscribeAttrib } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute ClusterRevision */ @@ -71852,8 +71664,6 @@ class SubscribeAttributeWaterHeaterManagementClusterRevision : public SubscribeA } }; -#endif // MTR_ENABLE_PROVISIONAL -#endif // MTR_ENABLE_PROVISIONAL #if MTR_ENABLE_PROVISIONAL /*----------------------------------------------------------------------------*\ | Cluster DemandResponseLoadControl | 0x0096 | @@ -73453,7 +73263,6 @@ class SubscribeAttributeDemandResponseLoadControlClusterRevision : public Subscr #endif // MTR_ENABLE_PROVISIONAL #endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /*----------------------------------------------------------------------------*\ | Cluster Messages | 0x0097 | |------------------------------------------------------------------------------| @@ -73476,7 +73285,6 @@ class SubscribeAttributeDemandResponseLoadControlClusterRevision : public Subscr | * MessageComplete | 0x0002 | \*----------------------------------------------------------------------------*/ -#if MTR_ENABLE_PROVISIONAL /* * Command PresentMessagesRequest */ @@ -73486,27 +73294,13 @@ class MessagesPresentMessagesRequest : public ClusterCommand { : ClusterCommand("present-messages-request") , mComplex_Responses(&mRequest.responses) { -#if MTR_ENABLE_PROVISIONAL AddArgument("MessageID", &mRequest.messageID); -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL AddArgument("Priority", 0, UINT8_MAX, &mRequest.priority); -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL AddArgument("MessageControl", 0, UINT8_MAX, &mRequest.messageControl); -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL AddArgument("StartTime", 0, UINT32_MAX, &mRequest.startTime); -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL AddArgument("Duration", 0, UINT64_MAX, &mRequest.duration); -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL AddArgument("MessageText", &mRequest.messageText); -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL AddArgument("Responses", &mComplex_Responses); -#endif // MTR_ENABLE_PROVISIONAL ClusterCommand::AddArguments(); } @@ -73521,33 +73315,20 @@ class MessagesPresentMessagesRequest : public ClusterCommand { __auto_type * cluster = [[MTRBaseClusterMessages alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue]; __auto_type * params = [[MTRMessagesClusterPresentMessagesRequestParams alloc] init]; params.timedInvokeTimeoutMs = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil; -#if MTR_ENABLE_PROVISIONAL params.messageID = [NSData dataWithBytes:mRequest.messageID.data() length:mRequest.messageID.size()]; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL params.priority = [NSNumber numberWithUnsignedChar:chip::to_underlying(mRequest.priority)]; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL params.messageControl = [NSNumber numberWithUnsignedChar:mRequest.messageControl.Raw()]; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL if (mRequest.startTime.IsNull()) { params.startTime = nil; } else { params.startTime = [NSNumber numberWithUnsignedInt:mRequest.startTime.Value()]; } -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL if (mRequest.duration.IsNull()) { params.duration = nil; } else { params.duration = [NSNumber numberWithUnsignedLongLong:mRequest.duration.Value()]; } -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL params.messageText = [[NSString alloc] initWithBytes:mRequest.messageText.data() length:mRequest.messageText.size() encoding:NSUTF8StringEncoding]; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL if (mRequest.responses.HasValue()) { { // Scope for our temporary variables auto * array_1 = [NSMutableArray new]; @@ -73571,7 +73352,6 @@ class MessagesPresentMessagesRequest : public ClusterCommand { } else { params.responses = nil; } -#endif // MTR_ENABLE_PROVISIONAL uint16_t repeatCount = mRepeatCount.ValueOr(1); uint16_t __block responsesNeeded = repeatCount; while (repeatCount--) { @@ -73596,8 +73376,6 @@ class MessagesPresentMessagesRequest : public ClusterCommand { TypedComplexArgument>> mComplex_Responses; }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /* * Command CancelMessagesRequest */ @@ -73607,9 +73385,7 @@ class MessagesCancelMessagesRequest : public ClusterCommand { : ClusterCommand("cancel-messages-request") , mComplex_MessageIDs(&mRequest.messageIDs) { -#if MTR_ENABLE_PROVISIONAL AddArgument("MessageIDs", &mComplex_MessageIDs); -#endif // MTR_ENABLE_PROVISIONAL ClusterCommand::AddArguments(); } @@ -73624,7 +73400,6 @@ class MessagesCancelMessagesRequest : public ClusterCommand { __auto_type * cluster = [[MTRBaseClusterMessages alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue]; __auto_type * params = [[MTRMessagesClusterCancelMessagesRequestParams alloc] init]; params.timedInvokeTimeoutMs = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil; -#if MTR_ENABLE_PROVISIONAL { // Scope for our temporary variables auto * array_0 = [NSMutableArray new]; for (auto & entry_0 : mRequest.messageIDs) { @@ -73634,7 +73409,6 @@ class MessagesCancelMessagesRequest : public ClusterCommand { } params.messageIDs = array_0; } -#endif // MTR_ENABLE_PROVISIONAL uint16_t repeatCount = mRepeatCount.ValueOr(1); uint16_t __block responsesNeeded = repeatCount; while (repeatCount--) { @@ -73659,10 +73433,6 @@ class MessagesCancelMessagesRequest : public ClusterCommand { TypedComplexArgument> mComplex_MessageIDs; }; -#endif // MTR_ENABLE_PROVISIONAL - -#if MTR_ENABLE_PROVISIONAL - /* * Attribute Messages */ @@ -73745,9 +73515,6 @@ class SubscribeAttributeMessagesMessages : public SubscribeAttribute { } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute ActiveMessageIDs */ @@ -73830,9 +73597,6 @@ class SubscribeAttributeMessagesActiveMessageIDs : public SubscribeAttribute { } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute GeneratedCommandList */ @@ -73915,9 +73679,6 @@ class SubscribeAttributeMessagesGeneratedCommandList : public SubscribeAttribute } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute AcceptedCommandList */ @@ -74000,9 +73761,6 @@ class SubscribeAttributeMessagesAcceptedCommandList : public SubscribeAttribute } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute AttributeList */ @@ -74085,9 +73843,6 @@ class SubscribeAttributeMessagesAttributeList : public SubscribeAttribute { } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute FeatureMap */ @@ -74170,9 +73925,6 @@ class SubscribeAttributeMessagesFeatureMap : public SubscribeAttribute { } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute ClusterRevision */ @@ -74255,8 +74007,6 @@ class SubscribeAttributeMessagesClusterRevision : public SubscribeAttribute { } }; -#endif // MTR_ENABLE_PROVISIONAL -#endif // MTR_ENABLE_PROVISIONAL /*----------------------------------------------------------------------------*\ | Cluster DeviceEnergyManagement | 0x0098 | |------------------------------------------------------------------------------| @@ -75783,7 +75533,6 @@ class SubscribeAttributeDeviceEnergyManagementClusterRevision : public Subscribe } }; -#if MTR_ENABLE_PROVISIONAL /*----------------------------------------------------------------------------*\ | Cluster EnergyEvse | 0x0099 | |------------------------------------------------------------------------------| @@ -75835,7 +75584,6 @@ class SubscribeAttributeDeviceEnergyManagementClusterRevision : public Subscribe | * Rfid | 0x0005 | \*----------------------------------------------------------------------------*/ -#if MTR_ENABLE_PROVISIONAL /* * Command Disable */ @@ -75880,8 +75628,6 @@ class EnergyEvseDisable : public ClusterCommand { private: }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /* * Command EnableCharging */ @@ -75890,15 +75636,9 @@ class EnergyEvseEnableCharging : public ClusterCommand { EnergyEvseEnableCharging() : ClusterCommand("enable-charging") { -#if MTR_ENABLE_PROVISIONAL AddArgument("ChargingEnabledUntil", 0, UINT32_MAX, &mRequest.chargingEnabledUntil); -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL AddArgument("MinimumChargeCurrent", INT64_MIN, INT64_MAX, &mRequest.minimumChargeCurrent); -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL AddArgument("MaximumChargeCurrent", INT64_MIN, INT64_MAX, &mRequest.maximumChargeCurrent); -#endif // MTR_ENABLE_PROVISIONAL ClusterCommand::AddArguments(); } @@ -75913,19 +75653,13 @@ class EnergyEvseEnableCharging : public ClusterCommand { __auto_type * cluster = [[MTRBaseClusterEnergyEVSE alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue]; __auto_type * params = [[MTREnergyEVSEClusterEnableChargingParams alloc] init]; params.timedInvokeTimeoutMs = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil; -#if MTR_ENABLE_PROVISIONAL if (mRequest.chargingEnabledUntil.IsNull()) { params.chargingEnabledUntil = nil; } else { params.chargingEnabledUntil = [NSNumber numberWithUnsignedInt:mRequest.chargingEnabledUntil.Value()]; } -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL params.minimumChargeCurrent = [NSNumber numberWithLongLong:mRequest.minimumChargeCurrent]; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL params.maximumChargeCurrent = [NSNumber numberWithLongLong:mRequest.maximumChargeCurrent]; -#endif // MTR_ENABLE_PROVISIONAL uint16_t repeatCount = mRepeatCount.ValueOr(1); uint16_t __block responsesNeeded = repeatCount; while (repeatCount--) { @@ -75949,7 +75683,6 @@ class EnergyEvseEnableCharging : public ClusterCommand { chip::app::Clusters::EnergyEvse::Commands::EnableCharging::Type mRequest; }; -#endif // MTR_ENABLE_PROVISIONAL #if MTR_ENABLE_PROVISIONAL /* * Command EnableDischarging @@ -76013,7 +75746,6 @@ class EnergyEvseEnableDischarging : public ClusterCommand { }; #endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /* * Command StartDiagnostics */ @@ -76058,8 +75790,6 @@ class EnergyEvseStartDiagnostics : public ClusterCommand { private: }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /* * Command SetTargets */ @@ -76069,9 +75799,7 @@ class EnergyEvseSetTargets : public ClusterCommand { : ClusterCommand("set-targets") , mComplex_ChargingTargetSchedules(&mRequest.chargingTargetSchedules) { -#if MTR_ENABLE_PROVISIONAL AddArgument("ChargingTargetSchedules", &mComplex_ChargingTargetSchedules); -#endif // MTR_ENABLE_PROVISIONAL ClusterCommand::AddArguments(); } @@ -76086,7 +75814,6 @@ class EnergyEvseSetTargets : public ClusterCommand { __auto_type * cluster = [[MTRBaseClusterEnergyEVSE alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue]; __auto_type * params = [[MTREnergyEVSEClusterSetTargetsParams alloc] init]; params.timedInvokeTimeoutMs = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil; -#if MTR_ENABLE_PROVISIONAL { // Scope for our temporary variables auto * array_0 = [NSMutableArray new]; for (auto & entry_0 : mRequest.chargingTargetSchedules) { @@ -76117,7 +75844,6 @@ class EnergyEvseSetTargets : public ClusterCommand { } params.chargingTargetSchedules = array_0; } -#endif // MTR_ENABLE_PROVISIONAL uint16_t repeatCount = mRepeatCount.ValueOr(1); uint16_t __block responsesNeeded = repeatCount; while (repeatCount--) { @@ -76142,8 +75868,6 @@ class EnergyEvseSetTargets : public ClusterCommand { TypedComplexArgument> mComplex_ChargingTargetSchedules; }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /* * Command GetTargets */ @@ -76194,8 +75918,6 @@ class EnergyEvseGetTargets : public ClusterCommand { private: }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /* * Command ClearTargets */ @@ -76240,10 +75962,6 @@ class EnergyEvseClearTargets : public ClusterCommand { private: }; -#endif // MTR_ENABLE_PROVISIONAL - -#if MTR_ENABLE_PROVISIONAL - /* * Attribute State */ @@ -76326,9 +76044,6 @@ class SubscribeAttributeEnergyEvseState : public SubscribeAttribute { } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute SupplyState */ @@ -76411,9 +76126,6 @@ class SubscribeAttributeEnergyEvseSupplyState : public SubscribeAttribute { } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute FaultState */ @@ -76496,9 +76208,6 @@ class SubscribeAttributeEnergyEvseFaultState : public SubscribeAttribute { } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute ChargingEnabledUntil */ @@ -76581,7 +76290,6 @@ class SubscribeAttributeEnergyEvseChargingEnabledUntil : public SubscribeAttribu } }; -#endif // MTR_ENABLE_PROVISIONAL #if MTR_ENABLE_PROVISIONAL /* @@ -76667,7 +76375,6 @@ class SubscribeAttributeEnergyEvseDischargingEnabledUntil : public SubscribeAttr }; #endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /* * Attribute CircuitCapacity @@ -76751,9 +76458,6 @@ class SubscribeAttributeEnergyEvseCircuitCapacity : public SubscribeAttribute { } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute MinimumChargeCurrent */ @@ -76836,9 +76540,6 @@ class SubscribeAttributeEnergyEvseMinimumChargeCurrent : public SubscribeAttribu } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute MaximumChargeCurrent */ @@ -76921,7 +76622,6 @@ class SubscribeAttributeEnergyEvseMaximumChargeCurrent : public SubscribeAttribu } }; -#endif // MTR_ENABLE_PROVISIONAL #if MTR_ENABLE_PROVISIONAL /* @@ -77007,7 +76707,6 @@ class SubscribeAttributeEnergyEvseMaximumDischargeCurrent : public SubscribeAttr }; #endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /* * Attribute UserMaximumChargeCurrent @@ -77132,9 +76831,6 @@ class SubscribeAttributeEnergyEvseUserMaximumChargeCurrent : public SubscribeAtt } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute RandomizationDelayWindow */ @@ -77258,9 +76954,6 @@ class SubscribeAttributeEnergyEvseRandomizationDelayWindow : public SubscribeAtt } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute NextChargeStartTime */ @@ -77343,9 +77036,6 @@ class SubscribeAttributeEnergyEvseNextChargeStartTime : public SubscribeAttribut } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute NextChargeTargetTime */ @@ -77428,9 +77118,6 @@ class SubscribeAttributeEnergyEvseNextChargeTargetTime : public SubscribeAttribu } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute NextChargeRequiredEnergy */ @@ -77513,9 +77200,6 @@ class SubscribeAttributeEnergyEvseNextChargeRequiredEnergy : public SubscribeAtt } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute NextChargeTargetSoC */ @@ -77598,9 +77282,6 @@ class SubscribeAttributeEnergyEvseNextChargeTargetSoC : public SubscribeAttribut } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute ApproximateEVEfficiency */ @@ -77727,7 +77408,6 @@ class SubscribeAttributeEnergyEvseApproximateEVEfficiency : public SubscribeAttr } }; -#endif // MTR_ENABLE_PROVISIONAL #if MTR_ENABLE_PROVISIONAL /* @@ -77983,7 +77663,6 @@ class SubscribeAttributeEnergyEvseVehicleID : public SubscribeAttribute { }; #endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /* * Attribute SessionID @@ -78067,9 +77746,6 @@ class SubscribeAttributeEnergyEvseSessionID : public SubscribeAttribute { } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute SessionDuration */ @@ -78152,9 +77828,6 @@ class SubscribeAttributeEnergyEvseSessionDuration : public SubscribeAttribute { } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute SessionEnergyCharged */ @@ -78237,7 +77910,6 @@ class SubscribeAttributeEnergyEvseSessionEnergyCharged : public SubscribeAttribu } }; -#endif // MTR_ENABLE_PROVISIONAL #if MTR_ENABLE_PROVISIONAL /* @@ -78323,7 +77995,6 @@ class SubscribeAttributeEnergyEvseSessionEnergyDischarged : public SubscribeAttr }; #endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /* * Attribute GeneratedCommandList @@ -78407,9 +78078,6 @@ class SubscribeAttributeEnergyEvseGeneratedCommandList : public SubscribeAttribu } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute AcceptedCommandList */ @@ -78492,9 +78160,6 @@ class SubscribeAttributeEnergyEvseAcceptedCommandList : public SubscribeAttribut } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute AttributeList */ @@ -78577,9 +78242,6 @@ class SubscribeAttributeEnergyEvseAttributeList : public SubscribeAttribute { } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute FeatureMap */ @@ -78662,9 +78324,6 @@ class SubscribeAttributeEnergyEvseFeatureMap : public SubscribeAttribute { } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute ClusterRevision */ @@ -78747,8 +78406,6 @@ class SubscribeAttributeEnergyEvseClusterRevision : public SubscribeAttribute { } }; -#endif // MTR_ENABLE_PROVISIONAL -#endif // MTR_ENABLE_PROVISIONAL #if MTR_ENABLE_PROVISIONAL /*----------------------------------------------------------------------------*\ | Cluster EnergyPreference | 0x009B | @@ -79703,7 +79360,6 @@ class SubscribeAttributeEnergyPreferenceClusterRevision : public SubscribeAttrib #endif // MTR_ENABLE_PROVISIONAL #endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /*----------------------------------------------------------------------------*\ | Cluster PowerTopology | 0x009C | |------------------------------------------------------------------------------| @@ -79721,8 +79377,6 @@ class SubscribeAttributeEnergyPreferenceClusterRevision : public SubscribeAttrib | Events: | | \*----------------------------------------------------------------------------*/ -#if MTR_ENABLE_PROVISIONAL - /* * Attribute AvailableEndpoints */ @@ -79805,9 +79459,6 @@ class SubscribeAttributePowerTopologyAvailableEndpoints : public SubscribeAttrib } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute ActiveEndpoints */ @@ -79890,9 +79541,6 @@ class SubscribeAttributePowerTopologyActiveEndpoints : public SubscribeAttribute } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute GeneratedCommandList */ @@ -79975,9 +79623,6 @@ class SubscribeAttributePowerTopologyGeneratedCommandList : public SubscribeAttr } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute AcceptedCommandList */ @@ -80060,9 +79705,6 @@ class SubscribeAttributePowerTopologyAcceptedCommandList : public SubscribeAttri } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute AttributeList */ @@ -80145,9 +79787,6 @@ class SubscribeAttributePowerTopologyAttributeList : public SubscribeAttribute { } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute FeatureMap */ @@ -80230,9 +79869,6 @@ class SubscribeAttributePowerTopologyFeatureMap : public SubscribeAttribute { } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute ClusterRevision */ @@ -80315,9 +79951,6 @@ class SubscribeAttributePowerTopologyClusterRevision : public SubscribeAttribute } }; -#endif // MTR_ENABLE_PROVISIONAL -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /*----------------------------------------------------------------------------*\ | Cluster EnergyEvseMode | 0x009D | |------------------------------------------------------------------------------| @@ -80336,7 +79969,6 @@ class SubscribeAttributePowerTopologyClusterRevision : public SubscribeAttribute | Events: | | \*----------------------------------------------------------------------------*/ -#if MTR_ENABLE_PROVISIONAL /* * Command ChangeToMode */ @@ -80345,9 +79977,7 @@ class EnergyEvseModeChangeToMode : public ClusterCommand { EnergyEvseModeChangeToMode() : ClusterCommand("change-to-mode") { -#if MTR_ENABLE_PROVISIONAL AddArgument("NewMode", 0, UINT8_MAX, &mRequest.newMode); -#endif // MTR_ENABLE_PROVISIONAL ClusterCommand::AddArguments(); } @@ -80362,9 +79992,7 @@ class EnergyEvseModeChangeToMode : public ClusterCommand { __auto_type * cluster = [[MTRBaseClusterEnergyEVSEMode alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue]; __auto_type * params = [[MTREnergyEVSEModeClusterChangeToModeParams alloc] init]; params.timedInvokeTimeoutMs = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil; -#if MTR_ENABLE_PROVISIONAL params.newMode = [NSNumber numberWithUnsignedChar:mRequest.newMode]; -#endif // MTR_ENABLE_PROVISIONAL uint16_t repeatCount = mRepeatCount.ValueOr(1); uint16_t __block responsesNeeded = repeatCount; while (repeatCount--) { @@ -80394,10 +80022,6 @@ class EnergyEvseModeChangeToMode : public ClusterCommand { chip::app::Clusters::EnergyEvseMode::Commands::ChangeToMode::Type mRequest; }; -#endif // MTR_ENABLE_PROVISIONAL - -#if MTR_ENABLE_PROVISIONAL - /* * Attribute SupportedModes */ @@ -80480,9 +80104,6 @@ class SubscribeAttributeEnergyEvseModeSupportedModes : public SubscribeAttribute } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute CurrentMode */ @@ -80565,9 +80186,6 @@ class SubscribeAttributeEnergyEvseModeCurrentMode : public SubscribeAttribute { } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute GeneratedCommandList */ @@ -80650,9 +80268,6 @@ class SubscribeAttributeEnergyEvseModeGeneratedCommandList : public SubscribeAtt } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute AcceptedCommandList */ @@ -80735,9 +80350,6 @@ class SubscribeAttributeEnergyEvseModeAcceptedCommandList : public SubscribeAttr } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute AttributeList */ @@ -80820,9 +80432,6 @@ class SubscribeAttributeEnergyEvseModeAttributeList : public SubscribeAttribute } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute FeatureMap */ @@ -80905,9 +80514,6 @@ class SubscribeAttributeEnergyEvseModeFeatureMap : public SubscribeAttribute { } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute ClusterRevision */ @@ -80990,9 +80596,6 @@ class SubscribeAttributeEnergyEvseModeClusterRevision : public SubscribeAttribut } }; -#endif // MTR_ENABLE_PROVISIONAL -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /*----------------------------------------------------------------------------*\ | Cluster WaterHeaterMode | 0x009E | |------------------------------------------------------------------------------| @@ -81011,7 +80614,6 @@ class SubscribeAttributeEnergyEvseModeClusterRevision : public SubscribeAttribut | Events: | | \*----------------------------------------------------------------------------*/ -#if MTR_ENABLE_PROVISIONAL /* * Command ChangeToMode */ @@ -81020,9 +80622,7 @@ class WaterHeaterModeChangeToMode : public ClusterCommand { WaterHeaterModeChangeToMode() : ClusterCommand("change-to-mode") { -#if MTR_ENABLE_PROVISIONAL AddArgument("NewMode", 0, UINT8_MAX, &mRequest.newMode); -#endif // MTR_ENABLE_PROVISIONAL ClusterCommand::AddArguments(); } @@ -81037,9 +80637,7 @@ class WaterHeaterModeChangeToMode : public ClusterCommand { __auto_type * cluster = [[MTRBaseClusterWaterHeaterMode alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue]; __auto_type * params = [[MTRWaterHeaterModeClusterChangeToModeParams alloc] init]; params.timedInvokeTimeoutMs = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil; -#if MTR_ENABLE_PROVISIONAL params.newMode = [NSNumber numberWithUnsignedChar:mRequest.newMode]; -#endif // MTR_ENABLE_PROVISIONAL uint16_t repeatCount = mRepeatCount.ValueOr(1); uint16_t __block responsesNeeded = repeatCount; while (repeatCount--) { @@ -81069,10 +80667,6 @@ class WaterHeaterModeChangeToMode : public ClusterCommand { chip::app::Clusters::WaterHeaterMode::Commands::ChangeToMode::Type mRequest; }; -#endif // MTR_ENABLE_PROVISIONAL - -#if MTR_ENABLE_PROVISIONAL - /* * Attribute SupportedModes */ @@ -81155,9 +80749,6 @@ class SubscribeAttributeWaterHeaterModeSupportedModes : public SubscribeAttribut } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute CurrentMode */ @@ -81240,9 +80831,6 @@ class SubscribeAttributeWaterHeaterModeCurrentMode : public SubscribeAttribute { } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute GeneratedCommandList */ @@ -81325,9 +80913,6 @@ class SubscribeAttributeWaterHeaterModeGeneratedCommandList : public SubscribeAt } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute AcceptedCommandList */ @@ -81410,9 +80995,6 @@ class SubscribeAttributeWaterHeaterModeAcceptedCommandList : public SubscribeAtt } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute AttributeList */ @@ -81495,9 +81077,6 @@ class SubscribeAttributeWaterHeaterModeAttributeList : public SubscribeAttribute } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute FeatureMap */ @@ -81580,9 +81159,6 @@ class SubscribeAttributeWaterHeaterModeFeatureMap : public SubscribeAttribute { } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute ClusterRevision */ @@ -81665,8 +81241,6 @@ class SubscribeAttributeWaterHeaterModeClusterRevision : public SubscribeAttribu } }; -#endif // MTR_ENABLE_PROVISIONAL -#endif // MTR_ENABLE_PROVISIONAL /*----------------------------------------------------------------------------*\ | Cluster DeviceEnergyManagementMode | 0x009F | |------------------------------------------------------------------------------| @@ -91005,7 +90579,6 @@ class SubscribeAttributeWindowCoveringClusterRevision : public SubscribeAttribut } }; -#if MTR_ENABLE_PROVISIONAL /*----------------------------------------------------------------------------*\ | Cluster ServiceArea | 0x0150 | |------------------------------------------------------------------------------| @@ -91029,7 +90602,6 @@ class SubscribeAttributeWindowCoveringClusterRevision : public SubscribeAttribut | Events: | | \*----------------------------------------------------------------------------*/ -#if MTR_ENABLE_PROVISIONAL /* * Command SelectAreas */ @@ -91039,9 +90611,7 @@ class ServiceAreaSelectAreas : public ClusterCommand { : ClusterCommand("select-areas") , mComplex_NewAreas(&mRequest.newAreas) { -#if MTR_ENABLE_PROVISIONAL AddArgument("NewAreas", &mComplex_NewAreas); -#endif // MTR_ENABLE_PROVISIONAL ClusterCommand::AddArguments(); } @@ -91056,7 +90626,6 @@ class ServiceAreaSelectAreas : public ClusterCommand { __auto_type * cluster = [[MTRBaseClusterServiceArea alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue]; __auto_type * params = [[MTRServiceAreaClusterSelectAreasParams alloc] init]; params.timedInvokeTimeoutMs = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil; -#if MTR_ENABLE_PROVISIONAL { // Scope for our temporary variables auto * array_0 = [NSMutableArray new]; for (auto & entry_0 : mRequest.newAreas) { @@ -91066,7 +90635,6 @@ class ServiceAreaSelectAreas : public ClusterCommand { } params.newAreas = array_0; } -#endif // MTR_ENABLE_PROVISIONAL uint16_t repeatCount = mRepeatCount.ValueOr(1); uint16_t __block responsesNeeded = repeatCount; while (repeatCount--) { @@ -91097,8 +90665,6 @@ class ServiceAreaSelectAreas : public ClusterCommand { TypedComplexArgument> mComplex_NewAreas; }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /* * Command SkipArea */ @@ -91107,9 +90673,7 @@ class ServiceAreaSkipArea : public ClusterCommand { ServiceAreaSkipArea() : ClusterCommand("skip-area") { -#if MTR_ENABLE_PROVISIONAL AddArgument("SkippedArea", 0, UINT32_MAX, &mRequest.skippedArea); -#endif // MTR_ENABLE_PROVISIONAL ClusterCommand::AddArguments(); } @@ -91124,9 +90688,7 @@ class ServiceAreaSkipArea : public ClusterCommand { __auto_type * cluster = [[MTRBaseClusterServiceArea alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue]; __auto_type * params = [[MTRServiceAreaClusterSkipAreaParams alloc] init]; params.timedInvokeTimeoutMs = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil; -#if MTR_ENABLE_PROVISIONAL params.skippedArea = [NSNumber numberWithUnsignedInt:mRequest.skippedArea]; -#endif // MTR_ENABLE_PROVISIONAL uint16_t repeatCount = mRepeatCount.ValueOr(1); uint16_t __block responsesNeeded = repeatCount; while (repeatCount--) { @@ -91156,10 +90718,6 @@ class ServiceAreaSkipArea : public ClusterCommand { chip::app::Clusters::ServiceArea::Commands::SkipArea::Type mRequest; }; -#endif // MTR_ENABLE_PROVISIONAL - -#if MTR_ENABLE_PROVISIONAL - /* * Attribute SupportedAreas */ @@ -91242,9 +90800,6 @@ class SubscribeAttributeServiceAreaSupportedAreas : public SubscribeAttribute { } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute SupportedMaps */ @@ -91327,9 +90882,6 @@ class SubscribeAttributeServiceAreaSupportedMaps : public SubscribeAttribute { } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute SelectedAreas */ @@ -91412,9 +90964,6 @@ class SubscribeAttributeServiceAreaSelectedAreas : public SubscribeAttribute { } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute CurrentArea */ @@ -91497,9 +91046,6 @@ class SubscribeAttributeServiceAreaCurrentArea : public SubscribeAttribute { } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute EstimatedEndTime */ @@ -91582,9 +91128,6 @@ class SubscribeAttributeServiceAreaEstimatedEndTime : public SubscribeAttribute } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute Progress */ @@ -91667,9 +91210,6 @@ class SubscribeAttributeServiceAreaProgress : public SubscribeAttribute { } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute GeneratedCommandList */ @@ -91752,9 +91292,6 @@ class SubscribeAttributeServiceAreaGeneratedCommandList : public SubscribeAttrib } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute AcceptedCommandList */ @@ -91837,9 +91374,6 @@ class SubscribeAttributeServiceAreaAcceptedCommandList : public SubscribeAttribu } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute AttributeList */ @@ -91922,9 +91456,6 @@ class SubscribeAttributeServiceAreaAttributeList : public SubscribeAttribute { } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute FeatureMap */ @@ -92007,9 +91538,6 @@ class SubscribeAttributeServiceAreaFeatureMap : public SubscribeAttribute { } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute ClusterRevision */ @@ -92092,8 +91620,6 @@ class SubscribeAttributeServiceAreaClusterRevision : public SubscribeAttribute { } }; -#endif // MTR_ENABLE_PROVISIONAL -#endif // MTR_ENABLE_PROVISIONAL /*----------------------------------------------------------------------------*\ | Cluster PumpConfigurationAndControl | 0x0200 | |------------------------------------------------------------------------------| @@ -94919,7 +94445,6 @@ class ThermostatClearWeeklySchedule : public ClusterCommand { private: }; -#if MTR_ENABLE_PROVISIONAL /* * Command SetActiveScheduleRequest */ @@ -94928,9 +94453,7 @@ class ThermostatSetActiveScheduleRequest : public ClusterCommand { ThermostatSetActiveScheduleRequest() : ClusterCommand("set-active-schedule-request") { -#if MTR_ENABLE_PROVISIONAL AddArgument("ScheduleHandle", &mRequest.scheduleHandle); -#endif // MTR_ENABLE_PROVISIONAL ClusterCommand::AddArguments(); } @@ -94945,9 +94468,7 @@ class ThermostatSetActiveScheduleRequest : public ClusterCommand { __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue]; __auto_type * params = [[MTRThermostatClusterSetActiveScheduleRequestParams alloc] init]; params.timedInvokeTimeoutMs = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil; -#if MTR_ENABLE_PROVISIONAL params.scheduleHandle = [NSData dataWithBytes:mRequest.scheduleHandle.data() length:mRequest.scheduleHandle.size()]; -#endif // MTR_ENABLE_PROVISIONAL uint16_t repeatCount = mRepeatCount.ValueOr(1); uint16_t __block responsesNeeded = repeatCount; while (repeatCount--) { @@ -94971,8 +94492,6 @@ class ThermostatSetActiveScheduleRequest : public ClusterCommand { chip::app::Clusters::Thermostat::Commands::SetActiveScheduleRequest::Type mRequest; }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /* * Command SetActivePresetRequest */ @@ -94981,9 +94500,7 @@ class ThermostatSetActivePresetRequest : public ClusterCommand { ThermostatSetActivePresetRequest() : ClusterCommand("set-active-preset-request") { -#if MTR_ENABLE_PROVISIONAL AddArgument("PresetHandle", &mRequest.presetHandle); -#endif // MTR_ENABLE_PROVISIONAL ClusterCommand::AddArguments(); } @@ -94998,13 +94515,11 @@ class ThermostatSetActivePresetRequest : public ClusterCommand { __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue]; __auto_type * params = [[MTRThermostatClusterSetActivePresetRequestParams alloc] init]; params.timedInvokeTimeoutMs = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil; -#if MTR_ENABLE_PROVISIONAL if (mRequest.presetHandle.IsNull()) { params.presetHandle = nil; } else { params.presetHandle = [NSData dataWithBytes:mRequest.presetHandle.Value().data() length:mRequest.presetHandle.Value().size()]; } -#endif // MTR_ENABLE_PROVISIONAL uint16_t repeatCount = mRepeatCount.ValueOr(1); uint16_t __block responsesNeeded = repeatCount; while (repeatCount--) { @@ -95028,8 +94543,6 @@ class ThermostatSetActivePresetRequest : public ClusterCommand { chip::app::Clusters::Thermostat::Commands::SetActivePresetRequest::Type mRequest; }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /* * Command AtomicRequest */ @@ -95039,15 +94552,9 @@ class ThermostatAtomicRequest : public ClusterCommand { : ClusterCommand("atomic-request") , mComplex_AttributeRequests(&mRequest.attributeRequests) { -#if MTR_ENABLE_PROVISIONAL AddArgument("RequestType", 0, UINT8_MAX, &mRequest.requestType); -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL AddArgument("AttributeRequests", &mComplex_AttributeRequests); -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL AddArgument("Timeout", 0, UINT16_MAX, &mRequest.timeout); -#endif // MTR_ENABLE_PROVISIONAL ClusterCommand::AddArguments(); } @@ -95062,10 +94569,7 @@ class ThermostatAtomicRequest : public ClusterCommand { __auto_type * cluster = [[MTRBaseClusterThermostat alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue]; __auto_type * params = [[MTRThermostatClusterAtomicRequestParams alloc] init]; params.timedInvokeTimeoutMs = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil; -#if MTR_ENABLE_PROVISIONAL params.requestType = [NSNumber numberWithUnsignedChar:chip::to_underlying(mRequest.requestType)]; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL { // Scope for our temporary variables auto * array_0 = [NSMutableArray new]; for (auto & entry_0 : mRequest.attributeRequests) { @@ -95075,14 +94579,11 @@ class ThermostatAtomicRequest : public ClusterCommand { } params.attributeRequests = array_0; } -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL if (mRequest.timeout.HasValue()) { params.timeout = [NSNumber numberWithUnsignedShort:mRequest.timeout.Value()]; } else { params.timeout = nil; } -#endif // MTR_ENABLE_PROVISIONAL uint16_t repeatCount = mRepeatCount.ValueOr(1); uint16_t __block responsesNeeded = repeatCount; while (repeatCount--) { @@ -95113,8 +94614,6 @@ class ThermostatAtomicRequest : public ClusterCommand { TypedComplexArgument> mComplex_AttributeRequests; }; -#endif // MTR_ENABLE_PROVISIONAL - /* * Attribute LocalTemperature */ @@ -100249,8 +99748,6 @@ class SubscribeAttributeThermostatACCapacityformat : public SubscribeAttribute { } }; -#if MTR_ENABLE_PROVISIONAL - /* * Attribute PresetTypes */ @@ -100333,9 +99830,6 @@ class SubscribeAttributeThermostatPresetTypes : public SubscribeAttribute { } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute ScheduleTypes */ @@ -100418,9 +99912,6 @@ class SubscribeAttributeThermostatScheduleTypes : public SubscribeAttribute { } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute NumberOfPresets */ @@ -100503,9 +99994,6 @@ class SubscribeAttributeThermostatNumberOfPresets : public SubscribeAttribute { } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute NumberOfSchedules */ @@ -100588,9 +100076,6 @@ class SubscribeAttributeThermostatNumberOfSchedules : public SubscribeAttribute } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute NumberOfScheduleTransitions */ @@ -100673,9 +100158,6 @@ class SubscribeAttributeThermostatNumberOfScheduleTransitions : public Subscribe } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute NumberOfScheduleTransitionPerDay */ @@ -100758,9 +100240,6 @@ class SubscribeAttributeThermostatNumberOfScheduleTransitionPerDay : public Subs } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute ActivePresetHandle */ @@ -100843,9 +100322,6 @@ class SubscribeAttributeThermostatActivePresetHandle : public SubscribeAttribute } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute ActiveScheduleHandle */ @@ -100928,9 +100404,6 @@ class SubscribeAttributeThermostatActiveScheduleHandle : public SubscribeAttribu } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute Presets */ @@ -101095,9 +100568,6 @@ class SubscribeAttributeThermostatPresets : public SubscribeAttribute { } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute Schedules */ @@ -101284,9 +100754,6 @@ class SubscribeAttributeThermostatSchedules : public SubscribeAttribute { } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute SetpointHoldExpiryTimestamp */ @@ -101369,8 +100836,6 @@ class SubscribeAttributeThermostatSetpointHoldExpiryTimestamp : public Subscribe } }; -#endif // MTR_ENABLE_PROVISIONAL - /* * Attribute GeneratedCommandList */ @@ -117224,8 +116689,6 @@ class SubscribeAttributeOccupancySensingOccupancySensorTypeBitmap : public Subsc } }; -#if MTR_ENABLE_PROVISIONAL - /* * Attribute HoldTime */ @@ -117349,9 +116812,6 @@ class SubscribeAttributeOccupancySensingHoldTime : public SubscribeAttribute { } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute HoldTimeLimits */ @@ -117434,8 +116894,6 @@ class SubscribeAttributeOccupancySensingHoldTimeLimits : public SubscribeAttribu } }; -#endif // MTR_ENABLE_PROVISIONAL - /* * Attribute PIROccupiedToUnoccupiedDelay */ @@ -132333,7 +131791,6 @@ class SubscribeAttributeRadonConcentrationMeasurementClusterRevision : public Su } }; -#if MTR_ENABLE_PROVISIONAL /*----------------------------------------------------------------------------*\ | Cluster WiFiNetworkManagement | 0x0451 | |------------------------------------------------------------------------------| @@ -132352,7 +131809,6 @@ class SubscribeAttributeRadonConcentrationMeasurementClusterRevision : public Su | Events: | | \*----------------------------------------------------------------------------*/ -#if MTR_ENABLE_PROVISIONAL /* * Command NetworkPassphraseRequest */ @@ -132403,10 +131859,6 @@ class WiFiNetworkManagementNetworkPassphraseRequest : public ClusterCommand { private: }; -#endif // MTR_ENABLE_PROVISIONAL - -#if MTR_ENABLE_PROVISIONAL - /* * Attribute Ssid */ @@ -132489,9 +131941,6 @@ class SubscribeAttributeWiFiNetworkManagementSsid : public SubscribeAttribute { } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute PassphraseSurrogate */ @@ -132574,9 +132023,6 @@ class SubscribeAttributeWiFiNetworkManagementPassphraseSurrogate : public Subscr } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute GeneratedCommandList */ @@ -132659,9 +132105,6 @@ class SubscribeAttributeWiFiNetworkManagementGeneratedCommandList : public Subsc } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute AcceptedCommandList */ @@ -132744,9 +132187,6 @@ class SubscribeAttributeWiFiNetworkManagementAcceptedCommandList : public Subscr } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute AttributeList */ @@ -132829,9 +132269,6 @@ class SubscribeAttributeWiFiNetworkManagementAttributeList : public SubscribeAtt } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute FeatureMap */ @@ -132914,9 +132351,6 @@ class SubscribeAttributeWiFiNetworkManagementFeatureMap : public SubscribeAttrib } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute ClusterRevision */ @@ -132999,9 +132433,6 @@ class SubscribeAttributeWiFiNetworkManagementClusterRevision : public SubscribeA } }; -#endif // MTR_ENABLE_PROVISIONAL -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /*----------------------------------------------------------------------------*\ | Cluster ThreadBorderRouterManagement | 0x0452 | |------------------------------------------------------------------------------| @@ -133027,7 +132458,6 @@ class SubscribeAttributeWiFiNetworkManagementClusterRevision : public SubscribeA | Events: | | \*----------------------------------------------------------------------------*/ -#if MTR_ENABLE_PROVISIONAL /* * Command GetActiveDatasetRequest */ @@ -133078,8 +132508,6 @@ class ThreadBorderRouterManagementGetActiveDatasetRequest : public ClusterComman private: }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /* * Command GetPendingDatasetRequest */ @@ -133130,8 +132558,6 @@ class ThreadBorderRouterManagementGetPendingDatasetRequest : public ClusterComma private: }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /* * Command SetActiveDatasetRequest */ @@ -133140,12 +132566,8 @@ class ThreadBorderRouterManagementSetActiveDatasetRequest : public ClusterComman ThreadBorderRouterManagementSetActiveDatasetRequest() : ClusterCommand("set-active-dataset-request") { -#if MTR_ENABLE_PROVISIONAL AddArgument("ActiveDataset", &mRequest.activeDataset); -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL AddArgument("Breadcrumb", 0, UINT64_MAX, &mRequest.breadcrumb); -#endif // MTR_ENABLE_PROVISIONAL ClusterCommand::AddArguments(); } @@ -133160,16 +132582,12 @@ class ThreadBorderRouterManagementSetActiveDatasetRequest : public ClusterComman __auto_type * cluster = [[MTRBaseClusterThreadBorderRouterManagement alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue]; __auto_type * params = [[MTRThreadBorderRouterManagementClusterSetActiveDatasetRequestParams alloc] init]; params.timedInvokeTimeoutMs = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil; -#if MTR_ENABLE_PROVISIONAL params.activeDataset = [NSData dataWithBytes:mRequest.activeDataset.data() length:mRequest.activeDataset.size()]; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL if (mRequest.breadcrumb.HasValue()) { params.breadcrumb = [NSNumber numberWithUnsignedLongLong:mRequest.breadcrumb.Value()]; } else { params.breadcrumb = nil; } -#endif // MTR_ENABLE_PROVISIONAL uint16_t repeatCount = mRepeatCount.ValueOr(1); uint16_t __block responsesNeeded = repeatCount; while (repeatCount--) { @@ -133193,8 +132611,6 @@ class ThreadBorderRouterManagementSetActiveDatasetRequest : public ClusterComman chip::app::Clusters::ThreadBorderRouterManagement::Commands::SetActiveDatasetRequest::Type mRequest; }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /* * Command SetPendingDatasetRequest */ @@ -133203,9 +132619,7 @@ class ThreadBorderRouterManagementSetPendingDatasetRequest : public ClusterComma ThreadBorderRouterManagementSetPendingDatasetRequest() : ClusterCommand("set-pending-dataset-request") { -#if MTR_ENABLE_PROVISIONAL AddArgument("PendingDataset", &mRequest.pendingDataset); -#endif // MTR_ENABLE_PROVISIONAL ClusterCommand::AddArguments(); } @@ -133220,9 +132634,7 @@ class ThreadBorderRouterManagementSetPendingDatasetRequest : public ClusterComma __auto_type * cluster = [[MTRBaseClusterThreadBorderRouterManagement alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue]; __auto_type * params = [[MTRThreadBorderRouterManagementClusterSetPendingDatasetRequestParams alloc] init]; params.timedInvokeTimeoutMs = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil; -#if MTR_ENABLE_PROVISIONAL params.pendingDataset = [NSData dataWithBytes:mRequest.pendingDataset.data() length:mRequest.pendingDataset.size()]; -#endif // MTR_ENABLE_PROVISIONAL uint16_t repeatCount = mRepeatCount.ValueOr(1); uint16_t __block responsesNeeded = repeatCount; while (repeatCount--) { @@ -133246,10 +132658,6 @@ class ThreadBorderRouterManagementSetPendingDatasetRequest : public ClusterComma chip::app::Clusters::ThreadBorderRouterManagement::Commands::SetPendingDatasetRequest::Type mRequest; }; -#endif // MTR_ENABLE_PROVISIONAL - -#if MTR_ENABLE_PROVISIONAL - /* * Attribute BorderRouterName */ @@ -133332,9 +132740,6 @@ class SubscribeAttributeThreadBorderRouterManagementBorderRouterName : public Su } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute BorderAgentID */ @@ -133417,9 +132822,6 @@ class SubscribeAttributeThreadBorderRouterManagementBorderAgentID : public Subsc } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute ThreadVersion */ @@ -133502,9 +132904,6 @@ class SubscribeAttributeThreadBorderRouterManagementThreadVersion : public Subsc } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute InterfaceEnabled */ @@ -133587,9 +132986,6 @@ class SubscribeAttributeThreadBorderRouterManagementInterfaceEnabled : public Su } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute ActiveDatasetTimestamp */ @@ -133672,9 +133068,6 @@ class SubscribeAttributeThreadBorderRouterManagementActiveDatasetTimestamp : pub } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute PendingDatasetTimestamp */ @@ -133757,9 +133150,6 @@ class SubscribeAttributeThreadBorderRouterManagementPendingDatasetTimestamp : pu } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute GeneratedCommandList */ @@ -133842,9 +133232,6 @@ class SubscribeAttributeThreadBorderRouterManagementGeneratedCommandList : publi } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute AcceptedCommandList */ @@ -133927,9 +133314,6 @@ class SubscribeAttributeThreadBorderRouterManagementAcceptedCommandList : public } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute AttributeList */ @@ -134012,9 +133396,6 @@ class SubscribeAttributeThreadBorderRouterManagementAttributeList : public Subsc } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute FeatureMap */ @@ -134097,9 +133478,6 @@ class SubscribeAttributeThreadBorderRouterManagementFeatureMap : public Subscrib } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute ClusterRevision */ @@ -134182,9 +133560,6 @@ class SubscribeAttributeThreadBorderRouterManagementClusterRevision : public Sub } }; -#endif // MTR_ENABLE_PROVISIONAL -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /*----------------------------------------------------------------------------*\ | Cluster ThreadNetworkDirectory | 0x0453 | |------------------------------------------------------------------------------| @@ -134206,7 +133581,6 @@ class SubscribeAttributeThreadBorderRouterManagementClusterRevision : public Sub | Events: | | \*----------------------------------------------------------------------------*/ -#if MTR_ENABLE_PROVISIONAL /* * Command AddNetwork */ @@ -134215,9 +133589,7 @@ class ThreadNetworkDirectoryAddNetwork : public ClusterCommand { ThreadNetworkDirectoryAddNetwork() : ClusterCommand("add-network") { -#if MTR_ENABLE_PROVISIONAL AddArgument("OperationalDataset", &mRequest.operationalDataset); -#endif // MTR_ENABLE_PROVISIONAL ClusterCommand::AddArguments(); } @@ -134232,9 +133604,7 @@ class ThreadNetworkDirectoryAddNetwork : public ClusterCommand { __auto_type * cluster = [[MTRBaseClusterThreadNetworkDirectory alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue]; __auto_type * params = [[MTRThreadNetworkDirectoryClusterAddNetworkParams alloc] init]; params.timedInvokeTimeoutMs = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil; -#if MTR_ENABLE_PROVISIONAL params.operationalDataset = [NSData dataWithBytes:mRequest.operationalDataset.data() length:mRequest.operationalDataset.size()]; -#endif // MTR_ENABLE_PROVISIONAL uint16_t repeatCount = mRepeatCount.ValueOr(1); uint16_t __block responsesNeeded = repeatCount; while (repeatCount--) { @@ -134258,8 +133628,6 @@ class ThreadNetworkDirectoryAddNetwork : public ClusterCommand { chip::app::Clusters::ThreadNetworkDirectory::Commands::AddNetwork::Type mRequest; }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /* * Command RemoveNetwork */ @@ -134268,9 +133636,7 @@ class ThreadNetworkDirectoryRemoveNetwork : public ClusterCommand { ThreadNetworkDirectoryRemoveNetwork() : ClusterCommand("remove-network") { -#if MTR_ENABLE_PROVISIONAL AddArgument("ExtendedPanID", &mRequest.extendedPanID); -#endif // MTR_ENABLE_PROVISIONAL ClusterCommand::AddArguments(); } @@ -134285,9 +133651,7 @@ class ThreadNetworkDirectoryRemoveNetwork : public ClusterCommand { __auto_type * cluster = [[MTRBaseClusterThreadNetworkDirectory alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue]; __auto_type * params = [[MTRThreadNetworkDirectoryClusterRemoveNetworkParams alloc] init]; params.timedInvokeTimeoutMs = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil; -#if MTR_ENABLE_PROVISIONAL params.extendedPanID = [NSData dataWithBytes:mRequest.extendedPanID.data() length:mRequest.extendedPanID.size()]; -#endif // MTR_ENABLE_PROVISIONAL uint16_t repeatCount = mRepeatCount.ValueOr(1); uint16_t __block responsesNeeded = repeatCount; while (repeatCount--) { @@ -134311,8 +133675,6 @@ class ThreadNetworkDirectoryRemoveNetwork : public ClusterCommand { chip::app::Clusters::ThreadNetworkDirectory::Commands::RemoveNetwork::Type mRequest; }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /* * Command GetOperationalDataset */ @@ -134321,9 +133683,7 @@ class ThreadNetworkDirectoryGetOperationalDataset : public ClusterCommand { ThreadNetworkDirectoryGetOperationalDataset() : ClusterCommand("get-operational-dataset") { -#if MTR_ENABLE_PROVISIONAL AddArgument("ExtendedPanID", &mRequest.extendedPanID); -#endif // MTR_ENABLE_PROVISIONAL ClusterCommand::AddArguments(); } @@ -134338,9 +133698,7 @@ class ThreadNetworkDirectoryGetOperationalDataset : public ClusterCommand { __auto_type * cluster = [[MTRBaseClusterThreadNetworkDirectory alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue]; __auto_type * params = [[MTRThreadNetworkDirectoryClusterGetOperationalDatasetParams alloc] init]; params.timedInvokeTimeoutMs = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil; -#if MTR_ENABLE_PROVISIONAL params.extendedPanID = [NSData dataWithBytes:mRequest.extendedPanID.data() length:mRequest.extendedPanID.size()]; -#endif // MTR_ENABLE_PROVISIONAL uint16_t repeatCount = mRepeatCount.ValueOr(1); uint16_t __block responsesNeeded = repeatCount; while (repeatCount--) { @@ -134370,10 +133728,6 @@ class ThreadNetworkDirectoryGetOperationalDataset : public ClusterCommand { chip::app::Clusters::ThreadNetworkDirectory::Commands::GetOperationalDataset::Type mRequest; }; -#endif // MTR_ENABLE_PROVISIONAL - -#if MTR_ENABLE_PROVISIONAL - /* * Attribute PreferredExtendedPanID */ @@ -134500,9 +133854,6 @@ class SubscribeAttributeThreadNetworkDirectoryPreferredExtendedPanID : public Su } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute ThreadNetworks */ @@ -134585,9 +133936,6 @@ class SubscribeAttributeThreadNetworkDirectoryThreadNetworks : public SubscribeA } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute ThreadNetworkTableSize */ @@ -134670,9 +134018,6 @@ class SubscribeAttributeThreadNetworkDirectoryThreadNetworkTableSize : public Su } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute GeneratedCommandList */ @@ -134755,9 +134100,6 @@ class SubscribeAttributeThreadNetworkDirectoryGeneratedCommandList : public Subs } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute AcceptedCommandList */ @@ -134840,9 +134182,6 @@ class SubscribeAttributeThreadNetworkDirectoryAcceptedCommandList : public Subsc } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute AttributeList */ @@ -134925,9 +134264,6 @@ class SubscribeAttributeThreadNetworkDirectoryAttributeList : public SubscribeAt } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute FeatureMap */ @@ -135010,9 +134346,6 @@ class SubscribeAttributeThreadNetworkDirectoryFeatureMap : public SubscribeAttri } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute ClusterRevision */ @@ -135095,8 +134428,6 @@ class SubscribeAttributeThreadNetworkDirectoryClusterRevision : public Subscribe } }; -#endif // MTR_ENABLE_PROVISIONAL -#endif // MTR_ENABLE_PROVISIONAL /*----------------------------------------------------------------------------*\ | Cluster WakeOnLan | 0x0503 | |------------------------------------------------------------------------------| @@ -135196,8 +134527,6 @@ class SubscribeAttributeWakeOnLanMACAddress : public SubscribeAttribute { } }; -#if MTR_ENABLE_PROVISIONAL - /* * Attribute LinkLocalAddress */ @@ -135280,8 +134609,6 @@ class SubscribeAttributeWakeOnLanLinkLocalAddress : public SubscribeAttribute { } }; -#endif // MTR_ENABLE_PROVISIONAL - /* * Attribute GeneratedCommandList */ @@ -135865,7 +135192,6 @@ class ChannelSkipChannel : public ClusterCommand { chip::app::Clusters::Channel::Commands::SkipChannel::Type mRequest; }; -#if MTR_ENABLE_PROVISIONAL /* * Command GetProgramGuide */ @@ -135877,27 +135203,15 @@ class ChannelGetProgramGuide : public ClusterCommand { , mComplex_PageToken(&mRequest.pageToken) , mComplex_ExternalIDList(&mRequest.externalIDList) { -#if MTR_ENABLE_PROVISIONAL AddArgument("StartTime", 0, UINT32_MAX, &mRequest.startTime); -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL AddArgument("EndTime", 0, UINT32_MAX, &mRequest.endTime); -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL AddArgument("ChannelList", &mComplex_ChannelList); -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL AddArgument("PageToken", &mComplex_PageToken); -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL AddArgument("RecordingFlag", 0, UINT32_MAX, &mRequest.recordingFlag); -#endif // MTR_ENABLE_PROVISIONAL #if MTR_ENABLE_PROVISIONAL AddArgument("ExternalIDList", &mComplex_ExternalIDList); #endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL AddArgument("Data", &mRequest.data); -#endif // MTR_ENABLE_PROVISIONAL ClusterCommand::AddArguments(); } @@ -135912,21 +135226,16 @@ class ChannelGetProgramGuide : public ClusterCommand { __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue]; __auto_type * params = [[MTRChannelClusterGetProgramGuideParams alloc] init]; params.timedInvokeTimeoutMs = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil; -#if MTR_ENABLE_PROVISIONAL if (mRequest.startTime.HasValue()) { params.startTime = [NSNumber numberWithUnsignedInt:mRequest.startTime.Value()]; } else { params.startTime = nil; } -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL if (mRequest.endTime.HasValue()) { params.endTime = [NSNumber numberWithUnsignedInt:mRequest.endTime.Value()]; } else { params.endTime = nil; } -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL if (mRequest.channelList.HasValue()) { { // Scope for our temporary variables auto * array_1 = [NSMutableArray new]; @@ -135967,8 +135276,6 @@ class ChannelGetProgramGuide : public ClusterCommand { } else { params.channelList = nil; } -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL if (mRequest.pageToken.HasValue()) { params.pageToken = [MTRChannelClusterPageTokenStruct new]; if (mRequest.pageToken.Value().limit.HasValue()) { @@ -135989,14 +135296,11 @@ class ChannelGetProgramGuide : public ClusterCommand { } else { params.pageToken = nil; } -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL if (mRequest.recordingFlag.HasValue()) { params.recordingFlag = [NSNumber numberWithUnsignedInt:mRequest.recordingFlag.Value().Raw()]; } else { params.recordingFlag = nil; } -#endif // MTR_ENABLE_PROVISIONAL #if MTR_ENABLE_PROVISIONAL if (mRequest.externalIDList.HasValue()) { { // Scope for our temporary variables @@ -136014,13 +135318,11 @@ class ChannelGetProgramGuide : public ClusterCommand { params.externalIDList = nil; } #endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL if (mRequest.data.HasValue()) { params.data = [NSData dataWithBytes:mRequest.data.Value().data() length:mRequest.data.Value().size()]; } else { params.data = nil; } -#endif // MTR_ENABLE_PROVISIONAL uint16_t repeatCount = mRepeatCount.ValueOr(1); uint16_t __block responsesNeeded = repeatCount; while (repeatCount--) { @@ -136053,8 +135355,6 @@ class ChannelGetProgramGuide : public ClusterCommand { TypedComplexArgument>> mComplex_ExternalIDList; }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /* * Command RecordProgram */ @@ -136064,18 +135364,12 @@ class ChannelRecordProgram : public ClusterCommand { : ClusterCommand("record-program") , mComplex_ExternalIDList(&mRequest.externalIDList) { -#if MTR_ENABLE_PROVISIONAL AddArgument("ProgramIdentifier", &mRequest.programIdentifier); -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL AddArgument("ShouldRecordSeries", 0, 1, &mRequest.shouldRecordSeries); -#endif // MTR_ENABLE_PROVISIONAL #if MTR_ENABLE_PROVISIONAL AddArgument("ExternalIDList", &mComplex_ExternalIDList); #endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL AddArgument("Data", &mRequest.data); -#endif // MTR_ENABLE_PROVISIONAL ClusterCommand::AddArguments(); } @@ -136090,12 +135384,8 @@ class ChannelRecordProgram : public ClusterCommand { __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue]; __auto_type * params = [[MTRChannelClusterRecordProgramParams alloc] init]; params.timedInvokeTimeoutMs = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil; -#if MTR_ENABLE_PROVISIONAL params.programIdentifier = [[NSString alloc] initWithBytes:mRequest.programIdentifier.data() length:mRequest.programIdentifier.size() encoding:NSUTF8StringEncoding]; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL params.shouldRecordSeries = [NSNumber numberWithBool:mRequest.shouldRecordSeries]; -#endif // MTR_ENABLE_PROVISIONAL #if MTR_ENABLE_PROVISIONAL { // Scope for our temporary variables auto * array_0 = [NSMutableArray new]; @@ -136109,9 +135399,7 @@ class ChannelRecordProgram : public ClusterCommand { params.externalIDList = array_0; } #endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL params.data = [NSData dataWithBytes:mRequest.data.data() length:mRequest.data.size()]; -#endif // MTR_ENABLE_PROVISIONAL uint16_t repeatCount = mRepeatCount.ValueOr(1); uint16_t __block responsesNeeded = repeatCount; while (repeatCount--) { @@ -136136,8 +135424,6 @@ class ChannelRecordProgram : public ClusterCommand { TypedComplexArgument> mComplex_ExternalIDList; }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /* * Command CancelRecordProgram */ @@ -136147,18 +135433,12 @@ class ChannelCancelRecordProgram : public ClusterCommand { : ClusterCommand("cancel-record-program") , mComplex_ExternalIDList(&mRequest.externalIDList) { -#if MTR_ENABLE_PROVISIONAL AddArgument("ProgramIdentifier", &mRequest.programIdentifier); -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL AddArgument("ShouldRecordSeries", 0, 1, &mRequest.shouldRecordSeries); -#endif // MTR_ENABLE_PROVISIONAL #if MTR_ENABLE_PROVISIONAL AddArgument("ExternalIDList", &mComplex_ExternalIDList); #endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL AddArgument("Data", &mRequest.data); -#endif // MTR_ENABLE_PROVISIONAL ClusterCommand::AddArguments(); } @@ -136173,12 +135453,8 @@ class ChannelCancelRecordProgram : public ClusterCommand { __auto_type * cluster = [[MTRBaseClusterChannel alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue]; __auto_type * params = [[MTRChannelClusterCancelRecordProgramParams alloc] init]; params.timedInvokeTimeoutMs = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil; -#if MTR_ENABLE_PROVISIONAL params.programIdentifier = [[NSString alloc] initWithBytes:mRequest.programIdentifier.data() length:mRequest.programIdentifier.size() encoding:NSUTF8StringEncoding]; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL params.shouldRecordSeries = [NSNumber numberWithBool:mRequest.shouldRecordSeries]; -#endif // MTR_ENABLE_PROVISIONAL #if MTR_ENABLE_PROVISIONAL { // Scope for our temporary variables auto * array_0 = [NSMutableArray new]; @@ -136192,9 +135468,7 @@ class ChannelCancelRecordProgram : public ClusterCommand { params.externalIDList = array_0; } #endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL params.data = [NSData dataWithBytes:mRequest.data.data() length:mRequest.data.size()]; -#endif // MTR_ENABLE_PROVISIONAL uint16_t repeatCount = mRepeatCount.ValueOr(1); uint16_t __block responsesNeeded = repeatCount; while (repeatCount--) { @@ -136219,8 +135493,6 @@ class ChannelCancelRecordProgram : public ClusterCommand { TypedComplexArgument> mComplex_ExternalIDList; }; -#endif // MTR_ENABLE_PROVISIONAL - /* * Attribute ChannelList */ @@ -137878,9 +137150,7 @@ class MediaPlaybackRewind : public ClusterCommand { MediaPlaybackRewind() : ClusterCommand("rewind") { -#if MTR_ENABLE_PROVISIONAL AddArgument("AudioAdvanceUnmuted", 0, 1, &mRequest.audioAdvanceUnmuted); -#endif // MTR_ENABLE_PROVISIONAL ClusterCommand::AddArguments(); } @@ -137895,13 +137165,11 @@ class MediaPlaybackRewind : public ClusterCommand { __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue]; __auto_type * params = [[MTRMediaPlaybackClusterRewindParams alloc] init]; params.timedInvokeTimeoutMs = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil; -#if MTR_ENABLE_PROVISIONAL if (mRequest.audioAdvanceUnmuted.HasValue()) { params.audioAdvanceUnmuted = [NSNumber numberWithBool:mRequest.audioAdvanceUnmuted.Value()]; } else { params.audioAdvanceUnmuted = nil; } -#endif // MTR_ENABLE_PROVISIONAL uint16_t repeatCount = mRepeatCount.ValueOr(1); uint16_t __block responsesNeeded = repeatCount; while (repeatCount--) { @@ -137939,9 +137207,7 @@ class MediaPlaybackFastForward : public ClusterCommand { MediaPlaybackFastForward() : ClusterCommand("fast-forward") { -#if MTR_ENABLE_PROVISIONAL AddArgument("AudioAdvanceUnmuted", 0, 1, &mRequest.audioAdvanceUnmuted); -#endif // MTR_ENABLE_PROVISIONAL ClusterCommand::AddArguments(); } @@ -137956,13 +137222,11 @@ class MediaPlaybackFastForward : public ClusterCommand { __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue]; __auto_type * params = [[MTRMediaPlaybackClusterFastForwardParams alloc] init]; params.timedInvokeTimeoutMs = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil; -#if MTR_ENABLE_PROVISIONAL if (mRequest.audioAdvanceUnmuted.HasValue()) { params.audioAdvanceUnmuted = [NSNumber numberWithBool:mRequest.audioAdvanceUnmuted.Value()]; } else { params.audioAdvanceUnmuted = nil; } -#endif // MTR_ENABLE_PROVISIONAL uint16_t repeatCount = mRepeatCount.ValueOr(1); uint16_t __block responsesNeeded = repeatCount; while (repeatCount--) { @@ -138151,7 +137415,6 @@ class MediaPlaybackSeek : public ClusterCommand { chip::app::Clusters::MediaPlayback::Commands::Seek::Type mRequest; }; -#if MTR_ENABLE_PROVISIONAL /* * Command ActivateAudioTrack */ @@ -138160,12 +137423,8 @@ class MediaPlaybackActivateAudioTrack : public ClusterCommand { MediaPlaybackActivateAudioTrack() : ClusterCommand("activate-audio-track") { -#if MTR_ENABLE_PROVISIONAL AddArgument("TrackID", &mRequest.trackID); -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL AddArgument("AudioOutputIndex", 0, UINT8_MAX, &mRequest.audioOutputIndex); -#endif // MTR_ENABLE_PROVISIONAL ClusterCommand::AddArguments(); } @@ -138180,12 +137439,8 @@ class MediaPlaybackActivateAudioTrack : public ClusterCommand { __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue]; __auto_type * params = [[MTRMediaPlaybackClusterActivateAudioTrackParams alloc] init]; params.timedInvokeTimeoutMs = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil; -#if MTR_ENABLE_PROVISIONAL params.trackID = [[NSString alloc] initWithBytes:mRequest.trackID.data() length:mRequest.trackID.size() encoding:NSUTF8StringEncoding]; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL params.audioOutputIndex = [NSNumber numberWithUnsignedChar:mRequest.audioOutputIndex]; -#endif // MTR_ENABLE_PROVISIONAL uint16_t repeatCount = mRepeatCount.ValueOr(1); uint16_t __block responsesNeeded = repeatCount; while (repeatCount--) { @@ -138209,8 +137464,6 @@ class MediaPlaybackActivateAudioTrack : public ClusterCommand { chip::app::Clusters::MediaPlayback::Commands::ActivateAudioTrack::Type mRequest; }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /* * Command ActivateTextTrack */ @@ -138219,9 +137472,7 @@ class MediaPlaybackActivateTextTrack : public ClusterCommand { MediaPlaybackActivateTextTrack() : ClusterCommand("activate-text-track") { -#if MTR_ENABLE_PROVISIONAL AddArgument("TrackID", &mRequest.trackID); -#endif // MTR_ENABLE_PROVISIONAL ClusterCommand::AddArguments(); } @@ -138236,9 +137487,7 @@ class MediaPlaybackActivateTextTrack : public ClusterCommand { __auto_type * cluster = [[MTRBaseClusterMediaPlayback alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue]; __auto_type * params = [[MTRMediaPlaybackClusterActivateTextTrackParams alloc] init]; params.timedInvokeTimeoutMs = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil; -#if MTR_ENABLE_PROVISIONAL params.trackID = [[NSString alloc] initWithBytes:mRequest.trackID.data() length:mRequest.trackID.size() encoding:NSUTF8StringEncoding]; -#endif // MTR_ENABLE_PROVISIONAL uint16_t repeatCount = mRepeatCount.ValueOr(1); uint16_t __block responsesNeeded = repeatCount; while (repeatCount--) { @@ -138262,8 +137511,6 @@ class MediaPlaybackActivateTextTrack : public ClusterCommand { chip::app::Clusters::MediaPlayback::Commands::ActivateTextTrack::Type mRequest; }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /* * Command DeactivateTextTrack */ @@ -138308,8 +137555,6 @@ class MediaPlaybackDeactivateTextTrack : public ClusterCommand { private: }; -#endif // MTR_ENABLE_PROVISIONAL - /* * Attribute CurrentState */ @@ -141398,9 +140643,7 @@ class ContentLauncherLaunchContent : public ClusterCommand { #if MTR_ENABLE_PROVISIONAL AddArgument("PlaybackPreferences", &mComplex_PlaybackPreferences); #endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL AddArgument("UseCurrentContext", 0, 1, &mRequest.useCurrentContext); -#endif // MTR_ENABLE_PROVISIONAL ClusterCommand::AddArguments(); } @@ -141500,13 +140743,11 @@ class ContentLauncherLaunchContent : public ClusterCommand { params.playbackPreferences = nil; } #endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL if (mRequest.useCurrentContext.HasValue()) { params.useCurrentContext = [NSNumber numberWithBool:mRequest.useCurrentContext.Value()]; } else { params.useCurrentContext = nil; } -#endif // MTR_ENABLE_PROVISIONAL uint16_t repeatCount = mRepeatCount.ValueOr(1); uint16_t __block responsesNeeded = repeatCount; while (repeatCount--) { @@ -144938,9 +144179,7 @@ class AccountLoginLogin : public ClusterCommand { { AddArgument("TempAccountIdentifier", &mRequest.tempAccountIdentifier); AddArgument("SetupPIN", &mRequest.setupPIN); -#if MTR_ENABLE_PROVISIONAL AddArgument("Node", 0, UINT64_MAX, &mRequest.node); -#endif // MTR_ENABLE_PROVISIONAL ClusterCommand::AddArguments(); } @@ -144957,13 +144196,11 @@ class AccountLoginLogin : public ClusterCommand { params.timedInvokeTimeoutMs = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil; params.tempAccountIdentifier = [[NSString alloc] initWithBytes:mRequest.tempAccountIdentifier.data() length:mRequest.tempAccountIdentifier.size() encoding:NSUTF8StringEncoding]; params.setupPIN = [[NSString alloc] initWithBytes:mRequest.setupPIN.data() length:mRequest.setupPIN.size() encoding:NSUTF8StringEncoding]; -#if MTR_ENABLE_PROVISIONAL if (mRequest.node.HasValue()) { params.node = [NSNumber numberWithUnsignedLongLong:mRequest.node.Value()]; } else { params.node = nil; } -#endif // MTR_ENABLE_PROVISIONAL uint16_t repeatCount = mRepeatCount.ValueOr(1); uint16_t __block responsesNeeded = repeatCount; while (repeatCount--) { @@ -144995,9 +144232,7 @@ class AccountLoginLogout : public ClusterCommand { AccountLoginLogout() : ClusterCommand("logout") { -#if MTR_ENABLE_PROVISIONAL AddArgument("Node", 0, UINT64_MAX, &mRequest.node); -#endif // MTR_ENABLE_PROVISIONAL ClusterCommand::AddArguments(); } @@ -145012,13 +144247,11 @@ class AccountLoginLogout : public ClusterCommand { __auto_type * cluster = [[MTRBaseClusterAccountLogin alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue]; __auto_type * params = [[MTRAccountLoginClusterLogoutParams alloc] init]; params.timedInvokeTimeoutMs = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil; -#if MTR_ENABLE_PROVISIONAL if (mRequest.node.HasValue()) { params.node = [NSNumber numberWithUnsignedLongLong:mRequest.node.Value()]; } else { params.node = nil; } -#endif // MTR_ENABLE_PROVISIONAL uint16_t repeatCount = mRepeatCount.ValueOr(1); uint16_t __block responsesNeeded = repeatCount; while (repeatCount--) { @@ -147119,7 +146352,6 @@ class SubscribeAttributeContentControlClusterRevision : public SubscribeAttribut #endif // MTR_ENABLE_PROVISIONAL #endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /*----------------------------------------------------------------------------*\ | Cluster ContentAppObserver | 0x0510 | |------------------------------------------------------------------------------| @@ -147136,7 +146368,6 @@ class SubscribeAttributeContentControlClusterRevision : public SubscribeAttribut | Events: | | \*----------------------------------------------------------------------------*/ -#if MTR_ENABLE_PROVISIONAL /* * Command ContentAppMessage */ @@ -147145,12 +146376,8 @@ class ContentAppObserverContentAppMessage : public ClusterCommand { ContentAppObserverContentAppMessage() : ClusterCommand("content-app-message") { -#if MTR_ENABLE_PROVISIONAL AddArgument("Data", &mRequest.data); -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL AddArgument("EncodingHint", &mRequest.encodingHint); -#endif // MTR_ENABLE_PROVISIONAL ClusterCommand::AddArguments(); } @@ -147165,16 +146392,12 @@ class ContentAppObserverContentAppMessage : public ClusterCommand { __auto_type * cluster = [[MTRBaseClusterContentAppObserver alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue]; __auto_type * params = [[MTRContentAppObserverClusterContentAppMessageParams alloc] init]; params.timedInvokeTimeoutMs = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil; -#if MTR_ENABLE_PROVISIONAL if (mRequest.data.HasValue()) { params.data = [[NSString alloc] initWithBytes:mRequest.data.Value().data() length:mRequest.data.Value().size() encoding:NSUTF8StringEncoding]; } else { params.data = nil; } -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL params.encodingHint = [[NSString alloc] initWithBytes:mRequest.encodingHint.data() length:mRequest.encodingHint.size() encoding:NSUTF8StringEncoding]; -#endif // MTR_ENABLE_PROVISIONAL uint16_t repeatCount = mRepeatCount.ValueOr(1); uint16_t __block responsesNeeded = repeatCount; while (repeatCount--) { @@ -147204,10 +146427,6 @@ class ContentAppObserverContentAppMessage : public ClusterCommand { chip::app::Clusters::ContentAppObserver::Commands::ContentAppMessage::Type mRequest; }; -#endif // MTR_ENABLE_PROVISIONAL - -#if MTR_ENABLE_PROVISIONAL - /* * Attribute GeneratedCommandList */ @@ -147290,9 +146509,6 @@ class SubscribeAttributeContentAppObserverGeneratedCommandList : public Subscrib } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute AcceptedCommandList */ @@ -147375,9 +146591,6 @@ class SubscribeAttributeContentAppObserverAcceptedCommandList : public Subscribe } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute AttributeList */ @@ -147460,9 +146673,6 @@ class SubscribeAttributeContentAppObserverAttributeList : public SubscribeAttrib } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute FeatureMap */ @@ -147545,9 +146755,6 @@ class SubscribeAttributeContentAppObserverFeatureMap : public SubscribeAttribute } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute ClusterRevision */ @@ -147630,8 +146837,6 @@ class SubscribeAttributeContentAppObserverClusterRevision : public SubscribeAttr } }; -#endif // MTR_ENABLE_PROVISIONAL -#endif // MTR_ENABLE_PROVISIONAL #if MTR_ENABLE_PROVISIONAL /*----------------------------------------------------------------------------*\ | Cluster ZoneManagement | 0x0550 | @@ -160492,7 +159697,6 @@ class SubscribeAttributeEcosystemInformationClusterRevision : public SubscribeAt #endif // MTR_ENABLE_PROVISIONAL #endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /*----------------------------------------------------------------------------*\ | Cluster CommissionerControl | 0x0751 | |------------------------------------------------------------------------------| @@ -160512,7 +159716,6 @@ class SubscribeAttributeEcosystemInformationClusterRevision : public SubscribeAt | * CommissioningRequestResult | 0x0000 | \*----------------------------------------------------------------------------*/ -#if MTR_ENABLE_PROVISIONAL /* * Command RequestCommissioningApproval */ @@ -160521,18 +159724,10 @@ class CommissionerControlRequestCommissioningApproval : public ClusterCommand { CommissionerControlRequestCommissioningApproval() : ClusterCommand("request-commissioning-approval") { -#if MTR_ENABLE_PROVISIONAL AddArgument("RequestID", 0, UINT64_MAX, &mRequest.requestID); -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL AddArgument("VendorID", 0, UINT16_MAX, &mRequest.vendorID); -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL AddArgument("ProductID", 0, UINT16_MAX, &mRequest.productID); -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL AddArgument("Label", &mRequest.label); -#endif // MTR_ENABLE_PROVISIONAL ClusterCommand::AddArguments(); } @@ -160547,22 +159742,14 @@ class CommissionerControlRequestCommissioningApproval : public ClusterCommand { __auto_type * cluster = [[MTRBaseClusterCommissionerControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue]; __auto_type * params = [[MTRCommissionerControlClusterRequestCommissioningApprovalParams alloc] init]; params.timedInvokeTimeoutMs = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil; -#if MTR_ENABLE_PROVISIONAL params.requestID = [NSNumber numberWithUnsignedLongLong:mRequest.requestID]; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL params.vendorID = [NSNumber numberWithUnsignedShort:chip::to_underlying(mRequest.vendorID)]; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL params.productID = [NSNumber numberWithUnsignedShort:mRequest.productID]; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL if (mRequest.label.HasValue()) { params.label = [[NSString alloc] initWithBytes:mRequest.label.Value().data() length:mRequest.label.Value().size() encoding:NSUTF8StringEncoding]; } else { params.label = nil; } -#endif // MTR_ENABLE_PROVISIONAL uint16_t repeatCount = mRepeatCount.ValueOr(1); uint16_t __block responsesNeeded = repeatCount; while (repeatCount--) { @@ -160586,8 +159773,6 @@ class CommissionerControlRequestCommissioningApproval : public ClusterCommand { chip::app::Clusters::CommissionerControl::Commands::RequestCommissioningApproval::Type mRequest; }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL /* * Command CommissionNode */ @@ -160596,12 +159781,8 @@ class CommissionerControlCommissionNode : public ClusterCommand { CommissionerControlCommissionNode() : ClusterCommand("commission-node") { -#if MTR_ENABLE_PROVISIONAL AddArgument("RequestID", 0, UINT64_MAX, &mRequest.requestID); -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL AddArgument("ResponseTimeoutSeconds", 0, UINT16_MAX, &mRequest.responseTimeoutSeconds); -#endif // MTR_ENABLE_PROVISIONAL ClusterCommand::AddArguments(); } @@ -160616,12 +159797,8 @@ class CommissionerControlCommissionNode : public ClusterCommand { __auto_type * cluster = [[MTRBaseClusterCommissionerControl alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue]; __auto_type * params = [[MTRCommissionerControlClusterCommissionNodeParams alloc] init]; params.timedInvokeTimeoutMs = mTimedInteractionTimeoutMs.HasValue() ? [NSNumber numberWithUnsignedShort:mTimedInteractionTimeoutMs.Value()] : nil; -#if MTR_ENABLE_PROVISIONAL params.requestID = [NSNumber numberWithUnsignedLongLong:mRequest.requestID]; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL params.responseTimeoutSeconds = [NSNumber numberWithUnsignedShort:mRequest.responseTimeoutSeconds]; -#endif // MTR_ENABLE_PROVISIONAL uint16_t repeatCount = mRepeatCount.ValueOr(1); uint16_t __block responsesNeeded = repeatCount; while (repeatCount--) { @@ -160651,10 +159828,6 @@ class CommissionerControlCommissionNode : public ClusterCommand { chip::app::Clusters::CommissionerControl::Commands::CommissionNode::Type mRequest; }; -#endif // MTR_ENABLE_PROVISIONAL - -#if MTR_ENABLE_PROVISIONAL - /* * Attribute SupportedDeviceCategories */ @@ -160737,9 +159910,6 @@ class SubscribeAttributeCommissionerControlSupportedDeviceCategories : public Su } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute GeneratedCommandList */ @@ -160822,9 +159992,6 @@ class SubscribeAttributeCommissionerControlGeneratedCommandList : public Subscri } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute AcceptedCommandList */ @@ -160907,9 +160074,6 @@ class SubscribeAttributeCommissionerControlAcceptedCommandList : public Subscrib } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute AttributeList */ @@ -160992,9 +160156,6 @@ class SubscribeAttributeCommissionerControlAttributeList : public SubscribeAttri } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute FeatureMap */ @@ -161077,9 +160238,6 @@ class SubscribeAttributeCommissionerControlFeatureMap : public SubscribeAttribut } }; -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL - /* * Attribute ClusterRevision */ @@ -161162,8 +160320,6 @@ class SubscribeAttributeCommissionerControlClusterRevision : public SubscribeAtt } }; -#endif // MTR_ENABLE_PROVISIONAL -#endif // MTR_ENABLE_PROVISIONAL #if MTR_ENABLE_PROVISIONAL /*----------------------------------------------------------------------------*\ | Cluster TlsCertificateManagement | 0x0801 | @@ -177460,9 +176616,7 @@ void registerClusterAccessControl(Commands & commands) commands_list clusterCommands = { make_unique(Id), // -#if MTR_ENABLE_PROVISIONAL make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL make_unique(Id), // make_unique(Id), // make_unique(Id), // @@ -177478,14 +176632,10 @@ void registerClusterAccessControl(Commands & commands) make_unique(), // make_unique(), // make_unique(), // -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // make_unique(), // @@ -177603,14 +176753,10 @@ void registerClusterBasicInformation(Commands & commands) make_unique(), // make_unique(), // make_unique(), // -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // make_unique(), // @@ -178000,18 +177146,12 @@ void registerClusterNetworkCommissioning(Commands & commands) make_unique(), // make_unique(), // make_unique(), // -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // make_unique(), // @@ -178061,12 +177201,8 @@ void registerClusterGeneralDiagnostics(Commands & commands) commands_list clusterCommands = { make_unique(Id), // make_unique(), // -#if MTR_ENABLE_PROVISIONAL make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL make_unique(Id), // make_unique(Id), // make_unique(Id), // @@ -178394,109 +177530,61 @@ void registerClusterEthernetNetworkDiagnostics(Commands & commands) } void registerClusterTimeSynchronization(Commands & commands) { -#if MTR_ENABLE_PROVISIONAL using namespace chip::app::Clusters::TimeSynchronization; const char * clusterName = "TimeSynchronization"; commands_list clusterCommands = { make_unique(Id), // -#if MTR_ENABLE_PROVISIONAL make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL make_unique(Id), // make_unique(Id), // make_unique(Id), // -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL make_unique(Id), // make_unique(Id), // }; commands.RegisterCluster(clusterName, clusterCommands); -#endif // MTR_ENABLE_PROVISIONAL } void registerClusterBridgedDeviceBasicInformation(Commands & commands) { @@ -178506,9 +177594,7 @@ void registerClusterBridgedDeviceBasicInformation(Commands & commands) commands_list clusterCommands = { make_unique(Id), // -#if MTR_ENABLE_PROVISIONAL make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL make_unique(Id), // make_unique(Id), // make_unique(Id), // @@ -178518,10 +177604,8 @@ void registerClusterBridgedDeviceBasicInformation(Commands & commands) make_unique(), // make_unique(), // make_unique(), // -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // make_unique(), // @@ -179943,72 +179027,44 @@ void registerClusterElectricalEnergyMeasurement(Commands & commands) } void registerClusterWaterHeaterManagement(Commands & commands) { -#if MTR_ENABLE_PROVISIONAL using namespace chip::app::Clusters::WaterHeaterManagement; const char * clusterName = "WaterHeaterManagement"; commands_list clusterCommands = { make_unique(Id), // -#if MTR_ENABLE_PROVISIONAL make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL make_unique(Id), // make_unique(Id), // make_unique(Id), // -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL make_unique(Id), // make_unique(Id), // }; commands.RegisterCluster(clusterName, clusterCommands); -#endif // MTR_ENABLE_PROVISIONAL } void registerClusterDemandResponseLoadControl(Commands & commands) { @@ -180100,56 +179156,36 @@ void registerClusterDemandResponseLoadControl(Commands & commands) } void registerClusterMessages(Commands & commands) { -#if MTR_ENABLE_PROVISIONAL using namespace chip::app::Clusters::Messages; const char * clusterName = "Messages"; commands_list clusterCommands = { make_unique(Id), // -#if MTR_ENABLE_PROVISIONAL make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL make_unique(Id), // make_unique(Id), // make_unique(Id), // -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL make_unique(Id), // make_unique(Id), // }; commands.RegisterCluster(clusterName, clusterCommands); -#endif // MTR_ENABLE_PROVISIONAL } void registerClusterDeviceEnergyManagement(Commands & commands) { @@ -180204,104 +179240,63 @@ void registerClusterDeviceEnergyManagement(Commands & commands) } void registerClusterEnergyEvse(Commands & commands) { -#if MTR_ENABLE_PROVISIONAL using namespace chip::app::Clusters::EnergyEvse; const char * clusterName = "EnergyEvse"; commands_list clusterCommands = { make_unique(Id), // -#if MTR_ENABLE_PROVISIONAL make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL #if MTR_ENABLE_PROVISIONAL make_unique(), // #endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL make_unique(Id), // make_unique(Id), // make_unique(Id), // -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL #if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // #endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL #if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // #endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL #if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // @@ -180314,48 +179309,31 @@ void registerClusterEnergyEvse(Commands & commands) make_unique(), // make_unique(), // #endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL #if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // #endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL make_unique(Id), // make_unique(Id), // }; commands.RegisterCluster(clusterName, clusterCommands); -#endif // MTR_ENABLE_PROVISIONAL } void registerClusterEnergyPreference(Commands & commands) { @@ -180418,7 +179396,6 @@ void registerClusterEnergyPreference(Commands & commands) } void registerClusterPowerTopology(Commands & commands) { -#if MTR_ENABLE_PROVISIONAL using namespace chip::app::Clusters::PowerTopology; const char * clusterName = "PowerTopology"; @@ -180428,134 +179405,83 @@ void registerClusterPowerTopology(Commands & commands) make_unique(Id), // make_unique(Id), // make_unique(Id), // -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL }; commands.RegisterCluster(clusterName, clusterCommands); -#endif // MTR_ENABLE_PROVISIONAL } void registerClusterEnergyEvseMode(Commands & commands) { -#if MTR_ENABLE_PROVISIONAL using namespace chip::app::Clusters::EnergyEvseMode; const char * clusterName = "EnergyEvseMode"; commands_list clusterCommands = { make_unique(Id), // -#if MTR_ENABLE_PROVISIONAL make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL make_unique(Id), // make_unique(Id), // make_unique(Id), // -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL }; commands.RegisterCluster(clusterName, clusterCommands); -#endif // MTR_ENABLE_PROVISIONAL } void registerClusterWaterHeaterMode(Commands & commands) { -#if MTR_ENABLE_PROVISIONAL using namespace chip::app::Clusters::WaterHeaterMode; const char * clusterName = "WaterHeaterMode"; commands_list clusterCommands = { make_unique(Id), // -#if MTR_ENABLE_PROVISIONAL make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL make_unique(Id), // make_unique(Id), // make_unique(Id), // -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL }; commands.RegisterCluster(clusterName, clusterCommands); -#endif // MTR_ENABLE_PROVISIONAL } void registerClusterDeviceEnergyManagementMode(Commands & commands) { @@ -180822,70 +179748,42 @@ void registerClusterWindowCovering(Commands & commands) } void registerClusterServiceArea(Commands & commands) { -#if MTR_ENABLE_PROVISIONAL using namespace chip::app::Clusters::ServiceArea; const char * clusterName = "ServiceArea"; commands_list clusterCommands = { make_unique(Id), // -#if MTR_ENABLE_PROVISIONAL make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL make_unique(Id), // make_unique(Id), // make_unique(Id), // -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL }; commands.RegisterCluster(clusterName, clusterCommands); -#endif // MTR_ENABLE_PROVISIONAL } void registerClusterPumpConfigurationAndControl(Commands & commands) { @@ -180976,15 +179874,9 @@ void registerClusterThermostat(Commands & commands) make_unique(), // make_unique(), // make_unique(), // -#if MTR_ENABLE_PROVISIONAL make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL make_unique(Id), // make_unique(Id), // make_unique(Id), // @@ -181113,52 +180005,30 @@ void registerClusterThermostat(Commands & commands) make_unique(), // make_unique(), // make_unique(), // -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // make_unique(), // @@ -181681,15 +180551,11 @@ void registerClusterOccupancySensing(Commands & commands) make_unique(), // make_unique(), // make_unique(), // -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // make_unique(), // @@ -182205,183 +181071,109 @@ void registerClusterRadonConcentrationMeasurement(Commands & commands) } void registerClusterWiFiNetworkManagement(Commands & commands) { -#if MTR_ENABLE_PROVISIONAL using namespace chip::app::Clusters::WiFiNetworkManagement; const char * clusterName = "WiFiNetworkManagement"; commands_list clusterCommands = { make_unique(Id), // -#if MTR_ENABLE_PROVISIONAL make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL make_unique(Id), // make_unique(Id), // make_unique(Id), // -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL }; commands.RegisterCluster(clusterName, clusterCommands); -#endif // MTR_ENABLE_PROVISIONAL } void registerClusterThreadBorderRouterManagement(Commands & commands) { -#if MTR_ENABLE_PROVISIONAL using namespace chip::app::Clusters::ThreadBorderRouterManagement; const char * clusterName = "ThreadBorderRouterManagement"; commands_list clusterCommands = { make_unique(Id), // -#if MTR_ENABLE_PROVISIONAL make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL make_unique(Id), // make_unique(Id), // make_unique(Id), // -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL }; commands.RegisterCluster(clusterName, clusterCommands); -#endif // MTR_ENABLE_PROVISIONAL } void registerClusterThreadNetworkDirectory(Commands & commands) { -#if MTR_ENABLE_PROVISIONAL using namespace chip::app::Clusters::ThreadNetworkDirectory; const char * clusterName = "ThreadNetworkDirectory"; commands_list clusterCommands = { make_unique(Id), // -#if MTR_ENABLE_PROVISIONAL make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL make_unique(Id), // make_unique(Id), // make_unique(Id), // -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL }; commands.RegisterCluster(clusterName, clusterCommands); -#endif // MTR_ENABLE_PROVISIONAL } void registerClusterWakeOnLan(Commands & commands) { @@ -182396,10 +181188,8 @@ void registerClusterWakeOnLan(Commands & commands) make_unique(Id), // make_unique(), // make_unique(), // -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // make_unique(), // @@ -182425,15 +181215,9 @@ void registerClusterChannel(Commands & commands) make_unique(), // make_unique(), // make_unique(), // -#if MTR_ENABLE_PROVISIONAL make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL make_unique(Id), // make_unique(Id), // make_unique(Id), // @@ -182508,15 +181292,9 @@ void registerClusterMediaPlayback(Commands & commands) make_unique(), // make_unique(), // make_unique(), // -#if MTR_ENABLE_PROVISIONAL make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL make_unique(Id), // make_unique(Id), // make_unique(Id), // @@ -182919,43 +181697,29 @@ void registerClusterContentControl(Commands & commands) } void registerClusterContentAppObserver(Commands & commands) { -#if MTR_ENABLE_PROVISIONAL using namespace chip::app::Clusters::ContentAppObserver; const char * clusterName = "ContentAppObserver"; commands_list clusterCommands = { make_unique(Id), // -#if MTR_ENABLE_PROVISIONAL make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL make_unique(Id), // make_unique(Id), // make_unique(Id), // -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL }; commands.RegisterCluster(clusterName, clusterCommands); -#endif // MTR_ENABLE_PROVISIONAL } void registerClusterZoneManagement(Commands & commands) { @@ -183647,52 +182411,34 @@ void registerClusterEcosystemInformation(Commands & commands) } void registerClusterCommissionerControl(Commands & commands) { -#if MTR_ENABLE_PROVISIONAL using namespace chip::app::Clusters::CommissionerControl; const char * clusterName = "CommissionerControl"; commands_list clusterCommands = { make_unique(Id), // -#if MTR_ENABLE_PROVISIONAL make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL make_unique(Id), // make_unique(Id), // make_unique(Id), // -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL -#if MTR_ENABLE_PROVISIONAL make_unique(), // make_unique(), // -#endif // MTR_ENABLE_PROVISIONAL make_unique(Id), // make_unique(Id), // }; commands.RegisterCluster(clusterName, clusterCommands); -#endif // MTR_ENABLE_PROVISIONAL } void registerClusterTlsCertificateManagement(Commands & commands) { From 8fe3a0120b2bc9918cbcd43bae07b7f4bd5b9f0c Mon Sep 17 00:00:00 2001 From: Arkadiusz Bokowy Date: Thu, 30 Jan 2025 09:39:55 +0100 Subject: [PATCH 17/36] Allow test event loop dispatch time adjustment for slow VMs (#37210) * Allow event loop dispatch time adjustment for slow VMs * Restyled by clang-format --------- Co-authored-by: Restyled.io --- src/system/tests/TestEventLoopHandler.cpp | 20 ++++++++++++++++---- src/test_driver/tizen/chip_tests/runner.sh | 3 +++ 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/src/system/tests/TestEventLoopHandler.cpp b/src/system/tests/TestEventLoopHandler.cpp index 4d5456098efb2f..d1de96ac94c6b2 100644 --- a/src/system/tests/TestEventLoopHandler.cpp +++ b/src/system/tests/TestEventLoopHandler.cpp @@ -14,6 +14,10 @@ * limitations under the License. */ +#include +#include +#include + #include #include @@ -25,9 +29,6 @@ #include #include -#include -#include - using namespace chip; using namespace chip::System::Clock; using namespace chip::System::Clock::Literals; @@ -139,9 +140,20 @@ TEST_F(TestEventLoopHandler, EventLoopHandlerWake) SystemLayer().RemoveLoopHandler(loopHandler); cancelFallback(); // avoid leaking the fallback timer + // Get the upper bound of the sleep duration from the environment, so we can + // adjust it if the test machine is under heavy load, e.g. in CI or on a slow VM. + // By default, we expect the sleep duration to be close to the requested 400ms. + unsigned int expectedMaxDuration = 500u; // allow some slack for test machine load + const char * maxDurationEnv = std::getenv("CHIP_TEST_EVENT_LOOP_HANDLER_MAX_DURATION_MS"); + if (maxDurationEnv != nullptr) + { + ChipLogDetail(Test, "CHIP_TEST_EVENT_LOOP_HANDLER_MAX_DURATION_MS=%s", maxDurationEnv); + expectedMaxDuration = static_cast(std::stoul(maxDurationEnv)); + } + Timestamp sleepDuration = loopHandler.wakeTimestamp - loopHandler.startTimestamp; EXPECT_GE(sleepDuration.count(), 400u); // loopHandler requested wake-up after 400ms - EXPECT_LE(sleepDuration.count(), 500u); // allow some slack for test machine load + EXPECT_LE(sleepDuration.count(), expectedMaxDuration); } #endif // !CHIP_DEVICE_LAYER_TARGET_FAKE diff --git a/src/test_driver/tizen/chip_tests/runner.sh b/src/test_driver/tizen/chip_tests/runner.sh index cad90e20e00bcc..d5e299180904fa 100755 --- a/src/test_driver/tizen/chip_tests/runner.sh +++ b/src/test_driver/tizen/chip_tests/runner.sh @@ -21,6 +21,9 @@ set -e # Print CHIP logs on stdout dlogutil CHIP & +# Override the default value to account for slower execution on QEMU. +export CHIP_TEST_EVENT_LOOP_HANDLER_MAX_DURATION_MS=1000 + # Set the correct path for .gcda files export GCOV_PREFIX=/mnt/chip export GCOV_PREFIX_STRIP=5 From 0943c68496469e5bab2d282b5e0721700d7c2811 Mon Sep 17 00:00:00 2001 From: Boris Zbarsky Date: Thu, 30 Jan 2025 03:58:13 -0500 Subject: [PATCH 18/36] Always define the "number of endpoints with this cluster side" macros. (#37214) * Always define the "number of endpoints with this cluster side" macros. If we have no such endpoints, just define the count to 0. This lets us get rid of various workarounds for the fact that the endpoint count is not always defined. * Add the relevant cluster count macros to the mock gen_config.h * power-cluster-test-srcs should not be pulled in on Android. --- .../app-templates/gen_config.h | 174 +++++++++++- .../lighting-app/app-templates/gen_config.h | 235 +++++++++++++++- .../power-source-server.cpp | 5 - .../sample-mei-server/sample-mei-server.h | 4 - src/app/tests/BUILD.gn | 1 - .../mock/include/zap-generated/gen_config.h | 263 ++++++++++++++++++ .../templates/app/gen_config.zapt | 10 +- 7 files changed, 676 insertions(+), 16 deletions(-) diff --git a/scripts/tools/zap/tests/outputs/all-clusters-app/app-templates/gen_config.h b/scripts/tools/zap/tests/outputs/all-clusters-app/app-templates/gen_config.h index effa1945e9cf27..8339313e052548 100644 --- a/scripts/tools/zap/tests/outputs/all-clusters-app/app-templates/gen_config.h +++ b/scripts/tools/zap/tests/outputs/all-clusters-app/app-templates/gen_config.h @@ -23,15 +23,15 @@ /**** Cluster endpoint counts ****/ #define MATTER_DM_IDENTIFY_CLUSTER_SERVER_ENDPOINT_COUNT (2) #define MATTER_DM_GROUPS_CLUSTER_SERVER_ENDPOINT_COUNT (3) -#define MATTER_DM_ON_OFF_CLUSTER_CLIENT_ENDPOINT_COUNT (1) #define MATTER_DM_ON_OFF_CLUSTER_SERVER_ENDPOINT_COUNT (2) #define MATTER_DM_LEVEL_CONTROL_CLUSTER_SERVER_ENDPOINT_COUNT (1) +#define MATTER_DM_PWM_CLUSTER_SERVER_ENDPOINT_COUNT (0) #define MATTER_DM_DESCRIPTOR_CLUSTER_SERVER_ENDPOINT_COUNT (4) #define MATTER_DM_BINDING_CLUSTER_SERVER_ENDPOINT_COUNT (2) #define MATTER_DM_ACCESS_CONTROL_CLUSTER_SERVER_ENDPOINT_COUNT (1) #define MATTER_DM_ACTIONS_CLUSTER_SERVER_ENDPOINT_COUNT (1) #define MATTER_DM_BASIC_INFORMATION_CLUSTER_SERVER_ENDPOINT_COUNT (1) -#define MATTER_DM_OTA_SOFTWARE_UPDATE_PROVIDER_CLUSTER_CLIENT_ENDPOINT_COUNT (1) +#define MATTER_DM_OTA_SOFTWARE_UPDATE_PROVIDER_CLUSTER_SERVER_ENDPOINT_COUNT (0) #define MATTER_DM_OTA_SOFTWARE_UPDATE_REQUESTOR_CLUSTER_SERVER_ENDPOINT_COUNT (1) #define MATTER_DM_LOCALIZATION_CONFIGURATION_CLUSTER_SERVER_ENDPOINT_COUNT (1) #define MATTER_DM_TIME_FORMAT_LOCALIZATION_CLUSTER_SERVER_ENDPOINT_COUNT (1) @@ -47,13 +47,19 @@ #define MATTER_DM_WIFI_NETWORK_DIAGNOSTICS_CLUSTER_SERVER_ENDPOINT_COUNT (1) #define MATTER_DM_ETHERNET_NETWORK_DIAGNOSTICS_CLUSTER_SERVER_ENDPOINT_COUNT (1) #define MATTER_DM_TIME_SYNCHRONIZATION_CLUSTER_SERVER_ENDPOINT_COUNT (1) +#define MATTER_DM_BRIDGED_DEVICE_BASIC_INFORMATION_CLUSTER_SERVER_ENDPOINT_COUNT (0) #define MATTER_DM_SWITCH_CLUSTER_SERVER_ENDPOINT_COUNT (1) #define MATTER_DM_ADMINISTRATOR_COMMISSIONING_CLUSTER_SERVER_ENDPOINT_COUNT (1) #define MATTER_DM_OPERATIONAL_CREDENTIALS_CLUSTER_SERVER_ENDPOINT_COUNT (1) #define MATTER_DM_GROUP_KEY_MANAGEMENT_CLUSTER_SERVER_ENDPOINT_COUNT (1) #define MATTER_DM_FIXED_LABEL_CLUSTER_SERVER_ENDPOINT_COUNT (2) #define MATTER_DM_USER_LABEL_CLUSTER_SERVER_ENDPOINT_COUNT (2) +#define MATTER_DM_PROXY_CONFIGURATION_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_PROXY_DISCOVERY_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_PROXY_VALID_CLUSTER_SERVER_ENDPOINT_COUNT (0) #define MATTER_DM_BOOLEAN_STATE_CLUSTER_SERVER_ENDPOINT_COUNT (1) +#define MATTER_DM_ICD_MANAGEMENT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_TIMER_CLUSTER_SERVER_ENDPOINT_COUNT (0) #define MATTER_DM_OPERATIONAL_STATE_OVEN_CLUSTER_SERVER_ENDPOINT_COUNT (1) #define MATTER_DM_OVEN_MODE_CLUSTER_SERVER_ENDPOINT_COUNT (1) #define MATTER_DM_LAUNDRY_DRYER_CONTROLS_CLUSTER_SERVER_ENDPOINT_COUNT (1) @@ -70,6 +76,7 @@ #define MATTER_DM_SMOKE_CO_ALARM_CLUSTER_SERVER_ENDPOINT_COUNT (1) #define MATTER_DM_DISHWASHER_ALARM_CLUSTER_SERVER_ENDPOINT_COUNT (1) #define MATTER_DM_MICROWAVE_OVEN_MODE_CLUSTER_SERVER_ENDPOINT_COUNT (1) +#define MATTER_DM_MICROWAVE_OVEN_CONTROL_CLUSTER_SERVER_ENDPOINT_COUNT (0) #define MATTER_DM_OPERATIONAL_STATE_CLUSTER_SERVER_ENDPOINT_COUNT (1) #define MATTER_DM_OPERATIONAL_STATE_RVC_CLUSTER_SERVER_ENDPOINT_COUNT (1) #define MATTER_DM_SCENES_CLUSTER_SERVER_ENDPOINT_COUNT (2) @@ -79,13 +86,19 @@ #define MATTER_DM_VALVE_CONFIGURATION_AND_CONTROL_CLUSTER_SERVER_ENDPOINT_COUNT (1) #define MATTER_DM_ELECTRICAL_POWER_MEASUREMENT_CLUSTER_SERVER_ENDPOINT_COUNT (1) #define MATTER_DM_ELECTRICAL_ENERGY_MEASUREMENT_CLUSTER_SERVER_ENDPOINT_COUNT (1) +#define MATTER_DM_WATER_HEATER_MANAGEMENT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_DEMAND_RESPONSE_LOAD_CONTROL_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_MESSAGES_CLUSTER_SERVER_ENDPOINT_COUNT (0) #define MATTER_DM_DEVICE_ENERGY_MANAGEMENT_CLUSTER_SERVER_ENDPOINT_COUNT (1) #define MATTER_DM_ENERGY_EVSE_CLUSTER_SERVER_ENDPOINT_COUNT (1) #define MATTER_DM_ENERGY_PREFERENCE_CLUSTER_SERVER_ENDPOINT_COUNT (1) #define MATTER_DM_POWER_TOPOLOGY_CLUSTER_SERVER_ENDPOINT_COUNT (1) #define MATTER_DM_ENERGY_EVSE_MODE_CLUSTER_SERVER_ENDPOINT_COUNT (1) +#define MATTER_DM_WATER_HEATER_MODE_CLUSTER_SERVER_ENDPOINT_COUNT (0) #define MATTER_DM_DEVICE_ENERGY_MANAGEMENT_MODE_CLUSTER_SERVER_ENDPOINT_COUNT (1) +#define MATTER_DM_DOOR_LOCK_CLUSTER_SERVER_ENDPOINT_COUNT (0) #define MATTER_DM_WINDOW_COVERING_CLUSTER_SERVER_ENDPOINT_COUNT (1) +#define MATTER_DM_SERVICE_AREA_CLUSTER_SERVER_ENDPOINT_COUNT (0) #define MATTER_DM_PUMP_CONFIGURATION_AND_CONTROL_CLUSTER_SERVER_ENDPOINT_COUNT (1) #define MATTER_DM_THERMOSTAT_CLUSTER_SERVER_ENDPOINT_COUNT (1) #define MATTER_DM_FAN_CONTROL_CLUSTER_SERVER_ENDPOINT_COUNT (1) @@ -108,10 +121,167 @@ #define MATTER_DM_PM10_CONCENTRATION_MEASUREMENT_CLUSTER_SERVER_ENDPOINT_COUNT (1) #define MATTER_DM_TVOC_CONCENTRATION_MEASUREMENT_CLUSTER_SERVER_ENDPOINT_COUNT (1) #define MATTER_DM_RADON_CONCENTRATION_MEASUREMENT_CLUSTER_SERVER_ENDPOINT_COUNT (1) +#define MATTER_DM_WIFI_NETWORK_MANAGEMENT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_THREAD_BORDER_ROUTER_MANAGEMENT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_THREAD_NETWORK_DIRECTORY_CLUSTER_SERVER_ENDPOINT_COUNT (0) #define MATTER_DM_WAKE_ON_LAN_CLUSTER_SERVER_ENDPOINT_COUNT (1) +#define MATTER_DM_CHANNEL_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_TARGET_NAVIGATOR_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_MEDIA_PLAYBACK_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_MEDIA_INPUT_CLUSTER_SERVER_ENDPOINT_COUNT (0) #define MATTER_DM_LOW_POWER_CLUSTER_SERVER_ENDPOINT_COUNT (1) +#define MATTER_DM_KEYPAD_INPUT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_CONTENT_LAUNCHER_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_AUDIO_OUTPUT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_APPLICATION_LAUNCHER_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_APPLICATION_BASIC_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_ACCOUNT_LOGIN_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_CONTENT_CONTROL_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_CONTENT_APP_OBSERVER_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_ZONE_MANAGEMENT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_CAMERA_AV_STREAM_MANAGEMENT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_CAMERA_AV_SETTINGS_USER_LEVEL_MANAGEMENT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_WEBRTC_TRANSPORT_PROVIDER_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_WEBRTC_TRANSPORT_REQUESTOR_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_PUSH_AV_STREAM_TRANSPORT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_CHIME_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_ECOSYSTEM_INFORMATION_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_COMMISSIONER_CONTROL_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_TLS_CERTIFICATE_MANAGEMENT_CLUSTER_SERVER_ENDPOINT_COUNT (0) #define MATTER_DM_UNIT_TESTING_CLUSTER_SERVER_ENDPOINT_COUNT (1) #define MATTER_DM_FAULT_INJECTION_CLUSTER_SERVER_ENDPOINT_COUNT (1) +#define MATTER_DM_SAMPLE_MEI_CLUSTER_SERVER_ENDPOINT_COUNT (0) + +#define MATTER_DM_IDENTIFY_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_GROUPS_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_ON_OFF_CLUSTER_CLIENT_ENDPOINT_COUNT (1) +#define MATTER_DM_LEVEL_CONTROL_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_PWM_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_DESCRIPTOR_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_BINDING_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_ACCESS_CONTROL_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_ACTIONS_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_BASIC_INFORMATION_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_OTA_SOFTWARE_UPDATE_PROVIDER_CLUSTER_CLIENT_ENDPOINT_COUNT (1) +#define MATTER_DM_OTA_SOFTWARE_UPDATE_REQUESTOR_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_LOCALIZATION_CONFIGURATION_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_TIME_FORMAT_LOCALIZATION_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_UNIT_LOCALIZATION_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_POWER_SOURCE_CONFIGURATION_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_POWER_SOURCE_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_GENERAL_COMMISSIONING_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_NETWORK_COMMISSIONING_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_DIAGNOSTIC_LOGS_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_GENERAL_DIAGNOSTICS_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_SOFTWARE_DIAGNOSTICS_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_THREAD_NETWORK_DIAGNOSTICS_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_WIFI_NETWORK_DIAGNOSTICS_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_ETHERNET_NETWORK_DIAGNOSTICS_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_TIME_SYNCHRONIZATION_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_BRIDGED_DEVICE_BASIC_INFORMATION_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_SWITCH_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_ADMINISTRATOR_COMMISSIONING_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_OPERATIONAL_CREDENTIALS_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_GROUP_KEY_MANAGEMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_FIXED_LABEL_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_USER_LABEL_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_PROXY_CONFIGURATION_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_PROXY_DISCOVERY_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_PROXY_VALID_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_BOOLEAN_STATE_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_ICD_MANAGEMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_TIMER_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_OPERATIONAL_STATE_OVEN_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_OVEN_MODE_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_LAUNDRY_DRYER_CONTROLS_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_MODE_SELECT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_LAUNDRY_WASHER_MODE_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_REFRIGERATOR_AND_TEMPERATURE_CONTROLLED_CABINET_MODE_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_LAUNDRY_WASHER_CONTROLS_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_RVC_RUN_MODE_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_RVC_CLEAN_MODE_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_TEMPERATURE_CONTROL_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_REFRIGERATOR_ALARM_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_DISHWASHER_MODE_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_AIR_QUALITY_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_SMOKE_CO_ALARM_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_DISHWASHER_ALARM_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_MICROWAVE_OVEN_MODE_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_MICROWAVE_OVEN_CONTROL_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_OPERATIONAL_STATE_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_OPERATIONAL_STATE_RVC_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_SCENES_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_HEPA_FILTER_MONITORING_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_ACTIVATED_CARBON_FILTER_MONITORING_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_BOOLEAN_STATE_CONFIGURATION_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_VALVE_CONFIGURATION_AND_CONTROL_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_ELECTRICAL_POWER_MEASUREMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_ELECTRICAL_ENERGY_MEASUREMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_WATER_HEATER_MANAGEMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_DEMAND_RESPONSE_LOAD_CONTROL_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_MESSAGES_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_DEVICE_ENERGY_MANAGEMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_ENERGY_EVSE_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_ENERGY_PREFERENCE_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_POWER_TOPOLOGY_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_ENERGY_EVSE_MODE_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_WATER_HEATER_MODE_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_DEVICE_ENERGY_MANAGEMENT_MODE_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_DOOR_LOCK_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_WINDOW_COVERING_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_SERVICE_AREA_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_PUMP_CONFIGURATION_AND_CONTROL_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_THERMOSTAT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_FAN_CONTROL_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_THERMOSTAT_USER_INTERFACE_CONFIGURATION_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_COLOR_CONTROL_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_BALLAST_CONFIGURATION_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_ILLUMINANCE_MEASUREMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_TEMPERATURE_MEASUREMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_PRESSURE_MEASUREMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_FLOW_MEASUREMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_RELATIVE_HUMIDITY_MEASUREMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_OCCUPANCY_SENSING_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_CARBON_MONOXIDE_CONCENTRATION_MEASUREMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_CARBON_DIOXIDE_CONCENTRATION_MEASUREMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_NITROGEN_DIOXIDE_CONCENTRATION_MEASUREMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_OZONE_CONCENTRATION_MEASUREMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_PM2_5_CONCENTRATION_MEASUREMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_FORMALDEHYDE_CONCENTRATION_MEASUREMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_PM1_CONCENTRATION_MEASUREMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_PM10_CONCENTRATION_MEASUREMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_TVOC_CONCENTRATION_MEASUREMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_RADON_CONCENTRATION_MEASUREMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_WIFI_NETWORK_MANAGEMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_THREAD_BORDER_ROUTER_MANAGEMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_THREAD_NETWORK_DIRECTORY_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_WAKE_ON_LAN_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_CHANNEL_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_TARGET_NAVIGATOR_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_MEDIA_PLAYBACK_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_MEDIA_INPUT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_LOW_POWER_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_KEYPAD_INPUT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_CONTENT_LAUNCHER_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_AUDIO_OUTPUT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_APPLICATION_LAUNCHER_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_APPLICATION_BASIC_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_ACCOUNT_LOGIN_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_CONTENT_CONTROL_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_CONTENT_APP_OBSERVER_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_ZONE_MANAGEMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_CAMERA_AV_STREAM_MANAGEMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_CAMERA_AV_SETTINGS_USER_LEVEL_MANAGEMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_WEBRTC_TRANSPORT_PROVIDER_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_WEBRTC_TRANSPORT_REQUESTOR_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_PUSH_AV_STREAM_TRANSPORT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_CHIME_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_ECOSYSTEM_INFORMATION_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_COMMISSIONER_CONTROL_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_TLS_CERTIFICATE_MANAGEMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_UNIT_TESTING_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_FAULT_INJECTION_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_SAMPLE_MEI_CLUSTER_CLIENT_ENDPOINT_COUNT (0) /**** Cluster Plugins ****/ diff --git a/scripts/tools/zap/tests/outputs/lighting-app/app-templates/gen_config.h b/scripts/tools/zap/tests/outputs/lighting-app/app-templates/gen_config.h index 4aaa5bfa362ced..3a34ba24d6a57f 100644 --- a/scripts/tools/zap/tests/outputs/lighting-app/app-templates/gen_config.h +++ b/scripts/tools/zap/tests/outputs/lighting-app/app-templates/gen_config.h @@ -25,13 +25,19 @@ #define MATTER_DM_GROUPS_CLUSTER_SERVER_ENDPOINT_COUNT (1) #define MATTER_DM_ON_OFF_CLUSTER_SERVER_ENDPOINT_COUNT (1) #define MATTER_DM_LEVEL_CONTROL_CLUSTER_SERVER_ENDPOINT_COUNT (1) +#define MATTER_DM_PWM_CLUSTER_SERVER_ENDPOINT_COUNT (0) #define MATTER_DM_DESCRIPTOR_CLUSTER_SERVER_ENDPOINT_COUNT (2) +#define MATTER_DM_BINDING_CLUSTER_SERVER_ENDPOINT_COUNT (0) #define MATTER_DM_ACCESS_CONTROL_CLUSTER_SERVER_ENDPOINT_COUNT (1) +#define MATTER_DM_ACTIONS_CLUSTER_SERVER_ENDPOINT_COUNT (0) #define MATTER_DM_BASIC_INFORMATION_CLUSTER_SERVER_ENDPOINT_COUNT (1) -#define MATTER_DM_OTA_SOFTWARE_UPDATE_PROVIDER_CLUSTER_CLIENT_ENDPOINT_COUNT (1) +#define MATTER_DM_OTA_SOFTWARE_UPDATE_PROVIDER_CLUSTER_SERVER_ENDPOINT_COUNT (0) #define MATTER_DM_OTA_SOFTWARE_UPDATE_REQUESTOR_CLUSTER_SERVER_ENDPOINT_COUNT (1) #define MATTER_DM_LOCALIZATION_CONFIGURATION_CLUSTER_SERVER_ENDPOINT_COUNT (1) #define MATTER_DM_TIME_FORMAT_LOCALIZATION_CLUSTER_SERVER_ENDPOINT_COUNT (1) +#define MATTER_DM_UNIT_LOCALIZATION_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_POWER_SOURCE_CONFIGURATION_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_POWER_SOURCE_CLUSTER_SERVER_ENDPOINT_COUNT (0) #define MATTER_DM_GENERAL_COMMISSIONING_CLUSTER_SERVER_ENDPOINT_COUNT (1) #define MATTER_DM_NETWORK_COMMISSIONING_CLUSTER_SERVER_ENDPOINT_COUNT (1) #define MATTER_DM_DIAGNOSTIC_LOGS_CLUSTER_SERVER_ENDPOINT_COUNT (1) @@ -40,15 +46,242 @@ #define MATTER_DM_THREAD_NETWORK_DIAGNOSTICS_CLUSTER_SERVER_ENDPOINT_COUNT (1) #define MATTER_DM_WIFI_NETWORK_DIAGNOSTICS_CLUSTER_SERVER_ENDPOINT_COUNT (1) #define MATTER_DM_ETHERNET_NETWORK_DIAGNOSTICS_CLUSTER_SERVER_ENDPOINT_COUNT (1) +#define MATTER_DM_TIME_SYNCHRONIZATION_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_BRIDGED_DEVICE_BASIC_INFORMATION_CLUSTER_SERVER_ENDPOINT_COUNT (0) #define MATTER_DM_SWITCH_CLUSTER_SERVER_ENDPOINT_COUNT (1) #define MATTER_DM_ADMINISTRATOR_COMMISSIONING_CLUSTER_SERVER_ENDPOINT_COUNT (1) #define MATTER_DM_OPERATIONAL_CREDENTIALS_CLUSTER_SERVER_ENDPOINT_COUNT (1) #define MATTER_DM_GROUP_KEY_MANAGEMENT_CLUSTER_SERVER_ENDPOINT_COUNT (1) #define MATTER_DM_FIXED_LABEL_CLUSTER_SERVER_ENDPOINT_COUNT (1) #define MATTER_DM_USER_LABEL_CLUSTER_SERVER_ENDPOINT_COUNT (1) +#define MATTER_DM_PROXY_CONFIGURATION_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_PROXY_DISCOVERY_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_PROXY_VALID_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_BOOLEAN_STATE_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_ICD_MANAGEMENT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_TIMER_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_OPERATIONAL_STATE_OVEN_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_OVEN_MODE_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_LAUNDRY_DRYER_CONTROLS_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_MODE_SELECT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_LAUNDRY_WASHER_MODE_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_REFRIGERATOR_AND_TEMPERATURE_CONTROLLED_CABINET_MODE_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_LAUNDRY_WASHER_CONTROLS_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_RVC_RUN_MODE_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_RVC_CLEAN_MODE_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_TEMPERATURE_CONTROL_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_REFRIGERATOR_ALARM_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_DISHWASHER_MODE_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_AIR_QUALITY_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_SMOKE_CO_ALARM_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_DISHWASHER_ALARM_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_MICROWAVE_OVEN_MODE_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_MICROWAVE_OVEN_CONTROL_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_OPERATIONAL_STATE_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_OPERATIONAL_STATE_RVC_CLUSTER_SERVER_ENDPOINT_COUNT (0) #define MATTER_DM_SCENES_CLUSTER_SERVER_ENDPOINT_COUNT (1) +#define MATTER_DM_HEPA_FILTER_MONITORING_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_ACTIVATED_CARBON_FILTER_MONITORING_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_BOOLEAN_STATE_CONFIGURATION_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_VALVE_CONFIGURATION_AND_CONTROL_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_ELECTRICAL_POWER_MEASUREMENT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_ELECTRICAL_ENERGY_MEASUREMENT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_WATER_HEATER_MANAGEMENT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_DEMAND_RESPONSE_LOAD_CONTROL_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_MESSAGES_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_DEVICE_ENERGY_MANAGEMENT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_ENERGY_EVSE_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_ENERGY_PREFERENCE_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_POWER_TOPOLOGY_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_ENERGY_EVSE_MODE_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_WATER_HEATER_MODE_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_DEVICE_ENERGY_MANAGEMENT_MODE_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_DOOR_LOCK_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_WINDOW_COVERING_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_SERVICE_AREA_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_PUMP_CONFIGURATION_AND_CONTROL_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_THERMOSTAT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_FAN_CONTROL_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_THERMOSTAT_USER_INTERFACE_CONFIGURATION_CLUSTER_SERVER_ENDPOINT_COUNT (0) #define MATTER_DM_COLOR_CONTROL_CLUSTER_SERVER_ENDPOINT_COUNT (1) +#define MATTER_DM_BALLAST_CONFIGURATION_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_ILLUMINANCE_MEASUREMENT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_TEMPERATURE_MEASUREMENT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_PRESSURE_MEASUREMENT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_FLOW_MEASUREMENT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_RELATIVE_HUMIDITY_MEASUREMENT_CLUSTER_SERVER_ENDPOINT_COUNT (0) #define MATTER_DM_OCCUPANCY_SENSING_CLUSTER_SERVER_ENDPOINT_COUNT (1) +#define MATTER_DM_CARBON_MONOXIDE_CONCENTRATION_MEASUREMENT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_CARBON_DIOXIDE_CONCENTRATION_MEASUREMENT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_NITROGEN_DIOXIDE_CONCENTRATION_MEASUREMENT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_OZONE_CONCENTRATION_MEASUREMENT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_PM2_5_CONCENTRATION_MEASUREMENT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_FORMALDEHYDE_CONCENTRATION_MEASUREMENT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_PM1_CONCENTRATION_MEASUREMENT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_PM10_CONCENTRATION_MEASUREMENT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_TVOC_CONCENTRATION_MEASUREMENT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_RADON_CONCENTRATION_MEASUREMENT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_WIFI_NETWORK_MANAGEMENT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_THREAD_BORDER_ROUTER_MANAGEMENT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_THREAD_NETWORK_DIRECTORY_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_WAKE_ON_LAN_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_CHANNEL_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_TARGET_NAVIGATOR_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_MEDIA_PLAYBACK_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_MEDIA_INPUT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_LOW_POWER_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_KEYPAD_INPUT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_CONTENT_LAUNCHER_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_AUDIO_OUTPUT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_APPLICATION_LAUNCHER_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_APPLICATION_BASIC_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_ACCOUNT_LOGIN_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_CONTENT_CONTROL_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_CONTENT_APP_OBSERVER_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_ZONE_MANAGEMENT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_CAMERA_AV_STREAM_MANAGEMENT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_CAMERA_AV_SETTINGS_USER_LEVEL_MANAGEMENT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_WEBRTC_TRANSPORT_PROVIDER_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_WEBRTC_TRANSPORT_REQUESTOR_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_PUSH_AV_STREAM_TRANSPORT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_CHIME_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_ECOSYSTEM_INFORMATION_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_COMMISSIONER_CONTROL_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_TLS_CERTIFICATE_MANAGEMENT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_UNIT_TESTING_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_FAULT_INJECTION_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_SAMPLE_MEI_CLUSTER_SERVER_ENDPOINT_COUNT (0) + +#define MATTER_DM_IDENTIFY_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_GROUPS_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_ON_OFF_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_LEVEL_CONTROL_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_PWM_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_DESCRIPTOR_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_BINDING_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_ACCESS_CONTROL_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_ACTIONS_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_BASIC_INFORMATION_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_OTA_SOFTWARE_UPDATE_PROVIDER_CLUSTER_CLIENT_ENDPOINT_COUNT (1) +#define MATTER_DM_OTA_SOFTWARE_UPDATE_REQUESTOR_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_LOCALIZATION_CONFIGURATION_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_TIME_FORMAT_LOCALIZATION_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_UNIT_LOCALIZATION_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_POWER_SOURCE_CONFIGURATION_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_POWER_SOURCE_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_GENERAL_COMMISSIONING_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_NETWORK_COMMISSIONING_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_DIAGNOSTIC_LOGS_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_GENERAL_DIAGNOSTICS_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_SOFTWARE_DIAGNOSTICS_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_THREAD_NETWORK_DIAGNOSTICS_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_WIFI_NETWORK_DIAGNOSTICS_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_ETHERNET_NETWORK_DIAGNOSTICS_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_TIME_SYNCHRONIZATION_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_BRIDGED_DEVICE_BASIC_INFORMATION_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_SWITCH_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_ADMINISTRATOR_COMMISSIONING_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_OPERATIONAL_CREDENTIALS_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_GROUP_KEY_MANAGEMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_FIXED_LABEL_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_USER_LABEL_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_PROXY_CONFIGURATION_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_PROXY_DISCOVERY_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_PROXY_VALID_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_BOOLEAN_STATE_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_ICD_MANAGEMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_TIMER_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_OPERATIONAL_STATE_OVEN_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_OVEN_MODE_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_LAUNDRY_DRYER_CONTROLS_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_MODE_SELECT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_LAUNDRY_WASHER_MODE_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_REFRIGERATOR_AND_TEMPERATURE_CONTROLLED_CABINET_MODE_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_LAUNDRY_WASHER_CONTROLS_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_RVC_RUN_MODE_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_RVC_CLEAN_MODE_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_TEMPERATURE_CONTROL_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_REFRIGERATOR_ALARM_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_DISHWASHER_MODE_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_AIR_QUALITY_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_SMOKE_CO_ALARM_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_DISHWASHER_ALARM_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_MICROWAVE_OVEN_MODE_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_MICROWAVE_OVEN_CONTROL_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_OPERATIONAL_STATE_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_OPERATIONAL_STATE_RVC_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_SCENES_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_HEPA_FILTER_MONITORING_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_ACTIVATED_CARBON_FILTER_MONITORING_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_BOOLEAN_STATE_CONFIGURATION_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_VALVE_CONFIGURATION_AND_CONTROL_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_ELECTRICAL_POWER_MEASUREMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_ELECTRICAL_ENERGY_MEASUREMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_WATER_HEATER_MANAGEMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_DEMAND_RESPONSE_LOAD_CONTROL_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_MESSAGES_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_DEVICE_ENERGY_MANAGEMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_ENERGY_EVSE_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_ENERGY_PREFERENCE_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_POWER_TOPOLOGY_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_ENERGY_EVSE_MODE_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_WATER_HEATER_MODE_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_DEVICE_ENERGY_MANAGEMENT_MODE_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_DOOR_LOCK_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_WINDOW_COVERING_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_SERVICE_AREA_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_PUMP_CONFIGURATION_AND_CONTROL_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_THERMOSTAT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_FAN_CONTROL_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_THERMOSTAT_USER_INTERFACE_CONFIGURATION_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_COLOR_CONTROL_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_BALLAST_CONFIGURATION_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_ILLUMINANCE_MEASUREMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_TEMPERATURE_MEASUREMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_PRESSURE_MEASUREMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_FLOW_MEASUREMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_RELATIVE_HUMIDITY_MEASUREMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_OCCUPANCY_SENSING_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_CARBON_MONOXIDE_CONCENTRATION_MEASUREMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_CARBON_DIOXIDE_CONCENTRATION_MEASUREMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_NITROGEN_DIOXIDE_CONCENTRATION_MEASUREMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_OZONE_CONCENTRATION_MEASUREMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_PM2_5_CONCENTRATION_MEASUREMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_FORMALDEHYDE_CONCENTRATION_MEASUREMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_PM1_CONCENTRATION_MEASUREMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_PM10_CONCENTRATION_MEASUREMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_TVOC_CONCENTRATION_MEASUREMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_RADON_CONCENTRATION_MEASUREMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_WIFI_NETWORK_MANAGEMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_THREAD_BORDER_ROUTER_MANAGEMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_THREAD_NETWORK_DIRECTORY_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_WAKE_ON_LAN_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_CHANNEL_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_TARGET_NAVIGATOR_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_MEDIA_PLAYBACK_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_MEDIA_INPUT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_LOW_POWER_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_KEYPAD_INPUT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_CONTENT_LAUNCHER_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_AUDIO_OUTPUT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_APPLICATION_LAUNCHER_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_APPLICATION_BASIC_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_ACCOUNT_LOGIN_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_CONTENT_CONTROL_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_CONTENT_APP_OBSERVER_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_ZONE_MANAGEMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_CAMERA_AV_STREAM_MANAGEMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_CAMERA_AV_SETTINGS_USER_LEVEL_MANAGEMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_WEBRTC_TRANSPORT_PROVIDER_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_WEBRTC_TRANSPORT_REQUESTOR_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_PUSH_AV_STREAM_TRANSPORT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_CHIME_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_ECOSYSTEM_INFORMATION_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_COMMISSIONER_CONTROL_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_TLS_CERTIFICATE_MANAGEMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_UNIT_TESTING_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_FAULT_INJECTION_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_SAMPLE_MEI_CLUSTER_CLIENT_ENDPOINT_COUNT (0) /**** Cluster Plugins ****/ diff --git a/src/app/clusters/power-source-server/power-source-server.cpp b/src/app/clusters/power-source-server/power-source-server.cpp index 7d95eca0da5ec5..448947516e036e 100644 --- a/src/app/clusters/power-source-server/power-source-server.cpp +++ b/src/app/clusters/power-source-server/power-source-server.cpp @@ -71,14 +71,9 @@ PowerSourceServer gPowerSourceServer; PowerSourceAttrAccess gAttrAccess; -#ifdef ZCL_USING_POWER_SOURCE_CLUSTER_SERVER static constexpr uint16_t kNumStaticEndpoints = MATTER_DM_POWER_SOURCE_CLUSTER_SERVER_ENDPOINT_COUNT; #define POWER_SERVER_NUM_SUPPORTED_ENDPOINTS \ (MATTER_DM_POWER_SOURCE_CLUSTER_SERVER_ENDPOINT_COUNT + CHIP_DEVICE_CONFIG_DYNAMIC_ENDPOINT_COUNT) -#else -static constexpr uint16_t kNumStaticEndpoints = 0; -#define POWER_SERVER_NUM_SUPPORTED_ENDPOINTS CHIP_DEVICE_CONFIG_DYNAMIC_ENDPOINT_COUNT -#endif static constexpr size_t kNumSupportedEndpoints = POWER_SERVER_NUM_SUPPORTED_ENDPOINTS; #if POWER_SERVER_NUM_SUPPORTED_ENDPOINTS > 0 diff --git a/src/app/clusters/sample-mei-server/sample-mei-server.h b/src/app/clusters/sample-mei-server/sample-mei-server.h index 14446ba6f38f02..2087a4ee81cd0c 100644 --- a/src/app/clusters/sample-mei-server/sample-mei-server.h +++ b/src/app/clusters/sample-mei-server/sample-mei-server.h @@ -11,12 +11,8 @@ #include #include -#ifdef ZCL_USING_SAMPLE_MEI_CLUSTER_SERVER #define SAMPLE_MEI_NUM_SUPPORTED_ENDPOINTS \ (MATTER_DM_SAMPLE_MEI_CLUSTER_SERVER_ENDPOINT_COUNT + CHIP_DEVICE_CONFIG_DYNAMIC_ENDPOINT_COUNT) -#else -#define SAMPLE_MEI_NUM_SUPPORTED_ENDPOINTS CHIP_DEVICE_CONFIG_DYNAMIC_ENDPOINT_COUNT -#endif /* ZCL_USING_SAMPLE_MEI_CLUSTER_SERVER */ static constexpr size_t kNumSupportedEndpoints = SAMPLE_MEI_NUM_SUPPORTED_ENDPOINTS; namespace chip { diff --git a/src/app/tests/BUILD.gn b/src/app/tests/BUILD.gn index 1923573765101a..ea077eb5d67582 100644 --- a/src/app/tests/BUILD.gn +++ b/src/app/tests/BUILD.gn @@ -244,7 +244,6 @@ chip_test_suite("tests") { ":ecosystem-information-test-srcs", ":operational-state-test-srcs", ":ota-requestor-test-srcs", - ":power-cluster-test-srcs", ":thread-network-directory-test-srcs", ":time-sync-data-provider-test-srcs", "${chip_root}/src/app", diff --git a/src/app/util/mock/include/zap-generated/gen_config.h b/src/app/util/mock/include/zap-generated/gen_config.h index 17f2de013f9597..e3a53a6a6573bd 100644 --- a/src/app/util/mock/include/zap-generated/gen_config.h +++ b/src/app/util/mock/include/zap-generated/gen_config.h @@ -19,3 +19,266 @@ #define MATTER_BINDING_TABLE_SIZE 20 #define SCENES_MANAGEMENT_TABLE_SIZE 24 + +/**** Cluster endpoint counts ****/ +#define MATTER_DM_IDENTIFY_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_GROUPS_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_ON_OFF_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_LEVEL_CONTROL_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_PWM_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_DESCRIPTOR_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_BINDING_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_ACCESS_CONTROL_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_ACTIONS_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_BASIC_INFORMATION_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_OTA_SOFTWARE_UPDATE_PROVIDER_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_OTA_SOFTWARE_UPDATE_REQUESTOR_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_LOCALIZATION_CONFIGURATION_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_TIME_FORMAT_LOCALIZATION_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_UNIT_LOCALIZATION_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_POWER_SOURCE_CONFIGURATION_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_POWER_SOURCE_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_GENERAL_COMMISSIONING_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_NETWORK_COMMISSIONING_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_DIAGNOSTIC_LOGS_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_GENERAL_DIAGNOSTICS_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_SOFTWARE_DIAGNOSTICS_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_THREAD_NETWORK_DIAGNOSTICS_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_WIFI_NETWORK_DIAGNOSTICS_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_ETHERNET_NETWORK_DIAGNOSTICS_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_TIME_SYNCHRONIZATION_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_BRIDGED_DEVICE_BASIC_INFORMATION_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_SWITCH_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_ADMINISTRATOR_COMMISSIONING_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_OPERATIONAL_CREDENTIALS_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_GROUP_KEY_MANAGEMENT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_FIXED_LABEL_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_USER_LABEL_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_PROXY_CONFIGURATION_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_PROXY_DISCOVERY_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_PROXY_VALID_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_BOOLEAN_STATE_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_ICD_MANAGEMENT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_TIMER_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_OPERATIONAL_STATE_OVEN_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_OVEN_MODE_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_LAUNDRY_DRYER_CONTROLS_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_MODE_SELECT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_LAUNDRY_WASHER_MODE_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_REFRIGERATOR_AND_TEMPERATURE_CONTROLLED_CABINET_MODE_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_LAUNDRY_WASHER_CONTROLS_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_RVC_RUN_MODE_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_RVC_CLEAN_MODE_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_TEMPERATURE_CONTROL_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_REFRIGERATOR_ALARM_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_DISHWASHER_MODE_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_AIR_QUALITY_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_SMOKE_CO_ALARM_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_DISHWASHER_ALARM_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_MICROWAVE_OVEN_MODE_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_MICROWAVE_OVEN_CONTROL_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_OPERATIONAL_STATE_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_OPERATIONAL_STATE_RVC_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_SCENES_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_HEPA_FILTER_MONITORING_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_ACTIVATED_CARBON_FILTER_MONITORING_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_BOOLEAN_STATE_CONFIGURATION_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_VALVE_CONFIGURATION_AND_CONTROL_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_ELECTRICAL_POWER_MEASUREMENT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_ELECTRICAL_ENERGY_MEASUREMENT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_WATER_HEATER_MANAGEMENT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_DEMAND_RESPONSE_LOAD_CONTROL_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_MESSAGES_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_DEVICE_ENERGY_MANAGEMENT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_ENERGY_EVSE_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_ENERGY_PREFERENCE_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_POWER_TOPOLOGY_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_ENERGY_EVSE_MODE_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_WATER_HEATER_MODE_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_DEVICE_ENERGY_MANAGEMENT_MODE_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_DOOR_LOCK_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_WINDOW_COVERING_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_SERVICE_AREA_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_PUMP_CONFIGURATION_AND_CONTROL_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_THERMOSTAT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_FAN_CONTROL_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_THERMOSTAT_USER_INTERFACE_CONFIGURATION_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_COLOR_CONTROL_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_BALLAST_CONFIGURATION_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_ILLUMINANCE_MEASUREMENT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_TEMPERATURE_MEASUREMENT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_PRESSURE_MEASUREMENT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_FLOW_MEASUREMENT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_RELATIVE_HUMIDITY_MEASUREMENT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_OCCUPANCY_SENSING_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_CARBON_MONOXIDE_CONCENTRATION_MEASUREMENT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_CARBON_DIOXIDE_CONCENTRATION_MEASUREMENT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_NITROGEN_DIOXIDE_CONCENTRATION_MEASUREMENT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_OZONE_CONCENTRATION_MEASUREMENT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_PM2_5_CONCENTRATION_MEASUREMENT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_FORMALDEHYDE_CONCENTRATION_MEASUREMENT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_PM1_CONCENTRATION_MEASUREMENT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_PM10_CONCENTRATION_MEASUREMENT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_TVOC_CONCENTRATION_MEASUREMENT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_RADON_CONCENTRATION_MEASUREMENT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_WIFI_NETWORK_MANAGEMENT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_THREAD_BORDER_ROUTER_MANAGEMENT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_THREAD_NETWORK_DIRECTORY_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_WAKE_ON_LAN_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_CHANNEL_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_TARGET_NAVIGATOR_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_MEDIA_PLAYBACK_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_MEDIA_INPUT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_LOW_POWER_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_KEYPAD_INPUT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_CONTENT_LAUNCHER_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_AUDIO_OUTPUT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_APPLICATION_LAUNCHER_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_APPLICATION_BASIC_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_ACCOUNT_LOGIN_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_CONTENT_CONTROL_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_CONTENT_APP_OBSERVER_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_ZONE_MANAGEMENT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_CAMERA_AV_STREAM_MANAGEMENT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_CAMERA_AV_SETTINGS_USER_LEVEL_MANAGEMENT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_WEBRTC_TRANSPORT_PROVIDER_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_WEBRTC_TRANSPORT_REQUESTOR_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_PUSH_AV_STREAM_TRANSPORT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_CHIME_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_ECOSYSTEM_INFORMATION_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_COMMISSIONER_CONTROL_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_TLS_CERTIFICATE_MANAGEMENT_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_UNIT_TESTING_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_FAULT_INJECTION_CLUSTER_SERVER_ENDPOINT_COUNT (0) +#define MATTER_DM_SAMPLE_MEI_CLUSTER_SERVER_ENDPOINT_COUNT (0) + +#define MATTER_DM_IDENTIFY_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_GROUPS_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_ON_OFF_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_LEVEL_CONTROL_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_PWM_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_DESCRIPTOR_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_BINDING_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_ACCESS_CONTROL_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_ACTIONS_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_BASIC_INFORMATION_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_OTA_SOFTWARE_UPDATE_PROVIDER_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_OTA_SOFTWARE_UPDATE_REQUESTOR_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_LOCALIZATION_CONFIGURATION_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_TIME_FORMAT_LOCALIZATION_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_UNIT_LOCALIZATION_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_POWER_SOURCE_CONFIGURATION_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_POWER_SOURCE_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_GENERAL_COMMISSIONING_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_NETWORK_COMMISSIONING_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_DIAGNOSTIC_LOGS_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_GENERAL_DIAGNOSTICS_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_SOFTWARE_DIAGNOSTICS_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_THREAD_NETWORK_DIAGNOSTICS_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_WIFI_NETWORK_DIAGNOSTICS_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_ETHERNET_NETWORK_DIAGNOSTICS_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_TIME_SYNCHRONIZATION_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_BRIDGED_DEVICE_BASIC_INFORMATION_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_SWITCH_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_ADMINISTRATOR_COMMISSIONING_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_OPERATIONAL_CREDENTIALS_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_GROUP_KEY_MANAGEMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_FIXED_LABEL_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_USER_LABEL_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_PROXY_CONFIGURATION_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_PROXY_DISCOVERY_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_PROXY_VALID_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_BOOLEAN_STATE_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_ICD_MANAGEMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_TIMER_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_OPERATIONAL_STATE_OVEN_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_OVEN_MODE_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_LAUNDRY_DRYER_CONTROLS_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_MODE_SELECT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_LAUNDRY_WASHER_MODE_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_REFRIGERATOR_AND_TEMPERATURE_CONTROLLED_CABINET_MODE_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_LAUNDRY_WASHER_CONTROLS_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_RVC_RUN_MODE_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_RVC_CLEAN_MODE_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_TEMPERATURE_CONTROL_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_REFRIGERATOR_ALARM_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_DISHWASHER_MODE_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_AIR_QUALITY_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_SMOKE_CO_ALARM_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_DISHWASHER_ALARM_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_MICROWAVE_OVEN_MODE_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_MICROWAVE_OVEN_CONTROL_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_OPERATIONAL_STATE_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_OPERATIONAL_STATE_RVC_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_SCENES_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_HEPA_FILTER_MONITORING_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_ACTIVATED_CARBON_FILTER_MONITORING_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_BOOLEAN_STATE_CONFIGURATION_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_VALVE_CONFIGURATION_AND_CONTROL_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_ELECTRICAL_POWER_MEASUREMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_ELECTRICAL_ENERGY_MEASUREMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_WATER_HEATER_MANAGEMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_DEMAND_RESPONSE_LOAD_CONTROL_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_MESSAGES_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_DEVICE_ENERGY_MANAGEMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_ENERGY_EVSE_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_ENERGY_PREFERENCE_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_POWER_TOPOLOGY_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_ENERGY_EVSE_MODE_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_WATER_HEATER_MODE_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_DEVICE_ENERGY_MANAGEMENT_MODE_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_DOOR_LOCK_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_WINDOW_COVERING_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_SERVICE_AREA_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_PUMP_CONFIGURATION_AND_CONTROL_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_THERMOSTAT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_FAN_CONTROL_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_THERMOSTAT_USER_INTERFACE_CONFIGURATION_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_COLOR_CONTROL_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_BALLAST_CONFIGURATION_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_ILLUMINANCE_MEASUREMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_TEMPERATURE_MEASUREMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_PRESSURE_MEASUREMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_FLOW_MEASUREMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_RELATIVE_HUMIDITY_MEASUREMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_OCCUPANCY_SENSING_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_CARBON_MONOXIDE_CONCENTRATION_MEASUREMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_CARBON_DIOXIDE_CONCENTRATION_MEASUREMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_NITROGEN_DIOXIDE_CONCENTRATION_MEASUREMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_OZONE_CONCENTRATION_MEASUREMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_PM2_5_CONCENTRATION_MEASUREMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_FORMALDEHYDE_CONCENTRATION_MEASUREMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_PM1_CONCENTRATION_MEASUREMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_PM10_CONCENTRATION_MEASUREMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_TVOC_CONCENTRATION_MEASUREMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_RADON_CONCENTRATION_MEASUREMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_WIFI_NETWORK_MANAGEMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_THREAD_BORDER_ROUTER_MANAGEMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_THREAD_NETWORK_DIRECTORY_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_WAKE_ON_LAN_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_CHANNEL_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_TARGET_NAVIGATOR_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_MEDIA_PLAYBACK_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_MEDIA_INPUT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_LOW_POWER_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_KEYPAD_INPUT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_CONTENT_LAUNCHER_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_AUDIO_OUTPUT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_APPLICATION_LAUNCHER_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_APPLICATION_BASIC_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_ACCOUNT_LOGIN_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_CONTENT_CONTROL_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_CONTENT_APP_OBSERVER_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_ZONE_MANAGEMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_CAMERA_AV_STREAM_MANAGEMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_CAMERA_AV_SETTINGS_USER_LEVEL_MANAGEMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_WEBRTC_TRANSPORT_PROVIDER_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_WEBRTC_TRANSPORT_REQUESTOR_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_PUSH_AV_STREAM_TRANSPORT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_CHIME_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_ECOSYSTEM_INFORMATION_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_COMMISSIONER_CONTROL_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_TLS_CERTIFICATE_MANAGEMENT_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_UNIT_TESTING_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_FAULT_INJECTION_CLUSTER_CLIENT_ENDPOINT_COUNT (0) +#define MATTER_DM_SAMPLE_MEI_CLUSTER_CLIENT_ENDPOINT_COUNT (0) diff --git a/src/app/zap-templates/templates/app/gen_config.zapt b/src/app/zap-templates/templates/app/gen_config.zapt index a7bcee23cc3889..277a2ea79fb725 100644 --- a/src/app/zap-templates/templates/app/gen_config.zapt +++ b/src/app/zap-templates/templates/app/gen_config.zapt @@ -4,9 +4,13 @@ #pragma once /**** Cluster endpoint counts ****/ -{{#all_user_clusters}} -#define MATTER_DM_{{as_delimited_macro define}}_{{as_delimited_macro side}}_ENDPOINT_COUNT ({{user_endpoint_count_by_cluster id side}}) -{{/all_user_clusters}} +{{#zcl_clusters}} +#define MATTER_DM_{{as_delimited_macro define}}_SERVER_ENDPOINT_COUNT ({{user_endpoint_count_by_cluster id "server"}}) +{{/zcl_clusters}} + +{{#zcl_clusters}} +#define MATTER_DM_{{as_delimited_macro define}}_CLIENT_ENDPOINT_COUNT ({{user_endpoint_count_by_cluster id "client"}}) +{{/zcl_clusters}} /**** Cluster Plugins ****/ {{#all_user_clusters}} From 89e823e5d8065ce85a6e6b4c205e11db413c4535 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Baczma=C5=84ski?= Date: Thu, 30 Jan 2025 11:15:07 +0100 Subject: [PATCH 19/36] [Zephyr] Save total operational hours on Read (#37259) Currently total operational hours are saved to NVM with `CONFIG_CHIP_OPERATIONAL_TIME_SAVE_INTERVAL`. Certification tests require checking the value after 1 hour, restarting the DUT, and checking if the value has not changed, causing failures if given config is higher than 1. This commit additionaly saves total operational hours to NVM everytime it is being read by `GetTotalOperationalHours` (writing only if currently stored value should be updated). This way value is stored with minimum frequency of 1 hour (if read request is sent frequently) and maximum frequency of `CONFIG_CHIP_OPERATIONAL_TIME_SAVE_INTERVAL`. --- .../Zephyr/DiagnosticDataProviderImpl.cpp | 15 +------ src/platform/Zephyr/PlatformManagerImpl.cpp | 40 +++++++++++-------- src/platform/Zephyr/PlatformManagerImpl.h | 3 +- 3 files changed, 27 insertions(+), 31 deletions(-) diff --git a/src/platform/Zephyr/DiagnosticDataProviderImpl.cpp b/src/platform/Zephyr/DiagnosticDataProviderImpl.cpp index 3dc0bf723cbc73..11512a3e3c3f8f 100644 --- a/src/platform/Zephyr/DiagnosticDataProviderImpl.cpp +++ b/src/platform/Zephyr/DiagnosticDataProviderImpl.cpp @@ -270,19 +270,8 @@ CHIP_ERROR DiagnosticDataProviderImpl::GetUpTime(uint64_t & upTime) CHIP_ERROR DiagnosticDataProviderImpl::GetTotalOperationalHours(uint32_t & totalOperationalHours) { - uint64_t upTimeS; - - ReturnErrorOnFailure(GetUpTime(upTimeS)); - - uint64_t totalHours = 0; - const uint32_t upTimeH = upTimeS / 3600 < UINT32_MAX ? static_cast(upTimeS / 3600) : UINT32_MAX; - const uint64_t deltaTime = upTimeH - PlatformMgrImpl().GetSavedOperationalHoursSinceBoot(); - - ReturnErrorOnFailure(ConfigurationMgr().GetTotalOperationalHours(reinterpret_cast(totalHours))); - - totalOperationalHours = static_cast(totalHours + deltaTime < UINT32_MAX ? totalHours + deltaTime : UINT32_MAX); - - return CHIP_NO_ERROR; + // Update the total operational hours and get the most recent value. + return PlatformMgrImpl().UpdateOperationalHours(&totalOperationalHours); } CHIP_ERROR DiagnosticDataProviderImpl::GetBootReason(BootReasonType & bootReason) diff --git a/src/platform/Zephyr/PlatformManagerImpl.cpp b/src/platform/Zephyr/PlatformManagerImpl.cpp index 163c2818ae8c2b..499ddc116a8116 100644 --- a/src/platform/Zephyr/PlatformManagerImpl.cpp +++ b/src/platform/Zephyr/PlatformManagerImpl.cpp @@ -76,33 +76,41 @@ static int app_entropy_source(void * data, unsigned char * output, size_t len, s void PlatformManagerImpl::OperationalHoursSavingTimerEventHandler(k_timer * timer) { - PlatformMgr().ScheduleWork(UpdateOperationalHours); + PlatformMgr().ScheduleWork([](intptr_t arg) { + CHIP_ERROR error = sInstance.UpdateOperationalHours(nullptr); + if (error != CHIP_NO_ERROR) + { + ChipLogError(DeviceLayer, "Failed to update operational hours: %" CHIP_ERROR_FORMAT, error.Format()); + } + }); } -void PlatformManagerImpl::UpdateOperationalHours(intptr_t arg) +CHIP_ERROR PlatformManagerImpl::UpdateOperationalHours(uint32_t * totalOperationalHours) { uint64_t upTimeS; - if (GetDiagnosticDataProvider().GetUpTime(upTimeS) != CHIP_NO_ERROR) - { - ChipLogError(DeviceLayer, "Failed to get up time of the node"); - return; - } + ReturnErrorOnFailure(GetDiagnosticDataProvider().GetUpTime(upTimeS)); + + uint32_t totalTime = 0; + const uint32_t upTimeH = upTimeS / 3600 < UINT32_MAX ? static_cast(upTimeS / 3600) : UINT32_MAX; + const uint64_t deltaTime = upTimeH - mSavedOperationalHoursSinceBoot; + + ReturnErrorOnFailure(ConfigurationMgr().GetTotalOperationalHours(totalTime)); - uint64_t totalOperationalHours = 0; - const uint32_t upTimeH = upTimeS / 3600 < UINT32_MAX ? static_cast(upTimeS / 3600) : UINT32_MAX; - const uint64_t deltaTime = upTimeH - sInstance.mSavedOperationalHoursSinceBoot; + totalTime = totalTime + deltaTime < UINT32_MAX ? static_cast(totalTime + deltaTime) : UINT32_MAX; - if (ConfigurationMgr().GetTotalOperationalHours(reinterpret_cast(totalOperationalHours)) == CHIP_NO_ERROR) + if (deltaTime > 0) { - ConfigurationMgr().StoreTotalOperationalHours( - static_cast(totalOperationalHours + deltaTime < UINT32_MAX ? totalOperationalHours + deltaTime : UINT32_MAX)); - sInstance.mSavedOperationalHoursSinceBoot = upTimeH; + ConfigurationMgr().StoreTotalOperationalHours(totalTime); + mSavedOperationalHoursSinceBoot = upTimeH; } - else + + if (totalOperationalHours != nullptr) { - ChipLogError(DeviceLayer, "Failed to get total operational hours of the node"); + *totalOperationalHours = totalTime; } + + return CHIP_NO_ERROR; } CHIP_ERROR PlatformManagerImpl::_InitChipStack(void) diff --git a/src/platform/Zephyr/PlatformManagerImpl.h b/src/platform/Zephyr/PlatformManagerImpl.h index ca13a451272c2a..d82b8b310a3808 100644 --- a/src/platform/Zephyr/PlatformManagerImpl.h +++ b/src/platform/Zephyr/PlatformManagerImpl.h @@ -47,7 +47,7 @@ class PlatformManagerImpl final : public PlatformManager, public Internal::Gener // ===== Platform-specific members that may be accessed directly by the application. System::Clock::Timestamp GetStartTime() { return mStartTime; } - uint32_t GetSavedOperationalHoursSinceBoot() { return mSavedOperationalHoursSinceBoot; } + CHIP_ERROR UpdateOperationalHours(uint32_t * totalOperationalHours); private: // ===== Methods that implement the PlatformManager abstract interface. @@ -55,7 +55,6 @@ class PlatformManagerImpl final : public PlatformManager, public Internal::Gener CHIP_ERROR _InitChipStack(void); static void OperationalHoursSavingTimerEventHandler(k_timer * timer); - static void UpdateOperationalHours(intptr_t arg); // ===== Members for internal use by the following friends. From 22d257481ebe137f113f716fba06b66b7428ab92 Mon Sep 17 00:00:00 2001 From: Alex Tsitsiura Date: Thu, 30 Jan 2025 15:22:23 +0200 Subject: [PATCH 20/36] [Telink] Update Docker image (Zephyr update) (#37319) --- integrations/docker/images/base/chip-build/version | 2 +- integrations/docker/images/stage-2/chip-build-telink/Dockerfile | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/integrations/docker/images/base/chip-build/version b/integrations/docker/images/base/chip-build/version index e760cfdf5e679a..1939f7e2b4d3b0 100644 --- a/integrations/docker/images/base/chip-build/version +++ b/integrations/docker/images/base/chip-build/version @@ -1 +1 @@ -103 : Changed sysroot for crosscompile image (new ubuntu version and includes NFC libs) +104 : [Telink] Update Docker image (Zephyr update) diff --git a/integrations/docker/images/stage-2/chip-build-telink/Dockerfile b/integrations/docker/images/stage-2/chip-build-telink/Dockerfile index 4767cd2d103c93..a0d3cb8c92253b 100644 --- a/integrations/docker/images/stage-2/chip-build-telink/Dockerfile +++ b/integrations/docker/images/stage-2/chip-build-telink/Dockerfile @@ -18,7 +18,7 @@ RUN set -x \ && : # last line # Setup Zephyr -ARG ZEPHYR_REVISION=c05c461b1119782cc839cf436fa04ec5e1fb2c8c +ARG ZEPHYR_REVISION=52c23bb5bfa7b08fb2499fda8c34cbd3418e0c1d WORKDIR /opt/telink/zephyrproject RUN set -x \ && python3 -m pip install --break-system-packages -U --no-cache-dir west \ From d7c12708f3de63cd1138de631a57821bde8c3721 Mon Sep 17 00:00:00 2001 From: Andrei Litvin Date: Thu, 30 Jan 2025 08:37:56 -0500 Subject: [PATCH 21/36] Correct aarch64 path (#37320) Co-authored-by: Andrei Litvin --- .../docker/images/vscode/chip-build-vscode/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/integrations/docker/images/vscode/chip-build-vscode/Dockerfile b/integrations/docker/images/vscode/chip-build-vscode/Dockerfile index 45834408fd44aa..ba46b7c10f06a3 100644 --- a/integrations/docker/images/vscode/chip-build-vscode/Dockerfile +++ b/integrations/docker/images/vscode/chip-build-vscode/Dockerfile @@ -42,7 +42,7 @@ COPY --from=telink /opt/telink/zephyr-sdk-0.16.1 /opt/telink/zephyr-sdk-0.16.1 COPY --from=tizen /opt/tizen-sdk /opt/tizen-sdk -COPY --from=crosscompile /opt/ubuntu-22.04.1-aarch64-sysroot /opt/ubuntu-22.04.1-aarch64-sysroot +COPY --from=crosscompile /opt/ubuntu-24.04-aarch64-sysroot /opt/ubuntu-24.04-aarch64-sysroot COPY --from=ameba /opt/ameba /opt/ameba @@ -124,7 +124,7 @@ ENV NRF5_TOOLS_ROOT=/opt/NordicSemiconductor/nRF5_tools ENV OPENOCD_PATH=/opt/openocd/ ENV QEMU_ESP32=/opt/espressif/qemu/qemu-system-xtensa ENV QEMU_ESP32_DIR=/opt/espressif/qemu -ENV SYSROOT_AARCH64=/opt/ubuntu-22.04.1-aarch64-sysroot +ENV SYSROOT_AARCH64=/opt/ubuntu-24.04-aarch64-sysroot ENV TELINK_ZEPHYR_BASE=/opt/telink/zephyrproject/zephyr ENV TELINK_ZEPHYR_SDK_DIR=/opt/telink/zephyr-sdk-0.16.1 ENV TI_SYSCONFIG_ROOT=/opt/ti/sysconfig_1.18.1 From 8be890b477424be92149da699a60a41b11d4f73e Mon Sep 17 00:00:00 2001 From: Shubham Patil Date: Thu, 30 Jan 2025 21:01:14 +0530 Subject: [PATCH 22/36] controller/python: add device attestation revocation support (#37134) * src/credentials: add an API to DeviceAttestationVerifier interface to set the revocation delegate * controller/python: add device attestation revocation support - Added the cli option to matter testing framework for setting the dac revocation set path - Added the required changes in the python bindings - Added an API to the python controller to set the dac revocation set path. * rename TrySettingRevocationDelegate to SetRevocationDelegate --- src/controller/python/BUILD.gn | 1 + src/controller/python/OpCredsBinding.cpp | 21 +++++++++++++++++++ src/controller/python/chip/ChipDeviceCtrl.py | 15 +++++++++++++ src/controller/python/chip/FabricAdmin.py | 8 ++++++- .../DefaultDeviceAttestationVerifier.h | 3 ++- .../DeviceAttestationVerifier.h | 15 +++++++++++++ .../chip/testing/matter_testing.py | 8 ++++++- 7 files changed, 68 insertions(+), 3 deletions(-) diff --git a/src/controller/python/BUILD.gn b/src/controller/python/BUILD.gn index a90f59f2f33952..4b4b2e98105541 100644 --- a/src/controller/python/BUILD.gn +++ b/src/controller/python/BUILD.gn @@ -126,6 +126,7 @@ shared_library("ChipDeviceCtrl") { "${chip_root}/src/app/icd/client:handler", "${chip_root}/src/app/server", "${chip_root}/src/credentials:default_attestation_verifier", + "${chip_root}/src/credentials:test_dac_revocation_delegate", "${chip_root}/src/lib", "${chip_root}/src/lib/core", "${chip_root}/src/lib/dnssd", diff --git a/src/controller/python/OpCredsBinding.cpp b/src/controller/python/OpCredsBinding.cpp index 57fe36d21f9b99..5cdad3cc817e15 100644 --- a/src/controller/python/OpCredsBinding.cpp +++ b/src/controller/python/OpCredsBinding.cpp @@ -44,6 +44,7 @@ #include #include #include +#include using namespace chip; @@ -61,6 +62,15 @@ const chip::Credentials::AttestationTrustStore * GetTestFileAttestationTrustStor return &attestationTrustStore; } +Credentials::DeviceAttestationRevocationDelegate * GetTestAttestationRevocationDelegate(const char * dacRevocationSetPath) +{ + VerifyOrReturnValue(dacRevocationSetPath != nullptr, nullptr); + + static Credentials::TestDACRevocationDelegateImpl testDacRevocationDelegate; + testDacRevocationDelegate.SetDeviceAttestationRevocationSetPath(dacRevocationSetPath); + return &testDacRevocationDelegate; +} + chip::Python::PlaceholderOperationalCredentialsIssuer sPlaceholderOperationalCredentialsIssuer; } // namespace @@ -700,4 +710,15 @@ PyChipError pychip_GetCompletionError() return ToPyChipError(sTestCommissioner.GetCompletionError()); } +PyChipError pychip_DeviceController_SetDACRevocationSetPath(const char * dacRevocationSetPath) +{ + Credentials::DeviceAttestationRevocationDelegate * dacRevocationDelegate = + GetTestAttestationRevocationDelegate(dacRevocationSetPath); + VerifyOrReturnError(dacRevocationDelegate != nullptr, ToPyChipError(CHIP_ERROR_INVALID_ARGUMENT)); + + Credentials::DeviceAttestationVerifier * dacVerifier = Credentials::GetDeviceAttestationVerifier(); + VerifyOrReturnError(dacVerifier != nullptr, ToPyChipError(CHIP_ERROR_INCORRECT_STATE)); + + return ToPyChipError(dacVerifier->SetRevocationDelegate(dacRevocationDelegate)); +} } // extern "C" diff --git a/src/controller/python/chip/ChipDeviceCtrl.py b/src/controller/python/chip/ChipDeviceCtrl.py index b330a2924121c0..013243c8c4b726 100644 --- a/src/controller/python/chip/ChipDeviceCtrl.py +++ b/src/controller/python/chip/ChipDeviceCtrl.py @@ -2010,6 +2010,9 @@ def _InitLib(self): self._dmLib.pychip_DeviceController_SetTermsAcknowledgements.restype = PyChipError self._dmLib.pychip_DeviceController_SetTermsAcknowledgements.argtypes = [c_uint16, c_uint16] + self._dmLib.pychip_DeviceController_SetDACRevocationSetPath.restype = PyChipError + self._dmLib.pychip_DeviceController_SetDACRevocationSetPath.argtypes = [c_char_p] + class ChipDeviceController(ChipDeviceControllerBase): ''' The ChipDeviceCommissioner binding, named as ChipDeviceController @@ -2308,6 +2311,18 @@ async def IssueNOCChain(self, csr: Clusters.OperationalCredentials.Commands.CSRR return await asyncio.futures.wrap_future(ctx.future) + def SetDACRevocationSetPath(self, dacRevocationSetPath: typing.Optional[str]): + ''' Set the path to the device attestation revocation set JSON file. + + Args: + dacRevocationSetPath: Path to the JSON file containing the device attestation revocation set + ''' + self.CheckIsActive() + self._ChipStack.Call( + lambda: self._dmLib.pychip_DeviceController_SetDACRevocationSetPath( + c_char_p(str.encode(dacRevocationSetPath) if dacRevocationSetPath else None)) + ).raise_on_error() + class BareChipDeviceController(ChipDeviceControllerBase): ''' A bare device controller without AutoCommissioner support. diff --git a/src/controller/python/chip/FabricAdmin.py b/src/controller/python/chip/FabricAdmin.py index a7c5fb86166339..d575f4690fa801 100644 --- a/src/controller/python/chip/FabricAdmin.py +++ b/src/controller/python/chip/FabricAdmin.py @@ -64,7 +64,8 @@ def __init__(self, certificateAuthority: CertificateAuthority.CertificateAuthori self._activeControllers: List[ChipDeviceCtrl.ChipDeviceController] = [] def NewController(self, nodeId: Optional[int] = None, paaTrustStorePath: str = "", - useTestCommissioner: bool = False, catTags: List[int] = [], keypair: p256keypair.P256Keypair = None): + useTestCommissioner: bool = False, catTags: List[int] = [], keypair: p256keypair.P256Keypair = None, + dacRevocationSetPath: str = ""): ''' Create a new chip.ChipDeviceCtrl.ChipDeviceController instance on this fabric. When vending ChipDeviceController instances on a given fabric, each controller instance @@ -77,6 +78,8 @@ def NewController(self, nodeId: Optional[int] = None, paaTrustStorePath: str = " paaTrustStorePath: Path to the PAA trust store. If one isn't provided, a suitable default is selected. useTestCommissioner: If a test commmisioner is to be created. catTags: A list of 32-bit CAT tags that will added to the NOC generated for this controller. + keypair: A keypair to be used for the controller. If one isn't provided, a new one is generated. + dacRevocationSetPath: Path to the device attestation revocation set JSON file. ''' if (not (self._isActive)): raise RuntimeError( @@ -107,6 +110,9 @@ def NewController(self, nodeId: Optional[int] = None, paaTrustStorePath: str = " catTags=catTags, keypair=keypair) + if dacRevocationSetPath and len(dacRevocationSetPath) > 0: + controller.SetDACRevocationSetPath(dacRevocationSetPath) + self._activeControllers.append(controller) return controller diff --git a/src/credentials/attestation_verifier/DefaultDeviceAttestationVerifier.h b/src/credentials/attestation_verifier/DefaultDeviceAttestationVerifier.h index 7e0fc1c4378848..5cce0bc94e8ad2 100644 --- a/src/credentials/attestation_verifier/DefaultDeviceAttestationVerifier.h +++ b/src/credentials/attestation_verifier/DefaultDeviceAttestationVerifier.h @@ -83,9 +83,10 @@ class DefaultDACVerifier : public DeviceAttestationVerifier CsaCdKeysTrustStore * GetCertificationDeclarationTrustStore() override { return &mCdKeysTrustStore; } - void SetRevocationDelegate(DeviceAttestationRevocationDelegate * revocationDelegate) + CHIP_ERROR SetRevocationDelegate(DeviceAttestationRevocationDelegate * revocationDelegate) override { mRevocationDelegate = revocationDelegate; + return CHIP_NO_ERROR; } protected: diff --git a/src/credentials/attestation_verifier/DeviceAttestationVerifier.h b/src/credentials/attestation_verifier/DeviceAttestationVerifier.h index e6915931a73b68..e51a70632dc73e 100644 --- a/src/credentials/attestation_verifier/DeviceAttestationVerifier.h +++ b/src/credentials/attestation_verifier/DeviceAttestationVerifier.h @@ -260,6 +260,9 @@ class ArrayAttestationTrustStore : public AttestationTrustStore const size_t mNumCerts; }; +// forward declaration +class DeviceAttestationRevocationDelegate; + class DeviceAttestationVerifier { public: @@ -410,6 +413,18 @@ class DeviceAttestationVerifier void EnableCdTestKeySupport(bool enabled) { mEnableCdTestKeySupport = enabled; } bool IsCdTestKeySupported() const { return mEnableCdTestKeySupport; } + /** + * @brief Try to set the revocation delegate. + * + * @param[in] revocationDelegate The revocation delegate to set. + * + * @return CHIP_NO_ERROR on success, CHIP_ERROR_NOT_IMPLEMENTED if the revocation delegate is not supported. + */ + virtual CHIP_ERROR SetRevocationDelegate(DeviceAttestationRevocationDelegate * revocationDelegate) + { + return CHIP_ERROR_NOT_IMPLEMENTED; + } + protected: CHIP_ERROR ValidateAttestationSignature(const Crypto::P256PublicKey & pubkey, const ByteSpan & attestationElements, const ByteSpan & attestationChallenge, const Crypto::P256ECDSASignature & signature); diff --git a/src/python_testing/matter_testing_infrastructure/chip/testing/matter_testing.py b/src/python_testing/matter_testing_infrastructure/chip/testing/matter_testing.py index 1054463ea64489..49249cc7dabb0f 100644 --- a/src/python_testing/matter_testing_infrastructure/chip/testing/matter_testing.py +++ b/src/python_testing/matter_testing_infrastructure/chip/testing/matter_testing.py @@ -675,6 +675,8 @@ class MatterTestConfig: # Accepted Terms and Conditions if used tc_version_to_simulate: int = None tc_user_response_to_simulate: int = None + # path to device attestation revocation set json file + dac_revocation_set_path: Optional[pathlib.Path] = None class ClusterMapper: @@ -1949,6 +1951,7 @@ def convert_args_to_matter_config(args: argparse.Namespace) -> MatterTestConfig: config.tc_version_to_simulate = args.tc_version_to_simulate config.tc_user_response_to_simulate = args.tc_user_response_to_simulate + config.dac_revocation_set_path = args.dac_revocation_set_path # Accumulate all command-line-passed named args all_global_args = [] @@ -1984,6 +1987,8 @@ def parse_matter_test_args(argv: Optional[List[str]] = None) -> MatterTestConfig paa_path_default = get_default_paa_trust_store(pathlib.Path.cwd()) basic_group.add_argument('--paa-trust-store-path', action="store", type=pathlib.Path, metavar="PATH", default=paa_path_default, help="PAA trust store path (default: %s)" % str(paa_path_default)) + basic_group.add_argument('--dac-revocation-set-path', action="store", type=pathlib.Path, metavar="PATH", + help="Path to JSON file containing the device attestation revocation set.") basic_group.add_argument('--ble-interface-id', action="store", type=int, metavar="INTERFACE_ID", help="ID of BLE adapter (from hciconfig)") basic_group.add_argument('-N', '--controller-node-id', type=int_decimal_or_hex, @@ -2506,7 +2511,8 @@ def run_tests_no_exit(test_class: MatterBaseTest, matter_test_config: MatterTest default_controller = stack.certificate_authorities[0].adminList[0].NewController( nodeId=matter_test_config.controller_node_id, paaTrustStorePath=str(matter_test_config.paa_trust_store_path), - catTags=matter_test_config.controller_cat_tags + catTags=matter_test_config.controller_cat_tags, + dacRevocationSetPath=str(matter_test_config.dac_revocation_set_path), ) test_config.user_params["default_controller"] = stash_globally(default_controller) From e0792a4c6281ecf13c2072a4d77e805c9b10f540 Mon Sep 17 00:00:00 2001 From: C Freeman Date: Thu, 30 Jan 2025 12:14:02 -0500 Subject: [PATCH 23/36] TCP tests: TC-SC-8.x - Use ArmFailsafe as cmd (#37313) * TCP tests: TC-SC-8.x - Use ArmFailsafe as cmd Also add top-level pics * Fix payload capability --- src/python_testing/TCP_Tests.py | 39 +++++++++++++++++++++++++++------ 1 file changed, 32 insertions(+), 7 deletions(-) diff --git a/src/python_testing/TCP_Tests.py b/src/python_testing/TCP_Tests.py index 10209346a0cd94..f38cdb5651bce0 100644 --- a/src/python_testing/TCP_Tests.py +++ b/src/python_testing/TCP_Tests.py @@ -38,6 +38,18 @@ class TCP_Tests(MatterBaseTest): + async def send_arm_cmd(self, payloadCapability: ChipDeviceCtrl.TransportPayloadCapability) -> None: + cmd = Clusters.GeneralCommissioning.Commands.ArmFailSafe(expiryLengthSeconds=900, breadcrumb=1) + await self.send_single_cmd(cmd=cmd, endpoint=0, payloadCapability=payloadCapability) + + @async_test_body + async def teardown_test(self): + cmd = Clusters.GeneralCommissioning.Commands.ArmFailSafe(expiryLengthSeconds=0, breadcrumb=0) + await self.send_single_cmd(cmd=cmd, endpoint=0, + payloadCapability=ChipDeviceCtrl.TransportPayloadCapability.LARGE_PAYLOAD) + + def pics_SC_8_1(self): + return ['MCORE.SC.TCP'] # TCP Connection Establishment @async_test_body @@ -51,6 +63,9 @@ async def test_TC_SC_8_1(self): asserts.assert_equal(device.isSessionOverTCPConnection, True, "Session does not have associated TCP connection") asserts.assert_equal(device.isActiveSession, True, "Large Payload Session should be active over TCP connection") + def pics_SC_8_2(self): + return ['MCORE.SC.TCP'] + # Large Payload Session Establishment @async_test_body async def test_TC_SC_8_2(self): @@ -62,6 +77,9 @@ async def test_TC_SC_8_2(self): asserts.fail("Unable to establish a CASE session over TCP to the device") asserts.assert_equal(device.sessionAllowsLargePayload, True, "Session does not have associated TCP connection") + def pics_SC_8_3(self): + return ['MCORE.SC.TCP'] + # Session Inactive After TCP Disconnect @async_test_body async def test_TC_SC_8_3(self): @@ -77,6 +95,9 @@ async def test_TC_SC_8_3(self): asserts.assert_equal(device.isActiveSession, False, "Large Payload Session should not be active after TCP connection closure") + def pics_SC_8_4(self): + return ['MCORE.SC.TCP'] + # TCP Connect, Disconnect, Then Connect Again @async_test_body async def test_TC_SC_8_4(self): @@ -101,7 +122,9 @@ async def test_TC_SC_8_4(self): asserts.assert_equal(device.isSessionOverTCPConnection, True, "Session does not have associated TCP connection") asserts.assert_equal(device.isActiveSession, True, "Large Payload Session should be active over TCP connection") - # OnOff Cluster Toggle Command Over TCP Session + def pics_SC_8_5(self): + return ['MCORE.SC.TCP'] + @async_test_body async def test_TC_SC_8_5(self): @@ -114,13 +137,14 @@ async def test_TC_SC_8_5(self): asserts.assert_equal(device.isActiveSession, True, "Large Payload Session should be active over TCP connection") asserts.assert_equal(device.sessionAllowsLargePayload, True, "Session does not have associated TCP connection") - commands = Clusters.Objects.OnOff.Commands try: - await self.send_single_cmd(cmd=commands.Toggle(), endpoint=1, - payloadCapability=ChipDeviceCtrl.TransportPayloadCapability.LARGE_PAYLOAD) + await self.send_arm_cmd(ChipDeviceCtrl.TransportPayloadCapability.LARGE_PAYLOAD) except InteractionModelError: asserts.fail("Unexpected error returned by DUT") + def pics_SC_8_6(self): + return ['MCORE.SC.TCP'] + # WildCard Read Over TCP Session @async_test_body async def test_TC_SC_8_6(self): @@ -139,6 +163,9 @@ async def test_TC_SC_8_6(self): except InteractionModelError: asserts.fail("Unexpected error returned by DUT") + def pics_SC_8_7(self): + return ['MCORE.SC.TCP'] + # Use TCP Session If Available For MRP Interaction @async_test_body async def test_TC_SC_8_7(self): @@ -152,10 +179,8 @@ async def test_TC_SC_8_7(self): asserts.assert_equal(device.isActiveSession, True, "Large Payload Session should be active over TCP connection") asserts.assert_equal(device.sessionAllowsLargePayload, True, "Session does not have associated TCP connection") - commands = Clusters.Objects.OnOff.Commands try: - await self.send_single_cmd(cmd=commands.Toggle(), endpoint=1, - payloadCapability=ChipDeviceCtrl.TransportPayloadCapability.MRP_OR_TCP_PAYLOAD) + self.send_arm_cmd(ChipDeviceCtrl.TransportPayloadCapability.MRP_OR_TCP_PAYLOAD) except InteractionModelError: asserts.fail("Unexpected error returned by DUT") From e28f439d89baf2e7365a392faad872c8475d5271 Mon Sep 17 00:00:00 2001 From: Adrian Gielniewski Date: Thu, 30 Jan 2025 21:44:44 +0100 Subject: [PATCH 24/36] [crypto] Fix initialization of psa key attributes (#37255) psa_key_attributes_t has to be initialized with PSA_KEY_ATTRIBUTES_INIT. Signed-off-by: Adrian Gielniewski --- src/crypto/PSASessionKeystore.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/crypto/PSASessionKeystore.cpp b/src/crypto/PSASessionKeystore.cpp index ece38e74ffeda2..4831333e0e6c48 100644 --- a/src/crypto/PSASessionKeystore.cpp +++ b/src/crypto/PSASessionKeystore.cpp @@ -190,8 +190,8 @@ void PSASessionKeystore::DestroyKey(HkdfKeyHandle & key) CHIP_ERROR PSASessionKeystore::PersistICDKey(Symmetric128BitsKeyHandle & key) { CHIP_ERROR err; - psa_key_id_t newKeyId = PSA_KEY_ID_NULL; - psa_key_attributes_t attrs; + psa_key_id_t newKeyId = PSA_KEY_ID_NULL; + psa_key_attributes_t attrs = PSA_KEY_ATTRIBUTES_INIT; psa_get_key_attributes(key.As(), &attrs); From 3044eebcadfe462bfdab21ae5ea72a8da5effbad Mon Sep 17 00:00:00 2001 From: Andrei Litvin Date: Thu, 30 Jan 2025 15:56:18 -0500 Subject: [PATCH 25/36] Add an additional binary ELF size differ we can use for size differences and docs (#37325) * Add the binary size differ * Add documentation for tooling * Restyle * Fix text --------- Co-authored-by: Andrei Litvin --- docs/tools/index.md | 1 + scripts/tools/ELF_SIZE_TOOLING.md | 63 +++++++ scripts/tools/FileSizeOutputExample.png | Bin 0 -> 357789 bytes scripts/tools/binary_elf_size_diff.py | 218 ++++++++++++++++++++++++ 4 files changed, 282 insertions(+) create mode 100644 scripts/tools/ELF_SIZE_TOOLING.md create mode 100644 scripts/tools/FileSizeOutputExample.png create mode 100755 scripts/tools/binary_elf_size_diff.py diff --git a/docs/tools/index.md b/docs/tools/index.md index a2ff8fd1587f89..1f7d68c47b77e1 100644 --- a/docs/tools/index.md +++ b/docs/tools/index.md @@ -28,6 +28,7 @@ Source files for these tools are located at `scripts/tools`. ../scripts/tools/memory/README ../scripts/tools/spake2p/README +../scripts/tools/ELF_SIZE_TOOLING ``` diff --git a/scripts/tools/ELF_SIZE_TOOLING.md b/scripts/tools/ELF_SIZE_TOOLING.md new file mode 100644 index 00000000000000..7e7e9883afabfa --- /dev/null +++ b/scripts/tools/ELF_SIZE_TOOLING.md @@ -0,0 +1,63 @@ +# ELF binary size information + +## Individual size information + +`file_size_from_nm.py` is able to build an interactive tree map of +methods/namespaces sizes within an elf binary. + +Use it to determine how much space specific parts of the code take. For example: + +``` +./scripts/tools/file_size_from_nm.py \ + --zoom '::chip::app' \ + ./out/qpg-qpg6105-light/chip-qpg6105-lighting-example.out +``` + +could result in a graph like: + +![image](./FileSizeOutputExample.png) + +## Determine difference between two binaries + +`binary_elf_size_diff` provides the ability to compare two elf files. Usually +you can build the master branch of a binary and save it somewhere like +`./out/master.elf` and then re-build with changes and compare. + +Example runs: + +``` +> ~/devel/chip-scripts/bindiff.py \ + ./out/qpg-qpg6105-light/chip-qpg6105-lighting-example.out \ + ./out/qpg-master.out + +Type Size Function +------- ------ ----------------------------------------------------------------------------------------------------------------------- +CHANGED -128 chip::app::CodegenDataModelProvider::WriteAttribute(chip::app::DataModel::WriteAttributeRequest const&, chip::app::A... +CHANGED -76 chip::app::InteractionModelEngine::CheckCommandExistence(chip::app::ConcreteCommandPath const&, chip::app::DataModel... +CHANGED -74 chip::app::reporting::Engine::CheckAccessDeniedEventPaths(chip::TLV::TLVWriter&, bool&, chip::app::ReadHandler*) +REMOVED -58 chip::app::DataModel::EndpointFinder::EndpointFinder(chip::app::DataModel::ProviderMetadataTree*) +REMOVED -44 chip::app::DataModel::EndpointFinder::Find(unsigned short) +CHANGED 18 chip::app::WriteHandler::WriteClusterData(chip::Access::SubjectDescriptor const&, chip::app::ConcreteDataAttributePa... +ADDED 104 chip::app::DataModel::ValidateClusterPath(chip::app::DataModel::ProviderMetadataTree*, chip::app::ConcreteClusterPat... +ADDED 224 chip::app::WriteHandler::CheckWriteAllowed(chip::Access::SubjectDescriptor const&, chip::app::ConcreteDataAttributeP... +TOTAL -34 + + +``` + +``` +> ~/devel/chip-scripts/bindiff.py \ + --output csv --skip-total \ + ./out/qpg-qpg6105-light/chip-qpg6105-lighting-example.out ./out/qpg-master.out + +Type,Size,Function +CHANGED,-128,"chip::app::CodegenDataModelProvider::WriteAttribute(chip::app::DataModel::WriteAttributeRequest const&, chip::app::AttributeValueDecoder&)" +CHANGED,-76,"chip::app::InteractionModelEngine::CheckCommandExistence(chip::app::ConcreteCommandPath const&, chip::app::DataModel::AcceptedCommandEntry&)" +CHANGED,-74,"chip::app::reporting::Engine::CheckAccessDeniedEventPaths(chip::TLV::TLVWriter&, bool&, chip::app::ReadHandler*)" +REMOVED,-58,chip::app::DataModel::EndpointFinder::EndpointFinder(chip::app::DataModel::ProviderMetadataTree*) +REMOVED,-44,chip::app::DataModel::EndpointFinder::Find(unsigned short) +CHANGED,18,"chip::app::WriteHandler::WriteClusterData(chip::Access::SubjectDescriptor const&, chip::app::ConcreteDataAttributePath const&, chip::TLV::TLVReader&)" +ADDED,104,"chip::app::DataModel::ValidateClusterPath(chip::app::DataModel::ProviderMetadataTree*, chip::app::ConcreteClusterPath const&, chip::Protocols::InteractionModel::Status)" +ADDED,224,"chip::app::WriteHandler::CheckWriteAllowed(chip::Access::SubjectDescriptor const&, chip::app::ConcreteDataAttributePath const&)" + +``` diff --git a/scripts/tools/FileSizeOutputExample.png b/scripts/tools/FileSizeOutputExample.png new file mode 100644 index 0000000000000000000000000000000000000000..263ed2cac2d5636cc16c3714a139d03d5deeb9e8 GIT binary patch literal 357789 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 z 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 z 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%0Am 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
p;fm4YvA@ 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 literal 0 HcmV?d00001 diff --git a/scripts/tools/binary_elf_size_diff.py b/scripts/tools/binary_elf_size_diff.py new file mode 100755 index 00000000000000..f982f54ed696fa --- /dev/null +++ b/scripts/tools/binary_elf_size_diff.py @@ -0,0 +1,218 @@ +#!/usr/bin/env -S python3 -B +# +# Copyright (c) 2025 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. +# + +# Processes 2 ELF files via `nm` and outputs the +# diferences in size. Example calls: +# +# scripts/tools/bindiff.py \ +# ./out/updated_binary.elf \ +# ./out/master_build.elf +# +# scripts/tools/bindiff.py \ +# --output csv \ +# --no-demangle \ +# ./out/updated_binary.elf \ +# ./out/master_build.elf +# +# +# Requires: +# - click +# - coloredlogs +# - cxxfilt +# - tabulate + +import csv +import logging +import os +import subprocess +import sys +from dataclasses import dataclass +from enum import Enum, auto +from pathlib import Path + +import click +import coloredlogs +import cxxfilt +import tabulate + + +@dataclass +class Symbol: + symbol_type: str + name: str + size: int + + +# Supported log levels, mapping string values required for argument +# parsing into logging constants +__LOG_LEVELS__ = { + "debug": logging.DEBUG, + "info": logging.INFO, + "warn": logging.WARN, + "fatal": logging.FATAL, +} + + +class OutputType(Enum): + TABLE = (auto(),) + CSV = (auto(),) + + +__OUTPUT_TYPES__ = { + "table": OutputType.TABLE, + "csv": OutputType.CSV, +} + + +def get_sizes(p: Path, no_demangle: bool): + output = subprocess.check_output( + ["nm", "--print-size", "--size-sort", "--radix=d", p.as_posix()] + ).decode("utf8") + + result = {} + + for line in output.split("\n"): + if not line.strip(): + continue + + _, size, t, name = line.split(" ") + size = int(size, 10) + + if not no_demangle: + name = cxxfilt.demangle(name) + + result[name] = Symbol(symbol_type=t, name=name, size=size) + + return result + + +def default_cols(): + try: + # if terminal output, try to fit + return os.get_terminal_size().columns - 29 + except Exception: + return 120 + + +@click.command() +@click.option( + "--log-level", + default="INFO", + show_default=True, + type=click.Choice(list(__LOG_LEVELS__.keys()), case_sensitive=False), + help="Determines the verbosity of script output.", +) +@click.option( + "--output", + default="TABLE", + show_default=True, + type=click.Choice(list(__OUTPUT_TYPES__.keys()), case_sensitive=False), + help="Determines the type of the output (use CSV for easier parsing).", +) +@click.option( + "--skip-total", + default=False, + is_flag=True, + help="Skip the output of a TOTAL line (i.e. a sum of all size deltas)" +) +@click.option( + "--no-demangle", + default=False, + is_flag=True, + help="Skip CXX demangling. Note that this will not deduplicate inline method instantiations." +) +@click.option( + "--style", + default="simple", + show_default=True, + help="tablefmt style for table output (e.g.: simple, plain, grid, fancy_grid, pipe, orgtbl, jira, presto, pretty, psql, rst)", +) +@click.option( + "--name-truncate", + default=default_cols(), + show_default=True, + type=int, + help="Truncate function name to this length (for table output only). use <= 10 to disable", +) +@click.argument("f1", type=Path) +@click.argument("f2", type=Path) +def main( + log_level, + output, + skip_total, + no_demangle, + style: str, + name_truncate: int, + f1: Path, + f2: Path, +): + log_fmt = "%(asctime)s %(levelname)-7s %(message)s" + coloredlogs.install(level=__LOG_LEVELS__[log_level], fmt=log_fmt) + + r1 = get_sizes(f1, no_demangle) + r2 = get_sizes(f2, no_demangle) + + output_type = __OUTPUT_TYPES__[output] + + # at this point every key has a size information + # We are interested in sizes that are DIFFERENT (add/remove or changed) + delta = [] + total = 0 + for k in set(r1.keys()) | set(r2.keys()): + if k in r1 and k in r2 and r1[k].size == r2[k].size: + continue + + # At this point the value is in v1 or v2 + s1 = r1[k].size if k in r1 else 0 + s2 = r2[k].size if k in r2 else 0 + name = r1[k].name if k in r1 else r2[k].name + + if k in r1 and k in r2: + change = "CHANGED" + elif k in r1: + change = "ADDED" + else: + change = "REMOVED" + + if ( + output_type == OutputType.TABLE + and name_truncate > 10 + and len(name) > name_truncate + ): + name = name[: name_truncate - 4] + "..." + + delta.append([change, s1 - s2, name]) + total += s1 - s2 + + delta.sort(key=lambda x: x[1]) + if not skip_total: + delta.append(["TOTAL", total, ""]) + + HEADER = ["Type", "Size", "Function"] + + if output_type == OutputType.TABLE: + print(tabulate.tabulate(delta, headers=HEADER, tablefmt=style)) + elif output_type == OutputType.CSV: + writer = csv.writer(sys.stdout) + writer.writerow(HEADER) + writer.writerows(delta) + else: + raise Exception("Unknown output type: %r" % output) + + +if __name__ == "__main__": + main(auto_envvar_prefix="CHIP") From 4f956ecb7a2fc6d0268eb9490cbb656799eee183 Mon Sep 17 00:00:00 2001 From: Alex Tsitsiura Date: Fri, 31 Jan 2025 16:26:22 +0200 Subject: [PATCH 26/36] [Telink] Improve tl321x/tl721x targets & Update compatible builds to docker version 104 (#37188) * riscv: telink: add compile support for tl7218x . - fix retention ram. Signed-off-by: Haiwen Xia * riscv: telink: seperate ram for tl3218x . - use retention mode to seperate ram. - reserve more ram for ilm. Signed-off-by: Haiwen Xia * [Telink] Fix broken GitHub CI after adding tl721x target * [Telink] remove temporary LZMA for tl321x due to bug * [Telink] Add missed clean out build output step * [Telink] remove b95 SoC / TLSR9258a board (replaced by TL721x) * [Telink] Update builds to docker version 104 * [Telink] disable debug part * skip update of QEMU / Tizen * skip update of Tizen & Smoke Run - Android * skip update of Lint Code Base image --------- Signed-off-by: Haiwen Xia Co-authored-by: Haiwen Xia Co-authored-by: haiwentelink <125550736+haiwentelink@users.noreply.github.com> --- .github/workflows/bloat_check.yaml | 2 +- .github/workflows/build.yaml | 10 ++--- .github/workflows/chef.yaml | 10 ++--- .github/workflows/doxygen.yaml | 2 +- .github/workflows/examples-ameba.yaml | 2 +- .github/workflows/examples-asr.yaml | 2 +- .github/workflows/examples-bouffalolab.yaml | 2 +- .github/workflows/examples-cc13xx_26xx.yaml | 2 +- .github/workflows/examples-cc32xx.yaml | 2 +- .github/workflows/examples-efr32.yaml | 2 +- .github/workflows/examples-esp32.yaml | 4 +- .github/workflows/examples-infineon.yaml | 2 +- .github/workflows/examples-linux-arm.yaml | 2 +- .github/workflows/examples-linux-imx.yaml | 2 +- .../workflows/examples-linux-standalone.yaml | 2 +- .../examples-linux-tv-casting-app.yaml | 2 +- .github/workflows/examples-mw320.yaml | 2 +- .github/workflows/examples-nrfconnect.yaml | 2 +- .github/workflows/examples-nuttx.yaml | 2 +- .github/workflows/examples-nxp.yaml | 4 +- .github/workflows/examples-openiotsdk.yaml | 2 +- .github/workflows/examples-qpg.yaml | 2 +- .github/workflows/examples-stm32.yaml | 2 +- .github/workflows/examples-telink.yaml | 41 ++++++++++++------- .github/workflows/full-android.yaml | 2 +- .github/workflows/fuzzing-build.yaml | 2 +- .github/workflows/java-tests.yaml | 2 +- .github/workflows/minimal-build.yaml | 4 +- .github/workflows/qemu.yaml | 2 +- .github/workflows/release_artifacts.yaml | 4 +- .github/workflows/tests.yaml | 4 +- .github/workflows/unit_integration_test.yaml | 2 +- .github/workflows/zap_regeneration.yaml | 2 +- .github/workflows/zap_templates.yaml | 2 +- config/telink/chip-module/Kconfig.defaults | 16 +++++++- .../air-quality-sensor-app/telink/README.md | 1 - examples/all-clusters-app/ameba/README.md | 4 +- examples/all-clusters-app/telink/README.md | 1 - .../all-clusters-minimal-app/ameba/README.md | 4 +- .../all-clusters-minimal-app/telink/README.md | 1 - examples/bridge-app/telink/README.md | 1 - examples/contact-sensor-app/telink/README.md | 1 - examples/fabric-admin/README.md | 4 +- examples/fabric-bridge-app/linux/README.md | 4 +- examples/fabric-sync/README.md | 4 +- examples/light-switch-app/ameba/README.md | 4 +- examples/light-switch-app/telink/README.md | 1 - examples/lighting-app/ameba/README.md | 4 +- examples/lighting-app/telink/README.md | 1 - examples/lock-app/telink/README.md | 1 - examples/ota-requestor-app/ameba/README.md | 4 +- examples/ota-requestor-app/telink/README.md | 1 - examples/pigweed-app/ameba/README.md | 4 +- examples/pump-app/telink/README.md | 1 - examples/pump-controller-app/telink/README.md | 1 - examples/shell/telink/README.md | 1 - examples/smoke-co-alarm-app/telink/README.md | 1 - .../telink/README.md | 1 - examples/thermostat/telink/README.md | 1 - examples/window-app/telink/README.md | 1 - integrations/cloudbuild/chef.yaml | 8 ++-- integrations/cloudbuild/smoke-test.yaml | 14 +++---- scripts/build/build/targets.py | 3 +- scripts/build/builders/telink.py | 9 ++-- .../build/testdata/all_targets_linux_x64.txt | 2 +- .../telink/tlsr9258a_2m_flash.overlay | 35 ---------------- .../telink/tlsr9258a_retention.overlay | 24 ----------- 67 files changed, 121 insertions(+), 175 deletions(-) delete mode 100644 src/platform/telink/tlsr9258a_2m_flash.overlay delete mode 100644 src/platform/telink/tlsr9258a_retention.overlay diff --git a/.github/workflows/bloat_check.yaml b/.github/workflows/bloat_check.yaml index 6ac96aebb7ed4c..a49cfbd58fa686 100644 --- a/.github/workflows/bloat_check.yaml +++ b/.github/workflows/bloat_check.yaml @@ -34,7 +34,7 @@ jobs: runs-on: ubuntu-latest container: - image: ghcr.io/project-chip/chip-build:98 + image: ghcr.io/project-chip/chip-build:104 steps: - name: Checkout diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 895e7260d1ba8a..bcccb51a49f8c9 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -43,7 +43,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build:98 + image: ghcr.io/project-chip/chip-build:104 volumes: - "/:/runner-root-volume" - "/tmp/log_output:/tmp/test_logs" @@ -139,7 +139,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build:98 + image: ghcr.io/project-chip/chip-build:104 volumes: - "/:/runner-root-volume" - "/tmp/log_output:/tmp/test_logs" @@ -308,7 +308,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build:98 + image: ghcr.io/project-chip/chip-build:104 volumes: - "/:/runner-root-volume" - "/tmp/log_output:/tmp/test_logs" @@ -373,7 +373,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build:98 + image: ghcr.io/project-chip/chip-build:104 volumes: - "/:/runner-root-volume" - "/tmp/log_output:/tmp/test_logs" @@ -492,7 +492,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build:98 + image: ghcr.io/project-chip/chip-build:104 volumes: - "/:/runner-root-volume" - "/tmp/log_output:/tmp/test_logs" diff --git a/.github/workflows/chef.yaml b/.github/workflows/chef.yaml index e6bcb180748cb3..b80aad17e2f7f2 100644 --- a/.github/workflows/chef.yaml +++ b/.github/workflows/chef.yaml @@ -36,7 +36,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build:98 + image: ghcr.io/project-chip/chip-build:104 options: --user root steps: @@ -57,7 +57,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-esp32:98 + image: ghcr.io/project-chip/chip-build-esp32:104 options: --user root steps: @@ -78,7 +78,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-nrf-platform:98 + image: ghcr.io/project-chip/chip-build-nrf-platform:104 options: --user root steps: @@ -99,7 +99,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-telink:98 + image: ghcr.io/project-chip/chip-build-telink:104 options: --user root steps: @@ -111,7 +111,7 @@ jobs: platform: telink # - name: Update Zephyr to specific revision (for developers purpose) # shell: bash - # run: scripts/run_in_build_env.sh "python3 scripts/tools/telink/update_zephyr.py c05c461b1119782cc839cf436fa04ec5e1fb2c8c" + # run: scripts/run_in_build_env.sh "python3 scripts/tools/telink/update_zephyr.py 52c23bb5bfa7b08fb2499fda8c34cbd3418e0c1d" - name: CI Examples Telink shell: bash run: | diff --git a/.github/workflows/doxygen.yaml b/.github/workflows/doxygen.yaml index 9cc5751ab310d3..21c0d452c1f7f9 100644 --- a/.github/workflows/doxygen.yaml +++ b/.github/workflows/doxygen.yaml @@ -84,7 +84,7 @@ jobs: runs-on: ubuntu-latest container: - image: ghcr.io/project-chip/chip-build-doxygen:98 + image: ghcr.io/project-chip/chip-build-doxygen:104 if: github.actor != 'restyled-io[bot]' diff --git a/.github/workflows/examples-ameba.yaml b/.github/workflows/examples-ameba.yaml index 121610d215123e..6bb87fd97257bb 100644 --- a/.github/workflows/examples-ameba.yaml +++ b/.github/workflows/examples-ameba.yaml @@ -39,7 +39,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-ameba:98 + image: ghcr.io/project-chip/chip-build-ameba:104 options: --user root steps: diff --git a/.github/workflows/examples-asr.yaml b/.github/workflows/examples-asr.yaml index 5302926ed7fc97..a753d338c4c212 100644 --- a/.github/workflows/examples-asr.yaml +++ b/.github/workflows/examples-asr.yaml @@ -37,7 +37,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-asr:98 + image: ghcr.io/project-chip/chip-build-asr:104 options: --user root steps: diff --git a/.github/workflows/examples-bouffalolab.yaml b/.github/workflows/examples-bouffalolab.yaml index 6fcb047e98e3ec..2d1ec2d7a2cd2c 100644 --- a/.github/workflows/examples-bouffalolab.yaml +++ b/.github/workflows/examples-bouffalolab.yaml @@ -38,7 +38,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-bouffalolab:98 + image: ghcr.io/project-chip/chip-build-bouffalolab:104 volumes: - "/tmp/bloat_reports:/tmp/bloat_reports" steps: diff --git a/.github/workflows/examples-cc13xx_26xx.yaml b/.github/workflows/examples-cc13xx_26xx.yaml index b879eb5025bdb5..35bdccbe274475 100644 --- a/.github/workflows/examples-cc13xx_26xx.yaml +++ b/.github/workflows/examples-cc13xx_26xx.yaml @@ -42,7 +42,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-ti:98 + image: ghcr.io/project-chip/chip-build-ti:104 volumes: - "/tmp/bloat_reports:/tmp/bloat_reports" steps: diff --git a/.github/workflows/examples-cc32xx.yaml b/.github/workflows/examples-cc32xx.yaml index 5516d4374641a7..cb874238157362 100644 --- a/.github/workflows/examples-cc32xx.yaml +++ b/.github/workflows/examples-cc32xx.yaml @@ -41,7 +41,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-ti:98 + image: ghcr.io/project-chip/chip-build-ti:104 volumes: - "/tmp/bloat_reports:/tmp/bloat_reports" steps: diff --git a/.github/workflows/examples-efr32.yaml b/.github/workflows/examples-efr32.yaml index c1b8253b336f24..855be84ced625f 100644 --- a/.github/workflows/examples-efr32.yaml +++ b/.github/workflows/examples-efr32.yaml @@ -41,7 +41,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-efr32:98 + image: ghcr.io/project-chip/chip-build-efr32:104 volumes: - "/tmp/bloat_reports:/tmp/bloat_reports" steps: diff --git a/.github/workflows/examples-esp32.yaml b/.github/workflows/examples-esp32.yaml index 09f7141f340edd..b65df551436f92 100644 --- a/.github/workflows/examples-esp32.yaml +++ b/.github/workflows/examples-esp32.yaml @@ -37,7 +37,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-esp32:98 + image: ghcr.io/project-chip/chip-build-esp32:104 volumes: - "/tmp/bloat_reports:/tmp/bloat_reports" @@ -132,7 +132,7 @@ jobs: if: github.actor != 'restyled-io[bot]' && github.repository_owner == 'espressif' container: - image: ghcr.io/project-chip/chip-build-esp32:98 + image: ghcr.io/project-chip/chip-build-esp32:104 volumes: - "/tmp/bloat_reports:/tmp/bloat_reports" diff --git a/.github/workflows/examples-infineon.yaml b/.github/workflows/examples-infineon.yaml index 52bc9f9752340a..4cf54ff65960f7 100644 --- a/.github/workflows/examples-infineon.yaml +++ b/.github/workflows/examples-infineon.yaml @@ -38,7 +38,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-infineon:98 + image: ghcr.io/project-chip/chip-build-infineon:104 env: # TODO: this should probably be part of the dockerfile itself CY_TOOLS_PATHS: /opt/Tools/ModusToolbox/tools_3.2 diff --git a/.github/workflows/examples-linux-arm.yaml b/.github/workflows/examples-linux-arm.yaml index 0edd77681284de..7c576dd68cd993 100644 --- a/.github/workflows/examples-linux-arm.yaml +++ b/.github/workflows/examples-linux-arm.yaml @@ -37,7 +37,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-crosscompile:98 + image: ghcr.io/project-chip/chip-build-crosscompile:104 volumes: - "/tmp/bloat_reports:/tmp/bloat_reports" diff --git a/.github/workflows/examples-linux-imx.yaml b/.github/workflows/examples-linux-imx.yaml index a43aadee9dfac9..72458c39656c2e 100644 --- a/.github/workflows/examples-linux-imx.yaml +++ b/.github/workflows/examples-linux-imx.yaml @@ -37,7 +37,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-imx:98 + image: ghcr.io/project-chip/chip-build-imx:104 steps: - name: Checkout diff --git a/.github/workflows/examples-linux-standalone.yaml b/.github/workflows/examples-linux-standalone.yaml index 021640438b22a3..0e5a6d3e6ef876 100644 --- a/.github/workflows/examples-linux-standalone.yaml +++ b/.github/workflows/examples-linux-standalone.yaml @@ -37,7 +37,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build:98 + image: ghcr.io/project-chip/chip-build:104 volumes: - "/tmp/bloat_reports:/tmp/bloat_reports" diff --git a/.github/workflows/examples-linux-tv-casting-app.yaml b/.github/workflows/examples-linux-tv-casting-app.yaml index 85ca839cb85651..392f7aadb440be 100644 --- a/.github/workflows/examples-linux-tv-casting-app.yaml +++ b/.github/workflows/examples-linux-tv-casting-app.yaml @@ -37,7 +37,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build:98 + image: ghcr.io/project-chip/chip-build:104 steps: - name: Checkout diff --git a/.github/workflows/examples-mw320.yaml b/.github/workflows/examples-mw320.yaml index 9cec1c6f94d783..1b745f9ce6cd3c 100644 --- a/.github/workflows/examples-mw320.yaml +++ b/.github/workflows/examples-mw320.yaml @@ -40,7 +40,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build:98 + image: ghcr.io/project-chip/chip-build:104 volumes: - "/tmp/bloat_reports:/tmp/bloat_reports" steps: diff --git a/.github/workflows/examples-nrfconnect.yaml b/.github/workflows/examples-nrfconnect.yaml index 97034e77f3aa57..34701f965c895c 100644 --- a/.github/workflows/examples-nrfconnect.yaml +++ b/.github/workflows/examples-nrfconnect.yaml @@ -40,7 +40,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-nrf-platform:98 + image: ghcr.io/project-chip/chip-build-nrf-platform:104 volumes: - "/tmp/bloat_reports:/tmp/bloat_reports" diff --git a/.github/workflows/examples-nuttx.yaml b/.github/workflows/examples-nuttx.yaml index 6fa6500abbf4fd..f32610349e11f2 100644 --- a/.github/workflows/examples-nuttx.yaml +++ b/.github/workflows/examples-nuttx.yaml @@ -38,7 +38,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-nuttx:98 + image: ghcr.io/project-chip/chip-build-nuttx:104 volumes: - "/tmp/bloat_reports:/tmp/bloat_reports" steps: diff --git a/.github/workflows/examples-nxp.yaml b/.github/workflows/examples-nxp.yaml index 870de18bda3a1a..adfeb2196e03ce 100644 --- a/.github/workflows/examples-nxp.yaml +++ b/.github/workflows/examples-nxp.yaml @@ -40,7 +40,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-nxp:98 + image: ghcr.io/project-chip/chip-build-nxp:104 volumes: - "/tmp/bloat_reports:/tmp/bloat_reports" steps: @@ -239,7 +239,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-nxp-zephyr:98 + image: ghcr.io/project-chip/chip-build-nxp-zephyr:104 steps: - name: Checkout diff --git a/.github/workflows/examples-openiotsdk.yaml b/.github/workflows/examples-openiotsdk.yaml index a392c00720d698..d0a0a46d79463b 100644 --- a/.github/workflows/examples-openiotsdk.yaml +++ b/.github/workflows/examples-openiotsdk.yaml @@ -36,7 +36,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-openiotsdk:98 + image: ghcr.io/project-chip/chip-build-openiotsdk:104 volumes: - "/tmp/bloat_reports:/tmp/bloat_reports" options: --privileged diff --git a/.github/workflows/examples-qpg.yaml b/.github/workflows/examples-qpg.yaml index 630e81eb8d2a86..adfd33920c5a30 100644 --- a/.github/workflows/examples-qpg.yaml +++ b/.github/workflows/examples-qpg.yaml @@ -40,7 +40,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build:98 + image: ghcr.io/project-chip/chip-build:104 volumes: - "/tmp/bloat_reports:/tmp/bloat_reports" steps: diff --git a/.github/workflows/examples-stm32.yaml b/.github/workflows/examples-stm32.yaml index 2682fc6ef3b915..387d6bba6e2307 100644 --- a/.github/workflows/examples-stm32.yaml +++ b/.github/workflows/examples-stm32.yaml @@ -41,7 +41,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build:98 + image: ghcr.io/project-chip/chip-build:104 volumes: - "/tmp/bloat_reports:/tmp/bloat_reports" steps: diff --git a/.github/workflows/examples-telink.yaml b/.github/workflows/examples-telink.yaml index 95fdb770933d07..22905124813572 100644 --- a/.github/workflows/examples-telink.yaml +++ b/.github/workflows/examples-telink.yaml @@ -39,7 +39,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-telink:98 + image: ghcr.io/project-chip/chip-build-telink:104 volumes: - "/tmp/bloat_reports:/tmp/bloat_reports" @@ -58,7 +58,7 @@ jobs: gh-context: ${{ toJson(github) }} # - name: Update Zephyr to specific revision (for developers purpose) - # run: scripts/run_in_build_env.sh "python3 scripts/tools/telink/update_zephyr.py c05c461b1119782cc839cf436fa04ec5e1fb2c8c" + # run: scripts/run_in_build_env.sh "python3 scripts/tools/telink/update_zephyr.py 52c23bb5bfa7b08fb2499fda8c34cbd3418e0c1d" - name: Build example Telink (B92 retention) Air Quality Sensor App # Run test for master and s07641069 PRs @@ -103,14 +103,14 @@ jobs: - name: clean out build output run: rm -rf ./out - - name: Build example Telink (B95) Bridge App + - name: Build example Telink (tl721x) Bridge App # Run test for master and all PRs run: | ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py --target 'telink-tlsr9258a-bridge' build" + "./scripts/build/build_examples.py --target 'telink-tl7218x-bridge' build" .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - telink tlsr9258a bridge-app \ - out/telink-tlsr9258a-bridge/zephyr/zephyr.elf \ + telink tl7218x bridge-app \ + out/telink-tl7218x-bridge/zephyr/zephyr.elf \ /tmp/bloat_reports/ - name: clean out build output @@ -167,14 +167,14 @@ jobs: - name: clean out build output (keep tools) run: rm -rf ./out/telink* - - name: Build example Telink (tl321x) Lighting App with OTA (LZMA), Shell, Factory Data + - name: Build example Telink (tl321x) Lighting App with OTA, Shell, Factory Data # Run test for master and all PRs run: | ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py --target 'telink-tl3218x-light-ota-compress-lzma-shell-factory-data' build" + "./scripts/build/build_examples.py --target 'telink-tl3218x-light-ota-shell-factory-data' build" .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - telink tl3218x light-app-ota-compress-lzma-shell-factory-data \ - out/telink-tl3218x-light-ota-compress-lzma-shell-factory-data/zephyr/zephyr.elf \ + telink tl3218x light-app-ota-shell-factory-data \ + out/telink-tl3218x-light-ota-shell-factory-data/zephyr/zephyr.elf \ /tmp/bloat_reports/ - name: clean out build output (keep tools) @@ -193,6 +193,19 @@ jobs: - name: clean out build output (keep tools) run: rm -rf ./out/telink* + - name: Build example Telink (tl721x retention) Light Switch App with OTA (LZMA), Factory Data + # Run test for master and all PRs + run: | + ./scripts/run_in_build_env.sh \ + "./scripts/build/build_examples.py --target 'telink-tl7218x_retention-light-switch-ota-compress-lzma-factory-data' build" + .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ + telink tl7218x_retention light-switch-app-ota-compress-lzma-factory-data \ + out/telink-tl7218x_retention-light-switch-ota-compress-lzma-factory-data/zephyr/zephyr.elf \ + /tmp/bloat_reports/ + + - name: clean out build output (keep tools) + run: rm -rf ./out/telink* + - name: Build example Telink (B92) Light Switch App with OTA (LZMA), Shell, Factory Data # Run test for master and all PRs run: | @@ -220,15 +233,15 @@ jobs: - name: clean out build output run: rm -rf ./out - - name: Build example Telink (B95) OTA Requestor App + - name: Build example Telink (tl321x) OTA Requestor App # Run test for master and s07641069 PRs if: github.event.pull_request.number == null || github.event.pull_request.head.repo.full_name == 's07641069/connectedhomeip' run: | ./scripts/run_in_build_env.sh \ - "./scripts/build/build_examples.py --target 'telink-tlsr9258a-ota-requestor' build" + "./scripts/build/build_examples.py --target 'telink-tl3218x-ota-requestor' build" .environment/pigweed-venv/bin/python3 scripts/tools/memory/gh_sizes.py \ - telink tlsr9258a ota-requestor-app \ - out/telink-tlsr9258a-ota-requestor/zephyr/zephyr.elf \ + telink tl3218x ota-requestor-app \ + out/telink-tl3218x-ota-requestor/zephyr/zephyr.elf \ /tmp/bloat_reports/ - name: clean out build output diff --git a/.github/workflows/full-android.yaml b/.github/workflows/full-android.yaml index 0e116e8062b03a..e8ac6d90469f55 100644 --- a/.github/workflows/full-android.yaml +++ b/.github/workflows/full-android.yaml @@ -39,7 +39,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build-android:98 + image: ghcr.io/project-chip/chip-build-android:104 volumes: - "/tmp/log_output:/tmp/test_logs" diff --git a/.github/workflows/fuzzing-build.yaml b/.github/workflows/fuzzing-build.yaml index 5bc8c6c6f01cc1..8a1ffbc248bb3a 100644 --- a/.github/workflows/fuzzing-build.yaml +++ b/.github/workflows/fuzzing-build.yaml @@ -33,7 +33,7 @@ jobs: if: github.actor != 'restyled-io[bot]' container: - image: ghcr.io/project-chip/chip-build:98 + image: ghcr.io/project-chip/chip-build:104 volumes: - "/tmp/log_output:/tmp/test_logs" diff --git a/.github/workflows/java-tests.yaml b/.github/workflows/java-tests.yaml index 87122ced0e47d3..ad95d3dec7ad03 100644 --- a/.github/workflows/java-tests.yaml +++ b/.github/workflows/java-tests.yaml @@ -43,7 +43,7 @@ jobs: runs-on: ubuntu-latest container: - image: ghcr.io/project-chip/chip-build-java:98 + image: ghcr.io/project-chip/chip-build-java:104 options: --privileged --sysctl "net.ipv6.conf.all.disable_ipv6=0 net.ipv4.conf.all.forwarding=0 net.ipv6.conf.all.forwarding=0" diff --git a/.github/workflows/minimal-build.yaml b/.github/workflows/minimal-build.yaml index fa9bff4a0735a3..c921662e1b4bc3 100644 --- a/.github/workflows/minimal-build.yaml +++ b/.github/workflows/minimal-build.yaml @@ -34,7 +34,7 @@ jobs: runs-on: ubuntu-latest container: - image: ghcr.io/project-chip/chip-build-minimal:98 + image: ghcr.io/project-chip/chip-build-minimal:104 steps: - name: Checkout @@ -56,7 +56,7 @@ jobs: runs-on: ubuntu-latest container: - image: ghcr.io/project-chip/chip-build-minimal:98 + image: ghcr.io/project-chip/chip-build-minimal:104 steps: - name: Checkout diff --git a/.github/workflows/qemu.yaml b/.github/workflows/qemu.yaml index c498eb9016cab4..8624b06bbd5c11 100644 --- a/.github/workflows/qemu.yaml +++ b/.github/workflows/qemu.yaml @@ -41,7 +41,7 @@ jobs: if: github.actor != 'restyled-io[bot]' && github.repository_owner == 'espressif' container: - image: ghcr.io/project-chip/chip-build-esp32-qemu:98 + image: ghcr.io/project-chip/chip-build-esp32-qemu:104 volumes: - "/tmp/log_output:/tmp/test_logs" diff --git a/.github/workflows/release_artifacts.yaml b/.github/workflows/release_artifacts.yaml index c513764852d1a4..bfa311bf17f7e0 100644 --- a/.github/workflows/release_artifacts.yaml +++ b/.github/workflows/release_artifacts.yaml @@ -32,7 +32,7 @@ jobs: runs-on: ubuntu-latest container: - image: ghcr.io/project-chip/chip-build-esp32:98 + image: ghcr.io/project-chip/chip-build-esp32:104 steps: - name: Checkout @@ -64,7 +64,7 @@ jobs: runs-on: ubuntu-latest container: - image: ghcr.io/project-chip/chip-build-efr32:98 + image: ghcr.io/project-chip/chip-build-efr32:104 steps: - name: Checkout uses: actions/checkout@v4 diff --git a/.github/workflows/tests.yaml b/.github/workflows/tests.yaml index 7b5286ebefa7c3..0c162c5a9aed71 100644 --- a/.github/workflows/tests.yaml +++ b/.github/workflows/tests.yaml @@ -50,7 +50,7 @@ jobs: runs-on: ubuntu-latest container: - image: ghcr.io/project-chip/chip-build:98 + image: ghcr.io/project-chip/chip-build:104 options: --privileged --sysctl "net.ipv6.conf.all.disable_ipv6=0 net.ipv4.conf.all.forwarding=1 net.ipv6.conf.all.forwarding=1" @@ -461,7 +461,7 @@ jobs: runs-on: ubuntu-latest container: - image: ghcr.io/project-chip/chip-build:98 + image: ghcr.io/project-chip/chip-build:104 options: --privileged --sysctl "net.ipv6.conf.all.disable_ipv6=0 net.ipv4.conf.all.forwarding=0 net.ipv6.conf.all.forwarding=0" diff --git a/.github/workflows/unit_integration_test.yaml b/.github/workflows/unit_integration_test.yaml index 8a24ae45728ad8..0b0860afe7f995 100644 --- a/.github/workflows/unit_integration_test.yaml +++ b/.github/workflows/unit_integration_test.yaml @@ -40,7 +40,7 @@ jobs: runs-on: ubuntu-latest container: - image: ghcr.io/project-chip/chip-build:98 + image: ghcr.io/project-chip/chip-build:104 volumes: - "/:/runner-root-volume" - "/tmp/log_output:/tmp/test_logs" diff --git a/.github/workflows/zap_regeneration.yaml b/.github/workflows/zap_regeneration.yaml index 9baec065c4fde7..d899b05b8a7cb8 100644 --- a/.github/workflows/zap_regeneration.yaml +++ b/.github/workflows/zap_regeneration.yaml @@ -30,7 +30,7 @@ jobs: runs-on: ubuntu-20.04 container: - image: ghcr.io/project-chip/chip-build:98 + image: ghcr.io/project-chip/chip-build:104 defaults: run: shell: sh diff --git a/.github/workflows/zap_templates.yaml b/.github/workflows/zap_templates.yaml index 51752e3fac8f0d..f03aa04605b2af 100644 --- a/.github/workflows/zap_templates.yaml +++ b/.github/workflows/zap_templates.yaml @@ -35,7 +35,7 @@ jobs: runs-on: ubuntu-20.04 container: - image: ghcr.io/project-chip/chip-build:98 + image: ghcr.io/project-chip/chip-build:104 defaults: run: shell: sh diff --git a/config/telink/chip-module/Kconfig.defaults b/config/telink/chip-module/Kconfig.defaults index e50aa413b90fa6..baafafa38a525d 100644 --- a/config/telink/chip-module/Kconfig.defaults +++ b/config/telink/chip-module/Kconfig.defaults @@ -206,7 +206,7 @@ endif # BT # Cut down the ram cost by matter's change,it can keep ramcode (driver). # No need load the ramcode every time in thread mode (retention mode). # If the ram is not enough , can change it back , initial setting is n. -if BOARD_TLSR9528A_RETENTION || BOARD_TLSR9258A_RETENTION || BOARD_TLSR9518ADK80D_RETENTION +if BOARD_TLSR9528A_RETENTION || BOARD_TLSR9518ADK80D_RETENTION config SOC_SERIES_RISCV_TELINK_B9X_NON_RETENTION_RAM_CODE default n if PM @@ -218,9 +218,21 @@ config PWM endif +if BOARD_TL7218X_RETENTION || BOARD_TL3218X_RETENTION || BOARD_TL3218X +config SOC_SERIES_RISCV_TELINK_TLX_NON_RETENTION_RAM_CODE + default n if PM + +config TELINK_TLX_MATTER_RETENTION_LAYOUT + default y if PM || BOARD_TL3218X + +config PWM + default n if PM + +endif + # Board non-retention config if BOARD_TLSR9118BDK40D || BOARD_TLSR9118BDK40D_V1 || \ - BOARD_TLSR9528A || BOARD_TLSR9258A || BOARD_TLSR9518ADK80D || BOARD_TL3218X || BOARD_TL7218X + BOARD_TLSR9528A || BOARD_TLSR9518ADK80D || BOARD_TL3218X || BOARD_TL7218X config PWM default y endif diff --git a/examples/air-quality-sensor-app/telink/README.md b/examples/air-quality-sensor-app/telink/README.md index c3d403f450ee45..8d8a9132be5a9f 100644 --- a/examples/air-quality-sensor-app/telink/README.md +++ b/examples/air-quality-sensor-app/telink/README.md @@ -12,7 +12,6 @@ The example supports building and running on the following devices: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | | [B91](https://wiki.telink-semi.cn/wiki/Hardware/B91_Generic_Starter_Kit_Hardware_Guide) [TLSR9518ADK80D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR951x-Series) | `tlsr9518adk80d`, `tlsr9518adk80d-mars`, `tlsr9518adk80d-usb` | [TLSR9518ADK80D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9518adk80d/doc/index.rst) | | [B92](https://wiki.telink-semi.cn/wiki/Hardware/B92_Generic_Starter_Kit_Hardware_Guide) [TLSR9528A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR952x-Series) | `tlsr9528a`, `tlsr9528a_retention` | [TLSR9528A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9528a/doc/index.rst) | -| [B95](https://wiki.telink-semi.cn/wiki/Hardware/B95_Generic_Starter_Kit_Hardware_Guide) [TLSR9258A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR925x-Series) | `tlsr9258a` | [TLSR9258A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9258a/doc/index.rst) | | [W91](https://wiki.telink-semi.cn/wiki/Hardware/W91_Generic_Starter_Kit_Hardware_Guide) [TLSR9118BDK40D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR911x-Series) | `tlsr9118bdk40d` | [TLSR9118BDK40D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9118bdk40d/doc/index.rst) | ## Build and flash diff --git a/examples/all-clusters-app/ameba/README.md b/examples/all-clusters-app/ameba/README.md index cfe8e68f69202f..d00ff787640d1a 100644 --- a/examples/all-clusters-app/ameba/README.md +++ b/examples/all-clusters-app/ameba/README.md @@ -27,11 +27,11 @@ The CHIP demo application is supported on - Pull docker image: - $ docker pull ghcr.io/project-chip/chip-build-ameba:97 + $ docker pull ghcr.io/project-chip/chip-build-ameba:104 - Run docker container: - $ docker run -it -v ${CHIP_DIR}:/root/chip ghcr.io/project-chip/chip-build-ameba:97 + $ docker run -it -v ${CHIP_DIR}:/root/chip ghcr.io/project-chip/chip-build-ameba:104 - Setup build environment: diff --git a/examples/all-clusters-app/telink/README.md b/examples/all-clusters-app/telink/README.md index b702fd6e3567db..b4f746d388afdd 100644 --- a/examples/all-clusters-app/telink/README.md +++ b/examples/all-clusters-app/telink/README.md @@ -14,7 +14,6 @@ The example supports building and running on the following devices: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | | [B91](https://wiki.telink-semi.cn/wiki/Hardware/B91_Generic_Starter_Kit_Hardware_Guide) [TLSR9518ADK80D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR951x-Series) | `tlsr9518adk80d`, `tlsr9518adk80d-mars`, `tlsr9518adk80d-usb` | [TLSR9518ADK80D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9518adk80d/doc/index.rst) | | [B92](https://wiki.telink-semi.cn/wiki/Hardware/B92_Generic_Starter_Kit_Hardware_Guide) [TLSR9528A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR952x-Series) | `tlsr9528a`, `tlsr9528a_retention` | [TLSR9528A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9528a/doc/index.rst) | -| [B95](https://wiki.telink-semi.cn/wiki/Hardware/B95_Generic_Starter_Kit_Hardware_Guide) [TLSR9258A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR925x-Series) | `tlsr9258a` | [TLSR9258A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9258a/doc/index.rst) | | [W91](https://wiki.telink-semi.cn/wiki/Hardware/W91_Generic_Starter_Kit_Hardware_Guide) [TLSR9118BDK40D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR911x-Series) | `tlsr9118bdk40d` | [TLSR9118BDK40D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9118bdk40d/doc/index.rst) | ## Build and flash diff --git a/examples/all-clusters-minimal-app/ameba/README.md b/examples/all-clusters-minimal-app/ameba/README.md index 731168b86a60c9..e57074ae1621ec 100644 --- a/examples/all-clusters-minimal-app/ameba/README.md +++ b/examples/all-clusters-minimal-app/ameba/README.md @@ -27,13 +27,13 @@ The CHIP demo application is supported on - Pull docker image: ``` - $ docker pull ghcr.io/project-chip/chip-build-ameba:97 + $ docker pull ghcr.io/project-chip/chip-build-ameba:104 ``` - Run docker container: ``` - $ docker run -it -v ${CHIP_DIR}:/root/chip ghcr.io/project-chip/chip-build-ameba:97 + $ docker run -it -v ${CHIP_DIR}:/root/chip ghcr.io/project-chip/chip-build-ameba:104 ``` - Setup build environment: diff --git a/examples/all-clusters-minimal-app/telink/README.md b/examples/all-clusters-minimal-app/telink/README.md index 33ad1fb6cf9f8d..add462a22d9ebf 100644 --- a/examples/all-clusters-minimal-app/telink/README.md +++ b/examples/all-clusters-minimal-app/telink/README.md @@ -14,7 +14,6 @@ The example supports building and running on the following devices: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | | [B91](https://wiki.telink-semi.cn/wiki/Hardware/B91_Generic_Starter_Kit_Hardware_Guide) [TLSR9518ADK80D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR951x-Series) | `tlsr9518adk80d`, `tlsr9518adk80d-mars`, `tlsr9518adk80d-usb` | [TLSR9518ADK80D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9518adk80d/doc/index.rst) | | [B92](https://wiki.telink-semi.cn/wiki/Hardware/B92_Generic_Starter_Kit_Hardware_Guide) [TLSR9528A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR952x-Series) | `tlsr9528a`, `tlsr9528a_retention` | [TLSR9528A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9528a/doc/index.rst) | -| [B95](https://wiki.telink-semi.cn/wiki/Hardware/B95_Generic_Starter_Kit_Hardware_Guide) [TLSR9258A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR925x-Series) | `tlsr9258a` | [TLSR9258A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9258a/doc/index.rst) | | [W91](https://wiki.telink-semi.cn/wiki/Hardware/W91_Generic_Starter_Kit_Hardware_Guide) [TLSR9118BDK40D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR911x-Series) | `tlsr9118bdk40d` | [TLSR9118BDK40D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9118bdk40d/doc/index.rst) | ## Build and flash diff --git a/examples/bridge-app/telink/README.md b/examples/bridge-app/telink/README.md index 00b050e93c945e..844493241d1a12 100644 --- a/examples/bridge-app/telink/README.md +++ b/examples/bridge-app/telink/README.md @@ -91,7 +91,6 @@ The example supports building and running on the following devices: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | | [B91](https://wiki.telink-semi.cn/wiki/Hardware/B91_Generic_Starter_Kit_Hardware_Guide) [TLSR9518ADK80D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR951x-Series) | `tlsr9518adk80d`, `tlsr9518adk80d-mars`, `tlsr9518adk80d-usb` | [TLSR9518ADK80D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9518adk80d/doc/index.rst) | | [B92](https://wiki.telink-semi.cn/wiki/Hardware/B92_Generic_Starter_Kit_Hardware_Guide) [TLSR9528A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR952x-Series) | `tlsr9528a`, `tlsr9528a_retention` | [TLSR9528A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9528a/doc/index.rst) | -| [B95](https://wiki.telink-semi.cn/wiki/Hardware/B95_Generic_Starter_Kit_Hardware_Guide) [TLSR9258A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR925x-Series) | `tlsr9258a` | [TLSR9258A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9258a/doc/index.rst) | | [W91](https://wiki.telink-semi.cn/wiki/Hardware/W91_Generic_Starter_Kit_Hardware_Guide) [TLSR9118BDK40D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR911x-Series) | `tlsr9118bdk40d` | [TLSR9118BDK40D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9118bdk40d/doc/index.rst) | ## Build and flash diff --git a/examples/contact-sensor-app/telink/README.md b/examples/contact-sensor-app/telink/README.md index 27d5721953c261..12306f01e5b637 100755 --- a/examples/contact-sensor-app/telink/README.md +++ b/examples/contact-sensor-app/telink/README.md @@ -12,7 +12,6 @@ The example supports building and running on the following devices: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | | [B91](https://wiki.telink-semi.cn/wiki/Hardware/B91_Generic_Starter_Kit_Hardware_Guide) [TLSR9518ADK80D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR951x-Series) | `tlsr9518adk80d`, `tlsr9518adk80d-mars`, `tlsr9518adk80d-usb` | [TLSR9518ADK80D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9518adk80d/doc/index.rst) | | [B92](https://wiki.telink-semi.cn/wiki/Hardware/B92_Generic_Starter_Kit_Hardware_Guide) [TLSR9528A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR952x-Series) | `tlsr9528a`, `tlsr9528a_retention` | [TLSR9528A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9528a/doc/index.rst) | -| [B95](https://wiki.telink-semi.cn/wiki/Hardware/B95_Generic_Starter_Kit_Hardware_Guide) [TLSR9258A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR925x-Series) | `tlsr9258a` | [TLSR9258A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9258a/doc/index.rst) | | [W91](https://wiki.telink-semi.cn/wiki/Hardware/W91_Generic_Starter_Kit_Hardware_Guide) [TLSR9118BDK40D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR911x-Series) | `tlsr9118bdk40d` | [TLSR9118BDK40D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9118bdk40d/doc/index.rst) | ## Build and flash diff --git a/examples/fabric-admin/README.md b/examples/fabric-admin/README.md index 93ad5e3dd0a259..600d50cd5a4ffa 100644 --- a/examples/fabric-admin/README.md +++ b/examples/fabric-admin/README.md @@ -23,13 +23,13 @@ For Raspberry Pi 4 example: ### Pull Docker Images ``` -docker pull ghcr.io/project-chip/chip-build-crosscompile:97 +docker pull ghcr.io/project-chip/chip-build-crosscompile:104 ``` ### Run docker ``` -docker run -it -v ~/connectedhomeip:/var/connectedhomeip ghcr.io/project-chip/chip-build-crosscompile:97 /bin/bash +docker run -it -v ~/connectedhomeip:/var/connectedhomeip ghcr.io/project-chip/chip-build-crosscompile:104 /bin/bash ``` ### Build diff --git a/examples/fabric-bridge-app/linux/README.md b/examples/fabric-bridge-app/linux/README.md index e7b4c02923c84e..20889041007b97 100644 --- a/examples/fabric-bridge-app/linux/README.md +++ b/examples/fabric-bridge-app/linux/README.md @@ -100,13 +100,13 @@ defined: Pull Docker Images ``` - docker pull ghcr.io/project-chip/chip-build-crosscompile:97 + docker pull ghcr.io/project-chip/chip-build-crosscompile:104 ``` Run docker ``` - docker run -it -v ~/connectedhomeip:/var/connectedhomeip ghcr.io/project-chip/chip-build-crosscompile:97 /bin/bash + docker run -it -v ~/connectedhomeip:/var/connectedhomeip ghcr.io/project-chip/chip-build-crosscompile:104 /bin/bash ``` Build diff --git a/examples/fabric-sync/README.md b/examples/fabric-sync/README.md index 254eb6ba1562e3..64fee61b3431de 100644 --- a/examples/fabric-sync/README.md +++ b/examples/fabric-sync/README.md @@ -92,13 +92,13 @@ defined: Pull Docker Images ```sh - docker pull ghcr.io/project-chip/chip-build-crosscompile:97 + docker pull ghcr.io/project-chip/chip-build-crosscompile:104 ``` Run docker ```sh - docker run -it -v ~/connectedhomeip:/var/connectedhomeip ghcr.io/project-chip/chip-build-crosscompile:97 /bin/bash + docker run -it -v ~/connectedhomeip:/var/connectedhomeip ghcr.io/project-chip/chip-build-crosscompile:104 /bin/bash ``` Build diff --git a/examples/light-switch-app/ameba/README.md b/examples/light-switch-app/ameba/README.md index 4b79744e03751d..a57df10e44e032 100644 --- a/examples/light-switch-app/ameba/README.md +++ b/examples/light-switch-app/ameba/README.md @@ -26,11 +26,11 @@ The CHIP demo application is supported on - Pull docker image: - $ docker pull ghcr.io/project-chip/chip-build-ameba:97 + $ docker pull ghcr.io/project-chip/chip-build-ameba:104 - Run docker container: - $ docker run -it -v ${CHIP_DIR}:/root/chip ghcr.io/project-chip/chip-build-ameba:97 + $ docker run -it -v ${CHIP_DIR}:/root/chip ghcr.io/project-chip/chip-build-ameba:104 - Setup build environment: diff --git a/examples/light-switch-app/telink/README.md b/examples/light-switch-app/telink/README.md index b2c75f1fc28fb9..087ef533a648cb 100755 --- a/examples/light-switch-app/telink/README.md +++ b/examples/light-switch-app/telink/README.md @@ -17,7 +17,6 @@ The example supports building and running on the following devices: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | | [B91](https://wiki.telink-semi.cn/wiki/Hardware/B91_Generic_Starter_Kit_Hardware_Guide) [TLSR9518ADK80D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR951x-Series) | `tlsr9518adk80d`, `tlsr9518adk80d-mars`, `tlsr9518adk80d-usb` | [TLSR9518ADK80D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9518adk80d/doc/index.rst) | | [B92](https://wiki.telink-semi.cn/wiki/Hardware/B92_Generic_Starter_Kit_Hardware_Guide) [TLSR9528A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR952x-Series) | `tlsr9528a`, `tlsr9528a_retention` | [TLSR9528A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9528a/doc/index.rst) | -| [B95](https://wiki.telink-semi.cn/wiki/Hardware/B95_Generic_Starter_Kit_Hardware_Guide) [TLSR9258A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR925x-Series) | `tlsr9258a` | [TLSR9258A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9258a/doc/index.rst) | | [W91](https://wiki.telink-semi.cn/wiki/Hardware/W91_Generic_Starter_Kit_Hardware_Guide) [TLSR9118BDK40D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR911x-Series) | `tlsr9118bdk40d` | [TLSR9118BDK40D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9118bdk40d/doc/index.rst) | ## Build and flash diff --git a/examples/lighting-app/ameba/README.md b/examples/lighting-app/ameba/README.md index ce6ae8402bcd58..ad6e173246489e 100644 --- a/examples/lighting-app/ameba/README.md +++ b/examples/lighting-app/ameba/README.md @@ -23,11 +23,11 @@ The CHIP demo application is supported on - Pull docker image: - $ docker pull ghcr.io/project-chip/chip-build-ameba:97 + $ docker pull ghcr.io/project-chip/chip-build-ameba:104 - Run docker container: - $ docker run -it -v ${CHIP_DIR}:/root/chip ghcr.io/project-chip/chip-build-ameba:97 + $ docker run -it -v ${CHIP_DIR}:/root/chip ghcr.io/project-chip/chip-build-ameba:104 - Setup build environment: diff --git a/examples/lighting-app/telink/README.md b/examples/lighting-app/telink/README.md index 1a142507652784..ba41630d9ff37f 100644 --- a/examples/lighting-app/telink/README.md +++ b/examples/lighting-app/telink/README.md @@ -15,7 +15,6 @@ The example supports building and running on the following devices: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | | [B91](https://wiki.telink-semi.cn/wiki/Hardware/B91_Generic_Starter_Kit_Hardware_Guide) [TLSR9518ADK80D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR951x-Series) | `tlsr9518adk80d`, `tlsr9518adk80d-mars`, `tlsr9518adk80d-usb` | [TLSR9518ADK80D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9518adk80d/doc/index.rst) | | [B92](https://wiki.telink-semi.cn/wiki/Hardware/B92_Generic_Starter_Kit_Hardware_Guide) [TLSR9528A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR952x-Series) | `tlsr9528a`, `tlsr9528a_retention` | [TLSR9528A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9528a/doc/index.rst) | -| [B95](https://wiki.telink-semi.cn/wiki/Hardware/B95_Generic_Starter_Kit_Hardware_Guide) [TLSR9258A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR925x-Series) | `tlsr9258a` | [TLSR9258A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9258a/doc/index.rst) | | [W91](https://wiki.telink-semi.cn/wiki/Hardware/W91_Generic_Starter_Kit_Hardware_Guide) [TLSR9118BDK40D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR911x-Series) | `tlsr9118bdk40d` | [TLSR9118BDK40D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9118bdk40d/doc/index.rst) | ## Build and flash diff --git a/examples/lock-app/telink/README.md b/examples/lock-app/telink/README.md index 9f6e8671ccbb3b..49e63e0c01e3a9 100755 --- a/examples/lock-app/telink/README.md +++ b/examples/lock-app/telink/README.md @@ -15,7 +15,6 @@ The example supports building and running on the following devices: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | | [B91](https://wiki.telink-semi.cn/wiki/Hardware/B91_Generic_Starter_Kit_Hardware_Guide) [TLSR9518ADK80D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR951x-Series) | `tlsr9518adk80d`, `tlsr9518adk80d-mars`, `tlsr9518adk80d-usb` | [TLSR9518ADK80D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9518adk80d/doc/index.rst) | | [B92](https://wiki.telink-semi.cn/wiki/Hardware/B92_Generic_Starter_Kit_Hardware_Guide) [TLSR9528A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR952x-Series) | `tlsr9528a`, `tlsr9528a_retention` | [TLSR9528A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9528a/doc/index.rst) | -| [B95](https://wiki.telink-semi.cn/wiki/Hardware/B95_Generic_Starter_Kit_Hardware_Guide) [TLSR9258A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR925x-Series) | `tlsr9258a` | [TLSR9258A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9258a/doc/index.rst) | | [W91](https://wiki.telink-semi.cn/wiki/Hardware/W91_Generic_Starter_Kit_Hardware_Guide) [TLSR9118BDK40D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR911x-Series) | `tlsr9118bdk40d` | [TLSR9118BDK40D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9118bdk40d/doc/index.rst) | ## Build and flash diff --git a/examples/ota-requestor-app/ameba/README.md b/examples/ota-requestor-app/ameba/README.md index c78e030ca6dc4b..f7c2fef69b37e3 100644 --- a/examples/ota-requestor-app/ameba/README.md +++ b/examples/ota-requestor-app/ameba/README.md @@ -6,11 +6,11 @@ A prototype application that demonstrates OTA Requestor capabilities. - Pull docker image: - $ docker pull ghcr.io/project-chip/chip-build-ameba:97 + $ docker pull ghcr.io/project-chip/chip-build-ameba:104 - Run docker container: - $ docker run -it -v ${CHIP_DIR}:/root/chip ghcr.io/project-chip/chip-build-ameba:97 + $ docker run -it -v ${CHIP_DIR}:/root/chip ghcr.io/project-chip/chip-build-ameba:104 - Setup build environment: diff --git a/examples/ota-requestor-app/telink/README.md b/examples/ota-requestor-app/telink/README.md index 0c359b3af5ac01..d3e9f8a3cc201b 100755 --- a/examples/ota-requestor-app/telink/README.md +++ b/examples/ota-requestor-app/telink/README.md @@ -8,7 +8,6 @@ The example supports building and running on the following devices: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | | [B91](https://wiki.telink-semi.cn/wiki/Hardware/B91_Generic_Starter_Kit_Hardware_Guide) [TLSR9518ADK80D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR951x-Series) | `tlsr9518adk80d`, `tlsr9518adk80d-mars`, `tlsr9518adk80d-usb` | [TLSR9518ADK80D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9518adk80d/doc/index.rst) | | [B92](https://wiki.telink-semi.cn/wiki/Hardware/B92_Generic_Starter_Kit_Hardware_Guide) [TLSR9528A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR952x-Series) | `tlsr9528a`, `tlsr9528a_retention` | [TLSR9528A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9528a/doc/index.rst) | -| [B95](https://wiki.telink-semi.cn/wiki/Hardware/B95_Generic_Starter_Kit_Hardware_Guide) [TLSR9258A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR925x-Series) | `tlsr9258a` | [TLSR9258A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9258a/doc/index.rst) | | [W91](https://wiki.telink-semi.cn/wiki/Hardware/W91_Generic_Starter_Kit_Hardware_Guide) [TLSR9118BDK40D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR911x-Series) | `tlsr9118bdk40d` | [TLSR9118BDK40D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9118bdk40d/doc/index.rst) | ## Build and flash diff --git a/examples/pigweed-app/ameba/README.md b/examples/pigweed-app/ameba/README.md index 9e5c4b2dc47eb2..286090e10dce01 100644 --- a/examples/pigweed-app/ameba/README.md +++ b/examples/pigweed-app/ameba/README.md @@ -31,11 +31,11 @@ following features are available: - Pull docker image: - $ docker pull ghcr.io/project-chip/chip-build-ameba:97 + $ docker pull ghcr.io/project-chip/chip-build-ameba:104 - Run docker container: - $ docker run -it -v ${CHIP_DIR}:/root/chip ghcr.io/project-chip/chip-build-ameba:97 + $ docker run -it -v ${CHIP_DIR}:/root/chip ghcr.io/project-chip/chip-build-ameba:104 - Setup build environment: diff --git a/examples/pump-app/telink/README.md b/examples/pump-app/telink/README.md index 0f3337f5c08a78..8e07d65bd8050b 100755 --- a/examples/pump-app/telink/README.md +++ b/examples/pump-app/telink/README.md @@ -16,7 +16,6 @@ The example supports building and running on the following devices: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | | [B91](https://wiki.telink-semi.cn/wiki/Hardware/B91_Generic_Starter_Kit_Hardware_Guide) [TLSR9518ADK80D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR951x-Series) | `tlsr9518adk80d`, `tlsr9518adk80d-mars`, `tlsr9518adk80d-usb` | [TLSR9518ADK80D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9518adk80d/doc/index.rst) | | [B92](https://wiki.telink-semi.cn/wiki/Hardware/B92_Generic_Starter_Kit_Hardware_Guide) [TLSR9528A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR952x-Series) | `tlsr9528a`, `tlsr9528a_retention` | [TLSR9528A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9528a/doc/index.rst) | -| [B95](https://wiki.telink-semi.cn/wiki/Hardware/B95_Generic_Starter_Kit_Hardware_Guide) [TLSR9258A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR925x-Series) | `tlsr9258a` | [TLSR9258A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9258a/doc/index.rst) | | [W91](https://wiki.telink-semi.cn/wiki/Hardware/W91_Generic_Starter_Kit_Hardware_Guide) [TLSR9118BDK40D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR911x-Series) | `tlsr9118bdk40d` | [TLSR9118BDK40D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9118bdk40d/doc/index.rst) | ## Build and flash diff --git a/examples/pump-controller-app/telink/README.md b/examples/pump-controller-app/telink/README.md index 3d1cb1f204f499..f0119a54263070 100755 --- a/examples/pump-controller-app/telink/README.md +++ b/examples/pump-controller-app/telink/README.md @@ -17,7 +17,6 @@ The example supports building and running on the following devices: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | | [B91](https://wiki.telink-semi.cn/wiki/Hardware/B91_Generic_Starter_Kit_Hardware_Guide) [TLSR9518ADK80D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR951x-Series) | `tlsr9518adk80d`, `tlsr9518adk80d-mars`, `tlsr9518adk80d-usb` | [TLSR9518ADK80D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9518adk80d/doc/index.rst) | | [B92](https://wiki.telink-semi.cn/wiki/Hardware/B92_Generic_Starter_Kit_Hardware_Guide) [TLSR9528A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR952x-Series) | `tlsr9528a`, `tlsr9528a_retention` | [TLSR9528A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9528a/doc/index.rst) | -| [B95](https://wiki.telink-semi.cn/wiki/Hardware/B95_Generic_Starter_Kit_Hardware_Guide) [TLSR9258A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR925x-Series) | `tlsr9258a` | [TLSR9258A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9258a/doc/index.rst) | | [W91](https://wiki.telink-semi.cn/wiki/Hardware/W91_Generic_Starter_Kit_Hardware_Guide) [TLSR9118BDK40D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR911x-Series) | `tlsr9118bdk40d` | [TLSR9118BDK40D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9118bdk40d/doc/index.rst) | ## Build and flash diff --git a/examples/shell/telink/README.md b/examples/shell/telink/README.md index 14e8bedb1c3bf0..65272899859498 100755 --- a/examples/shell/telink/README.md +++ b/examples/shell/telink/README.md @@ -12,7 +12,6 @@ The example supports building and running on the following devices: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | | [B91](https://wiki.telink-semi.cn/wiki/Hardware/B91_Generic_Starter_Kit_Hardware_Guide) [TLSR9518ADK80D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR951x-Series) | `tlsr9518adk80d`, `tlsr9518adk80d-mars`, `tlsr9518adk80d-usb` | [TLSR9518ADK80D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9518adk80d/doc/index.rst) | | [B92](https://wiki.telink-semi.cn/wiki/Hardware/B92_Generic_Starter_Kit_Hardware_Guide) [TLSR9528A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR952x-Series) | `tlsr9528a`, `tlsr9528a_retention` | [TLSR9528A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9528a/doc/index.rst) | -| [B95](https://wiki.telink-semi.cn/wiki/Hardware/B95_Generic_Starter_Kit_Hardware_Guide) [TLSR9258A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR925x-Series) | `tlsr9258a` | [TLSR9258A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9258a/doc/index.rst) | | [W91](https://wiki.telink-semi.cn/wiki/Hardware/W91_Generic_Starter_Kit_Hardware_Guide) [TLSR9118BDK40D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR911x-Series) | `tlsr9118bdk40d` | [TLSR9118BDK40D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9118bdk40d/doc/index.rst) | ## Build and flash diff --git a/examples/smoke-co-alarm-app/telink/README.md b/examples/smoke-co-alarm-app/telink/README.md index a2fce29d1b1fd3..5f0b94d14d162f 100755 --- a/examples/smoke-co-alarm-app/telink/README.md +++ b/examples/smoke-co-alarm-app/telink/README.md @@ -12,7 +12,6 @@ The example supports building and running on the following devices: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | | [B91](https://wiki.telink-semi.cn/wiki/Hardware/B91_Generic_Starter_Kit_Hardware_Guide) [TLSR9518ADK80D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR951x-Series) | `tlsr9518adk80d`, `tlsr9518adk80d-mars`, `tlsr9518adk80d-usb` | [TLSR9518ADK80D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9518adk80d/doc/index.rst) | | [B92](https://wiki.telink-semi.cn/wiki/Hardware/B92_Generic_Starter_Kit_Hardware_Guide) [TLSR9528A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR952x-Series) | `tlsr9528a`, `tlsr9528a_retention` | [TLSR9528A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9528a/doc/index.rst) | -| [B95](https://wiki.telink-semi.cn/wiki/Hardware/B95_Generic_Starter_Kit_Hardware_Guide) [TLSR9258A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR925x-Series) | `tlsr9258a` | [TLSR9258A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9258a/doc/index.rst) | | [W91](https://wiki.telink-semi.cn/wiki/Hardware/W91_Generic_Starter_Kit_Hardware_Guide) [TLSR9118BDK40D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR911x-Series) | `tlsr9118bdk40d` | [TLSR9118BDK40D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9118bdk40d/doc/index.rst) | ## Build and flash diff --git a/examples/temperature-measurement-app/telink/README.md b/examples/temperature-measurement-app/telink/README.md index 7dc9287a54ca55..2e838ca93ad12a 100644 --- a/examples/temperature-measurement-app/telink/README.md +++ b/examples/temperature-measurement-app/telink/README.md @@ -16,7 +16,6 @@ The example supports building and running on the following devices: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | | [B91](https://wiki.telink-semi.cn/wiki/Hardware/B91_Generic_Starter_Kit_Hardware_Guide) [TLSR9518ADK80D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR951x-Series) | `tlsr9518adk80d`, `tlsr9518adk80d-mars`, `tlsr9518adk80d-usb` | [TLSR9518ADK80D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9518adk80d/doc/index.rst) | | [B92](https://wiki.telink-semi.cn/wiki/Hardware/B92_Generic_Starter_Kit_Hardware_Guide) [TLSR9528A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR952x-Series) | `tlsr9528a`, `tlsr9528a_retention` | [TLSR9528A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9528a/doc/index.rst) | -| [B95](https://wiki.telink-semi.cn/wiki/Hardware/B95_Generic_Starter_Kit_Hardware_Guide) [TLSR9258A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR925x-Series) | `tlsr9258a` | [TLSR9258A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9258a/doc/index.rst) | | [W91](https://wiki.telink-semi.cn/wiki/Hardware/W91_Generic_Starter_Kit_Hardware_Guide) [TLSR9118BDK40D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR911x-Series) | `tlsr9118bdk40d` | [TLSR9118BDK40D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9118bdk40d/doc/index.rst) | ## Build and flash diff --git a/examples/thermostat/telink/README.md b/examples/thermostat/telink/README.md index 26856132994c5d..a23ec166d7b130 100755 --- a/examples/thermostat/telink/README.md +++ b/examples/thermostat/telink/README.md @@ -12,7 +12,6 @@ The example supports building and running on the following devices: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | | [B91](https://wiki.telink-semi.cn/wiki/Hardware/B91_Generic_Starter_Kit_Hardware_Guide) [TLSR9518ADK80D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR951x-Series) | `tlsr9518adk80d`, `tlsr9518adk80d-mars`, `tlsr9518adk80d-usb` | [TLSR9518ADK80D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9518adk80d/doc/index.rst) | | [B92](https://wiki.telink-semi.cn/wiki/Hardware/B92_Generic_Starter_Kit_Hardware_Guide) [TLSR9528A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR952x-Series) | `tlsr9528a`, `tlsr9528a_retention` | [TLSR9528A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9528a/doc/index.rst) | -| [B95](https://wiki.telink-semi.cn/wiki/Hardware/B95_Generic_Starter_Kit_Hardware_Guide) [TLSR9258A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR925x-Series) | `tlsr9258a` | [TLSR9258A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9258a/doc/index.rst) | | [W91](https://wiki.telink-semi.cn/wiki/Hardware/W91_Generic_Starter_Kit_Hardware_Guide) [TLSR9118BDK40D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR911x-Series) | `tlsr9118bdk40d` | [TLSR9118BDK40D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9118bdk40d/doc/index.rst) | ## Build and flash diff --git a/examples/window-app/telink/README.md b/examples/window-app/telink/README.md index b40a12bf754eac..6978ce49df8f5b 100644 --- a/examples/window-app/telink/README.md +++ b/examples/window-app/telink/README.md @@ -15,7 +15,6 @@ The example supports building and running on the following devices: | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | | [B91](https://wiki.telink-semi.cn/wiki/Hardware/B91_Generic_Starter_Kit_Hardware_Guide) [TLSR9518ADK80D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR951x-Series) | `tlsr9518adk80d`, `tlsr9518adk80d-mars`, `tlsr9518adk80d-usb` | [TLSR9518ADK80D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9518adk80d/doc/index.rst) | | [B92](https://wiki.telink-semi.cn/wiki/Hardware/B92_Generic_Starter_Kit_Hardware_Guide) [TLSR9528A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR952x-Series) | `tlsr9528a`, `tlsr9528a_retention` | [TLSR9528A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9528a/doc/index.rst) | -| [B95](https://wiki.telink-semi.cn/wiki/Hardware/B95_Generic_Starter_Kit_Hardware_Guide) [TLSR9258A](https://wiki.telink-semi.cn/wiki/chip-series/TLSR925x-Series) | `tlsr9258a` | [TLSR9258A](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9258a/doc/index.rst) | | [W91](https://wiki.telink-semi.cn/wiki/Hardware/W91_Generic_Starter_Kit_Hardware_Guide) [TLSR9118BDK40D](https://wiki.telink-semi.cn/wiki/chip-series/TLSR911x-Series) | `tlsr9118bdk40d` | [TLSR9118BDK40D](https://github.com/telink-semi/zephyr/blob/develop/boards/riscv/tlsr9118bdk40d/doc/index.rst) | ## Build and flash diff --git a/integrations/cloudbuild/chef.yaml b/integrations/cloudbuild/chef.yaml index 986ee6939be6d5..45c4df62387847 100644 --- a/integrations/cloudbuild/chef.yaml +++ b/integrations/cloudbuild/chef.yaml @@ -1,5 +1,5 @@ steps: - - name: "ghcr.io/project-chip/chip-build-vscode:98" + - name: "ghcr.io/project-chip/chip-build-vscode:104" entrypoint: "bash" args: - "-c" @@ -7,7 +7,7 @@ steps: git config --global --add safe.directory "*" python scripts/checkout_submodules.py --shallow --recursive --platform esp32 nrfconnect silabs linux android id: Submodules - - name: "ghcr.io/project-chip/chip-build-vscode:98" + - name: "ghcr.io/project-chip/chip-build-vscode:104" # NOTE: silabs boostrap is NOT done with the rest as it requests a conflicting # jinja2 version (asks for 3.1.3 when constraints.txt asks for 3.0.3) env: @@ -23,7 +23,7 @@ steps: - name: pwenv path: /pwenv timeout: 900s - - name: "ghcr.io/project-chip/chip-build-vscode:98" + - name: "ghcr.io/project-chip/chip-build-vscode:104" env: - PW_ENVIRONMENT_ROOT=/pwenv args: @@ -38,7 +38,7 @@ steps: - name: pwenv path: /pwenv - - name: "ghcr.io/project-chip/chip-build-vscode:98" + - name: "ghcr.io/project-chip/chip-build-vscode:104" env: - PW_ENVIRONMENT_ROOT=/pwenv args: diff --git a/integrations/cloudbuild/smoke-test.yaml b/integrations/cloudbuild/smoke-test.yaml index c3873a9ddb2a90..002bb7e1bd8db4 100644 --- a/integrations/cloudbuild/smoke-test.yaml +++ b/integrations/cloudbuild/smoke-test.yaml @@ -1,5 +1,5 @@ steps: - - name: "ghcr.io/project-chip/chip-build-vscode:98" + - name: "ghcr.io/project-chip/chip-build-vscode:104" entrypoint: "bash" args: - "-c" @@ -7,7 +7,7 @@ steps: git config --global --add safe.directory "*" python scripts/checkout_submodules.py --shallow --recursive --platform esp32 nrfconnect silabs linux android id: Submodules - - name: "ghcr.io/project-chip/chip-build-vscode:98" + - name: "ghcr.io/project-chip/chip-build-vscode:104" # NOTE: silabs boostrap is NOT done with the rest as it requests a conflicting # jinja2 version (asks for 3.1.3 when constraints.txt asks for 3.0.3) env: @@ -24,7 +24,7 @@ steps: path: /pwenv timeout: 900s - - name: "ghcr.io/project-chip/chip-build-vscode:98" + - name: "ghcr.io/project-chip/chip-build-vscode:104" id: ESP32 env: - PW_ENVIRONMENT_ROOT=/pwenv @@ -44,7 +44,7 @@ steps: volumes: - name: pwenv path: /pwenv - - name: "ghcr.io/project-chip/chip-build-vscode:98" + - name: "ghcr.io/project-chip/chip-build-vscode:104" id: NRFConnect env: - PW_ENVIRONMENT_ROOT=/pwenv @@ -65,7 +65,7 @@ steps: - name: pwenv path: /pwenv - - name: "ghcr.io/project-chip/chip-build-vscode:98" + - name: "ghcr.io/project-chip/chip-build-vscode:104" id: EFR32 env: - PW_ENVIRONMENT_ROOT=/pwenv @@ -87,7 +87,7 @@ steps: - name: pwenv path: /pwenv - - name: "ghcr.io/project-chip/chip-build-vscode:98" + - name: "ghcr.io/project-chip/chip-build-vscode:104" id: Linux env: - PW_ENVIRONMENT_ROOT=/pwenv @@ -140,7 +140,7 @@ steps: - name: pwenv path: /pwenv - - name: "ghcr.io/project-chip/chip-build-vscode:98" + - name: "ghcr.io/project-chip/chip-build-vscode:104" id: Android env: - PW_ENVIRONMENT_ROOT=/pwenv diff --git a/scripts/build/build/targets.py b/scripts/build/build/targets.py index ef34fb6e4807e5..3611e7372cb3c9 100755 --- a/scripts/build/build/targets.py +++ b/scripts/build/build/targets.py @@ -778,10 +778,9 @@ def BuildTelinkTarget(): TargetPart('tlsr9518adk80d', board=TelinkBoard.TLSR9518ADK80D), TargetPart('tlsr9528a', board=TelinkBoard.TLSR9528A), TargetPart('tlsr9528a_retention', board=TelinkBoard.TLSR9528A_RETENTION), - TargetPart('tlsr9258a', board=TelinkBoard.TLSR9258A), - TargetPart('tlsr9258a_retention', board=TelinkBoard.TLSR9258A_RETENTION), TargetPart('tl3218x', board=TelinkBoard.TL3218X), TargetPart('tl7218x', board=TelinkBoard.TL7218X), + TargetPart('tl7218x_retention', board=TelinkBoard.TL7218X_RETENTION), ]) target.AppendFixedTargets([ diff --git a/scripts/build/builders/telink.py b/scripts/build/builders/telink.py index d53a860ebcf944..b2966742179aac 100644 --- a/scripts/build/builders/telink.py +++ b/scripts/build/builders/telink.py @@ -119,10 +119,9 @@ class TelinkBoard(Enum): TLSR9518ADK80D = auto() TLSR9528A = auto() TLSR9528A_RETENTION = auto() - TLSR9258A = auto() - TLSR9258A_RETENTION = auto() TL3218X = auto() TL7218X = auto() + TL7218X_RETENTION = auto() def GnArgName(self): if self == TelinkBoard.TLRS9118BDK40D: @@ -133,14 +132,12 @@ def GnArgName(self): return 'tlsr9528a' elif self == TelinkBoard.TLSR9528A_RETENTION: return 'tlsr9528a_retention' - elif self == TelinkBoard.TLSR9258A: - return 'tlsr9258a' - elif self == TelinkBoard.TLSR9258A_RETENTION: - return 'tlsr9258a_retention' elif self == TelinkBoard.TL3218X: return 'tl3218x' elif self == TelinkBoard.TL7218X: return 'tl7218x' + elif self == TelinkBoard.TL7218X_RETENTION: + return 'tl7218x_retention' else: raise Exception('Unknown board type: %r' % self) diff --git a/scripts/build/testdata/all_targets_linux_x64.txt b/scripts/build/testdata/all_targets_linux_x64.txt index 96a6f218d77561..590844271d3ba6 100644 --- a/scripts/build/testdata/all_targets_linux_x64.txt +++ b/scripts/build/testdata/all_targets_linux_x64.txt @@ -22,5 +22,5 @@ nuttx-x64-light qpg-qpg6105-{lock,light,shell,persistent-storage,light-switch,thermostat}[-updateimage] stm32-stm32wb5mm-dk-light tizen-arm-{all-clusters,chip-tool,light,tests}[-no-ble][-no-thread][-no-wifi][-asan][-ubsan][-coverage][-with-ui] -telink-{tlsr9118bdk40d,tlsr9518adk80d,tlsr9528a,tlsr9528a_retention,tlsr9258a,tlsr9258a_retention,tl3218x,tl7218x}-{air-quality-sensor,all-clusters,all-clusters-minimal,bridge,contact-sensor,light,light-switch,lock,ota-requestor,pump,pump-controller,shell,smoke-co-alarm,temperature-measurement,thermostat,window-covering}[-ota][-dfu][-shell][-rpc][-factory-data][-4mb][-mars][-usb][-compress-lzma][-thread-analyzer] +telink-{tlsr9118bdk40d,tlsr9518adk80d,tlsr9528a,tlsr9528a_retention,tl3218x,tl7218x,tl7218x_retention}-{air-quality-sensor,all-clusters,all-clusters-minimal,bridge,contact-sensor,light,light-switch,lock,ota-requestor,pump,pump-controller,shell,smoke-co-alarm,temperature-measurement,thermostat,window-covering}[-ota][-dfu][-shell][-rpc][-factory-data][-4mb][-mars][-usb][-compress-lzma][-thread-analyzer] openiotsdk-{shell,lock}[-mbedtls][-psa] diff --git a/src/platform/telink/tlsr9258a_2m_flash.overlay b/src/platform/telink/tlsr9258a_2m_flash.overlay deleted file mode 100644 index bdfc0a45709fc1..00000000000000 --- a/src/platform/telink/tlsr9258a_2m_flash.overlay +++ /dev/null @@ -1,35 +0,0 @@ -&flash { - reg = <0x20000000 0x200000>; - - /delete-node/ partitions; - partitions { - compatible = "fixed-partitions"; - #address-cells = <1>; - #size-cells = <1>; - - boot_partition: partition@0 { - label = "mcuboot"; - reg = <0x00000000 0x13000>; - }; - slot0_partition: partition@13000 { - label = "image-0"; - reg = <0x13000 0xef000>; - }; - factory_partition: partition@102000 { - label = "factory-data"; - reg = <0x102000 0x1000>; - }; - storage_partition: partition@103000 { - label = "storage"; - reg = <0x103000 0xc000>; - }; - slot1_partition: partition@10f000 { - label = "image-1"; - reg = <0x10f000 0xef000>; - }; - vendor_partition: partition@1fe000 { - label = "vendor-data"; - reg = <0x1fe000 0x2000>; - }; - }; -}; diff --git a/src/platform/telink/tlsr9258a_retention.overlay b/src/platform/telink/tlsr9258a_retention.overlay deleted file mode 100644 index 0890951e787f96..00000000000000 --- a/src/platform/telink/tlsr9258a_retention.overlay +++ /dev/null @@ -1,24 +0,0 @@ -/ { - /* - * There is no way to keep GPIOs - * during deep-sleep mode so output GPIOs - * and PWM's are useless. - */ - - aliases { - /delete-property/ led0; - /delete-property/ led1; - /delete-property/ led2; - /delete-property/ led3; - /delete-property/ mcuboot-led0; - /delete-property/ pwm-led0; - /delete-property/ pwm-0; - }; - - /delete-node/ leds; - /delete-node/ pwm_leds; -}; - -&pwm0 { - status = "disabled"; -}; From 58c6789383488e05e735e2e03717fd8482403a3d Mon Sep 17 00:00:00 2001 From: C Freeman Date: Fri, 31 Jan 2025 11:29:46 -0500 Subject: [PATCH 27/36] Python test whl: Use zip files for data_model (#37163) * Python test whl: Use zip files for data_model We are close to the input parameter limit for the builds with the number of files in the data_model directory as-is. With the addition of the 1.4.1 files, we go over. Instead, we can zip the files and have the parser read directly from the zip archive. I think this also makes the whl slightly smaller, which is nice. Spec parsing is tested directly with TestSpecParsingSupport.py and with TestSpecParsingDeviceTypes.py. The TC_DeviceConformance tests also use the parsed spec. * Fix generator script to make the build file in the new format * Add CI checker that build file matches generated * Add an intentional failure so I can see the CI trigger * Add the warning * Add back the CI failure trigger * whoops, missed the part where I check out the code * CI is hard and I am not good at it * Think I got it? Works on act * Revert "Add back the CI failure trigger" This reverts commit 38ad9565a21f63ce848c24f55c511c9d037033c2. * Update src/python_testing/matter_testing_infrastructure/generate_data_model_xmls_gni.py --- .../check-data-model-directory-updates.yaml | 23 ++++++- .../matter_testing_infrastructure/BUILD.gn | 44 +++++++++++-- .../chip/testing/spec_parsing.py | 8 ++- .../data_model_xmls.gni | 16 +++-- .../generate_data_model_xmls_gni.py | 66 ++++++++++--------- 5 files changed, 113 insertions(+), 44 deletions(-) diff --git a/.github/workflows/check-data-model-directory-updates.yaml b/.github/workflows/check-data-model-directory-updates.yaml index 7bd20c87e0e4ec..895ee15c6f20b1 100644 --- a/.github/workflows/check-data-model-directory-updates.yaml +++ b/.github/workflows/check-data-model-directory-updates.yaml @@ -36,4 +36,25 @@ jobs: python3 scripts/dm_xml_ci_change_enforcement.py data_model/1.3 - name: Check for changes to 1.4 data_model directory without a SHA update run: | - python3 scripts/dm_xml_ci_change_enforcement.py data_model/1.4 \ No newline at end of file + python3 scripts/dm_xml_ci_change_enforcement.py data_model/1.4 + + check-data_model-build-file: + name: Check that all data_model files are listed in the data_model_xmls.gni build file + runs-on: ubuntu-latest + container: + image: ghcr.io/project-chip/chip-build + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Setup pip modules we use + run: | + python3 -m venv out/venv + out/venv/bin/pip3 install \ + jinja2 + - name: Generate build file (data_model_xmls.gni) + run: out/venv/bin/python3 src/python_testing/matter_testing_infrastructure/generate_data_model_xmls_gni.py + - name: Ensure git works in current working directory + run: git config --global --add safe.directory `pwd` + - name: Check for uncommited changes + run: | + git diff --exit-code HEAD -- src/python_testing/matter_testing_infrastructure/data_model_xmls.gni \ No newline at end of file diff --git a/src/python_testing/matter_testing_infrastructure/BUILD.gn b/src/python_testing/matter_testing_infrastructure/BUILD.gn index 28269a3df1fbed..0287a8a064a1d2 100644 --- a/src/python_testing/matter_testing_infrastructure/BUILD.gn +++ b/src/python_testing/matter_testing_infrastructure/BUILD.gn @@ -18,6 +18,7 @@ import("//build_overrides/pigweed.gni") import("//src/python_testing/matter_testing_infrastructure/data_model_xmls.gni") import("$dir_pw_build/python.gni") import("$dir_pw_build/python_dist.gni") +import("$dir_pw_build/zip.gni") pw_python_package("chip-testing-module") { generate_setup = { @@ -55,6 +56,33 @@ pw_python_package("chip-testing-module") { ] } +pw_zip("data_model_zip_1_3") { + inputs = [] + foreach(file, data_model_XMLS_1_3) { + zip_path = rebase_path(file, "${chip_root}/data_model/1.3/", "/") + inputs += [ "${file} > /${zip_path}" ] + } + output = "${root_out_dir}/data_model/zip_1_3.zip" +} + +pw_zip("data_model_zip_1_4") { + inputs = [] + foreach(file, data_model_XMLS_1_4) { + zip_path = rebase_path(file, "${chip_root}/data_model/1.4/", "/") + inputs += [ "${file} > /${zip_path}" ] + } + output = "${root_out_dir}/data_model/zip_1_4.zip" +} + +pw_zip("data_model_zip_master") { + inputs = [] + foreach(file, data_model_XMLS_master) { + zip_path = rebase_path(file, "${chip_root}/data_model/master/", "/") + inputs += [ "${file} > /${zip_path}" ] + } + output = "${root_out_dir}/data_model/zip_master.zip" +} + pw_python_distribution("chip-testing") { packages = [ ":chip-testing-module" ] @@ -65,9 +93,15 @@ pw_python_distribution("chip-testing") { include_extra_files_in_package_data = true } - # Use the imported data_model_XMLS directly - extra_files = [] - foreach(file, data_model_XMLS) { - extra_files += [ "${file} > chip/testing/${file}" ] - } + public_deps = [ + ":data_model_zip_1_3", + ":data_model_zip_1_4", + ":data_model_zip_master", + ] + + extra_files = [ + "${root_out_dir}/data_model/zip_1_3.zip > chip/testing/data_model/1.3/allfiles.zip", + "${root_out_dir}/data_model/zip_1_4.zip > chip/testing/data_model/1.4/allfiles.zip", + "${root_out_dir}/data_model/zip_master.zip > chip/testing/data_model/master/allfiles.zip", + ] } diff --git a/src/python_testing/matter_testing_infrastructure/chip/testing/spec_parsing.py b/src/python_testing/matter_testing_infrastructure/chip/testing/spec_parsing.py index 56c777868d3d87..8aa66382f71b94 100644 --- a/src/python_testing/matter_testing_infrastructure/chip/testing/spec_parsing.py +++ b/src/python_testing/matter_testing_infrastructure/chip/testing/spec_parsing.py @@ -20,6 +20,7 @@ import logging import typing import xml.etree.ElementTree as ElementTree +import zipfile from copy import deepcopy from dataclasses import dataclass from enum import Enum, auto @@ -571,8 +572,11 @@ def get_data_model_directory(data_model_directory: Union[PrebuiltDataModelDirect return data_model_directory # If it's a prebuilt directory, build the path based on the version and data model level - return pkg_resources.files(importlib.import_module('chip.testing')).joinpath( - 'data_model').joinpath(data_model_directory.dirname).joinpath(data_model_level.dirname) + zip_path = pkg_resources.files(importlib.import_module('chip.testing')).joinpath( + 'data_model').joinpath(data_model_directory.dirname).joinpath('allfiles.zip') + path = zipfile.Path(zip_path) + + return path.joinpath(data_model_level.dirname) def build_xml_clusters(data_model_directory: Union[PrebuiltDataModelDirectory, Traversable] = PrebuiltDataModelDirectory.k1_4) -> typing.Tuple[dict[uint, XmlCluster], list[ProblemNotice]]: diff --git a/src/python_testing/matter_testing_infrastructure/data_model_xmls.gni b/src/python_testing/matter_testing_infrastructure/data_model_xmls.gni index fc2d80305e6789..e3aee87a236ad4 100644 --- a/src/python_testing/matter_testing_infrastructure/data_model_xmls.gni +++ b/src/python_testing/matter_testing_infrastructure/data_model_xmls.gni @@ -11,10 +11,15 @@ # 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. +# +# This file is generated by +# src/python_testing/matter_testing_infrastructure/generate_data_model_xmls_gni.py +# +# Manually re-generate this file on any changes to the data_model directory. import("//build_overrides/chip.gni") -data_model_XMLS = [ +data_model_XMLS_1_3 = [ "${chip_root}/data_model/1.3/clusters/ACL-Cluster.xml", "${chip_root}/data_model/1.3/clusters/AccountLogin.xml", "${chip_root}/data_model/1.3/clusters/AdminCommissioningCluster.xml", @@ -116,7 +121,6 @@ data_model_XMLS = [ "${chip_root}/data_model/1.3/clusters/WindowCovering.xml", "${chip_root}/data_model/1.3/clusters/bridge-clusters-ActionsCluster.xml", "${chip_root}/data_model/1.3/clusters/bridge-clusters-BridgedDeviceBasicInformationCluster.xml", - "${chip_root}/data_model/1.3/clusters/cluster_ids.json", "${chip_root}/data_model/1.3/device_types/Aggregator.xml", "${chip_root}/data_model/1.3/device_types/AirPurifier.xml", "${chip_root}/data_model/1.3/device_types/AirQualitySensor.xml", @@ -180,6 +184,9 @@ data_model_XMLS = [ "${chip_root}/data_model/1.3/device_types/WaterValve.xml", "${chip_root}/data_model/1.3/device_types/WindowCovering.xml", "${chip_root}/data_model/1.3/device_types/WindowCoveringController.xml", +] + +data_model_XMLS_1_4 = [ "${chip_root}/data_model/1.4/clusters/ACL-Cluster.xml", "${chip_root}/data_model/1.4/clusters/AccountLogin.xml", "${chip_root}/data_model/1.4/clusters/AdminCommissioningCluster.xml", @@ -291,7 +298,6 @@ data_model_XMLS = [ "${chip_root}/data_model/1.4/clusters/WindowCovering.xml", "${chip_root}/data_model/1.4/clusters/bridge-clusters-ActionsCluster.xml", "${chip_root}/data_model/1.4/clusters/bridge-clusters-BridgedDeviceBasicInformationCluster.xml", - "${chip_root}/data_model/1.4/clusters/cluster_ids.json", "${chip_root}/data_model/1.4/device_types/Aggregator.xml", "${chip_root}/data_model/1.4/device_types/AirPurifier.xml", "${chip_root}/data_model/1.4/device_types/AirQualitySensor.xml", @@ -365,6 +371,9 @@ data_model_XMLS = [ "${chip_root}/data_model/1.4/device_types/WaterValve.xml", "${chip_root}/data_model/1.4/device_types/WindowCovering.xml", "${chip_root}/data_model/1.4/device_types/WindowCoveringController.xml", +] + +data_model_XMLS_master = [ "${chip_root}/data_model/master/clusters/ACL-Cluster.xml", "${chip_root}/data_model/master/clusters/AccountLogin.xml", "${chip_root}/data_model/master/clusters/AdminCommissioningCluster.xml", @@ -482,7 +491,6 @@ data_model_XMLS = [ "${chip_root}/data_model/master/clusters/bridge-clusters-ActionsCluster.xml", "${chip_root}/data_model/master/clusters/bridge-clusters-BridgedDeviceBasicInformationCluster.xml", "${chip_root}/data_model/master/clusters/bridge-clusters-EcosystemInformationCluster.xml", - "${chip_root}/data_model/master/clusters/cluster_ids.json", "${chip_root}/data_model/master/device_types/Aggregator.xml", "${chip_root}/data_model/master/device_types/AirPurifier.xml", "${chip_root}/data_model/master/device_types/AirQualitySensor.xml", diff --git a/src/python_testing/matter_testing_infrastructure/generate_data_model_xmls_gni.py b/src/python_testing/matter_testing_infrastructure/generate_data_model_xmls_gni.py index 76179797f5fe8c..470913b33afc15 100644 --- a/src/python_testing/matter_testing_infrastructure/generate_data_model_xmls_gni.py +++ b/src/python_testing/matter_testing_infrastructure/generate_data_model_xmls_gni.py @@ -13,8 +13,8 @@ # limitations under the License. """ -Generates a gni file containing all data_model files (generally XML and JSON files) -that are typically used by matter_testing_infrastructure. +Generates a gni file containing all data_model files (XML) +that are used by matter_testing_infrastructure. These files are to be bundled with whl packages of the matter_testing_infrastructure so that methods requiring data model files work just by installing the python @@ -26,19 +26,10 @@ # Set chip_root to be dynamically based on the script's location chip_root = os.path.abspath(os.path.join(os.path.dirname(__file__), "../../..")) - -# Directories to search for .xml and .json files relative to chip_root -directories = [ - os.path.join(chip_root, "data_model/1.3/clusters/"), - os.path.join(chip_root, "data_model/1.3/device_types/"), - os.path.join(chip_root, "data_model/1.4/clusters/"), - os.path.join(chip_root, "data_model/1.4/device_types/"), - os.path.join(chip_root, "data_model/master/clusters/"), - os.path.join(chip_root, "data_model/master/device_types/"), -] +data_model_dir = os.path.join(chip_root, "data_model") # Template for generating the GNI file content with proper indentation -GNI_TEMPLATE = """\ +GNI_HEADER = """\ # Copyright (c) 2024 Project CHIP Authors # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -52,43 +43,54 @@ # 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. +# +# This file is generated by +# src/python_testing/matter_testing_infrastructure/generate_data_model_xmls_gni.py +# +# Manually re-generate this file on any changes to the data_model directory. import("//build_overrides/chip.gni") +""" + +GNI_TEMPLATE = """\ -data_model_XMLS = [ +data_model_XMLS_{{ dir }} = [ {% for name in file_list %} - "{{ name }}", + "{{ name }}", {% endfor %} ] -""" -# Function to find and collect all .xml and .json files +""" -def get_data_model_file_names(): +def get_data_model_file_names(directory: str): + ''' Function to find and collect all .xml files''' file_list = [] - for directory in directories: - for root, _, files in os.walk(directory): - for file in files: - if file.endswith(".xml") or file.endswith(".json"): - # Replace absolute path with `${chip_root}` for GNI compatibility - relative_path = os.path.join("${chip_root}", os.path.relpath(root, chip_root), file) - file_list.append(relative_path) + for root, _, files in os.walk(directory): + for file in files: + if file.endswith(".xml"): + # Replace absolute path with `${chip_root}` for GNI compatibility + relative_path = os.path.join("${chip_root}", os.path.relpath(root, chip_root), file) + file_list.append(relative_path) # Sort files alphabetically file_list.sort() return file_list -# Main function to generate the data_model_xmls.gni file - def generate_gni_file(): - # Step 1: Find all files and create the sorted file list - file_list = get_data_model_file_names() - - # Step 2: Render the template with the file list + '''Main function to generate the data_model_xmls.gni file''' environment = jinja2.Environment(trim_blocks=True, lstrip_blocks=True) template = environment.from_string(GNI_TEMPLATE) - output_content = template.render(file_list=file_list) + output_content_per_dir = [] + + # Step 1: Find all files and create the sorted file list + dirs = sorted([d for d in os.listdir(data_model_dir) if os.path.isdir(os.path.join(data_model_dir, d))]) + for directory in dirs: + file_list = get_data_model_file_names(os.path.join(data_model_dir, directory)) + # Step 2: Render the template with the file list + output_content_per_dir.append(template.render(dir=directory.replace('.', '_'), file_list=file_list)) + + output_content = GNI_HEADER + "".join(output_content_per_dir) # Step 3: Dynamically generate the output file path # Get the script's directory (where this script is located) From 48ca7544e9b6ca078c2b1cc7f03768aabedc1c77 Mon Sep 17 00:00:00 2001 From: Junior Martinez <67972863+jmartinez-silabs@users.noreply.github.com> Date: Fri, 31 Jan 2025 12:08:09 -0500 Subject: [PATCH 28/36] [SL-UP] Raise TimerTask to the highest prio (#254) (#37276) --- examples/platform/silabs/FreeRTOSConfig.h | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/examples/platform/silabs/FreeRTOSConfig.h b/examples/platform/silabs/FreeRTOSConfig.h index 462f923aff895b..2d061fad9159be 100644 --- a/examples/platform/silabs/FreeRTOSConfig.h +++ b/examples/platform/silabs/FreeRTOSConfig.h @@ -174,11 +174,8 @@ extern uint32_t SystemCoreClock; /* Software timer related definitions. */ #define configUSE_TIMERS (1) -#ifdef SLI_SI917 +// Keep the timerTask at the highest prio as some of our stacks tasks leverage eventing with timers. #define configTIMER_TASK_PRIORITY (55) /* Highest priority */ -#else -#define configTIMER_TASK_PRIORITY (40) /* Highest priority */ -#endif // SLI_SI917 #define configTIMER_QUEUE_LENGTH (10) #define configTIMER_TASK_STACK_DEPTH (1024) @@ -313,7 +310,7 @@ standard names. */ /* Thread local storage pointers used by the SDK */ #ifndef configNUM_USER_THREAD_LOCAL_STORAGE_POINTERS -#define configNUM_USER_THREAD_LOCAL_STORAGE_POINTERS 2 +#define configNUM_USER_THREAD_LOCAL_STORAGE_POINTERS 0 #endif #ifndef configNUM_SDK_THREAD_LOCAL_STORAGE_POINTERS From 6de6b5078cbc9fc5d8b9315d39cd11dad17188ad Mon Sep 17 00:00:00 2001 From: Andrei Litvin Date: Fri, 31 Jan 2025 12:21:10 -0500 Subject: [PATCH 29/36] Set up an `kInternalDeviceAccess` Auth mode to be used by internal requests when building subject descriptors (#37174) * Support a new auth mode of "internal" * Restyle * Rename kInternal to kInternalDeviceAccess --------- Co-authored-by: Andrei Litvin --- examples/common/pigweed/rpc_services/Attributes.h | 4 ++-- src/access/AccessControl.cpp | 2 ++ src/access/AuthMode.h | 9 +++++---- src/app/dynamic_server/AccessControl.cpp | 3 ++- 4 files changed, 11 insertions(+), 7 deletions(-) diff --git a/examples/common/pigweed/rpc_services/Attributes.h b/examples/common/pigweed/rpc_services/Attributes.h index cfbb400ae2f7f2..eff2af5d66db31 100644 --- a/examples/common/pigweed/rpc_services/Attributes.h +++ b/examples/common/pigweed/rpc_services/Attributes.h @@ -192,7 +192,7 @@ class Attributes : public pw_rpc::nanopb::Attributes::Service return ::pw::Status::NotFound(); } - Access::SubjectDescriptor subjectDescriptor{ .authMode = chip::Access::AuthMode::kPase }; + Access::SubjectDescriptor subjectDescriptor{ .authMode = chip::Access::AuthMode::kInternalDeviceAccess }; app::DataModel::WriteAttributeRequest write_request; write_request.path = path; write_request.operationFlags.Set(app::DataModel::OperationFlags::kInternal); @@ -343,7 +343,7 @@ class Attributes : public pw_rpc::nanopb::Attributes::Service ::pw::Status ReadAttributeIntoTlvBuffer(const app::ConcreteAttributePath & path, MutableByteSpan & tlvBuffer) { - Access::SubjectDescriptor subjectDescriptor{ .authMode = chip::Access::AuthMode::kPase }; + Access::SubjectDescriptor subjectDescriptor{ .authMode = chip::Access::AuthMode::kInternalDeviceAccess }; app::AttributeReportIBs::Builder attributeReports; TLV::TLVWriter writer; TLV::TLVType outer; diff --git a/src/access/AccessControl.cpp b/src/access/AccessControl.cpp index ba149a6a225b54..a223d250529dda 100644 --- a/src/access/AccessControl.cpp +++ b/src/access/AccessControl.cpp @@ -98,6 +98,8 @@ char GetAuthModeStringForLogging(AuthMode authMode) { case AuthMode::kNone: return 'n'; + case AuthMode::kInternalDeviceAccess: + return 'i'; case AuthMode::kPase: return 'p'; case AuthMode::kCase: diff --git a/src/access/AuthMode.h b/src/access/AuthMode.h index c5a2d76820855a..eadaec1d1da9cf 100644 --- a/src/access/AuthMode.h +++ b/src/access/AuthMode.h @@ -27,10 +27,11 @@ namespace Access { // Auth mode should have only one value expressed, which should not be None. enum class AuthMode : uint8_t { - kNone = 0, - kPase = 1 << 5, - kCase = 1 << 6, - kGroup = 1 << 7 + kNone = 0, + kInternalDeviceAccess = 1 << 4, // Not part of an external interaction + kPase = 1 << 5, + kCase = 1 << 6, + kGroup = 1 << 7 }; } // namespace Access diff --git a/src/app/dynamic_server/AccessControl.cpp b/src/app/dynamic_server/AccessControl.cpp index 75385f49308792..17298956eaf51a 100644 --- a/src/app/dynamic_server/AccessControl.cpp +++ b/src/app/dynamic_server/AccessControl.cpp @@ -63,7 +63,8 @@ class AccessControlDelegate : public Access::AccessControl::Delegate return CHIP_ERROR_ACCESS_DENIED; } - if (subjectDescriptor.authMode != AuthMode::kCase && subjectDescriptor.authMode != AuthMode::kPase) + if (subjectDescriptor.authMode != AuthMode::kCase && subjectDescriptor.authMode != AuthMode::kPase && + subjectDescriptor.authMode != AuthMode::kInternalDeviceAccess) { // No idea who is asking; deny for now. return CHIP_ERROR_ACCESS_DENIED; From cdd492bfd956d7016a74553ca85e02a4c023389f Mon Sep 17 00:00:00 2001 From: Alex Sirko <10052495+asirko-soft@users.noreply.github.com> Date: Fri, 31 Jan 2025 17:31:24 +0000 Subject: [PATCH 30/36] TC-FLABEL-2.1 python test (#36744) * implement TC_FLABEL_2_1 with Python * use write_single_attribute method instead of WriteAttribute, remove debug logging * apply linter suggestion * replace @async_test_body with @run_if_endpoint_matches * address review comments * remove unused import * add description * add checks as per the test plan to check that LabelList tuples are of type string and have a length up to 16 bytes * remove yaml test, now has a Python implementation --- scripts/tests/chiptest/__init__.py | 1 - .../certification/Test_TC_FLABEL_2_1.yaml | 86 -------------- src/app/tests/suites/ciTests.json | 1 - src/python_testing/TC_FLABEL_2_1.py | 110 ++++++++++++++++++ 4 files changed, 110 insertions(+), 88 deletions(-) delete mode 100644 src/app/tests/suites/certification/Test_TC_FLABEL_2_1.yaml create mode 100644 src/python_testing/TC_FLABEL_2_1.py diff --git a/scripts/tests/chiptest/__init__.py b/scripts/tests/chiptest/__init__.py index 5cb891a0144b3e..6d15c68349f5c3 100644 --- a/scripts/tests/chiptest/__init__.py +++ b/scripts/tests/chiptest/__init__.py @@ -207,7 +207,6 @@ def _GetDarwinFrameworkToolUnsupportedTests() -> Set[str]: "Test_TC_DGTHREAD_2_2", # Thread Network Diagnostics is not implemented under darwin. "Test_TC_DGTHREAD_2_3", # Thread Network Diagnostics is not implemented under darwin. "Test_TC_DGTHREAD_2_4", # Thread Network Diagnostics is not implemented under darwin. - "Test_TC_FLABEL_2_1", # darwin-framework-tool does not support writing readonly attributes by name "Test_TC_GRPKEY_2_1", # darwin-framework-tool does not support writing readonly attributes by name "Test_TC_LCFG_2_1", # darwin-framework-tool does not support writing readonly attributes by name "Test_TC_OPCREDS_3_7", # darwin-framework-tool does not support the GetCommissionerRootCertificate command. diff --git a/src/app/tests/suites/certification/Test_TC_FLABEL_2_1.yaml b/src/app/tests/suites/certification/Test_TC_FLABEL_2_1.yaml deleted file mode 100644 index 917e5d6017fc6f..00000000000000 --- a/src/app/tests/suites/certification/Test_TC_FLABEL_2_1.yaml +++ /dev/null @@ -1,86 +0,0 @@ -# Copyright (c) 2021 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. -# Auto-generated scripts for harness use only, please review before automation. The endpoints and cluster names are currently set to default - -name: 98.2.1. [TC-FLABEL-2.1] Fixed Label cluster [DUT-server] - -PICS: - - FLABEL.S - -config: - nodeId: 0x12344321 - cluster: "Fixed Label" - endpoint: 1 - -tests: - - label: "Commission DUT to TH" - cluster: "DelayCommands" - command: "WaitForCommissionee" - arguments: - values: - - name: "nodeId" - value: nodeId - - - label: "Step 1: TH reads LabelList from the DUT" - PICS: FLABEL.S.A0000 - command: "readAttribute" - attribute: "LabelList" - response: - constraints: - type: list - - - label: - "Step 2: TH tries to write LabelList attribute of the DUT by setting - Label = Test_Label, Value= Test_Value" - PICS: FLABEL.S.A0000 - command: "writeAttribute" - attribute: "LabelList" - arguments: - value: [{ Label: "Test_Label", Value: "Test_Value" }] - response: - error: UNSUPPORTED_WRITE - - - label: "Step 3: TH reads LabelList from the DUT" - verification: | - ./chip-tool fixedlabel read label-list 1 0 - Verify that the LabelList value is same as value from step 1 On TH(all-clusters-app) : - - [1651124649.820293][2819:2824] CHIP:TOO: Endpoint: 0 Cluster: 0x0000_0040 Attribute 0x0000_0000 DataVersion: 3688229931 - [1651124649.820478][2819:2824] CHIP:TOO: LabelList: 4 entries - [1651124649.820534][2819:2824] CHIP:TOO: [1]: { - [1651124649.820570][2819:2824] CHIP:TOO: Label: room - [1651124649.820602][2819:2824] CHIP:TOO: Value: bedroom 2 - [1651124649.820636][2819:2824] CHIP:TOO: } - [1651124649.820676][2819:2824] CHIP:TOO: [2]: { - [1651124649.820709][2819:2824] CHIP:TOO: Label: orientation - [1651124649.820741][2819:2824] CHIP:TOO: Value: North - [1651124649.820773][2819:2824] CHIP:TOO: } - [1651124649.820812][2819:2824] CHIP:TOO: [3]: { - [1651124649.820845][2819:2824] CHIP:TOO: Label: floor - [1651124649.820875][2819:2824] CHIP:TOO: Value: 2 - [1651124649.820906][2819:2824] CHIP:TOO: } - [1651124649.820945][2819:2824] CHIP:TOO: [4]: { - [1651124649.820977][2819:2824] CHIP:TOO: Label: direction - [1651124649.821008][2819:2824] CHIP:TOO: Value: up - [1651124649.821039][2819:2824] CHIP:TOO: } - [1651124649.821193][2819:2824] CHIP:EM: Sending Standalone Ack for MessageCounter:2439070 on exchange 10798i - cluster: "LogCommands" - command: "UserPrompt" - PICS: PICS_SKIP_SAMPLE_APP && FLABEL.S.A0000 - arguments: - values: - - name: "message" - value: "Enter 'y' after success" - - name: "expectedValue" - value: "y" diff --git a/src/app/tests/suites/ciTests.json b/src/app/tests/suites/ciTests.json index bf446a38478973..9fa23f8a516aa5 100644 --- a/src/app/tests/suites/ciTests.json +++ b/src/app/tests/suites/ciTests.json @@ -57,7 +57,6 @@ "Test_TC_EEVSEM_3_3" ], "FlowMeasurement": ["Test_TC_FLW_2_1"], - "FixedLabel": ["Test_TC_FLABEL_2_1"], "FanControl": [ "Test_TC_FAN_2_1", "Test_TC_FAN_2_2", diff --git a/src/python_testing/TC_FLABEL_2_1.py b/src/python_testing/TC_FLABEL_2_1.py new file mode 100644 index 00000000000000..39544b734d0db5 --- /dev/null +++ b/src/python_testing/TC_FLABEL_2_1.py @@ -0,0 +1,110 @@ +# +# 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. +# + +# === BEGIN CI TEST ARGUMENTS === +# test-runner-runs: +# run1: +# app: ${ALL_CLUSTERS_APP} +# app-args: --discriminator 1234 --KVS kvs1 --trace-to json:${TRACE_APP}.json +# script-args: > +# --storage-path admin_storage.json +# --commissioning-method on-network +# --discriminator 1234 +# --passcode 20202021 +# --endpoint 1 +# --trace-to json:${TRACE_TEST_JSON}.json +# --trace-to perfetto:${TRACE_TEST_PERFETTO}.perfetto +# factory-reset: true +# quiet: true +# === END CI TEST ARGUMENTS === + +import chip.clusters as Clusters +from chip.interaction_model import Status +from chip.testing.matter_testing import MatterBaseTest, TestStep, default_matter_test_main, has_attribute, run_if_endpoint_matches +from mobly import asserts + + +class Test_TC_FLABEL_2_1(MatterBaseTest): + def pics_TC_FLABEL_2_1(self) -> list[str]: + return ["FLABEL.S"] + + def steps_TC_FLABEL_2_1(self) -> list[TestStep]: + return [ + TestStep(1, "Commission DUT to TH", is_commissioning=True), + TestStep(2, "TH reads LabelList from the DUT", "Read is successful"), + TestStep(3, "TH tries to write LabelList attribute", "Write fails with UNSUPPORTED_WRITE"), + TestStep(4, "Verify LabelList hasn't changed", "LabelList matches initial read") + ] + + def desc_TC_FLABEL_2_1(self) -> str: + return "[TC-FLABEL-2.1] Fixed Label Cluster [DUT-server]" + + @run_if_endpoint_matches(has_attribute(Clusters.FixedLabel.Attributes.LabelList)) + async def test_TC_FLABEL_2_1(self): + # Step 1: Commission DUT (already done) + self.step(1) + + # Step 2: Read LabelList attribute + self.step(2) + initial_labels = await self.read_single_attribute_check_success( + cluster=Clusters.Objects.FixedLabel, + attribute=Clusters.Objects.FixedLabel.Attributes.LabelList + ) + asserts.assert_true(isinstance(initial_labels, list), "LabelList should be a list type") + + # Verify each label in the list meets the requirements + for label_struct in initial_labels: + # Verify label field + asserts.assert_true(isinstance(label_struct.label, str), + "Label field must be a string") + asserts.assert_true(len(label_struct.label.encode('utf-8')) <= 16, + f"Label '{label_struct.label}' exceeds 16 bytes") + + # Verify value field + asserts.assert_true(isinstance(label_struct.value, str), + "Value field must be a string") + asserts.assert_true(len(label_struct.value.encode('utf-8')) <= 16, + f"Value '{label_struct.value}' exceeds 16 bytes") + + # Step 3: Attempt to write LabelList (should fail) + self.step(3) + test_label = Clusters.Objects.FixedLabel.Attributes.LabelList( + [Clusters.Objects.FixedLabel.Structs.LabelStruct( + label="Test_Label", + value="Test_Value" + )] + ) + + # Use write_single_attribute with expect_success=False since we expect it to fail + write_status = await self.write_single_attribute( + attribute_value=test_label, + expect_success=False + ) + asserts.assert_equal(write_status, Status.UnsupportedWrite, "Expected UNSUPPORTED_WRITE status") + + # Step 4: Verify LabelList hasn't changed + self.step(4) + final_labels = await self.read_single_attribute_check_success( + cluster=Clusters.Objects.FixedLabel, + attribute=Clusters.Objects.FixedLabel.Attributes.LabelList + ) + asserts.assert_equal(initial_labels, final_labels, + "LabelList should remain unchanged after write attempt") + + +if __name__ == "__main__": + default_matter_test_main() From 435583e5bf4b09c393f0dcf2bd43ee78e9e2ea9c Mon Sep 17 00:00:00 2001 From: yunhanw-google Date: Fri, 31 Jan 2025 09:43:44 -0800 Subject: [PATCH 31/36] update docker for android (#37341) * update docker for android * update base docker chip build version --- integrations/docker/images/base/chip-build/version | 2 +- .../docker/images/stage-3/chip-build-android/Dockerfile | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/integrations/docker/images/base/chip-build/version b/integrations/docker/images/base/chip-build/version index 1939f7e2b4d3b0..aded04f44ab3e9 100644 --- a/integrations/docker/images/base/chip-build/version +++ b/integrations/docker/images/base/chip-build/version @@ -1 +1 @@ -104 : [Telink] Update Docker image (Zephyr update) +105 : Upgrade android docker with new kotlin/gradle diff --git a/integrations/docker/images/stage-3/chip-build-android/Dockerfile b/integrations/docker/images/stage-3/chip-build-android/Dockerfile index 219e6172902cc1..ea60b3db45074e 100644 --- a/integrations/docker/images/stage-3/chip-build-android/Dockerfile +++ b/integrations/docker/images/stage-3/chip-build-android/Dockerfile @@ -28,11 +28,11 @@ RUN set -x \ # Download and install android command line tool (for installing `sdkmanager`) RUN set -x \ - && wget -O /tmp/android-tools.zip https://dl.google.com/android/repository/sdk-tools-linux-3859397.zip \ + && wget -O /tmp/cmdline-tools.zip https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip \ && cd /opt/android/sdk \ - && unzip /tmp/android-tools.zip \ - && rm -f /tmp/android-tools.zip \ - && test -d /opt/android/sdk/tools \ + && unzip /tmp/cmdline-tools.zip \ + && rm -f /tmp/cmdline-tools.zip \ + && test -d /opt/android/sdk/cmdline-tools \ && : # last line # Download and install android NDK From 26341b4e9192146b0ac1c34a612d5ffc372e3fa5 Mon Sep 17 00:00:00 2001 From: Andrei Litvin Date: Fri, 31 Jan 2025 16:41:14 -0500 Subject: [PATCH 32/36] Make the wildcard subscription test in TestReadInteraction more maintainable. (#37338) * Prepare for capture testing... * Update test to look more sane * Update includes * More includes fixes * One more update * Restyled by clang-format * Fix types to make arm/xtensa compiles happy * Restyled by clang-format * Make clang tidy happy * Restyled by clang-format * Even more readable code * Restyled by clang-format * Update src/app/tests/TestReadInteraction.cpp Co-authored-by: Andy Salisbury * Update src/app/tests/TestReadInteraction.cpp Co-authored-by: Andy Salisbury * Update src/app/tests/TestReadInteraction.cpp Co-authored-by: Andy Salisbury * Removed odd todo --------- Co-authored-by: Andrei Litvin Co-authored-by: Restyled.io Co-authored-by: Andy Salisbury --- src/app/tests/TestReadInteraction.cpp | 344 +++++++++++++++++++++++--- 1 file changed, 312 insertions(+), 32 deletions(-) diff --git a/src/app/tests/TestReadInteraction.cpp b/src/app/tests/TestReadInteraction.cpp index b56db3e82dc1b5..b9313d896fd499 100644 --- a/src/app/tests/TestReadInteraction.cpp +++ b/src/app/tests/TestReadInteraction.cpp @@ -15,8 +15,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#include + #include #include +#include #include #include #include @@ -30,6 +33,7 @@ #include #include #include +#include #include #include #include @@ -37,13 +41,19 @@ #include #include #include +#include +#include +#include #include #include #include #include -#include + +#include namespace { +using namespace chip::app::Clusters::Globals::Attributes; + uint8_t gDebugEventBuffer[128]; uint8_t gInfoEventBuffer[128]; uint8_t gCritEventBuffer[128]; @@ -71,7 +81,6 @@ static bool sUsingSubSync = false; const chip::Test::MockNodeConfig & TestMockNodeConfig() { using namespace chip::app; - using namespace chip::app::Clusters::Globals::Attributes; using namespace chip::Test; // clang-format off @@ -167,6 +176,36 @@ void GenerateEvents() EXPECT_EQ(logMgmt.LogEvent(&testEventGenerator, options2, eid2), CHIP_NO_ERROR); } +/// Represents an expected attribute capture +class AttributeCaptureAssertion +{ +public: + constexpr AttributeCaptureAssertion(chip::EndpointId ep, chip::ClusterId cl, chip::AttributeId at, + std::optional listSize = std::nullopt) : + mEndpoint(ep), + mCluster(cl), mAttribute(at), mListSize(listSize) + {} + + chip::app::ConcreteAttributePath Path() const { return chip::app::ConcreteAttributePath(mEndpoint, mCluster, mAttribute); } + + chip::EndpointId Endpoint() const { return mEndpoint; } + chip::ClusterId Cluster() const { return mCluster; } + chip::AttributeId Attribute() const { return mAttribute; } + std::optional ListSize() const { return mListSize; } + + bool Matches(const chip::app::ConcreteAttributePath & path, const std::optional & listSize) const + { + return (Path() == path) && (mListSize == listSize); + } + +private: + // this is split out because ConcreteAttributePath is NOT constexpr + const chip::EndpointId mEndpoint; + const chip::ClusterId mCluster; + const chip::AttributeId mAttribute; + const std::optional mListSize; +}; + class MockInteractionModelApp : public chip::app::ReadClient::Callback { public: @@ -191,13 +230,19 @@ class MockInteractionModelApp : public chip::app::ReadClient::Callback { if (status.mStatus == chip::Protocols::InteractionModel::Status::Success) { + ChipLogProgress(Test, "Attribute data received 0x%X/" ChipLogFormatMEI "/" ChipLogFormatMEI " Success: LIST: %s", + aPath.mEndpointId, ChipLogValueMEI(aPath.mClusterId), ChipLogValueMEI(aPath.mAttributeId), + aPath.IsListOperation() ? "true" : "false"); mReceivedAttributePaths.push_back(aPath); mNumAttributeResponse++; mGotReport = true; + std::optional listSize = std::nullopt; + if (aPath.IsListItemOperation()) { mNumArrayItems++; + listSize = 1; } else if (aPath.IsListOperation()) { @@ -208,10 +253,18 @@ class MockInteractionModelApp : public chip::app::ReadClient::Callback size_t count = 0; if (chip::TLV::Utilities::Count(*apData, count, /* aRecurse = */ false) == CHIP_NO_ERROR) { + listSize = static_cast(count); mNumArrayItems += static_cast(count); + ChipLogProgress(Test, " List count: %u", static_cast(count)); } } } + mReceivedListSizes.push_back(listSize); + } + else + { + ChipLogError(NotSpecified, "ERROR status for 0x%X/" ChipLogFormatMEI "/" ChipLogFormatMEI, aPath.mEndpointId, + ChipLogValueMEI(aPath.mClusterId), ChipLogValueMEI(aPath.mAttributeId)); } mLastStatusReceived = status; } @@ -242,6 +295,132 @@ class MockInteractionModelApp : public chip::app::ReadClient::Callback } } + // Log the current captures in a code-like format, to more easily update tests + void LogCaptures(const char * heading) + { + ChipLogProgress(Test, "Captured attributes (%s):", heading); + + for (unsigned i = 0; i < mReceivedAttributePaths.size(); i++) + { + const auto & path = mReceivedAttributePaths[i]; + chip::StringBuilder<128> argsBuffer; + + if (path.mEndpointId >= 0xff) + { + argsBuffer.AddFormat("0x%X, ", path.mEndpointId); + } + else + { + argsBuffer.AddFormat("%u, ", path.mEndpointId); + } + + if (path.mClusterId >= 0xff) + { + argsBuffer.AddFormat("0x%lX, ", static_cast(path.mClusterId)); + } + else + { + argsBuffer.AddFormat("%lu, ", static_cast(path.mClusterId)); + } + + switch (path.mAttributeId) + { + case ClusterRevision::Id: + argsBuffer.Add("ClusterRevision::Id"); + break; + case FeatureMap::Id: + argsBuffer.Add("FeatureMap::Id"); + break; + case GeneratedCommandList::Id: + argsBuffer.Add("GeneratedCommandList::Id"); + break; + case AcceptedCommandList::Id: + argsBuffer.Add("AcceptedCommandList::Id"); + break; + case AttributeList::Id: + argsBuffer.Add("AttributeList::Id"); + break; + default: + if (path.mAttributeId >= 0xff) + { + argsBuffer.AddFormat("0x%lX", static_cast(path.mAttributeId)); + } + else + { + argsBuffer.AddFormat("%lu", static_cast(path.mAttributeId)); + } + break; + } + + auto listSize = mReceivedListSizes[i]; + if (listSize.has_value()) + { + argsBuffer.AddFormat(", /* listSize = */ %u", listSize.value()); + } + + ChipLogProgress(Test, " AttributeCaptureAssertion(%s),", argsBuffer.c_str()); + } + } + + void Reset() + { + mNumDataElementIndex = 0; + mGotEventResponse = false; + mNumReadEventFailureStatusReceived = 0; + mNumAttributeResponse = 0; + mNumArrayItems = 0; + mGotReport = false; + mReadError = false; + mError = CHIP_NO_ERROR; + mReceivedAttributePaths.clear(); + mReceivedListSizes.clear(); + } + + bool CapturesMatchExactly(chip::Span captures) + { + if (captures.size() != mReceivedAttributePaths.size()) + { + ChipLogError(Test, "Captures do not match: expected %u, got %u instead", static_cast(captures.size()), + static_cast(mReceivedAttributePaths.size())); + return false; + } + + for (unsigned i = 0; i < mReceivedAttributePaths.size(); i++) + { + if (captures[i].Matches(mReceivedAttributePaths[i], mReceivedListSizes[i])) + { + continue; + } + + ChipLogError(Test, "Failure on expected capture index %u:", i); + + chip::StringBuilder<128> buffer; + buffer.AddFormat("0x%X/" ChipLogFormatMEI "/" ChipLogFormatMEI "", captures[i].Endpoint(), + ChipLogValueMEI(captures[i].Cluster()), ChipLogValueMEI(captures[i].Attribute())); + auto listSize = captures[i].ListSize(); + if (listSize.has_value()) + { + buffer.AddFormat(" - list of %u items", *listSize); + } + + ChipLogError(Test, " Expected: %s", buffer.c_str()); + + buffer.Reset(); + buffer.AddFormat("0x%X/" ChipLogFormatMEI "/" ChipLogFormatMEI "", mReceivedAttributePaths[i].mEndpointId, + ChipLogValueMEI(mReceivedAttributePaths[i].mClusterId), + ChipLogValueMEI(mReceivedAttributePaths[i].mEndpointId)); + listSize = mReceivedListSizes[i]; + if (listSize.has_value()) + { + buffer.AddFormat(" - list of %u items", *listSize); + } + ChipLogError(Test, " Actual: %s", buffer.c_str()); + return false; + } + + return true; + } + int mNumDataElementIndex = 0; bool mGotEventResponse = false; int mNumReadEventFailureStatusReceived = 0; @@ -253,6 +432,11 @@ class MockInteractionModelApp : public chip::app::ReadClient::Callback chip::app::StatusIB mLastStatusReceived; CHIP_ERROR mError = CHIP_NO_ERROR; std::vector mReceivedAttributePaths; + + // For every received attribute path, report the size of the underlying list + // - nullopt if NOT a list + // - list size (including 0) if a list + std::vector> mReceivedListSizes; }; // @@ -1365,11 +1549,14 @@ void TestReadInteraction::TestReadChunking() DrainAndServiceIO(); - // We get one chunk with 4 array elements, and then one chunk per - // element, and the total size of the array is - // kMockAttribute4ListLength. - EXPECT_EQ(delegate.mNumAttributeResponse, 1 + (kMockAttribute4ListLength - 4)); - EXPECT_EQ(delegate.mNumArrayItems, 6); + delegate.LogCaptures("TestReadChunking:"); + + constexpr AttributeCaptureAssertion kExpectedResponses[] = { + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, 0xFFF10004, /* listSize = */ 4), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, 0xFFF10004, /* listSize = */ 1), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, 0xFFF10004, /* listSize = */ 1), + }; + ASSERT_TRUE(delegate.CapturesMatchExactly(chip::Span(kExpectedResponses))); EXPECT_TRUE(delegate.mGotReport); EXPECT_FALSE(delegate.mReadError); // By now we should have closed all exchanges and sent all pending acks, so @@ -2639,21 +2826,86 @@ void TestReadInteraction::TestSubscribeWildcard() // - cluster 0xFFF1'FC03 (2 attributes) // - cluster 0xFFF1'FC04 (2 attributes) // - // For at total of 29 attributes. There are two wildcard subscription - // paths, for a total of 58 attributes. // + // Actual chunk placement is execution defined, however generally // Attribute 0xFFFC::0xFFF1'FC02::0xFFF1'0004 (kMockEndpoint3::MockClusterId(2)::MockAttributeId(4)) - // is a list of kMockAttribute4ListLength elements of size 256 bytes each, which cannot fit in a single - // packet, so gets list chunking applied to it. + // is a list of kMockAttribute4ListLength of size 256 bytes each, which cannot fit + // in a single packet, so chunking is applied (we get a list and then individual elements as + // single items) // - // Because delegate.mNumAttributeResponse counts AttributeDataIB instances, not attributes, - // the count will depend on exactly how the list for attribute - // 0xFFFC::0xFFF1'FC02::0xFFF1'0004 is chunked. For each of the two instances of that attribute - // in the response, there will be one AttributeDataIB for the start of the list (which will include - // some number of 256-byte elements), then one AttributeDataIB for each of the remaining elements. - constexpr size_t kExpectedAttributeResponse = 29 * 2 + (kMockAttribute4ListLength - 4) + (kMockAttribute4ListLength - 4); - EXPECT_EQ((unsigned) delegate.mNumAttributeResponse, kExpectedAttributeResponse); - EXPECT_EQ(delegate.mNumArrayItems, 12); + // The assertions below expect a specific order verified as ok (updates should verify + // that the updates make sense) + + delegate.LogCaptures("TestSubscribeWildcard: initial subscription"); + + constexpr AttributeCaptureAssertion kExpectedResponses[] = { + AttributeCaptureAssertion(0xFFFE, 0xFFF1FC01, ClusterRevision::Id), + AttributeCaptureAssertion(0xFFFE, 0xFFF1FC01, FeatureMap::Id), + AttributeCaptureAssertion(0xFFFE, 0xFFF1FC02, ClusterRevision::Id), + AttributeCaptureAssertion(0xFFFE, 0xFFF1FC02, FeatureMap::Id), + AttributeCaptureAssertion(0xFFFE, 0xFFF1FC02, 0xFFF10001), + AttributeCaptureAssertion(0xFFFD, 0xFFF1FC01, ClusterRevision::Id), + AttributeCaptureAssertion(0xFFFD, 0xFFF1FC01, FeatureMap::Id), + AttributeCaptureAssertion(0xFFFD, 0xFFF1FC02, ClusterRevision::Id), + AttributeCaptureAssertion(0xFFFD, 0xFFF1FC02, FeatureMap::Id), + AttributeCaptureAssertion(0xFFFD, 0xFFF1FC02, 0xFFF10001), + AttributeCaptureAssertion(0xFFFD, 0xFFF1FC02, 0xFFF10002), + AttributeCaptureAssertion(0xFFFD, 0xFFF1FC03, ClusterRevision::Id), + AttributeCaptureAssertion(0xFFFD, 0xFFF1FC03, FeatureMap::Id), + AttributeCaptureAssertion(0xFFFD, 0xFFF1FC03, 0xFFF10001), + AttributeCaptureAssertion(0xFFFD, 0xFFF1FC03, 0xFFF10002), + AttributeCaptureAssertion(0xFFFD, 0xFFF1FC03, 0xFFF10003), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC01, ClusterRevision::Id), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC01, FeatureMap::Id), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC01, 0xFFF10001), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, ClusterRevision::Id), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, FeatureMap::Id), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, 0xFFF10001), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, 0xFFF10002), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, 0xFFF10003), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, 0xFFF10004, /* listSize = */ 4), + // Chunking here + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, 0xFFF10004, /* listSize = */ 1), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, 0xFFF10004, /* listSize = */ 1), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC03, ClusterRevision::Id), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC03, FeatureMap::Id), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC04, ClusterRevision::Id), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC04, FeatureMap::Id), + AttributeCaptureAssertion(0xFFFE, 0xFFF1FC01, ClusterRevision::Id), + AttributeCaptureAssertion(0xFFFE, 0xFFF1FC01, FeatureMap::Id), + AttributeCaptureAssertion(0xFFFE, 0xFFF1FC02, ClusterRevision::Id), + AttributeCaptureAssertion(0xFFFE, 0xFFF1FC02, FeatureMap::Id), + AttributeCaptureAssertion(0xFFFE, 0xFFF1FC02, 0xFFF10001), + AttributeCaptureAssertion(0xFFFD, 0xFFF1FC01, ClusterRevision::Id), + AttributeCaptureAssertion(0xFFFD, 0xFFF1FC01, FeatureMap::Id), + AttributeCaptureAssertion(0xFFFD, 0xFFF1FC02, ClusterRevision::Id), + AttributeCaptureAssertion(0xFFFD, 0xFFF1FC02, FeatureMap::Id), + AttributeCaptureAssertion(0xFFFD, 0xFFF1FC02, 0xFFF10001), + AttributeCaptureAssertion(0xFFFD, 0xFFF1FC02, 0xFFF10002), + AttributeCaptureAssertion(0xFFFD, 0xFFF1FC03, ClusterRevision::Id), + AttributeCaptureAssertion(0xFFFD, 0xFFF1FC03, FeatureMap::Id), + AttributeCaptureAssertion(0xFFFD, 0xFFF1FC03, 0xFFF10001), + AttributeCaptureAssertion(0xFFFD, 0xFFF1FC03, 0xFFF10002), + AttributeCaptureAssertion(0xFFFD, 0xFFF1FC03, 0xFFF10003), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC01, ClusterRevision::Id), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC01, FeatureMap::Id), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC01, 0xFFF10001), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, ClusterRevision::Id), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, FeatureMap::Id), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, 0xFFF10001), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, 0xFFF10002), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, 0xFFF10003), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, 0xFFF10004, /* listSize = */ 4), + // Chunking here + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, 0xFFF10004, /* listSize = */ 1), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, 0xFFF10004, /* listSize = */ 1), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC03, ClusterRevision::Id), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC03, FeatureMap::Id), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC04, ClusterRevision::Id), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC04, FeatureMap::Id), + }; + + ASSERT_TRUE(delegate.CapturesMatchExactly(chip::Span(kExpectedResponses))); EXPECT_EQ(engine->GetNumActiveReadHandlers(ReadHandler::InteractionType::Subscribe), 1u); ASSERT_NE(engine->ActiveHandlerAt(0), nullptr); delegate.mpReadHandler = engine->ActiveHandlerAt(0); @@ -2678,10 +2930,9 @@ void TestReadInteraction::TestSubscribeWildcard() } // Set a endpoint dirty + ChipLogProgress(NotSpecified, "Testing updates after dirty path setting"); { - delegate.mGotReport = false; - delegate.mNumAttributeResponse = 0; - delegate.mNumArrayItems = 0; + delegate.Reset(); AttributePathParams dirtyPath; dirtyPath.mEndpointId = chip::Test::kMockEndpoint3; @@ -2700,16 +2951,45 @@ void TestReadInteraction::TestSubscribeWildcard() } while (last != delegate.mNumAttributeResponse); // Mock endpoint3 has 13 attributes in total, and we subscribed twice. - // And attribute 3/2/4 is a list with 6 elements and list chunking - // is applied to it, but the way the packet boundaries fall we get two of - // its items as a single list, followed by 4 more items for one - // of our subscriptions, and 3 items as a single list followed by 3 - // more items for the other. - // - // Thus we should receive 13*2 + 4 + 3 = 33 attribute data in total. - ChipLogError(DataManagement, "RESPO: %d\n", delegate.mNumAttributeResponse); - EXPECT_EQ(delegate.mNumAttributeResponse, 33); - EXPECT_EQ(delegate.mNumArrayItems, 12); + delegate.LogCaptures("TestSubscribeWildcard: after dirty"); + constexpr AttributeCaptureAssertion kExpectedResponsesAfterDirty[] = { + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC01, ClusterRevision::Id), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC01, FeatureMap::Id), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC01, 0xFFF10001), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, ClusterRevision::Id), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, FeatureMap::Id), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, 0xFFF10001), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, 0xFFF10002), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, 0xFFF10003), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, 0xFFF10004, /* listSize = */ 3), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, 0xFFF10004, /* listSize = */ 1), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, 0xFFF10004, /* listSize = */ 1), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, 0xFFF10004, /* listSize = */ 1), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC03, ClusterRevision::Id), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC03, FeatureMap::Id), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC04, ClusterRevision::Id), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC04, FeatureMap::Id), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC01, ClusterRevision::Id), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC01, FeatureMap::Id), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC01, 0xFFF10001), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, ClusterRevision::Id), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, FeatureMap::Id), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, 0xFFF10001), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, 0xFFF10002), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, 0xFFF10003), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, 0xFFF10004, /* listSize = */ 2), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, 0xFFF10004, /* listSize = */ 1), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, 0xFFF10004, /* listSize = */ 1), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, 0xFFF10004, /* listSize = */ 1), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC02, 0xFFF10004, /* listSize = */ 1), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC03, ClusterRevision::Id), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC03, FeatureMap::Id), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC04, ClusterRevision::Id), + AttributeCaptureAssertion(0xFFFC, 0xFFF1FC04, FeatureMap::Id), + + }; + + ASSERT_TRUE(delegate.CapturesMatchExactly(chip::Span(kExpectedResponsesAfterDirty))); } } From c56eb2bcf565fdc5e18e6c113d149534b0c5a301 Mon Sep 17 00:00:00 2001 From: Andrei Litvin Date: Fri, 31 Jan 2025 17:14:30 -0500 Subject: [PATCH 33/36] Validate for a valid cluster path when Invoke is called (#37207) * Fix invoke verification of data existence of cluster and endpoint * Add unit test for codegen logic issue * Add integration test for return codes * Restule * Remove odd comment * Remove unused import * Use asserts fail * Add unit test that checks invalid cluster return code as well * Fix comment * Code review feedback: listing of commands should fail if the cluster does not exist * Update src/data-model-providers/codegen/CodegenDataModelProvider.cpp Co-authored-by: Boris Zbarsky * Update src/data-model-providers/codegen/CodegenDataModelProvider.cpp Co-authored-by: Boris Zbarsky * Update src/data-model-providers/codegen/CodegenDataModelProvider.cpp Co-authored-by: Boris Zbarsky * Updated comment * Try to reduce amount of code overhead for extra validation check * Update logic yet again since just checking for null fails unit tests and having unit tests seems reasonable * Restyle * Update src/data-model-providers/codegen/EmberMetadata.h Co-authored-by: Boris Zbarsky * Update src/data-model-providers/codegen/EmberMetadata.h Co-authored-by: Boris Zbarsky * Update src/data-model-providers/codegen/CodegenDataModelProvider.cpp Co-authored-by: Boris Zbarsky * Update comment * Update comment * Update based on code review ... if we cannot enforce an interface, we document. Not happy and hoping we can improve in the future --------- Co-authored-by: Boris Zbarsky Co-authored-by: Andrei Litvin --- src/app/data-model-provider/Provider.h | 10 +++ .../codegen/CodegenDataModelProvider.cpp | 17 +++- .../codegen/EmberMetadata.cpp | 29 +++++-- .../codegen/EmberMetadata.h | 9 ++ .../tests/TestCodegenModelViaMocks.cpp | 85 ++++++++++++++++++- src/python_testing/TestInvokeReturnCodes.py | 81 ++++++++++++++++++ 6 files changed, 218 insertions(+), 13 deletions(-) create mode 100644 src/python_testing/TestInvokeReturnCodes.py diff --git a/src/app/data-model-provider/Provider.h b/src/app/data-model-provider/Provider.h index 13d5a4a4f55e7c..530911b484fcc0 100644 --- a/src/app/data-model-provider/Provider.h +++ b/src/app/data-model-provider/Provider.h @@ -85,6 +85,16 @@ class Provider : public ProviderMetadataTree /// This includes cases where command handling and value return will be done asynchronously. /// - returning a value other than Success implies an error reply (error and data are mutually exclusive) /// + /// Preconditions: + /// - `request.path` MUST be valid: Invoke` is only guaranteed to function correctly for + /// VALID paths (i.e. use `ProviderMetadataTree::AcceptedCommands` to check). This is + /// because we assume ACL or flags (like timed invoke) have to happen before invoking + /// this command. + /// - TODO: as interfaces are updated, we may want to make the above requirement more + /// relaxed, as it seems desirable for users of this interface to have guaranteed + /// behavior (like error on invalid paths) where as today this seems unclear as some + /// command intercepts do not validate if the path is valid per endpoints. + /// /// Return value expectations: /// - if a response has been placed into `handler` then std::nullopt MUST be returned. In particular /// note that CHIP_NO_ERROR is NOT the same as std::nullopt: diff --git a/src/data-model-providers/codegen/CodegenDataModelProvider.cpp b/src/data-model-providers/codegen/CodegenDataModelProvider.cpp index a3889fb1e25ebb..74fc5b769189a5 100644 --- a/src/data-model-providers/codegen/CodegenDataModelProvider.cpp +++ b/src/data-model-providers/codegen/CodegenDataModelProvider.cpp @@ -14,6 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +#include "data-model-providers/codegen/EmberMetadata.h" #include #include @@ -324,6 +325,12 @@ const EmberAfCluster * CodegenDataModelProvider::FindServerCluster(const Concret CHIP_ERROR CodegenDataModelProvider::AcceptedCommands(const ConcreteClusterPath & path, DataModel::ListBuilder & builder) { + // Some CommandHandlerInterface instances are registered of ALL endpoints, so make sure first that + // the cluster actually exists on this endpoint before asking the CommandHandlerInterface whether it + // supports the command. + const EmberAfCluster * serverCluster = FindServerCluster(path); + VerifyOrReturnError(serverCluster != nullptr, CHIP_ERROR_NOT_FOUND); + CommandHandlerInterface * interface = CommandHandlerInterfaceRegistry::Instance().GetCommandHandler(path.mEndpointId, path.mClusterId); if (interface != nullptr) @@ -377,8 +384,6 @@ CHIP_ERROR CodegenDataModelProvider::AcceptedCommands(const ConcreteClusterPath VerifyOrReturnError(err == CHIP_ERROR_NOT_IMPLEMENTED, err); } - const EmberAfCluster * serverCluster = FindServerCluster(path); - VerifyOrReturnError(serverCluster != nullptr, CHIP_ERROR_NOT_FOUND); VerifyOrReturnError(serverCluster->acceptedCommandList != nullptr, CHIP_NO_ERROR); const chip::CommandId * endOfList = serverCluster->acceptedCommandList; @@ -404,6 +409,12 @@ CHIP_ERROR CodegenDataModelProvider::AcceptedCommands(const ConcreteClusterPath CHIP_ERROR CodegenDataModelProvider::GeneratedCommands(const ConcreteClusterPath & path, DataModel::ListBuilder & builder) { + // Some CommandHandlerInterface instances are registered of ALL endpoints, so make sure first that + // the cluster actually exists on this endpoint before asking the CommandHandlerInterface whether it + // supports the command. + const EmberAfCluster * serverCluster = FindServerCluster(path); + VerifyOrReturnError(serverCluster != nullptr, CHIP_ERROR_NOT_FOUND); + CommandHandlerInterface * interface = CommandHandlerInterfaceRegistry::Instance().GetCommandHandler(path.mEndpointId, path.mClusterId); if (interface != nullptr) @@ -454,8 +465,6 @@ CHIP_ERROR CodegenDataModelProvider::GeneratedCommands(const ConcreteClusterPath VerifyOrReturnError(err == CHIP_ERROR_NOT_IMPLEMENTED, err); } - const EmberAfCluster * serverCluster = FindServerCluster(path); - VerifyOrReturnError(serverCluster != nullptr, CHIP_ERROR_NOT_FOUND); VerifyOrReturnError(serverCluster->generatedCommandList != nullptr, CHIP_NO_ERROR); const chip::CommandId * endOfList = serverCluster->generatedCommandList; diff --git a/src/data-model-providers/codegen/EmberMetadata.cpp b/src/data-model-providers/codegen/EmberMetadata.cpp index 22e31a569fe702..54842ee6f25882 100644 --- a/src/data-model-providers/codegen/EmberMetadata.cpp +++ b/src/data-model-providers/codegen/EmberMetadata.cpp @@ -56,16 +56,11 @@ FindAttributeMetadata(const ConcreteAttributePath & aPath) if (metadata == nullptr) { - const EmberAfEndpointType * type = emberAfFindEndpointType(aPath.mEndpointId); - if (type == nullptr) - { - return Status::UnsupportedEndpoint; - } + Status status = ValidateClusterPath(aPath); - const EmberAfCluster * cluster = emberAfFindClusterInType(type, aPath.mClusterId, CLUSTER_MASK_SERVER); - if (cluster == nullptr) + if (status != Status::Success) { - return Status::UnsupportedCluster; + return status; } // Since we know the attribute is unsupported and the endpoint/cluster are @@ -76,6 +71,24 @@ FindAttributeMetadata(const ConcreteAttributePath & aPath) return metadata; } +Status ValidateClusterPath(const ConcreteClusterPath & path) +{ + + const EmberAfEndpointType * type = emberAfFindEndpointType(path.mEndpointId); + if (type == nullptr) + { + return Status::UnsupportedEndpoint; + } + + const EmberAfCluster * cluster = emberAfFindClusterInType(type, path.mClusterId, CLUSTER_MASK_SERVER); + if (cluster == nullptr) + { + return Status::UnsupportedCluster; + } + + return Status::Success; +} + } // namespace Ember } // namespace app } // namespace chip diff --git a/src/data-model-providers/codegen/EmberMetadata.h b/src/data-model-providers/codegen/EmberMetadata.h index 64c0bfe736a25f..06e1568be950c7 100644 --- a/src/data-model-providers/codegen/EmberMetadata.h +++ b/src/data-model-providers/codegen/EmberMetadata.h @@ -16,6 +16,7 @@ */ #pragma once +#include "app/ConcreteClusterPath.h" #include #include #include @@ -42,6 +43,14 @@ std::variant FindAttributeMetadata(const ConcreteAttributePath & aPath); +/// Returns the status for a given cluster existing in the ember metadata. +/// +/// Return code will be one of: +/// - Status::UnsupportedEndpoint if the path endpoint does not exist +/// - Status::UnsupportedCluster if the cluster does not exist on the given endpoint +/// - Status::Success if the cluster exists in the ember metadata. +Protocols::InteractionModel::Status ValidateClusterPath(const ConcreteClusterPath & path); + } // namespace Ember } // namespace app } // namespace chip diff --git a/src/data-model-providers/codegen/tests/TestCodegenModelViaMocks.cpp b/src/data-model-providers/codegen/tests/TestCodegenModelViaMocks.cpp index 1045114b7f9b4c..cf156a786d0d53 100644 --- a/src/data-model-providers/codegen/tests/TestCodegenModelViaMocks.cpp +++ b/src/data-model-providers/codegen/tests/TestCodegenModelViaMocks.cpp @@ -218,6 +218,44 @@ class MockAccessControl : public Access::AccessControl::Delegate, public Access: bool IsDeviceTypeOnEndpoint(DeviceTypeId deviceType, EndpointId endpoint) override { return true; } }; +class MockCommandHandler : public CommandHandler +{ +public: + CHIP_ERROR FallibleAddStatus(const ConcreteCommandPath & aRequestCommandPath, + const Protocols::InteractionModel::ClusterStatusCode & aStatus, + const char * context = nullptr) override + { + // MOCK: do not do anything here + return CHIP_NO_ERROR; + } + + void AddStatus(const ConcreteCommandPath & aRequestCommandPath, const Protocols::InteractionModel::ClusterStatusCode & aStatus, + const char * context = nullptr) override + { + // MOCK: do not do anything here + } + + FabricIndex GetAccessingFabricIndex() const override { return 1; } + + CHIP_ERROR AddResponseData(const ConcreteCommandPath & aRequestCommandPath, CommandId aResponseCommandId, + const DataModel::EncodableToTLV & aEncodable) override + { + return CHIP_NO_ERROR; + } + + void AddResponse(const ConcreteCommandPath & aRequestCommandPath, CommandId aResponseCommandId, + const DataModel::EncodableToTLV & aEncodable) override + {} + + bool IsTimedInvoke() const override { return false; } + + void FlushAcksRightAwayOnSlowCommand() override {} + + Access::SubjectDescriptor GetSubjectDescriptor() const override { return kAdminSubjectDescriptor; } + + Messaging::ExchangeContext * GetExchangeContext() const override { return nullptr; } +}; + /// Overrides Enumerate*Commands in the CommandHandlerInterface to allow /// testing of behaviors when command enumeration is done in the interace. class CustomListCommandHandler : public CommandHandlerInterface @@ -229,7 +267,20 @@ class CustomListCommandHandler : public CommandHandlerInterface } ~CustomListCommandHandler() { CommandHandlerInterfaceRegistry::Instance().UnregisterCommandHandler(this); } - void InvokeCommand(HandlerContext & handlerContext) override { handlerContext.SetCommandNotHandled(); } + void InvokeCommand(HandlerContext & handlerContext) override + { + if (mHandleCommand) + { + handlerContext.mCommandHandler.AddStatus(handlerContext.mRequestPath, Protocols::InteractionModel::Status::Success); + handlerContext.SetCommandHandled(); + } + else + { + handlerContext.SetCommandNotHandled(); + } + } + + void SetHandleCommands(bool handle) { mHandleCommand = handle; } CHIP_ERROR EnumerateAcceptedCommands(const ConcreteClusterPath & cluster, CommandIdCallback callback, void * context) override { @@ -268,6 +319,7 @@ class CustomListCommandHandler : public CommandHandlerInterface private: bool mOverrideAccepted = false; bool mOverrideGenerated = false; + bool mHandleCommand = false; std::vector mAccepted; std::vector mGenerated; @@ -1156,6 +1208,37 @@ TEST_F(TestCodegenModelViaMocks, IterateOverGeneratedCommands) ASSERT_TRUE(cmds.data_equal(Span(expectedCommands3))); } +TEST_F(TestCodegenModelViaMocks, AcceptedGeneratedCommandsOnInvalidEndpoints) +{ + UseMockNodeConfig config(gTestNodeConfig); + CodegenDataModelProviderWithContext model; + + // register a CHI on ALL endpoints + CustomListCommandHandler handler(chip::NullOptional, MockClusterId(1)); + handler.SetHandleCommands(true); + + DataModel::ListBuilder generatedBuilder; + DataModel::ListBuilder acceptedBuilder; + + // valid endpoint will result in valid data (even though list is empty) + ASSERT_EQ(model.GeneratedCommands(ConcreteClusterPath(kMockEndpoint1, MockClusterId(1)), generatedBuilder), CHIP_NO_ERROR); + ASSERT_TRUE(generatedBuilder.IsEmpty()); + ASSERT_EQ(model.AcceptedCommands(ConcreteClusterPath(kMockEndpoint1, MockClusterId(1)), acceptedBuilder), CHIP_NO_ERROR); + ASSERT_TRUE(acceptedBuilder.IsEmpty()); + + // Invalid endpoint fails - we will get no commands there (even though CHI is registered) + ASSERT_EQ(model.GeneratedCommands(ConcreteClusterPath(kEndpointIdThatIsMissing, MockClusterId(1)), generatedBuilder), + CHIP_ERROR_NOT_FOUND); + ASSERT_EQ(model.AcceptedCommands(ConcreteClusterPath(kEndpointIdThatIsMissing, MockClusterId(1)), acceptedBuilder), + CHIP_ERROR_NOT_FOUND); + + // same for invalid cluster ID + ASSERT_EQ(model.GeneratedCommands(ConcreteClusterPath(kMockEndpoint1, MockClusterId(0x1123)), generatedBuilder), + CHIP_ERROR_NOT_FOUND); + ASSERT_EQ(model.AcceptedCommands(ConcreteClusterPath(kMockEndpoint1, MockClusterId(0x1123)), acceptedBuilder), + CHIP_ERROR_NOT_FOUND); +} + TEST_F(TestCodegenModelViaMocks, CommandHandlerInterfaceCommandHandling) { diff --git a/src/python_testing/TestInvokeReturnCodes.py b/src/python_testing/TestInvokeReturnCodes.py new file mode 100644 index 00000000000000..cd01f8882338c4 --- /dev/null +++ b/src/python_testing/TestInvokeReturnCodes.py @@ -0,0 +1,81 @@ +# +# Copyright (c) 2025 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. +# + +# === BEGIN CI TEST ARGUMENTS === +# test-runner-runs: +# run1: +# app: ${ALL_CLUSTERS_APP} +# app-args: > +# --discriminator 1234 +# --KVS kvs1 +# --trace-to json:${TRACE_APP}.json +# script-args: > +# --storage-path admin_storage.json +# --commissioning-method on-network +# --discriminator 1234 +# --passcode 20202021 +# --trace-to json:${TRACE_TEST_JSON}.json +# --trace-to perfetto:${TRACE_TEST_PERFETTO}.perfetto +# factory-reset: true +# quiet: true +# === END CI TEST ARGUMENTS === + +import chip.clusters as Clusters +from chip.interaction_model import InteractionModelError, Status +from chip.testing.matter_testing import MatterBaseTest, async_test_body, default_matter_test_main +from mobly import asserts + + +class TestInvokeReturnCodes(MatterBaseTest): + """ + Validates that the invoke action correctly refuses commands + on invalid endpoints. + """ + + @async_test_body + async def test_invalid_endpoint_command(self): + self.print_step(0, "Commissioning - already done") + + self.print_step(1, "Find an invalid endpoint id") + root_parts = await self.read_single_attribute_check_success( + cluster=Clusters.Descriptor, + attribute=Clusters.Descriptor.Attributes.PartsList, + endpoint=0, + ) + endpoints = set(root_parts) + invalid_endpoint_id = 1 + while invalid_endpoint_id in endpoints: + invalid_endpoint_id += 1 + + self.print_step( + 2, + "Attempt to invoke SoftwareDiagnostics::ResetWatermarks on an invalid endpoint", + ) + try: + await self.send_single_cmd( + cmd=Clusters.SoftwareDiagnostics.Commands.ResetWatermarks(), + endpoint=invalid_endpoint_id, + ) + asserts.fail("Unexpected command success on an invalid endpoint") + except InteractionModelError as e: + asserts.assert_equal( + e.status, Status.UnsupportedEndpoint, "Unexpected error returned" + ) + + +if __name__ == "__main__": + default_matter_test_main() From 95ba8a477929ce65c08be4d54ffa3bdf35016375 Mon Sep 17 00:00:00 2001 From: Boris Zbarsky Date: Fri, 31 Jan 2025 20:13:48 -0500 Subject: [PATCH 34/36] Add some descriptions to chip-tool read/subscribe-by-id commands. (#37323) --- .../commands/clusters/ModelCommand.h | 6 ++- .../commands/clusters/ReportCommand.h | 48 ++++++++++++------- 2 files changed, 36 insertions(+), 18 deletions(-) diff --git a/examples/chip-tool/commands/clusters/ModelCommand.h b/examples/chip-tool/commands/clusters/ModelCommand.h index f9ae83aed79f0a..d3e45101b5b830 100644 --- a/examples/chip-tool/commands/clusters/ModelCommand.h +++ b/examples/chip-tool/commands/clusters/ModelCommand.h @@ -28,8 +28,10 @@ class ModelCommand : public CHIPCommand { public: - ModelCommand(const char * commandName, CredentialIssuerCommands * credsIssuerConfig, bool supportsMultipleEndpoints = false) : - CHIPCommand(commandName, credsIssuerConfig), mOnDeviceConnectedCallback(OnDeviceConnectedFn, this), + ModelCommand(const char * commandName, CredentialIssuerCommands * credsIssuerConfig, bool supportsMultipleEndpoints = false, + const char * helpText = nullptr) : + CHIPCommand(commandName, credsIssuerConfig, helpText), + mOnDeviceConnectedCallback(OnDeviceConnectedFn, this), mOnDeviceConnectionFailureCallback(OnDeviceConnectionFailureFn, this), mSupportsMultipleEndpoints(supportsMultipleEndpoints) {} diff --git a/examples/chip-tool/commands/clusters/ReportCommand.h b/examples/chip-tool/commands/clusters/ReportCommand.h index e2c0f1db785900..f9d1d1e9ba33ac 100644 --- a/examples/chip-tool/commands/clusters/ReportCommand.h +++ b/examples/chip-tool/commands/clusters/ReportCommand.h @@ -26,8 +26,9 @@ class ReportCommand : public InteractionModelReports, public ModelCommand, public chip::app::ReadClient::Callback { public: - ReportCommand(const char * commandName, CredentialIssuerCommands * credsIssuerConfig) : - InteractionModelReports(this), ModelCommand(commandName, credsIssuerConfig, /* supportsMultipleEndpoints = */ true) + ReportCommand(const char * commandName, CredentialIssuerCommands * credsIssuerConfig, const char * helpText = nullptr) : + InteractionModelReports(this), + ModelCommand(commandName, credsIssuerConfig, /* supportsMultipleEndpoints = */ true, helpText) {} /////////// ReadClient Callback Interface ///////// @@ -133,8 +134,8 @@ class ReportCommand : public InteractionModelReports, public ModelCommand, publi class ReadCommand : public ReportCommand { protected: - ReadCommand(const char * commandName, CredentialIssuerCommands * credsIssuerConfig) : - ReportCommand(commandName, credsIssuerConfig) + ReadCommand(const char * commandName, CredentialIssuerCommands * credsIssuerConfig, const char * helpText = nullptr) : + ReportCommand(commandName, credsIssuerConfig, helpText) {} void OnDone(chip::app::ReadClient * aReadClient) override @@ -147,8 +148,8 @@ class ReadCommand : public ReportCommand class SubscribeCommand : public ReportCommand { protected: - SubscribeCommand(const char * commandName, CredentialIssuerCommands * credsIssuerConfig) : - ReportCommand(commandName, credsIssuerConfig) + SubscribeCommand(const char * commandName, CredentialIssuerCommands * credsIssuerConfig, const char * helpText = nullptr) : + ReportCommand(commandName, credsIssuerConfig, helpText) {} void OnSubscriptionEstablished(chip::SubscriptionId subscriptionId) override @@ -187,7 +188,8 @@ class SubscribeCommand : public ReportCommand class ReadAttribute : public ReadCommand { public: - ReadAttribute(CredentialIssuerCommands * credsIssuerConfig) : ReadCommand("read-by-id", credsIssuerConfig) + ReadAttribute(CredentialIssuerCommands * credsIssuerConfig) : + ReadCommand("read-by-id", credsIssuerConfig, "Read attributes for the given attribute path (which may include wildcards).") { AddArgument("cluster-ids", 0, UINT32_MAX, &mClusterIds, "Comma-separated list of cluster ids to read from (e.g. \"6\" or \"8,0x201\").\n Allowed to be 0xFFFFFFFF to " @@ -198,7 +200,8 @@ class ReadAttribute : public ReadCommand } ReadAttribute(chip::ClusterId clusterId, CredentialIssuerCommands * credsIssuerConfig) : - ReadCommand("read-by-id", credsIssuerConfig), mClusterIds(1, clusterId) + ReadCommand("read-by-id", credsIssuerConfig, "Read attributes from this cluster; allows wildcard endpoint and attribute."), + mClusterIds(1, clusterId) { AddAttributeIdArgument(); AddCommonArguments(); @@ -245,7 +248,9 @@ class ReadAttribute : public ReadCommand class SubscribeAttribute : public SubscribeCommand { public: - SubscribeAttribute(CredentialIssuerCommands * credsIssuerConfig) : SubscribeCommand("subscribe-by-id", credsIssuerConfig) + SubscribeAttribute(CredentialIssuerCommands * credsIssuerConfig) : + SubscribeCommand("subscribe-by-id", credsIssuerConfig, + "Subscribe to attributes for the given attribute path (which may include wildcards).") { AddArgument("cluster-ids", 0, UINT32_MAX, &mClusterIds, "Comma-separated list of cluster ids to subscribe to (e.g. \"6\" or \"8,0x201\").\n Allowed to be 0xFFFFFFFF " @@ -256,7 +261,9 @@ class SubscribeAttribute : public SubscribeCommand } SubscribeAttribute(chip::ClusterId clusterId, CredentialIssuerCommands * credsIssuerConfig) : - SubscribeCommand("subscribe-by-id", credsIssuerConfig), mClusterIds(1, clusterId) + SubscribeCommand("subscribe-by-id", credsIssuerConfig, + "Subscribe to attributes from this cluster; allows wildcard endpoint and attribute."), + mClusterIds(1, clusterId) { AddAttributeIdArgument(); AddCommonArguments(); @@ -312,7 +319,8 @@ class SubscribeAttribute : public SubscribeCommand class ReadEvent : public ReadCommand { public: - ReadEvent(CredentialIssuerCommands * credsIssuerConfig) : ReadCommand("read-event-by-id", credsIssuerConfig) + ReadEvent(CredentialIssuerCommands * credsIssuerConfig) : + ReadCommand("read-event-by-id", credsIssuerConfig, "Read events for the given event path (which may include wildcards).") { AddArgument("cluster-id", 0, UINT32_MAX, &mClusterIds); AddArgument("event-id", 0, UINT32_MAX, &mEventIds); @@ -322,7 +330,8 @@ class ReadEvent : public ReadCommand } ReadEvent(chip::ClusterId clusterId, CredentialIssuerCommands * credsIssuerConfig) : - ReadCommand("read-event-by-id", credsIssuerConfig), mClusterIds(1, clusterId) + ReadCommand("read-event-by-id", credsIssuerConfig, "Read events from this cluster; allows wildcard endpoint and event."), + mClusterIds(1, clusterId) { AddArgument("event-id", 0, UINT32_MAX, &mEventIds); AddArgument("fabric-filtered", 0, 1, &mFabricFiltered); @@ -356,7 +365,9 @@ class ReadEvent : public ReadCommand class SubscribeEvent : public SubscribeCommand { public: - SubscribeEvent(CredentialIssuerCommands * credsIssuerConfig) : SubscribeCommand("subscribe-event-by-id", credsIssuerConfig) + SubscribeEvent(CredentialIssuerCommands * credsIssuerConfig) : + SubscribeCommand("subscribe-event-by-id", credsIssuerConfig, + "Subscribe to events for the given event path (which may include wildcards).") { AddArgument("cluster-id", 0, UINT32_MAX, &mClusterIds); AddArgument("event-id", 0, UINT32_MAX, &mEventIds); @@ -365,7 +376,9 @@ class SubscribeEvent : public SubscribeCommand } SubscribeEvent(chip::ClusterId clusterId, CredentialIssuerCommands * credsIssuerConfig) : - SubscribeCommand("subscribe-event-by-id", credsIssuerConfig), mClusterIds(1, clusterId) + SubscribeCommand("subscribe-event-by-id", credsIssuerConfig, + "Subscribe to events from this cluster; allows wildcard endpoint and event."), + mClusterIds(1, clusterId) { AddArgument("event-id", 0, UINT32_MAX, &mEventIds); AddCommonArguments(); @@ -447,7 +460,8 @@ class ReadNone : public ReadCommand class ReadAll : public ReadCommand { public: - ReadAll(CredentialIssuerCommands * credsIssuerConfig) : ReadCommand("read-all", credsIssuerConfig) + ReadAll(CredentialIssuerCommands * credsIssuerConfig) : + ReadCommand("read-all", credsIssuerConfig, "Read attributes and events for the given paths (which may include wildcards).") { AddArgument("cluster-ids", 0, UINT32_MAX, &mClusterIds, "Comma-separated list of cluster ids to read from (e.g. \"6\" or \"8,0x201\").\n Allowed to be 0xFFFFFFFF to " @@ -513,7 +527,9 @@ class SubscribeNone : public SubscribeCommand class SubscribeAll : public SubscribeCommand { public: - SubscribeAll(CredentialIssuerCommands * credsIssuerConfig) : SubscribeCommand("subscribe-all", credsIssuerConfig) + SubscribeAll(CredentialIssuerCommands * credsIssuerConfig) : + SubscribeCommand("subscribe-all", credsIssuerConfig, + "Subscribe to attributes and events for the given paths (which may include wildcards).") { AddArgument("cluster-ids", 0, UINT32_MAX, &mClusterIds, "Comma-separated list of cluster ids to read from (e.g. \"6\" or \"8,0x201\").\n Allowed to be 0xFFFFFFFF to " From 94936ea0027e763455b65ff8a2c69dced1129a59 Mon Sep 17 00:00:00 2001 From: Boris Zbarsky Date: Fri, 31 Jan 2025 23:08:07 -0500 Subject: [PATCH 35/36] Add MTRDeviceController API to get a list of node IDs with data stored for them. (#37344) * Add MTRDeviceController API to get a list of node IDs with data stored for them. To avoid races between modifications to _nodesWithResumptionInfo and our reading it, added a lock to protect _nodesWithResumptionInfo. Also added a cached _nodesWithAttributeInfo (protected by the same lock) so that we don't have to do a sync dispatch to our storage queue to return a value from this API. * Fix unit test that was relying on the storage being the source of truth for the node index. --- .../Framework/CHIP/MTRDeviceController.h | 7 + .../Framework/CHIP/MTRDeviceController.mm | 6 + .../CHIP/MTRDeviceControllerDataStore.h | 6 + .../CHIP/MTRDeviceControllerDataStore.mm | 124 +++++++++++++----- .../CHIP/MTRDeviceController_Concrete.mm | 10 ++ .../Framework/CHIP/MTRDeviceController_XPC.mm | 5 + .../CHIP/XPC Protocol/MTRXPCServerProtocol.h | 1 + .../CHIPTests/MTRPerControllerStorageTests.m | 9 ++ .../TestHelpers/MTRTestDeclarations.h | 2 + 9 files changed, 138 insertions(+), 32 deletions(-) diff --git a/src/darwin/Framework/CHIP/MTRDeviceController.h b/src/darwin/Framework/CHIP/MTRDeviceController.h index 8177eda25cd5ba..41c97e805be95d 100644 --- a/src/darwin/Framework/CHIP/MTRDeviceController.h +++ b/src/darwin/Framework/CHIP/MTRDeviceController.h @@ -309,6 +309,13 @@ MTR_AVAILABLE(ios(16.1), macos(13.0), watchos(9.1), tvos(16.1)) */ - (void)resume MTR_AVAILABLE(ios(18.2), macos(15.2), watchos(11.2), tvos(18.2)); +/** + * Returns the list of node IDs for which this controller has stored + * information. Returns empty list if the controller does not have any + * information stored. + */ +- (NSArray *)nodesWithStoredData MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); + /** * Shut down the controller. Calls to shutdown after the first one are NO-OPs. * This must be called, either directly or via shutting down the diff --git a/src/darwin/Framework/CHIP/MTRDeviceController.mm b/src/darwin/Framework/CHIP/MTRDeviceController.mm index 7bdbf2302740e9..93b02c9a693ea7 100644 --- a/src/darwin/Framework/CHIP/MTRDeviceController.mm +++ b/src/darwin/Framework/CHIP/MTRDeviceController.mm @@ -508,6 +508,12 @@ + (void)forceLocalhostAdvertisingOnly } #endif // DEBUG +- (NSArray *)nodesWithStoredData +{ + MTR_ABSTRACT_METHOD(); + return @[]; +} + #pragma mark - MTRDeviceControllerDelegate management // Note these are implemented in the base class so that XPC subclass can use it as well diff --git a/src/darwin/Framework/CHIP/MTRDeviceControllerDataStore.h b/src/darwin/Framework/CHIP/MTRDeviceControllerDataStore.h index f4f38855420345..3feaa5a3e480af 100644 --- a/src/darwin/Framework/CHIP/MTRDeviceControllerDataStore.h +++ b/src/darwin/Framework/CHIP/MTRDeviceControllerDataStore.h @@ -105,6 +105,12 @@ typedef void (^MTRDeviceControllerDataStoreClusterDataHandler)(NSDictionary *)nodesWithStoredData; + @end NS_ASSUME_NONNULL_END diff --git a/src/darwin/Framework/CHIP/MTRDeviceControllerDataStore.mm b/src/darwin/Framework/CHIP/MTRDeviceControllerDataStore.mm index 7ca30225b84f88..8a0057ca1ed9f2 100644 --- a/src/darwin/Framework/CHIP/MTRDeviceControllerDataStore.mm +++ b/src/darwin/Framework/CHIP/MTRDeviceControllerDataStore.mm @@ -19,6 +19,7 @@ // Importing MTRBaseDevice.h for the MTRAttributePath class. Needs to change when https://github.com/project-chip/connectedhomeip/issues/31247 is fixed. #import "MTRBaseDevice.h" #import "MTRLogging_Internal.h" +#import "MTRUnfairLock.h" #include #include @@ -111,6 +112,11 @@ @implementation MTRDeviceControllerDataStore { __weak MTRDeviceController * _controller; // Array of nodes with resumption info, oldest-stored first. NSMutableArray * _nodesWithResumptionInfo; + // Array of nodes with attribute info. + NSMutableArray * _nodesWithAttributeInfo; + // Lock protecting access to the _nodesWithAttributeInfo and + // _nodesWithResumptionInfo arrays. + os_unfair_lock _nodeArrayLock; } - (nullable instancetype)initWithController:(MTRDeviceController *)controller @@ -124,8 +130,10 @@ - (nullable instancetype)initWithController:(MTRDeviceController *)controller _controller = controller; _storageDelegate = storageDelegate; _storageDelegateQueue = storageDelegateQueue; + _nodeArrayLock = OS_UNFAIR_LOCK_INIT; __block id resumptionNodeList; + __block NSArray * nodesWithAttributeInfo; dispatch_sync(_storageDelegateQueue, ^{ @autoreleasepool { // NOTE: controller, not our weak ref, since we know it's still @@ -134,6 +142,8 @@ - (nullable instancetype)initWithController:(MTRDeviceController *)controller valueForKey:sResumptionNodeListKey securityLevel:MTRStorageSecurityLevelSecure sharingType:MTRStorageSharingTypeNotShared]; + + nodesWithAttributeInfo = [self _fetchNodeIndex]; } }); if (resumptionNodeList != nil) { @@ -152,6 +162,12 @@ - (nullable instancetype)initWithController:(MTRDeviceController *)controller _nodesWithResumptionInfo = [[NSMutableArray alloc] init]; } + if (nodesWithAttributeInfo != nil) { + _nodesWithAttributeInfo = [nodesWithAttributeInfo mutableCopy]; + } else { + _nodesWithAttributeInfo = [[NSMutableArray alloc] init]; + } + return self; } @@ -196,6 +212,8 @@ - (void)storeResumptionInfo:(MTRCASESessionResumptionInfo *)resumptionInfo removeValueForKey:ResumptionByResumptionIDKey(oldInfo.resumptionID) securityLevel:MTRStorageSecurityLevelSecure sharingType:MTRStorageSharingTypeNotShared]; + + std::lock_guard lock(self->_nodeArrayLock); [_nodesWithResumptionInfo removeObject:resumptionInfo.nodeID]; } @@ -211,9 +229,14 @@ - (void)storeResumptionInfo:(MTRCASESessionResumptionInfo *)resumptionInfo sharingType:MTRStorageSharingTypeNotShared]; // Update our resumption info node list. - [_nodesWithResumptionInfo addObject:resumptionInfo.nodeID]; + NSArray * valueToStore; + { + std::lock_guard lock(self->_nodeArrayLock); + [_nodesWithResumptionInfo addObject:resumptionInfo.nodeID]; + valueToStore = [_nodesWithResumptionInfo copy]; + } [_storageDelegate controller:controller - storeValue:[_nodesWithResumptionInfo copy] + storeValue:valueToStore forKey:sResumptionNodeListKey securityLevel:MTRStorageSecurityLevelSecure sharingType:MTRStorageSharingTypeNotShared]; @@ -226,7 +249,9 @@ - (void)clearAllResumptionInfo VerifyOrReturn(controller != nil); // No way to call delegate without controller. // Can we do less dispatch? We would need to have a version of - // _findResumptionInfoWithKey that assumes we are already on the right queue. + // _findResumptionInfoWithKey that assumes we are already on the right + // queue. + std::lock_guard lock(_nodeArrayLock); for (NSNumber * nodeID in _nodesWithResumptionInfo) { [self _clearResumptionInfoForNodeID:nodeID controller:controller]; } @@ -240,6 +265,8 @@ - (void)clearResumptionInfoForNodeID:(NSNumber *)nodeID VerifyOrReturn(controller != nil); // No way to call delegate without controller. [self _clearResumptionInfoForNodeID:nodeID controller:controller]; + + std::lock_guard lock(_nodeArrayLock); [_nodesWithResumptionInfo removeObject:nodeID]; } @@ -588,6 +615,20 @@ - (void)unitTestPruneEmptyStoredClusterDataBranches [self _pruneEmptyStoredClusterDataBranches]; }); } + +- (void)unitTestRereadNodeIndex +{ + dispatch_sync(_storageDelegateQueue, ^{ + auto * newIndex = [self _fetchNodeIndex]; + + std::lock_guard lock(self->_nodeArrayLock); + if (newIndex != nil) { + self->_nodesWithAttributeInfo = [newIndex mutableCopy]; + } else { + self->_nodesWithAttributeInfo = [[NSMutableArray alloc] init]; + } + }); +} #endif - (void)_pruneEmptyStoredClusterDataBranches @@ -596,9 +637,8 @@ - (void)_pruneEmptyStoredClusterDataBranches NSUInteger storeFailures = 0; - // Fetch node index - NSArray * nodeIndex = [self _fetchNodeIndex]; - NSMutableArray * nodeIndexCopy = [nodeIndex mutableCopy]; + std::lock_guard lock(self->_nodeArrayLock); + NSArray * nodeIndex = [_nodesWithAttributeInfo copy]; for (NSNumber * nodeID in nodeIndex) { // Fetch endpoint index @@ -638,7 +678,7 @@ - (void)_pruneEmptyStoredClusterDataBranches if (endpointIndexCopy.count) { success = [self _storeEndpointIndex:endpointIndexCopy forNodeID:nodeID]; } else { - [nodeIndexCopy removeObject:nodeID]; + [_nodesWithAttributeInfo removeObject:nodeID]; success = [self _deleteEndpointIndexForNodeID:nodeID]; } if (!success) { @@ -648,16 +688,16 @@ - (void)_pruneEmptyStoredClusterDataBranches } } - if (nodeIndex.count != nodeIndexCopy.count) { + if (nodeIndex.count != _nodesWithAttributeInfo.count) { BOOL success; - if (nodeIndexCopy.count) { - success = [self _storeNodeIndex:nodeIndexCopy]; + if (_nodesWithAttributeInfo.count) { + success = [self _storeNodeIndex:_nodesWithAttributeInfo]; } else { success = [self _deleteNodeIndex]; } if (!success) { storeFailures++; - MTR_LOG_ERROR("Store failed in _pruneEmptyStoredClusterDataBranches for nodeIndex (%lu)", static_cast(nodeIndexCopy.count)); + MTR_LOG_ERROR("Store failed in _pruneEmptyStoredClusterDataBranches for nodeIndex (%lu)", static_cast(_nodesWithAttributeInfo.count)); } } @@ -713,18 +753,19 @@ - (void)clearStoredClusterDataForNodeID:(NSNumber *)nodeID { dispatch_async(_storageDelegateQueue, ^{ [self _clearStoredClusterDataForNodeID:nodeID]; - NSArray * nodeIndex = [self _fetchNodeIndex]; - NSMutableArray * nodeIndexCopy = [nodeIndex mutableCopy]; - [nodeIndexCopy removeObject:nodeID]; - if (nodeIndex.count != nodeIndexCopy.count) { + + std::lock_guard lock(self->_nodeArrayLock); + auto oldCount = self->_nodesWithAttributeInfo.count; + [self->_nodesWithAttributeInfo removeObject:nodeID]; + if (self->_nodesWithAttributeInfo.count != oldCount) { BOOL success; - if (nodeIndexCopy.count) { - success = [self _storeNodeIndex:nodeIndexCopy]; + if (self->_nodesWithAttributeInfo.count) { + success = [self _storeNodeIndex:self->_nodesWithAttributeInfo]; } else { success = [self _deleteNodeIndex]; } if (!success) { - MTR_LOG_ERROR("Store failed in clearStoredAttributesForNodeID for nodeIndex (%lu)", static_cast(nodeIndexCopy.count)); + MTR_LOG_ERROR("Store failed in clearStoredAttributesForNodeID for nodeIndex (%lu)", static_cast(self->_nodesWithAttributeInfo.count)); } } }); @@ -804,12 +845,12 @@ - (void)clearAllStoredClusterData { dispatch_async(_storageDelegateQueue, ^{ // Fetch node index - NSArray * nodeIndex = [self _fetchNodeIndex]; - - for (NSNumber * nodeID in nodeIndex) { + std::lock_guard lock(self->_nodeArrayLock); + for (NSNumber * nodeID in self->_nodesWithAttributeInfo) { [self _clearStoredClusterDataForNodeID:nodeID]; } + [self->_nodesWithAttributeInfo removeAllObjects]; BOOL success = [self _deleteNodeIndex]; if (!success) { MTR_LOG_ERROR("Delete failed for nodeIndex"); @@ -826,14 +867,13 @@ - (void)clearAllStoredClusterData __block NSMutableDictionary * clusterDataToReturn = nil; dispatch_sync(_storageDelegateQueue, ^{ - // Fetch node index - NSArray * nodeIndex = [self _fetchNodeIndex]; + std::lock_guard lock(self->_nodeArrayLock); #if ATTRIBUTE_CACHE_VERBOSE_LOGGING - MTR_LOG("Fetch got %lu values for nodeIndex", static_cast(nodeIndex.count)); + MTR_LOG("Fetch got %lu values for nodeIndex", static_cast(self->_nodesWithAttributeInfo.count)); #endif - if (![nodeIndex containsObject:nodeID]) { + if (![self->_nodesWithAttributeInfo containsObject:nodeID]) { // Sanity check and delete if nodeID exists in index NSArray * endpointIndex = [self _fetchEndpointIndexForNodeID:nodeID]; if (endpointIndex) { @@ -1086,14 +1126,13 @@ - (void)storeClusterData:(NSDictionary } // Check if node index needs updating / creation - NSArray * nodeIndex = [self _fetchNodeIndex]; NSArray * nodeIndexToStore = nil; - if (!nodeIndex) { - // Ensure node index exists - MTR_LOG("No entry found for for nodeIndex - creating for node 0x%016llX", nodeID.unsignedLongLongValue); - nodeIndexToStore = [NSArray arrayWithObject:nodeID]; - } else if (![nodeIndex containsObject:nodeID]) { - nodeIndexToStore = [nodeIndex arrayByAddingObject:nodeID]; + { + std::lock_guard lock(self->_nodeArrayLock); + if (![self->_nodesWithAttributeInfo containsObject:nodeID]) { + [self->_nodesWithAttributeInfo addObject:nodeID]; + nodeIndexToStore = [self->_nodesWithAttributeInfo copy]; + } } if (nodeIndexToStore) { @@ -1206,6 +1245,27 @@ - (void)synchronouslyPerformBlock:(void (^_Nullable)(void))block }); } +- (NSArray *)nodesWithStoredData +{ + // We have three types of stored data: + // + // 1) Attribute data + // 2) Session resumption data + // 3) Device data. + // + // Items 1 and 2 come with node indices. Item 3 does not, but in practice + // we should have device data if and only if we have attribute data for that + // node ID, barring odd error conditions. + // + // TODO: Consider changing how we store device data so we can easily recover + // the relevant set of node IDs. + NSMutableSet * nodeSet = [NSMutableSet set]; + std::lock_guard lock(_nodeArrayLock); + [nodeSet addObjectsFromArray:_nodesWithResumptionInfo]; + [nodeSet addObjectsFromArray:_nodesWithAttributeInfo]; + return [nodeSet allObjects]; +} + @end @implementation MTRCASESessionResumptionInfo diff --git a/src/darwin/Framework/CHIP/MTRDeviceController_Concrete.mm b/src/darwin/Framework/CHIP/MTRDeviceController_Concrete.mm index 4c427e7dd9fbcb..47e3f75884354c 100644 --- a/src/darwin/Framework/CHIP/MTRDeviceController_Concrete.mm +++ b/src/darwin/Framework/CHIP/MTRDeviceController_Concrete.mm @@ -1720,6 +1720,16 @@ - (nullable NSNumber *)neededReadPrivilegeForClusterID:(NSNumber *)clusterID att return nil; } +- (NSArray *)nodesWithStoredData +{ + if (!self.controllerDataStore) { + // We have nothing stored, if we have no way to store. + return @[]; + } + + return [self.controllerDataStore nodesWithStoredData]; +} + @end /** diff --git a/src/darwin/Framework/CHIP/MTRDeviceController_XPC.mm b/src/darwin/Framework/CHIP/MTRDeviceController_XPC.mm index 72c7151355021c..3be424b955b749 100644 --- a/src/darwin/Framework/CHIP/MTRDeviceController_XPC.mm +++ b/src/darwin/Framework/CHIP/MTRDeviceController_XPC.mm @@ -64,6 +64,11 @@ @implementation MTRDeviceController_XPC : (NSNumber *) nodeID, deleteNodeID : (NSNumber *) nodeID) +MTR_DEVICECONTROLLER_SIMPLE_REMOTE_XPC_GETTER(nodesWithStoredData, + NSArray *, + @[], // Default return value + getNodesWithStoredDataWithReply) + - (void)_updateRegistrationInfo { NSMutableDictionary * registrationInfo = [NSMutableDictionary dictionary]; diff --git a/src/darwin/Framework/CHIP/XPC Protocol/MTRXPCServerProtocol.h b/src/darwin/Framework/CHIP/XPC Protocol/MTRXPCServerProtocol.h index 1c57480565dacb..3e80bc4e67770f 100644 --- a/src/darwin/Framework/CHIP/XPC Protocol/MTRXPCServerProtocol.h +++ b/src/darwin/Framework/CHIP/XPC Protocol/MTRXPCServerProtocol.h @@ -77,6 +77,7 @@ MTR_AVAILABLE(ios(18.3), macos(15.3), watchos(11.3), tvos(18.3)) - (oneway void)deviceController:(NSUUID *)controller unregisterNodeID:(NSNumber *)nodeID; - (oneway void)deviceController:(NSUUID *)controller updateControllerConfiguration:(NSDictionary *)controllerState MTR_AVAILABLE(ios(18.3), macos(15.3), watchos(11.3), tvos(18.3)); +- (oneway void)deviceController:(NSUUID *)controller getNodesWithStoredDataWithReply:(void (^)(NSArray *))reply MTR_AVAILABLE(ios(18.4), macos(15.4), watchos(11.4), tvos(18.4)); @end MTR_AVAILABLE(ios(18.3), macos(15.3), watchos(11.3), tvos(18.3)) diff --git a/src/darwin/Framework/CHIPTests/MTRPerControllerStorageTests.m b/src/darwin/Framework/CHIPTests/MTRPerControllerStorageTests.m index 2abfda4fee4b8b..779b42abdfc0be 100644 --- a/src/darwin/Framework/CHIPTests/MTRPerControllerStorageTests.m +++ b/src/darwin/Framework/CHIPTests/MTRPerControllerStorageTests.m @@ -1521,6 +1521,8 @@ - (void)test008_TestDataStoreDirect dispatch_sync(_storageQueue, ^{ [storageDelegate controller:controller storeValues:testBulkValues securityLevel:MTRStorageSecurityLevelSecure sharingType:MTRStorageSharingTypeNotShared]; }); + // Since we messed with the node index, tell the data store to re-sync it's cache. + [controller.controllerDataStore unitTestRereadNodeIndex]; // Verify that the store resulted in the correct values NSDictionary * dataStoreClusterData = [controller.controllerDataStore getStoredClusterDataForNodeID:@(3001)]; XCTAssertEqualObjects(dataStoreClusterData, bulkTestClusterDataDictionary); @@ -1772,6 +1774,10 @@ - (void)test010_TestDataStoreMTRDeviceWithBulkReadWrite XCTAssertNotNil([dataStore findResumptionInfoByNodeID:deviceID]); XCTAssertNotNil([dataStore getStoredDeviceDataForNodeID:deviceID]); XCTAssertNotNil([dataStore getStoredClusterDataForNodeID:deviceID]); + __auto_type * nodesWithStoredData = [controller nodesWithStoredData]; + XCTAssertTrue([nodesWithStoredData containsObject:deviceID]); + XCTAssertEqualObjects(nodesWithStoredData, [dataStore nodesWithStoredData]); + XCTAssertEqualObjects(nodesWithStoredData, deviceAttributeCounts.allKeys); [controller forgetDeviceWithNodeID:deviceID]; deviceAttributeCounts = [controller unitTestGetDeviceAttributeCounts]; @@ -1779,6 +1785,9 @@ - (void)test010_TestDataStoreMTRDeviceWithBulkReadWrite XCTAssertNil([dataStore findResumptionInfoByNodeID:deviceID]); XCTAssertNil([dataStore getStoredDeviceDataForNodeID:deviceID]); XCTAssertNil([dataStore getStoredClusterDataForNodeID:deviceID]); + nodesWithStoredData = [controller nodesWithStoredData]; + XCTAssertFalse([nodesWithStoredData containsObject:deviceID]); + XCTAssertEqualObjects(nodesWithStoredData, [dataStore nodesWithStoredData]); [controller shutdown]; XCTAssertFalse([controller isRunning]); diff --git a/src/darwin/Framework/CHIPTests/TestHelpers/MTRTestDeclarations.h b/src/darwin/Framework/CHIPTests/TestHelpers/MTRTestDeclarations.h index e2a9ae76df964e..3b6c3da0ea65ac 100644 --- a/src/darwin/Framework/CHIPTests/TestHelpers/MTRTestDeclarations.h +++ b/src/darwin/Framework/CHIPTests/TestHelpers/MTRTestDeclarations.h @@ -36,6 +36,7 @@ NS_ASSUME_NONNULL_BEGIN - (void)clearStoredClusterDataForNodeID:(NSNumber *)nodeID; - (void)clearAllStoredClusterData; - (void)unitTestPruneEmptyStoredClusterDataBranches; +- (void)unitTestRereadNodeIndex; - (NSString *)_endpointIndexKeyForNodeID:(NSNumber *)nodeID; - (NSString *)_clusterIndexKeyForNodeID:(NSNumber *)nodeID endpointID:(NSNumber *)endpointID; - (NSString *)_clusterDataKeyForNodeID:(NSNumber *)nodeID endpointID:(NSNumber *)endpointID clusterID:(NSNumber *)clusterID; @@ -43,6 +44,7 @@ NS_ASSUME_NONNULL_BEGIN - (nullable NSArray *)_fetchClusterIndexForNodeID:(NSNumber *)nodeID endpointID:(NSNumber *)endpointID; - (nullable MTRDeviceClusterData *)_fetchClusterDataForNodeID:(NSNumber *)nodeID endpointID:(NSNumber *)endpointID clusterID:(NSNumber *)clusterID; - (nullable NSDictionary *)getStoredDeviceDataForNodeID:(NSNumber *)nodeID; +- (NSArray *)nodesWithStoredData; @end // Declare internal methods for testing From 95d5de5c56d959255633e40c5f788685f2ad10f2 Mon Sep 17 00:00:00 2001 From: James Swan <122404367+swan-amazon@users.noreply.github.com> Date: Fri, 31 Jan 2025 20:15:21 -0800 Subject: [PATCH 36/36] Fix compilation errors for android-chip-tool and java-matter-commissioner (#37346) * Fix compilation errors for android-chip-tool and java-matter-commissioner - Corrected logging statement syntax in `AndroidLogDownloadFromNode.cpp` - Fixed type casting issue for `jlong jremoteNodeId` - Resolved incorrect pointer dereference causing a misplaced operation in `OnTransferCallback` - Updated type casting for `msg_length` in `CHIPP256KeypairBridge.cpp` to use `jsize` instead of `uint32_t` - Adjusted JNI function call to use `static_cast(msg_length)` These changes ensure compatibility with JNI and address type inconsistencies that were causing build failures. Testing: ```bash export PATH=$PATH:/opt/kotlin-compiler-1.8.0/bin export ANDROID_HOME=/opt/Android/sdk/ export ANDROID_NDK_HOME=/opt/Android/sdk/ndk/23.2.8568313 export JAVA_HOME=/Library/Java/JavaVirtualMachines/amazon-corretto-11.jdk/Contents/Home export JAVA_PATH=/Library/Java/JavaVirtualMachines/amazon-corretto-11.jdk/Contents/Home sed 's/ -XX:MaxPermSize=2048m//' examples/android/CHIPTool/gradle.properties > examples/android/CHIPTool/gradle.properties.new && mv examples/android/CHIPTool/gradle.properties.new examples/android/CHIPTool/gradle.properties source scripts/activate.sh ./scripts/build/build_examples.py --target android-arm64-chip-tool --target darwin-arm64-java-matter-controller build ``` * fix: Cast GetFabricIndex() return value to jint in AndroidLogDownloadFromNode The change adds an explicit static cast to convert the FabricIndex return value to jint type when assigning to jFabricIndex variable, maintaining type safety in the JNI interface layer. --- src/controller/java/AndroidLogDownloadFromNode.cpp | 9 +++++---- src/controller/java/CHIPP256KeypairBridge.cpp | 4 ++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/controller/java/AndroidLogDownloadFromNode.cpp b/src/controller/java/AndroidLogDownloadFromNode.cpp index 785567476fc125..f439cd64d881fe 100644 --- a/src/controller/java/AndroidLogDownloadFromNode.cpp +++ b/src/controller/java/AndroidLogDownloadFromNode.cpp @@ -152,7 +152,7 @@ void AndroidLogDownloadFromNode::OnResponseRetrieveLogs(void * context, using namespace chip::app::Clusters::DiagnosticLogs; if (data.status == StatusEnum::kSuccess) { - ChipLogProgress(Controller, "Success. Will receive log from BDX protocol.") + ChipLogProgress(Controller, "Success. Will receive log from BDX protocol."); } else if (data.status == StatusEnum::kExhausted) { @@ -210,8 +210,8 @@ void AndroidLogDownloadFromNode::FinishLogDownloadFromNode(void * context, CHIP_ JniLocalReferenceScope scope(env); jobject jCallback = self->mJavaCallback.ObjectRef(); - jint jFabricIndex = self->mController->GetFabricIndex(); - jlong jremoteNodeId = self->mRemoteNodeId; + jint jFabricIndex = static_cast(self->mController->GetFabricIndex()); + jlong jremoteNodeId = static_cast(self->mRemoteNodeId); VerifyOrExit(env != nullptr, ChipLogError(Controller, "Could not get JNIEnv for current thread")); @@ -274,7 +274,8 @@ void AndroidLogDownloadFromNode::OnTransferCallback(FabricIndex fabricIndex, Nod if (ret != JNI_TRUE) { - ChipLogError(Controller, "Transfer will be rejected.") * errInfoOnFailure = CHIP_ERROR_INTERNAL; + ChipLogError(Controller, "Transfer will be rejected."); + *errInfoOnFailure = CHIP_ERROR_INTERNAL; } } diff --git a/src/controller/java/CHIPP256KeypairBridge.cpp b/src/controller/java/CHIPP256KeypairBridge.cpp index a73eb417203c10..a42c5bc50e87a0 100644 --- a/src/controller/java/CHIPP256KeypairBridge.cpp +++ b/src/controller/java/CHIPP256KeypairBridge.cpp @@ -108,14 +108,14 @@ CHIP_ERROR CHIPP256KeypairBridge::ECDSA_sign_msg(const uint8_t * msg, size_t msg return CHIP_ERROR_INCORRECT_STATE; } - VerifyOrReturnError(CanCastTo(msg_length), CHIP_ERROR_INVALID_ARGUMENT); + VerifyOrReturnError(CanCastTo(msg_length), CHIP_ERROR_INVALID_ARGUMENT); CHIP_ERROR err = CHIP_NO_ERROR; jbyteArray jniMsg; jobject signedResult = nullptr; JNIEnv * env = JniReferences::GetInstance().GetEnvForCurrentThread(); VerifyOrReturnError(env != nullptr, err = CHIP_JNI_ERROR_NO_ENV); - err = JniReferences::GetInstance().N2J_ByteArray(env, msg, static_cast(msg_length), jniMsg); + err = JniReferences::GetInstance().N2J_ByteArray(env, msg, static_cast(msg_length), jniMsg); VerifyOrReturnError(err == CHIP_NO_ERROR, err); VerifyOrReturnError(jniMsg != nullptr, err); VerifyOrReturnError(mDelegate.HasValidObjectRef(), CHIP_ERROR_INCORRECT_STATE);

b2eo$t9x=^vB~Vsd?5j2ef6N7#P1?DO?@i-F z(Kxuzl&-9$8Ynho!8R!qhnSF{+Bn!RaWjrYE0=g#tG-7+$jBNUfod?c^+Naw@2FoT zR^9WluEl#zQ!CNBLX%&)CpPtyZOAWFvli0LS$KnVEv<(uup25E*6;fq+K;0?eiu!; zo71b0ZGP$XgdNY6sL;ahO;}Myod6Era`r@)t4=qEs092mUR=}Gx@mGFLIHn>02=y$ z909s%&A5BZhZkMw5UV}^Hvg0oS_UAy5M`Ai@9pPk1g3qq?jAGh3lbu--B zIcTe(WzKtcz+I(4t+JPGIyp4g(8@lKyNp|z+AjnUM_YoTT0jY0E>d$-MKOu|kLz9X z8fE1G1}DBXY!jfyj3Q!^)q!NOfxXVbsh>*7{gOA=Fwx+ggX#OMn)zP6S($1n*g)Vv zTDrDu6u`j?GfkETC=&VnS=tPPCci@>Niq0SmhG?$4j2CB{q4TaDT-d|ml1X%)WmT! zU58QE2bu%ER2IZ>wa3*$OA4Ed&SpLbaSN!8JD&6c@lW`Sv1-Yb|TRFuRD< zNBT$7hW2!kqE0np=4%({?jzsIq#3F0is$=Q7BELzbeY+R!7Z1d<^#+<`qAv!^>DRs zBxg<)APXp{l8G&Gav(8#uFhXXyI4nuXZOX&r(@UoXJ;i{9OU5$5ETw#{TkZbrkqXF z(jHiT?=$NbvlnS>X*qrX<+Tnkw90<;rSW}4)Jp7#fXHVTi5?`rQn~zOb{!4chfF6R zD17XM)Ee`DBWVORb_54p%Xphjw|e6QT*7ruJ$|tr9WBt}ePp`w0$B4*S?4bWvp>9H zDiXkm3iRloXX$$+UaH#WEe-rU&r_F5-YhKlb(FT^1mrJCHpbHg&3m4F?ebUfVJUMX z2x*mi*@XN~l;H{C6RVH%hAv@w?&TU`=Uw8o%}$A9<_l!#Nfzxm?p9qrflQfT>o48Q z(wGu@!{BNAi{rbF_6bnJ_X2C9wWOXfQM5B2`UbJY&7LN52X#)QT>5`_-B0ZapnR`q zI-#u9)hna#N&NW1XS}jwr3Srho6jO|nMbUYP|~-cZhCl2t8!~1z!uiASe?M5OFu1--Zjx5BF@m|N-o!@Faju?3!di-$RSdKrwm8r zdAz5Osz|Uz6<6npnZha>86mEg)sEYL75TMwNwKD+Unm!C7=RQ z(lGS6s#O*f(fE)Fc^Iy?T9J{^%livtbBEsCmUZDd5@^@O{B+4WgY(YNC3&?sZDZK*$ib5307md$QLN@o= zUIeAk6GgG7M^~N}!{{S+i&8i-;AN-VHfeYzaqV$`-Nj0+)b=`j*i|0eJw9>h@(|FY zEs%L7x+3&_q(aG*;o?U*w(sylZzS`2`WLk&fvmaQm(*Hd>x$d|A7?$1wB_@#?drKR z-R1GisMi2tjuu7t<*z~u-_nu;nsD|JPz}t~^-LsR&bV0#5P2FxfpQs1eDPm-q5aD( zWHtEz$JAR!Mg4v6-vbOV^b8;k5~Fk@-5ru5-Hmj2NOyOqgoKoIr!aH~NQabkgTOt0 z*6;gY_j6#e&ikBw&ffdFUR(CFqeLk&3MN=+jr|?((ljC`g$Gx>L$7l^yavD^$JX6q z9lfBnmgcxlq;6BbkRW|+$F$nmG2_)6V}Vyq5Ta%Gt#X4~*Xlc^WLeId&SRr2t}5-g zt#^tJmUz&(x2NRS*oCm&i|dI9r5?rfe!2KXD-#UWjxJ3wwH9F7yB08jmX=nhx76s= zymqqKOl}DPl*wS$wE%IA){OE6E+X;SNdGw82R2HZ_se`Umv8?0dWJ;dm3k#Ogp1YF(6}E)A+G3u@ zsMQQ$3nn%mh#vDjX)K>tsV-dDXq+^gxRXL zTid}>)UvIV^ZX9QDMXKe)qr}vSl8nY_C_r#qTpS8yxP}sz!uRlch_HJd0cgy6~iF) zmEyh-cz%6R)k9KUTp0u-=^b4g$F^wg^rcJ7X9^Kt=?i~hSu%L}F+P2zIk1mG4haFN zscQBAdSO6NAu7~-W~A3}D4k`hpMPZ1-w9WibQeR4%Y3DpjW^hLl$qxhbdd6nC#p}~`<-NQnI3ix+q+C3k-6;-w&-#v$aJW~k2{y$wplt? z>)_R2(LH7q_xgr3qGBKSKYKTMWbOnpyhFj-Y@Wwb|K83pW+Li+;4yeU%Nq6W2Wt$s z(Qhu{m|j)P;<^?y9XlB7x1%1mK5&BzW&!y|zp@s3oJk{+UVHB`0G3NQ1dsQBeBOsh zx(M|2&Ai3XG4+R}zFHt@a6u6zqL%xnwo5sH`nv9vD#i%25rxxYkG~-cYK00C=Z5Fi z3EZY(+ku%b+FT?Z-y%{O!l~B$*ST~(k5;){$eVR?g@@5*sASk1Elkgh;>eNvWpSBU zTq-^PtF>Ijh_j((MO!i3`wfq~%$eEN$fmrt08&C7U|vdr7i@QA5UNin`U;OA*+m#F zGn+VfmM6NN#