<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="https://devzone.nordicsemi.com/cfs-file/__key/system/syndication/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Scenes Cluster Client on Matter Remote Controller</title><link>https://devzone.nordicsemi.com/f/nordic-q-a/127747/scenes-cluster-client-on-matter-remote-controller</link><description>Dear Support Team, 
 
 I&amp;#39;m developing a Matter remote controller and want to implement Scenes Cluster Client functionality. When a button is pressed, the remote should recall a specific scene (e.g., Scene ID 5) on target devices. 
 I have three questions</description><dc:language>en-US</dc:language><generator>Telligent Community 13</generator><lastBuildDate>Mon, 13 Apr 2026 10:57:51 GMT</lastBuildDate><atom:link rel="self" type="application/rss+xml" href="https://devzone.nordicsemi.com/f/nordic-q-a/127747/scenes-cluster-client-on-matter-remote-controller" /><item><title>RE: Scenes Cluster Client on Matter Remote Controller</title><link>https://devzone.nordicsemi.com/thread/564838?ContentTypeID=1</link><pubDate>Mon, 13 Apr 2026 10:57:51 GMT</pubDate><guid isPermaLink="false">137ad170-7792-4731-bb38-c0d22fbe4515:255a3ccb-b7c2-4728-a8a7-45478ec9c930</guid><dc:creator>Maria Gilje</dc:creator><description>&lt;p&gt;Hello,&lt;/p&gt;
[quote user=""]&lt;span style="font-family:Consolas;"&gt;&lt;span&gt;1. How to provision the Scene ID to the remote? Should the Scene ID be stored in the Binding Table, or is there a dedicated attribute for this?&lt;/span&gt;&lt;/span&gt;[/quote]
&lt;p&gt;In the Matter spec there is only descriptions about how to store the scene ID on the server, so for the client case, this is up to the application. Ultimately you can decide how you want to do this, but here are some options:&lt;/p&gt;
&lt;p&gt;Hardcoding it and mapping buttons directly to the scene, but keep in mind that it will be fixed during development, e.g.:&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="c_cpp"&gt;constexpr chip::SceneId kButton1Scene = 0x01;
constexpr chip::SceneId kButton2Scene = 0x05;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Looking into if you can use KeyValueStorMgr. This requires it to be configurable at runtime with your application:&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="c_cpp"&gt;// Write during provisioning
chip::DeviceLayer::PersistedStorage::KeyValueStoreMgr()
    .Put(&amp;quot;scene/btn1&amp;quot;, &amp;amp;sceneId, sizeof(sceneId));

// Read on button press
chip::SceneId sceneId;
chip::DeviceLayer::PersistedStorage::KeyValueStoreMgr()
    .Get(&amp;quot;scene/btn1&amp;quot;, &amp;amp;sceneId, sizeof(sceneId));&lt;/pre&gt;&lt;/p&gt;
[quote user=""]&lt;span style="font-family:Consolas;"&gt;&lt;span&gt;2. How to recall the scene on button press? Should the remote send a groupcast&amp;nbsp;&lt;code&gt;RecallScene&lt;/code&gt;&amp;nbsp;command, or is there another standard way?&lt;/span&gt;&lt;/span&gt;[/quote]
&lt;p&gt;Your intuision is correct: groupcasting RecallScene will be the best way. Our light switch sample uses this method.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;So this should be added in the equivalent of&amp;nbsp;LightSwitch::SwitchChangedHandler():&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="text"&gt;if (binding.type == Binding::MATTER_MULTICAST_BINDING &amp;amp;&amp;amp;
    bindingData.ClusterId == chip::app::Clusters::ScenesManagement::Id)
{
    chip::app::Clusters::ScenesManagement::Commands::RecallScene::Type cmd;
    cmd.groupID   = binding.groupId;
    cmd.sceneID   = bindingData.Value;

    chip::Messaging::ExchangeManager &amp;amp;exchangeMgr =
        chip::Server::GetInstance().GetExchangeManager();

    chip::Controller::InvokeGroupCommandRequest(
        &amp;amp;exchangeMgr, binding.fabricIndex, binding.groupId, cmd);
}&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;And on a button press it can be triggered with something like this:&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="text"&gt;void OnButton1Pressed()
{
    auto *data = chip::Platform::New&amp;lt;Nrf::Matter::BindingHandler::BindingData&amp;gt;();
    data-&amp;gt;EndpointId        = mSwitchEndpoint;
    data-&amp;gt;ClusterId         = chip::app::Clusters::ScenesManagement::Id;
    data-&amp;gt;CommandId         = chip::app::Clusters::ScenesManagement::Commands::RecallScene::Id;
    data-&amp;gt;Value             = 0x05;  // Scene ID 5 just as an example
    data-&amp;gt;IsGroup           = chip::MakeOptional(true); // force groupcast
    data-&amp;gt;InvokeCommandFunc = SceneRecallHandler;
    Nrf::Matter::BindingHandler::RunBoundClusterAction(data);
}&lt;/pre&gt;&lt;/p&gt;
[quote user=""]&lt;span style="font-family:Consolas;"&gt;&lt;span&gt;3. What are the exact chip-tool commands to configure this? I need a step-by-step example (bind remote button to group + assign Scene ID).&lt;/span&gt;&lt;/span&gt;[/quote]
&lt;p&gt;Commissiong both devices (remote and target device) with chip-tool pairing.&lt;/p&gt;
&lt;p&gt;Create a group and add the target device to it:&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="text"&gt;chip-tool groups add-group &amp;lt;group-id&amp;gt; &amp;quot;&amp;lt;group-name&amp;gt;&amp;quot; &amp;lt;target-node-id&amp;gt; &amp;lt;target-endpoint-id&amp;gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Add the scene to the target device using either AddScene or StoreScene, for example:&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="text"&gt;chip-tool scenesmanagement add-scene &amp;lt;group-id&amp;gt; &amp;lt;scene-id&amp;gt; &amp;lt;transition-time&amp;gt; &amp;quot;&amp;lt;scene-name&amp;gt;&amp;quot; [] &amp;lt;target-node-id&amp;gt; &amp;lt;target-endpoint-id&amp;gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Add the remote to the group (for keyset/groupcast ACL)&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="text"&gt;chip-tool groups add-group &amp;lt;group-id&amp;gt; &amp;quot;&amp;lt;group-name&amp;gt;&amp;quot; &amp;lt;remote-node-id&amp;gt; &amp;lt;remote-endpoint-id&amp;gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Write a binding on the remote:&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="text"&gt;chip-tool binding write binding &amp;#39;[{&amp;quot;fabricIndex&amp;quot;: &amp;lt;fabric-id&amp;gt;, &amp;quot;group&amp;quot;: &amp;lt;group-id&amp;gt;}]&amp;#39; &amp;lt;remote-node-id&amp;gt; &amp;lt;remote-endpoint-id&amp;gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Verify that the scene exists on the target device. This should list scene ID with the ID provided earlier.&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="text"&gt;chip-tool scenesmanagement get-scene-membership &amp;lt;group-id&amp;gt; &amp;lt;target-node-id&amp;gt; &amp;lt;target-endpoint-id&amp;gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Then test that RecallScene works by pressing the button on the remote. It is also possible to test with chip-tool:&lt;/p&gt;
&lt;p&gt;&lt;pre class="ui-code" data-mode="text"&gt;chip-tool scenesmanagement recall-scene &amp;lt;group-id&amp;gt; &amp;lt;scene-id&amp;gt; &amp;lt;target-node-id&amp;gt; &amp;lt;target-endpoint-id&amp;gt;&lt;/pre&gt;&lt;/p&gt;
&lt;p&gt;Best regards,&lt;/p&gt;
&lt;p&gt;Maria&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;</description></item></channel></rss>