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).
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.
| Parameter | Type | Description |
|---|---|---|
| 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:
| Field | Type | Description |
|---|---|---|
| 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.
| Parameter | Type | Description |
|---|---|---|
| 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.
| Parameter | Type | Description |
|---|---|---|
| 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.
| Parameter | Type | Description |
|---|---|---|
| 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 |
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).
| Parameter | Type | Description |
|---|---|---|
| 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.
| Parameter | Type | Description |
|---|---|---|
| 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 |
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:
ChannelTypeEnum
Describes the channel's transmission method / source type:
LineupInfoTypeEnum
Describes the lineup operator type:
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):
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
}
}
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
- Check
FeatureMap (0xFFFC)to confirm CL support (Bit 0 = 1) - Read
ChannelList (0x0000)to get all channels (MajorNumber, MinorNumber, Name, CallSign, Type) - Read
CurrentChannel (0x0002)to highlight the current channel - Display the channel list in the UI, optionally grouped by
Type(terrestrial, cable, satellite, OTT) - The user clicks a target channel and sends
ChangeChannelByNumberwith the channel's MajorNumber and MinorNumber - Subscribe to
CurrentChannelattribute changes and update the UI highlight after confirming the switch
Scenario 2: Voice assistant fuzzy channel search
- Confirm the device supports CL or LI features (prerequisite for ChangeChannel)
- The user tells the voice assistant "Switch to HBO", and the voice system sends
ChangeChannelwith"HBO"as the Match parameter - 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
- Subscribe to
CurrentChannelto 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.