diff --git a/config/esp32/components/chip/CMakeLists.txt b/config/esp32/components/chip/CMakeLists.txt
index d35791cf1ed3c0..f8c6e839bffbb5 100644
--- a/config/esp32/components/chip/CMakeLists.txt
+++ b/config/esp32/components/chip/CMakeLists.txt
@@ -124,6 +124,10 @@ if(CONFIG_DISABLE_IPV4)
     chip_gn_arg_append("chip_inet_config_enable_ipv4"        "false")
 endif()
 
+if(CONFIG_DISABLE_READ_CLIENT)
+    chip_gn_arg_append("chip_enable_read_client"             "false")
+endif()
+
 if(CHIP_CODEGEN_PREGEN_DIR)
     chip_gn_arg_append("chip_code_pre_generated_directory"  "\"${CHIP_CODEGEN_PREGEN_DIR}\"")
 endif()
diff --git a/config/esp32/components/chip/Kconfig b/config/esp32/components/chip/Kconfig
index 99de12afa97e6e..5c871c2d043a30 100644
--- a/config/esp32/components/chip/Kconfig
+++ b/config/esp32/components/chip/Kconfig
@@ -108,6 +108,12 @@ menu "CHIP Core"
             help
                 Matter spec is based on IPv6 communication only. Enabling this option may save some flash/ram.
 
+        config DISABLE_READ_CLIENT
+            bool "Disable read client in Interaction Model"
+            default n
+            help
+                Some device types don't require the read client. Enabling this option may save some flash/ram.
+
         config BUILD_CHIP_TESTS
             bool "Build CHIP tests"
             default n
diff --git a/examples/lighting-app/esp32/sdkconfig.defaults b/examples/lighting-app/esp32/sdkconfig.defaults
index 59c0af656896f0..f87a164ae41dd2 100644
--- a/examples/lighting-app/esp32/sdkconfig.defaults
+++ b/examples/lighting-app/esp32/sdkconfig.defaults
@@ -58,3 +58,6 @@ CONFIG_RMT_SUPPRESS_DEPRECATE_WARN=y
 
 # Enable HKDF in mbedtls
 CONFIG_MBEDTLS_HKDF_C=y
+
+# Disable Read Client
+CONFIG_DISABLE_READ_CLIENT=y
diff --git a/examples/lighting-app/linux/args.gni b/examples/lighting-app/linux/args.gni
index d07e8c87cdb15c..4c205a5cef34a5 100644
--- a/examples/lighting-app/linux/args.gni
+++ b/examples/lighting-app/linux/args.gni
@@ -27,3 +27,5 @@ chip_project_config_include_dirs =
 chip_project_config_include_dirs += [ "${chip_root}/config/standalone" ]
 
 matter_enable_tracing_support = true
+
+chip_enable_read_client = false
diff --git a/src/app/AttributePathParams.h b/src/app/AttributePathParams.h
index adfc77cfe27830..b03153d71c2e2f 100644
--- a/src/app/AttributePathParams.h
+++ b/src/app/AttributePathParams.h
@@ -24,7 +24,9 @@
 
 namespace chip {
 namespace app {
+#if CHIP_CONFIG_ENABLE_READ_CLIENT
 class ReadClient;
+#endif // CHIP_CONFIG_ENABLE_READ_CLIENT
 struct AttributePathParams
 {
     //
diff --git a/src/app/BUILD.gn b/src/app/BUILD.gn
index aade1882cb5f5a..eac13d68a1d004 100644
--- a/src/app/BUILD.gn
+++ b/src/app/BUILD.gn
@@ -58,6 +58,7 @@ buildconfig_header("app_buildconfig") {
     "CHIP_CONFIG_SUBSCRIPTION_TIMEOUT_RESUMPTION=${chip_subscription_timeout_resumption}",
     "CHIP_CONFIG_ENABLE_EVENTLIST_ATTRIBUTE=${enable_eventlist_attribute}",
     "CHIP_CONFIG_ENABLE_ICD_SERVER=${chip_enable_icd_server}",
+    "CHIP_CONFIG_ENABLE_READ_CLIENT=${chip_enable_read_client}",
   ]
 }
 
@@ -76,7 +77,6 @@ static_library("app") {
     "AttributePathExpandIterator.h",
     "AttributePathParams.h",
     "AttributePersistenceProvider.h",
-    "BufferedReadCallback.cpp",
     "CASEClient.cpp",
     "CASEClient.h",
     "CASEClientPool.h",
@@ -84,8 +84,6 @@ static_library("app") {
     "CASESessionManager.h",
     "ChunkedWriteCallback.cpp",
     "ChunkedWriteCallback.h",
-    "ClusterStateCache.cpp",
-    "ClusterStateCache.h",
     "CommandHandler.cpp",
     "CommandResponseHelper.h",
     "CommandSender.cpp",
@@ -179,7 +177,6 @@ static_library("app") {
     "OperationalSessionSetup.cpp",
     "OperationalSessionSetup.h",
     "OperationalSessionSetupPool.h",
-    "ReadClient.cpp",
     "ReadHandler.cpp",
     "RequiredPrivilege.cpp",
     "RequiredPrivilege.h",
@@ -209,6 +206,15 @@ static_library("app") {
     ]
   }
 
+  if (chip_enable_read_client) {
+    sources += [
+      "BufferedReadCallback.cpp",
+      "ClusterStateCache.cpp",
+      "ClusterStateCache.h",
+      "ReadClient.cpp",
+    ]
+  }
+
   public_deps = [
     ":app_config",
     "${chip_root}/src/access",
diff --git a/src/app/BufferedReadCallback.h b/src/app/BufferedReadCallback.h
index 7779446f5a78fd..0616bb09958348 100644
--- a/src/app/BufferedReadCallback.h
+++ b/src/app/BufferedReadCallback.h
@@ -25,6 +25,7 @@
 #include <app/ReadClient.h>
 #include <vector>
 
+#if CHIP_CONFIG_ENABLE_READ_CLIENT
 namespace chip {
 namespace app {
 
@@ -133,3 +134,4 @@ class BufferedReadCallback : public ReadClient::Callback
 
 } // namespace app
 } // namespace chip
+#endif // CHIP_CONFIG_ENABLE_READ_CLIENT
diff --git a/src/app/ClusterStateCache.h b/src/app/ClusterStateCache.h
index e0d5d98d72a5ec..9e08abacde7768 100644
--- a/src/app/ClusterStateCache.h
+++ b/src/app/ClusterStateCache.h
@@ -33,6 +33,7 @@
 #include <set>
 #include <vector>
 
+#if CHIP_CONFIG_ENABLE_READ_CLIENT
 namespace chip {
 namespace app {
 /*
@@ -660,5 +661,6 @@ class ClusterStateCache : protected ReadClient::Callback
     const bool mCacheData                   = true;
 };
 
-}; // namespace app
-}; // namespace chip
+};     // namespace app
+};     // namespace chip
+#endif // CHIP_CONFIG_ENABLE_READ_CLIENT
diff --git a/src/app/InteractionModelEngine.cpp b/src/app/InteractionModelEngine.cpp
index 933b5a4c118254..23aaf9d85d03be 100644
--- a/src/app/InteractionModelEngine.cpp
+++ b/src/app/InteractionModelEngine.cpp
@@ -108,6 +108,7 @@ void InteractionModelEngine::Shutdown()
 
     mReadHandlers.ReleaseAll();
 
+#if CHIP_CONFIG_ENABLE_READ_CLIENT
     // Shut down any subscription clients that are still around.  They won't be
     // able to work after this point anyway, since we're about to drop our refs
     // to them.
@@ -134,6 +135,7 @@ void InteractionModelEngine::Shutdown()
     // After that, we just null out our tracker.
     //
     mpActiveReadClientList = nullptr;
+#endif // CHIP_CONFIG_ENABLE_READ_CLIENT
 
     for (auto & writeHandler : mWriteHandlers)
     {
@@ -254,6 +256,7 @@ uint32_t InteractionModelEngine::GetNumActiveWriteHandlers() const
     return numActive;
 }
 
+#if CHIP_CONFIG_ENABLE_READ_CLIENT
 CHIP_ERROR InteractionModelEngine::ShutdownSubscription(const ScopedNodeId & aPeerNodeId, SubscriptionId aSubscriptionId)
 {
     assertChipStackLockedByCurrentThread();
@@ -311,6 +314,7 @@ void InteractionModelEngine::ShutdownMatchingSubscriptions(const Optional<Fabric
         readClient = nextClient;
     }
 }
+#endif // CHIP_CONFIG_ENABLE_READ_CLIENT
 
 void InteractionModelEngine::OnDone(CommandHandler & apCommandObj)
 {
@@ -794,6 +798,7 @@ CHIP_ERROR InteractionModelEngine::OnTimedRequest(Messaging::ExchangeContext * a
     return handler->OnMessageReceived(apExchangeContext, aPayloadHeader, std::move(aPayload));
 }
 
+#if CHIP_CONFIG_ENABLE_READ_CLIENT
 Status InteractionModelEngine::OnUnsolicitedReportData(Messaging::ExchangeContext * apExchangeContext,
                                                        const PayloadHeader & aPayloadHeader, System::PacketBufferHandle && aPayload)
 {
@@ -849,6 +854,7 @@ Status InteractionModelEngine::OnUnsolicitedReportData(Messaging::ExchangeContex
 
     return Status::InvalidSubscription;
 }
+#endif // CHIP_CONFIG_ENABLE_READ_CLIENT
 
 CHIP_ERROR InteractionModelEngine::OnUnsolicitedMessageReceived(const PayloadHeader & payloadHeader,
                                                                 ExchangeDelegate *& newDelegate)
@@ -892,10 +898,12 @@ CHIP_ERROR InteractionModelEngine::OnMessageReceived(Messaging::ExchangeContext
         status =
             OnReadInitialRequest(apExchangeContext, aPayloadHeader, std::move(aPayload), ReadHandler::InteractionType::Subscribe);
     }
+#if CHIP_CONFIG_ENABLE_READ_CLIENT
     else if (aPayloadHeader.HasMessageType(Protocols::InteractionModel::MsgType::ReportData))
     {
         status = OnUnsolicitedReportData(apExchangeContext, aPayloadHeader, std::move(aPayload));
     }
+#endif // CHIP_CONFIG_ENABLE_READ_CLIENT
     else if (aPayloadHeader.HasMessageType(MsgType::TimedRequest))
     {
         OnTimedRequest(apExchangeContext, aPayloadHeader, std::move(aPayload), status);
@@ -920,11 +928,13 @@ void InteractionModelEngine::OnResponseTimeout(Messaging::ExchangeContext * ec)
                  ChipLogValueExchange(ec));
 }
 
+#if CHIP_CONFIG_ENABLE_READ_CLIENT
 void InteractionModelEngine::AddReadClient(ReadClient * apReadClient)
 {
     apReadClient->SetNextClient(mpActiveReadClientList);
     mpActiveReadClientList = apReadClient;
 }
+#endif // CHIP_CONFIG_ENABLE_READ_CLIENT
 
 bool InteractionModelEngine::TrimFabricForSubscriptions(FabricIndex aFabricIndex, bool aForceEvict)
 {
@@ -1322,6 +1332,7 @@ Protocols::InteractionModel::Status InteractionModelEngine::EnsureResourceForRea
     return Status::Success;
 }
 
+#if CHIP_CONFIG_ENABLE_READ_CLIENT
 void InteractionModelEngine::RemoveReadClient(ReadClient * apReadClient)
 {
     ReadClient * pPrevListItem = nullptr;
@@ -1380,6 +1391,7 @@ bool InteractionModelEngine::InActiveReadClientList(ReadClient * apReadClient)
 
     return false;
 }
+#endif // CHIP_CONFIG_ENABLE_READ_CLIENT
 
 bool InteractionModelEngine::HasConflictWriteRequests(const WriteHandler * apWriteHandler, const ConcreteAttributePath & aPath)
 {
@@ -1738,6 +1750,7 @@ void InteractionModelEngine::OnFabricRemoved(const FabricTable & fabricTable, Fa
         return Loop::Continue;
     });
 
+#if CHIP_CONFIG_ENABLE_READ_CLIENT
     for (auto * readClient = mpActiveReadClientList; readClient != nullptr; readClient = readClient->GetNextClient())
     {
         if (readClient->GetFabricIndex() == fabricIndex)
@@ -1746,6 +1759,7 @@ void InteractionModelEngine::OnFabricRemoved(const FabricTable & fabricTable, Fa
             readClient->Close(CHIP_ERROR_IM_FABRIC_DELETED, false);
         }
     }
+#endif // CHIP_CONFIG_ENABLE_READ_CLIENT
 
     for (auto & handler : mWriteHandlers)
     {
diff --git a/src/app/InteractionModelEngine.h b/src/app/InteractionModelEngine.h
index 6236ff63efc5ec..57e4c66475757f 100644
--- a/src/app/InteractionModelEngine.h
+++ b/src/app/InteractionModelEngine.h
@@ -129,6 +129,7 @@ class InteractionModelEngine : public Messaging::UnsolicitedMessageHandler,
      */
     CASESessionManager * GetCASESessionManager() const { return mpCASESessionMgr; }
 
+#if CHIP_CONFIG_ENABLE_READ_CLIENT
     /**
      * Tears down an active subscription.
      *
@@ -151,6 +152,7 @@ class InteractionModelEngine : public Messaging::UnsolicitedMessageHandler,
      * Tears down all active subscriptions.
      */
     void ShutdownAllSubscriptions();
+#endif // CHIP_CONFIG_ENABLE_READ_CLIENT
 
     uint32_t GetNumActiveReadHandlers() const;
     uint32_t GetNumActiveReadHandlers(ReadHandler::InteractionType type) const;
@@ -234,6 +236,7 @@ class InteractionModelEngine : public Messaging::UnsolicitedMessageHandler,
     void OnTimedWrite(TimedHandler * apTimedHandler, Messaging::ExchangeContext * apExchangeContext,
                       const PayloadHeader & aPayloadHeader, System::PacketBufferHandle && aPayload);
 
+#if CHIP_CONFIG_ENABLE_READ_CLIENT
     /**
      * Add a read client to the internally tracked list of weak references. This list is used to
      * correctly dispatch unsolicited reports to the right matching handler by subscription ID.
@@ -254,6 +257,7 @@ class InteractionModelEngine : public Messaging::UnsolicitedMessageHandler,
      * Return the number of active read clients being tracked by the engine.
      */
     size_t GetNumActiveReadClients();
+#endif // CHIP_CONFIG_ENABLE_READ_CLIENT
 
     /**
      * Returns the number of dirty subscriptions. Including the subscriptions that are generating reports.
@@ -348,6 +352,7 @@ class InteractionModelEngine : public Messaging::UnsolicitedMessageHandler,
     //
     void ShutdownActiveReads()
     {
+#if CHIP_CONFIG_ENABLE_READ_CLIENT
         for (auto * readClient = mpActiveReadClientList; readClient != nullptr;)
         {
             readClient->mpImEngine = nullptr;
@@ -361,6 +366,7 @@ class InteractionModelEngine : public Messaging::UnsolicitedMessageHandler,
         // After that, we just null out our tracker.
         //
         mpActiveReadClientList = nullptr;
+#endif // CHIP_CONFIG_ENABLE_READ_CLIENT
 
         mReadHandlers.ReleaseAll();
     }
@@ -599,7 +605,9 @@ class InteractionModelEngine : public Messaging::UnsolicitedMessageHandler,
 
     ObjectPool<ReadHandler, CHIP_IM_MAX_NUM_READS + CHIP_IM_MAX_NUM_SUBSCRIPTIONS> mReadHandlers;
 
+#if CHIP_CONFIG_ENABLE_READ_CLIENT
     ReadClient * mpActiveReadClientList = nullptr;
+#endif
 
     ReadHandler::ApplicationCallback * mpReadHandlerApplicationCallback = nullptr;
 
diff --git a/src/app/ReadClient.h b/src/app/ReadClient.h
index 502e08eaa65a6a..71844713ff1461 100644
--- a/src/app/ReadClient.h
+++ b/src/app/ReadClient.h
@@ -49,6 +49,7 @@
 #include <protocols/Protocols.h>
 #include <system/SystemPacketBuffer.h>
 
+#if CHIP_CONFIG_ENABLE_READ_CLIENT
 namespace chip {
 namespace app {
 
@@ -613,5 +614,6 @@ class ReadClient : public Messaging::ExchangeDelegate
         kReservedSizeForEndOfContainer + kReservedSizeForIMRevision + kReservedSizeForEndOfContainer;
 };
 
-}; // namespace app
-}; // namespace chip
+};     // namespace app
+};     // namespace chip
+#endif // CHIP_CONFIG_ENABLE_READ_CLIENT
diff --git a/src/app/common_flags.gni b/src/app/common_flags.gni
index 1d4309810d57e8..5e5a82afd7d5e1 100644
--- a/src/app/common_flags.gni
+++ b/src/app/common_flags.gni
@@ -15,4 +15,5 @@
 declare_args() {
   # Temporary flag for interaction model and echo protocols, set it to true to enable
   chip_app_use_echo = false
+  chip_enable_read_client = true
 }
diff --git a/src/controller/BUILD.gn b/src/controller/BUILD.gn
index 3172c1815a1271..9fcbca7ea451e2 100644
--- a/src/controller/BUILD.gn
+++ b/src/controller/BUILD.gn
@@ -13,6 +13,8 @@
 # limitations under the License.
 
 import("//build_overrides/chip.gni")
+import("${chip_root}/src/app/common_flags.gni")
+import("${chip_root}/src/lib/lib.gni")
 import("${chip_root}/src/platform/device.gni")
 import("${chip_root}/src/platform/python.gni")
 
@@ -21,15 +23,13 @@ static_library("controller") {
 
   sources = [ "CHIPCluster.h" ]
 
-  if (chip_controller) {
+  if (chip_controller && chip_build_controller) {
     sources += [
       "AbstractDnssdDiscoveryController.cpp",
       "AutoCommissioner.cpp",
       "AutoCommissioner.h",
       "CHIPCommissionableNodeController.cpp",
       "CHIPCommissionableNodeController.h",
-      "CHIPDeviceController.cpp",
-      "CHIPDeviceController.h",
       "CHIPDeviceControllerFactory.cpp",
       "CHIPDeviceControllerFactory.h",
       "CommissioneeDeviceProxy.cpp",
@@ -37,10 +37,6 @@ static_library("controller") {
       "CommissionerDiscoveryController.cpp",
       "CommissionerDiscoveryController.h",
       "CommissioningDelegate.cpp",
-      "CommissioningWindowOpener.cpp",
-      "CommissioningWindowOpener.h",
-      "CurrentFabricRemover.cpp",
-      "CurrentFabricRemover.h",
       "DeviceDiscoveryDelegate.h",
       "DevicePairingDelegate.h",
       "EmptyDataModelHandler.cpp",
@@ -49,6 +45,16 @@ static_library("controller") {
       "SetUpCodePairer.cpp",
       "SetUpCodePairer.h",
     ]
+    if (chip_enable_read_client) {
+      sources += [
+        "CHIPDeviceController.cpp",
+        "CHIPDeviceController.h",
+        "CommissioningWindowOpener.cpp",
+        "CommissioningWindowOpener.h",
+        "CurrentFabricRemover.cpp",
+        "CurrentFabricRemover.h",
+      ]
+    }
   }
 
   cflags = [ "-Wconversion" ]
diff --git a/src/controller/CHIPCluster.h b/src/controller/CHIPCluster.h
index ab37a52ece8e24..4324092871424b 100644
--- a/src/controller/CHIPCluster.h
+++ b/src/controller/CHIPCluster.h
@@ -221,6 +221,7 @@ class DLL_EXPORT ClusterBase
         return WriteAttribute<AttributeInfo>(requestData, context, successCb, failureCb, NullOptional, doneCb, aDataVersion);
     }
 
+#if CHIP_CONFIG_ENABLE_READ_CLIENT
     /**
      * Read an attribute and get a type-safe callback with the attribute value.
      */
@@ -399,6 +400,7 @@ class DLL_EXPORT ClusterBase
                                                          onSubscriptionEstablishedCb, onResubscriptionAttemptCb,
                                                          aKeepPreviousSubscriptions, aIsUrgentEvent);
     }
+#endif // CHIP_CONFIG_ENABLE_READ_CLIENT
 
 protected:
     Messaging::ExchangeManager & mExchangeManager;
diff --git a/src/controller/CHIPDeviceController.h b/src/controller/CHIPDeviceController.h
index 9fd8d1cfe7ee03..2d85fdce3068e4 100644
--- a/src/controller/CHIPDeviceController.h
+++ b/src/controller/CHIPDeviceController.h
@@ -384,8 +384,10 @@ class DLL_EXPORT DeviceCommissioner : public DeviceController,
 #if CHIP_DEVICE_CONFIG_ENABLE_COMMISSIONER_DISCOVERY // make this commissioner discoverable
                                       public Protocols::UserDirectedCommissioning::InstanceNameResolver,
 #endif
-                                      public SessionEstablishmentDelegate,
-                                      public app::ClusterStateCache::Callback
+#if CHIP_CONFIG_ENABLE_READ_CLIENT
+                                      public app::ClusterStateCache::Callback,
+#endif
+                                      public SessionEstablishmentDelegate
 {
 public:
     DeviceCommissioner();
@@ -683,8 +685,10 @@ class DLL_EXPORT DeviceCommissioner : public DeviceController,
     void RegisterPairingDelegate(DevicePairingDelegate * pairingDelegate) { mPairingDelegate = pairingDelegate; }
     DevicePairingDelegate * GetPairingDelegate() const { return mPairingDelegate; }
 
+#if CHIP_CONFIG_ENABLE_READ_CLIENT
     // ClusterStateCache::Callback impl
     void OnDone(app::ReadClient *) override;
+#endif // CHIP_CONFIG_ENABLE_READ_CLIENT
 
     // Issue an NOC chain using the associated OperationalCredentialsDelegate. The NOC chain will
     // be provided in X509 DER format.
@@ -915,11 +919,13 @@ class DLL_EXPORT DeviceCommissioner : public DeviceController,
 
     void SendCommissioningReadRequest(DeviceProxy * proxy, Optional<System::Clock::Timeout> timeout,
                                       app::AttributePathParams * readPaths, size_t readPathsSize);
+#if CHIP_CONFIG_ENABLE_READ_CLIENT
     // Parsers for the two different read clients
     void ParseCommissioningInfo();
     void ParseFabrics();
     // Called by ParseCommissioningInfo
     void ParseTimeSyncInfo(ReadCommissioningInfo & info);
+#endif // CHIP_CONFIG_ENABLE_READ_CLIENT
 
     static CHIP_ERROR
     ConvertFromOperationalCertStatus(chip::app::Clusters::OperationalCredentials::NodeOperationalCertStatusEnum err);
@@ -959,8 +965,10 @@ class DLL_EXPORT DeviceCommissioner : public DeviceController,
         nullptr; // Commissioning delegate that issued the PerformCommissioningStep command
     CompletionStatus commissioningCompletionStatus;
 
+#if CHIP_CONFIG_ENABLE_READ_CLIENT
     Platform::UniquePtr<app::ClusterStateCache> mAttributeCache;
     Platform::UniquePtr<app::ReadClient> mReadClient;
+#endif
     Credentials::AttestationVerificationResult mAttestationResult;
     Platform::UniquePtr<Credentials::DeviceAttestationVerifier::AttestationDeviceInfo> mAttestationDeviceInfo;
     Credentials::DeviceAttestationVerifier * mDeviceAttestationVerifier = nullptr;
diff --git a/src/controller/ReadInteraction.h b/src/controller/ReadInteraction.h
index 88c1f902121de6..34491dd9edfebf 100644
--- a/src/controller/ReadInteraction.h
+++ b/src/controller/ReadInteraction.h
@@ -23,6 +23,7 @@
 #include <app/ReadPrepareParams.h>
 #include <controller/TypedReadCallback.h>
 
+#if CHIP_CONFIG_ENABLE_READ_CLIENT
 namespace chip {
 namespace Controller {
 namespace detail {
@@ -328,3 +329,4 @@ CHIP_ERROR SubscribeEvent(
 
 } // namespace Controller
 } // namespace chip
+#endif // CHIP_CONFIG_ENABLE_READ_CLIENT
diff --git a/src/controller/TypedReadCallback.h b/src/controller/TypedReadCallback.h
index aa0e4394ad4e5e..f35a39670ee8e7 100644
--- a/src/controller/TypedReadCallback.h
+++ b/src/controller/TypedReadCallback.h
@@ -24,6 +24,7 @@
 #include <functional>
 #include <lib/support/CHIPMem.h>
 
+#if CHIP_CONFIG_ENABLE_READ_CLIENT
 namespace chip {
 namespace Controller {
 
@@ -290,3 +291,4 @@ class TypedReadEventCallback final : public app::ReadClient::Callback
 
 } // namespace Controller
 } // namespace chip
+#endif // CHIP_CONFIG_ENABLE_READ_CLIENT