Summary
Sony BRAVIA Professional Displays KDX9077 Series Simple IP Control protocol. 24-byte fixed-size TCP messages on port 20060. Source covers power, volume, mute, input, picture mute, scene, IR passthrough, plus device address queries and unsolicited event notifications.
Transport
protocols:
- tcp
addressing:
port: 20060
auth:
type: none # inferred: no auth procedure in source
Traits
- powerable # inferred from setPowerStatus / getPowerStatus / togglePowerStatus
- queryable # inferred from getPowerStatus, getAudioVolume, getAudioMute, getInput, getPictureMute, getSceneSetting, getBroadcastAddress, getMacAddress
- routable # inferred from setInput / getInput
- levelable # inferred from setAudioVolume / getAudioVolume
Actions
# All actions use 24-byte fixed-size Simple IP Control frames.
# Frame layout: 0x2A 0x53 [type] [cmd4cc ASCII] [16-byte params] 0x0A
# Type bytes: C=Control, E=Enquiry, A=Answer (monitor→client), N=Notify (monitor→client)
- id: set_ircc_code
label: Send IR Remote Code (setIrccCode)
kind: action
command: "*SCCIRCC{ir_param}\n"
params:
- name: ir_param
type: string
description: 16 ASCII digit parameter from IR Commands table (e.g. "0000000000000005" for Display, "0000000000000030" for Volume Up). Pad on left with "0".
- id: set_power_status
label: Set Power Status (setPowerStatus)
kind: action
command: "*SCPOWR000000000000000{state}\n"
params:
- name: state
type: integer
description: 0 = Standby (Off), 1 = Active (On)
- id: get_power_status
label: Get Power Status (getPowerStatus)
kind: query
command: "*SEPOWR################\n"
params: []
- id: toggle_power_status
label: Toggle Power Status (togglePowerStatus)
kind: action
command: "*SCTPOW################\n"
params: []
- id: set_audio_volume
label: Set Audio Volume (setAudioVolume)
kind: action
command: "*SCVOLU{volume:016d}\n"
params:
- name: volume
type: integer
description: Volume value 0-100, decimal, left-padded with "0" to 16 digits (e.g. 41 = "0000000000000029")
- id: get_audio_volume
label: Get Audio Volume (getAudioVolume)
kind: query
command: "*SEVOLU################\n"
params: []
- id: set_audio_mute
label: Set Audio Mute (setAudioMute)
kind: action
command: "*SCAMUT000000000000000{mute}\n"
params:
- name: mute
type: integer
description: 0 = Unmute, 1 = Mute
- id: get_audio_mute
label: Get Audio Mute (getAudioMute)
kind: query
command: "*SEAMUT################\n"
params: []
- id: set_input_hdmi
label: Set Input to HDMI (setInput, HDMI)
kind: action
command: "*SCINPT0000000000010000XXXX\n"
params:
- name: port
type: integer
description: HDMI port number 1-9999, decimal, left-padded with "0" to fill last 4 bytes (e.g. HDMI 1 → "0001")
- id: set_input_composite
label: Set Input to Composite (setInput, Composite)
kind: action
command: "*SCINPT0000000000030000XXXX\n"
params:
- name: port
type: integer
description: Composite port number 1-9999, decimal, left-padded with "0" to fill last 4 bytes
- id: set_input_component
label: Set Input to Component (setInput, Component)
kind: action
command: "*SCINPT0000000000040000XXXX\n"
params:
- name: port
type: integer
description: Component port number 1-9999, decimal, left-padded with "0" to fill last 4 bytes
- id: set_input_screen_mirroring
label: Set Input to Screen Mirroring (setInput, Screen Mirroring)
kind: action
command: "*SCINPT0000000000050000XXXX\n"
params:
- name: port
type: integer
description: Screen Mirroring port number 1-9999, decimal, left-padded with "0" to fill last 4 bytes
- id: get_input
label: Get Current Input (getInput)
kind: query
command: "*SEINPT################\n"
params: []
- id: set_picture_mute
label: Set Picture Mute (setPictureMute)
kind: action
command: "*SCPMUT000000000000000{state}\n"
params:
- name: state
type: integer
description: 0 = Disable (picture on), 1 = Enable (screen black)
- id: get_picture_mute
label: Get Picture Mute (getPictureMute)
kind: query
command: "*SEPMUT################\n"
params: []
- id: toggle_picture_mute
label: Toggle Picture Mute (togglePictureMute)
kind: action
command: "*SCTPMU################\n"
params: []
- id: set_scene_setting
label: Set Scene Setting (setSceneSetting)
kind: action
command: "*SCSCEN{scene_padded}\n"
params:
- name: scene
type: string
description: One of "auto", "auto24pSync", "general". Case-sensitive, pad on right with "#" to 16 chars (e.g. "auto24pSync#####")
- id: get_scene_setting
label: Get Scene Setting (getSceneSetting)
kind: query
command: "*SESCEN################\n"
params: []
- id: get_broadcast_address
label: Get Broadcast IPv4 Address (getBroadcastAddress)
kind: query
command: "*SEBADREth0##########\n"
params: []
- id: get_mac_address
label: Get MAC Address (getMacAddress)
kind: query
command: "*SEMADREth0##########\n"
params: []
Feedbacks
# Each Answer (A) frame is 24 bytes: 0x2A 0x53 0x41 [cmd4cc] [16-byte params] 0x0A
# Generic success: 16 ASCII "0" bytes; generic error: 16 ASCII "F" bytes
- id: power_state
type: enum
values:
- standby
- active
# Encoded in answer body to setPowerStatus / getPowerStatus: trailing byte "0"=off, "1"=on
# Also delivered unsolicited via firePowerChange (Notify)
- id: audio_volume
type: integer
# Encoded in answer body to setAudioVolume / getAudioVolume: 16 decimal digits
# Also delivered unsolicited via fireVolumeChange (Notify)
- id: audio_mute
type: enum
values:
- unmuted
- muted
# Encoded in answer body to setAudioMute / getAudioMute: trailing byte "0"=unmuted, "1"=muted
# Also delivered unsolicited via fireMuteChange (Notify)
- id: current_input
type: enum
values:
- hdmi
- composite
- component
- screen_mirroring
# Encoded in answer body to setInput / getInput: byte[10]="0"/"3"/"4"/"5" = input family; bytes[18-21] = port number (decimal)
# Also delivered unsolicited via fireInputChange (Notify)
- id: picture_mute
type: enum
values:
- disabled
- enabled
# Encoded in answer body to setPictureMute / getPictureMute: trailing byte "0"=disabled, "1"=enabled
# Also delivered unsolicited via firePictureMuteChange (Notify)
- id: scene_setting
type: string
# Encoded in answer body to setSceneSetting / getSceneSetting: 16 ASCII chars, right-padded with "#"
# Values: "auto", "auto24pSync", "general" (case-sensitive)
# "N..." answer body = not available for current input
- id: broadcast_address
type: string
# Encoded in answer body to getBroadcastAddress: IPv4 address left-justified in 16 bytes, right-padded with "#"
# Example from source: "192.168.0.14####"
- id: mac_address
type: string
# Encoded in answer body to getMacAddress: MAC left-justified in 16 bytes, right-padded with "#"
# Example from source: "XXXXXXXXXXXXXXXX" (12 hex digits, padded to 16 with "#")
Variables
# IR code parameter table (16-digit values for setIrccCode).
# Each value goes into the 16-byte params field right-justified, left-padded with "0".
- id: ir_display
label: IR Display
type: enum_value
value: "0000000000000005"
- id: ir_home
label: IR Home
type: enum_value
value: "0000000000000006"
- id: ir_options
label: IR Options
type: enum_value
value: "0000000000000007"
- id: ir_return
label: IR Return
type: enum_value
value: "0000000000000008"
- id: ir_up
label: IR Up
type: enum_value
value: "0000000000000009"
- id: ir_down
label: IR Down
type: enum_value
value: "0000000000000010"
- id: ir_right
label: IR Right
type: enum_value
value: "0000000000000011"
- id: ir_left
label: IR Left
type: enum_value
value: "0000000000000012"
- id: ir_confirm
label: IR Confirm
type: enum_value
value: "0000000000000013"
- id: ir_red
label: IR Red
type: enum_value
value: "0000000000000014"
- id: ir_green
label: IR Green
type: enum_value
value: "0000000000000015"
- id: ir_yellow
label: IR Yellow
type: enum_value
value: "0000000000000016"
- id: ir_blue
label: IR Blue
type: enum_value
value: "0000000000000017"
- id: ir_num1
label: IR Num 1
type: enum_value
value: "0000000000000018"
- id: ir_num2
label: IR Num 2
type: enum_value
value: "0000000000000019"
- id: ir_num3
label: IR Num 3
type: enum_value
value: "0000000000000020"
- id: ir_num4
label: IR Num 4
type: enum_value
value: "0000000000000021"
- id: ir_num5
label: IR Num 5
type: enum_value
value: "0000000000000022"
- id: ir_num6
label: IR Num 6
type: enum_value
value: "0000000000000023"
- id: ir_num7
label: IR Num 7
type: enum_value
value: "0000000000000024"
- id: ir_num8
label: IR Num 8
type: enum_value
value: "0000000000000025"
- id: ir_num9
label: IR Num 9
type: enum_value
value: "0000000000000026"
- id: ir_num0
label: IR Num 0
type: enum_value
value: "0000000000000027"
- id: ir_volume_up
label: IR Volume Up
type: enum_value
value: "0000000000000030"
- id: ir_volume_down
label: IR Volume Down
type: enum_value
value: "0000000000000031"
- id: ir_mute
label: IR Mute
type: enum_value
value: "0000000000000032"
- id: ir_channel_up
label: IR Channel Up
type: enum_value
value: "0000000000000033"
- id: ir_channel_down
label: IR Channel Down
type: enum_value
value: "0000000000000034"
- id: ir_subtitle
label: IR Subtitle
type: enum_value
value: "0000000000000035"
- id: ir_dot
label: IR DOT
type: enum_value
value: "0000000000000038"
- id: ir_picture_off
label: IR Picture Off
type: enum_value
value: "0000000000000050"
- id: ir_wide
label: IR Wide
type: enum_value
value: "0000000000000061"
- id: ir_jump
label: IR Jump
type: enum_value
value: "0000000000000062"
- id: ir_sync_menu
label: IR Sync Menu
type: enum_value
value: "0000000000000076"
- id: ir_forward
label: IR Forward
type: enum_value
value: "0000000000000077"
- id: ir_play
label: IR Play
type: enum_value
value: "0000000000000078"
- id: ir_rewind
label: IR Rewind
type: enum_value
value: "0000000000000079"
- id: ir_prev
label: IR Prev
type: enum_value
value: "0000000000000080"
- id: ir_stop
label: IR Stop
type: enum_value
value: "0000000000000081"
- id: ir_next
label: IR Next
type: enum_value
value: "0000000000000082"
- id: ir_pause
label: IR Pause
type: enum_value
value: "0000000000000084"
- id: ir_flash_plus
label: IR Flash Plus
type: enum_value
value: "0000000000000086"
- id: ir_flash_minus
label: IR Flash Minus
type: enum_value
value: "0000000000000087"
- id: ir_tv_power
label: IR TV Power
type: enum_value
value: "0000000000000098"
- id: ir_audio
label: IR Audio
type: enum_value
value: "0000000000000099"
- id: ir_input
label: IR Input
type: enum_value
value: "0000000000000101"
- id: ir_sleep
label: IR Sleep
type: enum_value
value: "0000000000000104"
- id: ir_sleep_timer
label: IR Sleep Timer
type: enum_value
value: "0000000000000105"
- id: ir_video2
label: IR Video 2
type: enum_value
value: "0000000000000108"
- id: ir_picture_mode
label: IR Picture Mode
type: enum_value
value: "0000000000000110"
- id: ir_demo_surround
label: IR Demo Surround
type: enum_value
value: "0000000000000121"
- id: ir_hdmi1
label: IR HDMI 1
type: enum_value
value: "0000000000000124"
- id: ir_hdmi2
label: IR HDMI 2
type: enum_value
value: "0000000000000125"
- id: ir_hdmi3
label: IR HDMI 3
type: enum_value
value: "0000000000000126"
- id: ir_hdmi4
label: IR HDMI 4
type: enum_value
value: "0000000000000127"
- id: ir_action_menu
label: IR Action Menu
type: enum_value
value: "0000000000000129"
- id: ir_help
label: IR Help
type: enum_value
value: "0000000000000130"
Events
# All events are 24-byte Notify frames: 0x2A 0x53 0x4E [cmd4cc] [16-byte params] 0x0A
- id: fire_power_change
label: Power Status Changed (firePowerChange)
frame: "*SNPOWR000000000000000{state}\n"
payload:
- name: state
type: integer
description: 0 = powering off, 1 = powering on
- id: fire_input_change
label: Input Changed (fireInputChange)
frame: "*SNINPT00000000000{family}000XXXX\n"
payload:
- name: family
type: integer
description: 0 = generic input change; 1=HDMI, 3=Composite, 4=Component, 5=Screen Mirroring
- name: port
type: integer
description: Port number 1-9999, decimal, left-padded with "0" to 4 bytes (omitted when family=0)
- id: fire_volume_change
label: Audio Volume Changed (fireVolumeChange)
frame: "*SNVOLU{volume:016d}\n"
payload:
- name: volume
type: integer
description: New volume value 0-100, decimal, left-padded with "0" to 16 digits
- id: fire_mute_change
label: Audio Mute Changed (fireMuteChange)
frame: "*SNAMUT000000000000000{state}\n"
payload:
- name: state
type: integer
description: 0 = unmuted, 1 = muted
- id: fire_picture_mute_change
label: Picture Mute Changed (firePictureMuteChange)
frame: "*SNPMUT000000000000000{state}\n"
payload:
- name: state
type: integer
description: 0 = picture mute enabled, 1 = picture mute disabled
Macros
# UNRESOLVED: source does not document multi-step sequences.
Safety
confirmation_required_for: []
interlocks: []
# UNRESOLVED: source does not document safety warnings, interlocks, or power-on sequencing.
Notes
All commands and events are 24-byte fixed frames. Layout: header 0x2A 0x53 (2 bytes), type byte (1: 0x43 Control, 0x45 Enquiry, 0x41 Answer, 0x4E Notify), FourCC command (4 ASCII), 16-byte parameter field, footer 0x0A (LF). Every control/enquiry must be answered; success = 16 ASCII 0, error = 16 ASCII F. Each command must wait for its answer before the next is sent. setInput may return an N... body when the requested input is not found.
Reference ASCII dump in source: *SCPOWR0000000000000000 (power off control) and *SAPOWR0000000000000000 *SNPOWR0000000000000000 (accept + current-state notify).
scene parameter strings are case-sensitive and right-padded with # to 16 chars (e.g. auto24pSync#####). ir_* parameter values are decimal numbers right-justified and left-padded with 0 to 16 chars.
Network interface name in getBroadcastAddress / getMacAddress is hard-coded as eth0; alternate interfaces are not enumerated in source.
EU area models ship in 3 RED-DA compliance variants; command availability differs per variant. See https://pro-bravia.sony.net/setup/device-settings/red-da/ for the per-variant matrix.
Provenance
source_domains:
- pro-bravia.sony.net
source_urls:
- https://pro-bravia.sony.net/remote-display-control/simple-ip-control/
- https://pro-bravia.sony.net/remote-display-control/rest-api/structure/
- https://pro-bravia.sony.net/remote-display-control/rest-api/reference/
- https://pro-bravia.sony.net
retrieved_at: 2026-06-08T16:41:03.314Z
last_checked_at: 2026-06-10T07:35:28.161Z
Verification Summary
verdict: verified
checked_at: 2026-06-10T07:35:28.161Z
matched_actions: 20
action_count: 20
confidence: medium
summary: "All 20 spec actions matched exactly with source commands; transport (TCP port 20060) verified; complete bidirectional coverage. (5 unresolved item(s) noted in Known Gaps.)"
Known Gaps
- "EU area models have 3 RED-DA compliance variants with differing available commands. Source defers to external URL."
- "source does not document multi-step sequences."
- "source does not document safety warnings, interlocks, or power-on sequencing."
- "firmware version compatibility not stated in source."
- "voltage/current/power specifications not in scope of this IP control document."
From the AI4AV catalog (https://ai4av.net) · ODbL-1.0