Summary
Sony BRAVIA 2014 series TVs provide IP control via Sony's "Simple IP Control" protocol on TCP port 20060. Frames are 24-byte fixed-size: 2-byte header 0x2A 0x53, type byte, 4-byte Four-CC function, 16-byte parameter, 1-byte footer 0x0A. The same command set is also exposed via HTTP/JSON-RPC ("WebAPI") on a higher layer. This spec catalogs the Low Level (TCP) commands — set/get state for power, volume, mute, channel, input, picture mute, and PIP, plus a large IR-like code table.
Transport
protocols:
- tcp
addressing:
port: 20060
auth:
type: none # inferred: no auth procedure in source
Frame format (24 bytes):
- Header:
0x2A 0x53(fixed) - Type:
0x43Control /0x45Enquiry /0x41Answer /0x4ENotify - Function: 4 ASCII characters (Four-CC)
- Parameter: 16 bytes
- Footer:
0x0A(LF, fixed)
Server disconnects after 30 s idle.
Traits
- powerable # inferred from setPowerStatus / getPowerStatus
- routable # inferred from setInput / setInputSource / setChannel commands
- queryable # inferred from get* Enquiry commands
- levelable # inferred from setAudioVolume / getAudioVolume
Actions
# Each action payload is a 24-byte frame:
# 0x2A 0x53 [type] [F0 F1 F2 F3] [P0..P15] 0x0A
# Type is 'C' (0x43) for Control, 'E' (0x45) for Enquiry.
# Four-CC strings are written in quotes inside the command field;
# the implementer must pack each as four ASCII bytes at offset 3.
- id: set_ircc_code
label: Send IR-like Code (setIrccCode)
kind: action
command: "0x2A 0x53 0x43 I R C C [P0..P15] 0x0A # FourCC=IRCC; P=IR function code from Table 5"
params:
- name: ir_function
type: string
description: IR function name from Table 5 (e.g. "Power Off", "Volume Up", "Num1")
- id: set_power_status_standby
label: Set Power Standby
kind: action
command: "0x2A 0x53 0x43 P O W R 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x0A # FourCC=POWR; P last byte = 0x00 (Standby)"
params: []
- id: set_power_status_active
label: Set Power Active (On)
kind: action
command: "0x2A 0x53 0x43 P O W R 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x31 0x0A # FourCC=POWR; P last byte = 0x01 (Active)"
params: []
- id: get_power_status
label: Get Power Status
kind: query
command: "0x2A 0x53 0x45 P O W R 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x0A # FourCC=POWR; Enquiry"
params: []
- id: set_audio_volume
label: Set Audio Volume
kind: action
command: "0x2A 0x53 0x43 V O L U [volume_digits] 0x0A # FourCC=VOLU; P=right-padded decimal (e.g. 0x30..0x32 0x39 = 0000000000000029 = 41)"
params:
- name: volume
type: integer
description: Volume level, ASCII decimal digits, right-padded with '0' to fill 16 bytes
- id: get_audio_volume
label: Get Audio Volume
kind: query
command: "0x2A 0x53 0x45 V O L U 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x0A # FourCC=VOLU"
params: []
- id: set_audio_mute_unmute
label: Set Audio Mute Off
kind: action
command: "0x2A 0x53 0x43 A M U T 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x0A # FourCC=AMUT; P last byte = 0x00"
params: []
- id: set_audio_mute_mute
label: Set Audio Mute On
kind: action
command: "0x2A 0x53 0x43 A M U T 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x31 0x0A # FourCC=AMUT; P last byte = 0x01"
params: []
- id: get_audio_mute
label: Get Audio Mute Status
kind: query
command: "0x2A 0x53 0x45 A M U T 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x0A # FourCC=AMUT"
params: []
- id: set_channel
label: Set Channel (preset)
kind: action
command: "0x2A 0x53 0x43 C H N N [preset_major][.][preset_minor][pad] 0x0A # FourCC=CHNN; e.g. 00000050.1000000 = ch 50.1, 00000006.0000000 = ch 6"
params:
- name: preset
type: string
description: "Preset channel as 'MAJOR.MINOR' with major/minor each left-padded with '0' to 8 digits"
- id: get_channel
label: Get Current Preset Channel
kind: query
command: "0x2A 0x53 0x45 C H N N 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x0A # FourCC=CHNN"
params: []
- id: set_triplet_channel
label: Set Channel (triplet, hex)
kind: action
command: "0x2A 0x53 0x43 T C H N [triplet_hex] 0x0A # FourCC=TCHN; e.g. 0x37 0x46 0x45 0x30 0x37 0x46 0x45 0x30 0x30 0x34 0x30 0x30 = 32736.32736.1024"
params:
- name: triplet
type: string
description: Triplet channel as 12-byte hex (e.g. "7FE07FE00400")
- id: get_triplet_channel
label: Get Current Triplet Channel
kind: query
command: "0x2A 0x53 0x45 T C H N 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x0A # FourCC=TCHN"
params: []
- id: set_input_source
label: Set TV Input Source (tuner)
kind: action
command: "0x2A 0x53 0x43 I S R C [source_padded] 0x0A # FourCC=ISRC; e.g. dvbt############, dvbc, dvbs, isdbt, isdbbs, isdbcs, antenna, cable, isdbgt"
params:
- name: source
type: string
description: "Tuner source mnemonic right-padded with '#' to fill 16 bytes (e.g. 'dvbt', 'cable')"
- id: get_input_source
label: Get TV Input Source
kind: query
command: "0x2A 0x53 0x45 I S R C 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x0A # FourCC=ISRC"
params: []
- id: set_input_tv
label: Set Input to TV
kind: action
command: "0x2A 0x53 0x43 I N P T 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x0A # FourCC=INPT; byte 7 = 0x00 (TV)"
params: []
- id: set_input_hdmi
label: Set Input to HDMI (1-9999)
kind: action
command: "0x2A 0x53 0x43 I N P T 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x31 [port_padded] 0x0A # FourCC=INPT; byte 7 = 0x01 (HDMI)"
params:
- name: port
type: integer
description: HDMI port number 1-9999, ASCII decimal right-padded with '0' to fill last 4 bytes
- id: set_input_scart
label: Set Input to SCART (1-9999)
kind: action
command: "0x2A 0x53 0x43 I N P T 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x32 [port_padded] 0x0A # FourCC=INPT; byte 7 = 0x02 (SCART)"
params:
- name: port
type: integer
description: SCART port number 1-9999
- id: set_input_composite
label: Set Input to Composite (1-9999)
kind: action
command: "0x2A 0x53 0x43 I N P T 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x33 [port_padded] 0x0A # FourCC=INPT; byte 7 = 0x03 (Composite)"
params:
- name: port
type: integer
description: Composite port number 1-9999
- id: set_input_component
label: Set Input to Component (1-9999)
kind: action
command: "0x2A 0x53 0x43 I N P T 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x34 [port_padded] 0x0A # FourCC=INPT; byte 7 = 0x04 (Component)"
params:
- name: port
type: integer
description: Component port number 1-9999
- id: set_input_screen_mirroring
label: Set Input to Screen Mirroring (1-9999)
kind: action
command: "0x2A 0x53 0x43 I N P T 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x35 [port_padded] 0x0A # FourCC=INPT; byte 7 = 0x05 (Screen Mirroring)"
params:
- name: port
type: integer
description: Screen Mirroring port number 1-9999
- id: set_input_pc_rgb
label: Set Input to PC RGB (1-9999)
kind: action
command: "0x2A 0x53 0x43 I N P T 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x36 [port_padded] 0x0A # FourCC=INPT; byte 7 = 0x06 (PC RGB)"
params:
- name: port
type: integer
description: PC RGB port number 1-9999
- id: get_input
label: Get Current Input
kind: query
command: "0x2A 0x53 0x45 I N P T 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x0A # FourCC=INPT"
params: []
- id: set_picture_mute_off
label: Disable Picture Mute
kind: action
command: "0x2A 0x53 0x43 P M U T 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x0A # FourCC=PMUT; P last byte = 0x00"
params: []
- id: set_picture_mute_on
label: Enable Picture Mute (blank screen)
kind: action
command: "0x2A 0x53 0x43 P M U T 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x31 0x0A # FourCC=PMUT; P last byte = 0x01"
params: []
- id: get_picture_mute
label: Get Picture Mute Status
kind: query
command: "0x2A 0x53 0x45 P M U T 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x0A # FourCC=PMUT"
params: []
- id: toggle_picture_mute
label: Toggle Picture Mute
kind: action
command: "0x2A 0x53 0x43 T P M U 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x0A # FourCC=TPMU"
params: []
- id: set_pip_off
label: Disable PIP
kind: action
command: "0x2A 0x53 0x43 P I P I 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x0A # FourCC=PIPI; P last byte = 0x00"
params: []
- id: set_pip_on
label: Enable PIP
kind: action
command: "0x2A 0x53 0x43 P I P I 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x30 0x31 0x0A # FourCC=PIPI; P last byte = 0x01"
params: []
- id: get_pip
label: Get PIP Status
kind: query
command: "0x2A 0x53 0x45 P I P I 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x0A # FourCC=PIPI"
params: []
- id: toggle_pip
label: Toggle PIP Status
kind: action
command: "0x2A 0x53 0x43 T P I P 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x0A # FourCC=TPIP"
params: []
- id: toggle_pip_position
label: Cycle PIP Position
kind: action
command: "0x2A 0x53 0x43 T P P P 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x23 0x0A # FourCC=TPPP"
params: []
- id: get_broadcast_address
label: Get Broadcast IPv4 Address (eth0)
kind: query
command: "0x2A 0x53 0x45 B A D R e t h 0 [pad] 0x0A # FourCC=BADR; param starts with 'eth0' then '#' padding"
params: []
- id: get_mac_address
label: Get MAC Address (eth0)
kind: query
command: "0x2A 0x53 0x45 M A D R e t h 0 [pad] 0x0A # FourCC=MADR; param starts with 'eth0' then '#' padding"
params: []
Feedbacks
- id: power_state
type: enum
values: [standby, active]
source: "getPowerStatus answer: P last byte 0x00 = Standby, 0x01 = Active"
- id: audio_mute_state
type: enum
values: [unmuted, muted]
source: "getAudioMute answer: 0x00 = Not Muted, 0x01 = Muted"
- id: picture_mute_state
type: enum
values: [disabled, enabled]
source: "getPictureMute answer: 0x00 = Disabled, 0x01 = Enabled"
- id: pip_state
type: enum
values: [disabled, enabled]
source: "getPip answer: 0x00 = Disabled, 0x01 = Enabled"
- id: current_input
type: enum
values: [tv, hdmi, scart, composite, component, screen_mirroring, pc_rgb]
source: "getInput answer: byte 7 selects family; last 4 bytes (right-padded '0') carry 1-9999 port"
- id: current_tuner_source
type: enum
values: [dvbt, dvbc, dvbs, isdbt, isdbbs, isdbcs, antenna, cable, isdbgt]
source: "getInputSource answer: right-padded '#' string"
- id: channel_preset
type: string
source: "getChannel answer: 'MAJOR.MINOR' with 8-digit zero-padded fields"
- id: channel_triplet
type: string
source: "getTripletChannel answer: 12 hex digits representing major.minor.sub"
- id: broadcast_address
type: string
source: "getBroadcastAddress answer: ASCII IPv4 right-padded with '#'"
- id: mac_address
type: string
source: "getMacAddress answer: ASCII MAC right-padded with '#'"
Events
# Unsolicited Notify (type 0x4E) frames the TV sends to the controller.
# Each is the same 24-byte frame layout with type = 0x4E.
- id: power_change
source: "firePowerChange (N POWR): P last byte 0x00 = powering off, 0x01 = powering on"
- id: channel_change
source: "fireChannelChange (N CHNN): P carries MAJOR.MINOR preset (same format as set_channel)"
- id: input_change
source: "fireInputChange (N INPT): byte 7 selects family (TV/HDMI/SCART/Composite/Component/Screen Mirroring/PC RGB), port in last 4 bytes"
- id: volume_change
source: "fireVolumeChange (N VOLU): P carries new volume as right-padded decimal"
- id: mute_change
source: "fireMuteChange (N AMUT): P last byte 0x00 = unmuting, 0x01 = muting"
- id: pip_change
source: "firePipChange (N PIPI): P last byte 0x00 = disabled, 0x01 = enabled"
- id: picture_mute_change
source: "firePictureMuteChange (N PMUT): P last byte 0x00 = disabled, 0x01 = enabled"
Safety
confirmation_required_for: []
interlocks: []
# UNRESOLVED: source contains no safety warnings, interlocks, or power-on sequencing requirements.
Notes
- Frame structure is fixed at 24 bytes:
0x2A 0x53 [type] [Four-CC] [16-byte param] 0x0A. Each Four-CC is four ASCII characters. - Server disconnects after 30 s of client idle; clients must keep-alive or reconnect.
- High-level HTTP/JSON-RPC ("WebAPI") layer exists per §1 of the source, but endpoint URL/method names are not in this document.
- IR function codes (Table 5) are emitted via the
setIrccCode(IRCC) action with a 16-byte parameter, e.g.0x00..0x00= Power Off,0x00..0x30= Volume Up. The full table is large (≈90 entries) and is parameterized rather than enumerated as separate actions. Analog?row in Table 5 appears in the source with a literal?and is preserved as-is; flag for operator review.- Volume is encoded as ASCII decimal digits, right-padded with ASCII
0(0x30) to fill 16 bytes — not as a binary integer. - The source notes BRAVIA 2014 models; cross-check KDXE8004 series firmware compatibility before deployment.
Provenance
source_domains:
- raw.githubusercontent.com
source_urls:
- https://raw.githubusercontent.com/xiaolaba/bravia_console_sony/master/Sony_Simple_IP_Control_Protocol_for_BRAVIA.pdf
retrieved_at: 2026-06-08T17:32:37.911Z
last_checked_at: 2026-06-09T07:21:02.277Z
Verification Summary
verdict: verified
checked_at: 2026-06-09T07:21:02.277Z
matched_actions: 34
action_count: 34
confidence: medium
summary: "All 34 spec action-units match their literal Four-CC commands in source Table 4; transport parameters (TCP port 20060, no auth) verified; bidirectional coverage complete. (5 unresolved item(s) noted in Known Gaps.)"
Known Gaps
- "HTTP/JSON-RPC endpoint URL for the WebAPI layer is not in this source."
- "source contains no safety warnings, interlocks, or power-on sequencing requirements."
- "HTTP/JSON-RPC WebAPI endpoint + method names not in this source."
- "firmware version compatibility not stated in source."
- "'Analog?' IR code label has a literal '?' in source; needs verification."
From the AI4AV catalog (https://ai4av.net) · ODbL-1.0