Channel Cluster

Cluster ID: 0x0504  |  Endpoint: Media endpoint (TV, set-top box, etc.)

Channel handles channel navigation and lineup management — channel switching, skipping, name-based search, querying the channel list, and the Electronic Program Guide (EPG). It is one of the core Clusters for media devices such as smart TVs and set-top boxes. Unlike MediaInput which manages physical input sources (HDMI, USB), Channel manages logical channels (CCTV-1, HBO).

Four Optional Features

The Channel Cluster defines four Features: CL (Channel List), LI (Lineup Info), EG (Electronic Guide), and RP (Record Program). The most basic devices can have none enabled — supporting only the ChangeChannelByNumber and SkipChannel basic tuning commands. Enabling CL provides a channel list for UI display; LI exposes operator and lineup info; EG enables EPG program guide queries; RP enables scheduled recording.

Commands

The Channel Cluster has 6 client commands and 2 response commands. Basic tuning (ChangeChannelByNumber / SkipChannel) is supported by all devices. ChangeChannel requires channel list or lineup info support (CL or LI), and GetProgramGuide and recording commands require more advanced features. Click a command ID in the table below to jump to its detailed description.

ID Name Description Required Feature
0x00 ChangeChannel Fuzzy match channel by name / call sign / number CL or LI
0x02 ChangeChannelByNumber Exact tune by major + minor number None
0x03 SkipChannel Skip forward / backward relative to current channel None
0x04 GetProgramGuide Query the Electronic Program Guide (EPG) EG
0x06 RecordProgram Schedule recording of a specified program RP
0x07 CancelRecordProgram Cancel a scheduled recording RP

Response Commands

ID Name Trigger Command Description
0x01 ChangeChannelResponse ChangeChannel Returns the match result status code and optional additional data
0x05 ProgramGuideResponse GetProgramGuide Returns the program list and pagination info

ChangeChannel — Fuzzy Match Channel (0x00)

Fuzzy matches and switches channels using a string against the channel list. The device sequentially matches channel fields including Name, CallSign, AffiliateCallSign, and number (MajorNumber-MinorNumber). If exactly one channel matches, it automatically switches and updates CurrentChannel; if multiple or zero matches are found, the device notifies the controller via ChangeChannelResponse.

ParameterTypeDescription
Match string Match string — can be a channel name, call sign, number, etc. E.g., "CCTV-6", "HBO", "6-1"

ChangeChannelResponse

Response to ChangeChannel, indicating the match result:

FieldTypeDescription
Status StatusEnum Match result status (see enum below)
Data string (optional) Additional information. May contain a list of matched channel names when MultipleMatches occurs
// ChangeChannel command response (ChangeChannelResponse)
// Match successful
{
  "Status": 0,         // Success
  "Data": null
}

// Multiple matches found
{
  "Status": 1,         // MultipleMatches
  "Data": "CCTV-5 Sports, CCTV-5+ Events"
}

// No channels matched
{
  "Status": 2,         // NoMatches
  "Data": null
}
Usage Scenarios

Voice assistant scenario: the user says "Switch to CCTV-6", and the voice system passes the text to ChangeChannel's Match parameter. The device matches "CCTV-6 Movie" in the channel list — a unique hit — automatically switches, and returns Status = Success. If the user says "Switch to CCTV-5" but the device has both "CCTV-5 Sports" and "CCTV-5+ Events", it returns Status = MultipleMatches, and the app needs to let the user choose.

ChangeChannelByNumber — Exact Tune (0x02)

Switches to a specific channel using the major number (MajorNumber) and minor number (MinorNumber). This is the most basic tuning command — it does not require the device to provide a channel list, and all devices implementing the Channel Cluster must support it. No response command is returned — on success, the CurrentChannel attribute updates.

ParameterTypeDescription
MajorNumber uint16 Channel major number. E.g., the major number for CCTV-6 is 6
MinorNumber uint16 Channel minor number. Most channels have a minor number of 1; minor numbers distinguish sub-channels under the same major number (e.g., 6-1, 6-2)
Usage Scenarios

The user clicks a channel in the app's channel list, and the app directly sends this command with the channel's MajorNumber and MinorNumber. Also applies to remote control numeric key input: the user presses "6-1", and the device parses it and calls ChangeChannelByNumber(6, 1).

SkipChannel — Relative Skip (0x03)

Skips a specified number of channels forward or backward relative to the current channel. Positive numbers skip forward (increasing channel numbers), negative numbers skip backward. The skip follows the device's internal channel ordering and wraps around at the end or beginning of the list.

ParameterTypeDescription
Count int16 Skip count. +1 = next channel, -1 = previous channel, +5 = skip 5 channels forward
Usage Scenarios

Corresponds to the CH+/CH- buttons on the remote. The user presses CH+ and the app sends SkipChannel(+1); presses CH- and sends SkipChannel(-1). No need to know the current channel number or position in the list — the device handles it.

GetProgramGuide — Query Program Guide (0x04)

Queries the Electronic Program Guide (EPG) data, returning the program list within the specified time range and channel range. This command requires the device to enable the EG (ElectronicGuide) feature. The response is returned via ProgramGuideResponse with pagination support.

ParameterTypeDescription
StartTime epoch-s (optional) Query start time (UTC seconds timestamp). Omit to start from current time
EndTime epoch-s (optional) Query end time. Omit for no end time limit
ChannelList list<ChannelInfoStruct> (optional) Limits the query to specific channels. Omit to query all channels
PageToken PageTokenStruct (optional) Pagination token for fetching the next page of results
RecordingFlag RecordingFlagBitmap (optional) Filter for scheduled or currently recording programs
ProgramGuideResponse

The response contains ProgramList (program list) and optional Paging (pagination info). Each program entry includes title, description, start/end time, channel, audio language, rating, and more. Since EPG data is typically large, controllers should use pagination and time/channel filters appropriately to control the response size.

RecordProgram — Schedule Recording (0x06)

Schedules recording of a specified program. Locates the program to record via its unique identifier (ProgramIdentifier) or external ID. This command requires the device to enable the RP (RecordProgram) feature. This command is only supported by devices with storage capabilities (e.g., set-top boxes with hard drives, DVRs).

ParameterTypeDescription
ProgramIdentifier string Unique identifier of the program, from the Identifier field in EPG data
ShouldRecordSeries bool Whether to record the entire series (not just a single episode)
ExternalIDList list<AdditionalInfoStruct> (optional) External identifier list for cross-platform program identification
Data bytes (optional) Vendor-specific custom data

CancelRecordProgram — Cancel Recording (0x07)

Cancels a previously scheduled recording via RecordProgram. The parameter structure is the same as RecordProgram, identifying the recording to cancel via ProgramIdentifier. Requires the RP feature.

ParameterTypeDescription
ProgramIdentifier string Identifier of the program whose recording to cancel
ShouldRecordSeries bool Whether to cancel recording of the entire series
ExternalIDList list<AdditionalInfoStruct> (optional) External identifier list
Data bytes (optional) Vendor-specific custom data

Attributes

The Channel Cluster has 3 attributes. Click an attribute ID in the summary table below to jump to its detailed description.

ID Name Type Description Required Feature
0x0000 ChannelList list<ChannelInfoStruct> List of all channels the device can tune to CL
0x0001 Lineup LineupInfoStruct Operator and lineup package information LI
0x0002 CurrentChannel ChannelInfoStruct / null The channel currently being viewed None

Channel Information (0x0000 ~ 0x0002)

Describes the device's available channel list, operator lineup information, and the currently selected channel.

ID Name Type Description
0x0000 ChannelList list<ChannelInfoStruct> All viewable channels declared by the device. Each element is a ChannelInfoStruct containing channel number, name, call sign, type, and more. The list order determines the SkipChannel navigation order. Requires the CL feature
0x0001 Lineup LineupInfoStruct The operator and lineup package information the device is connected to. Includes operator name, package name, postal code, etc. Requires LI feature
0x0002 CurrentChannel ChannelInfoStruct / null The channel currently being viewed. Nullable — null indicates the device is not tuned to any channel (e.g., playing an HDMI input or streaming app). Changed via ChangeChannel / ChangeChannelByNumber / SkipChannel commands
Subscribe to Changes

Controllers should subscribe to CurrentChannel attribute changes to sync the app UI when the user changes channels via the remote. If the device supports the CL feature, also read ChannelList on initial connection to build the channel selection UI.

Struct Definitions

The Channel Cluster uses two core structures to describe channel and lineup information.

ChannelInfoStruct

Describes the complete information for a channel. MajorNumber and MinorNumber are required fields; the rest are optional.

Field Type Required Description
MajorNumber uint16 Yes Channel major number. E.g., CCTV-6 corresponds to 6, HBO to 100
MinorNumber uint16 Yes Channel minor number. Sub-channels under the same major number are distinguished by minor number; most channels have minor number 1
Name string No Channel name for UI display. E.g., "CCTV-6 Movie"
CallSign string No Channel call sign (broadcast identifier). E.g., "CCTV6", "HBO"
AffiliateCallSign string No Affiliate call sign. Used for regional variants of the same channel, e.g., "HBO East"
Identifier string No Unique identifier for the channel, used to locate it in EPG and other systems. E.g., "cctv6-hd"
Type ChannelTypeEnum No Channel type — satellite, cable, terrestrial, or OTT streaming (see enum below)

LineupInfoStruct

Describes the operator lineup information for the device's current connection. OperatorName and LineupInfoType are required fields.

Field Type Required Description
OperatorName string Yes Operator name. E.g., "China Broadcasting", "Comcast"
LineupName string No Lineup package name. E.g., "Standard Digital Package", "Premium HD Bundle"
PostalCode string No Postal code of the device's location, used to distinguish channel lineup differences for the same operator in different regions
LineupInfoType LineupInfoTypeEnum Yes Lineup type (see enum below)

Enum Values

StatusEnum

Match result status in ChangeChannelResponse:

0
Success Unique match successful — switched to the target channel
1
MultipleMatches Multiple channels matched — user needs to make a further selection
2
NoMatches No channels matched

ChannelTypeEnum

Describes the channel's transmission method / source type:

0
Satellite Satellite TV — received via satellite signal
1
Cable Cable TV — delivered via coaxial cable or fiber-to-the-home
2
Terrestrial Terrestrial — received via over-the-air broadcast (DVB-T / ATSC)
3
OTT OTT streaming — delivered via the internet (IPTV / online live)

LineupInfoTypeEnum

Describes the lineup operator type:

0
MSO Multiple System Operator — the most common type, such as cable TV companies and IPTV operators
LineupInfoType Currently Has Only One Value

The Matter 1.4 specification currently defines only one enum value for LineupInfoTypeEnum: MSO (0). Future versions may add more types. Device implementations should use 0 as the default value.

Feature Bitmap

The Channel Cluster declares which optional capabilities the device supports via FeatureMap (0xFFFC):

Bit 0
CL (ChannelList) Channel List — the device provides a browsable channel list (ChannelList attribute) and supports ChangeChannel fuzzy matching
Bit 1
LI (LineupInfo) Lineup Info — the device exposes operator and lineup package information (Lineup attribute) and may also support ChangeChannel
Bit 2
EG (ElectronicGuide) Electronic Guide — the device provides EPG data and supports the GetProgramGuide command for querying program info
Bit 3
RP (RecordProgram) Record Program — the device supports scheduled recording via RecordProgram and CancelRecordProgram commands
Feature Dependencies

ChangeChannel requires at least CL or LI to be enabled; otherwise there is no data source for name matching.
RP implicitly requires EG — to record programs, the device must first be able to query program information.
ChangeChannelByNumber and SkipChannel do not depend on any feature; they are basic required commands.

Example Data

Read results of the Channel Cluster from a set-top box with CL + LI features enabled, currently viewing CCTV-6:

{
  // --- Current Channel ---
  "0x0002": {                       // CurrentChannel
    "MajorNumber": 6,
    "MinorNumber": 1,
    "Name": "CCTV-6 Movies",
    "CallSign": "CCTV6",
    "AffiliateCallSign": null,
    "Identifier": "cctv6-hd",
    "Type": 2                        // Terrestrial
  },

  // --- Channel List (requires CL feature) ---
  "0x0000": [                        // ChannelList
    {
      "MajorNumber": 1,
      "MinorNumber": 1,
      "Name": "CCTV-1 General",
      "CallSign": "CCTV1",
      "AffiliateCallSign": null,
      "Identifier": "cctv1-hd",
      "Type": 2                      // Terrestrial
    },
    {
      "MajorNumber": 5,
      "MinorNumber": 1,
      "Name": "CCTV-5 Sports",
      "CallSign": "CCTV5",
      "AffiliateCallSign": null,
      "Identifier": "cctv5-hd",
      "Type": 2
    },
    {
      "MajorNumber": 6,
      "MinorNumber": 1,
      "Name": "CCTV-6 Movies",
      "CallSign": "CCTV6",
      "AffiliateCallSign": null,
      "Identifier": "cctv6-hd",
      "Type": 2
    },
    {
      "MajorNumber": 100,
      "MinorNumber": 1,
      "Name": "HBO",
      "CallSign": "HBO",
      "AffiliateCallSign": "HBO East",
      "Identifier": "hbo-east",
      "Type": 1                      // Cable
    }
  ],

  // --- Lineup Info (requires LI feature) ---
  "0x0001": {                        // Lineup
    "OperatorName": "China Broadcasting",
    "LineupName": "Standard Digital",
    "PostalCode": "100000",
    "LineupInfoType": 0              // MSO
  }
}
Developer Tip

For the simplest devices, there may only be the CurrentChannel (0x0002) attribute. Only devices supporting the CL feature return ChannelList (0x0000), and only those supporting LI return Lineup (0x0001). Check FeatureMap (0xFFFC) before reading to determine which features the device supports and avoid reading non-existent attributes.

Common Scenarios

Scenario 1: App channel list and tuning
  1. Check FeatureMap (0xFFFC) to confirm CL support (Bit 0 = 1)
  2. Read ChannelList (0x0000) to get all channels (MajorNumber, MinorNumber, Name, CallSign, Type)
  3. Read CurrentChannel (0x0002) to highlight the current channel
  4. Display the channel list in the UI, optionally grouped by Type (terrestrial, cable, satellite, OTT)
  5. The user clicks a target channel and sends ChangeChannelByNumber with the channel's MajorNumber and MinorNumber
  6. Subscribe to CurrentChannel attribute changes and update the UI highlight after confirming the switch
Scenario 2: Voice assistant fuzzy channel search
  1. Confirm the device supports CL or LI features (prerequisite for ChangeChannel)
  2. The user tells the voice assistant "Switch to HBO", and the voice system sends ChangeChannel with "HBO" as the Match parameter
  3. Check the ChangeChannelResponse Status:
    • Success (0): Channel switched, no further action needed
    • MultipleMatches (1): Show the candidate channel list from Data to the user, then use ChangeChannelByNumber for exact tuning after their selection
    • NoMatches (2): Notify the user that no matching channel was found and suggest different search terms
  4. Subscribe to CurrentChannel to confirm the tuning result

Note: The matching logic of ChangeChannel is determined by the device implementation. Different devices may produce different results for the same search term. Apps should gracefully handle both MultipleMatches and NoMatches cases.