Summary
Spec covers Sony BRAVIA Simple IP Control protocol (v0.6) as exposed by the KDXD7004 series. Low-level TCP transport on port 20060 carrying fixed 24-byte frames; each frame carries a Four-CC function name, a type byte (Control/Enquiry/Answer/Notify), and 16 parameter bytes. Enable via Network → Home Network Setup → IP Control → Simple IP Control (Normal Mode) or Hotel/Pro Mode → IP Control → Simple IP Control.
Transport
protocols:
- tcp
addressing:
port: 20060
auth:
type: none # inferred: no auth procedure in source
Traits
- powerable # inferred: setPowerStatus present
- routable # inferred: setInput / setInputSource present
- queryable # inferred: getPowerStatus / getAudioVolume / getInput etc. present
- levelable # inferred: setAudioVolume present
Actions
# Control / Enquiry / Notify actions over Sony Simple IP Control, 24-byte fixed
# frame layout: [0x2A 0x53] [Type: C|E|A|N] [Function: 4 ASCII bytes] [16 param bytes] [0x0A].
# `command:` field shows the literal frame template; variable parts in {braces}
# are filled with hex or ASCII bytes per the source's parameter table.
- id: set_ircc_code
label: Send IR-Like Code
kind: action
command: "2A 53 43 IRCC {ircc_param_16_bytes} 0A"
params:
- name: ircc_param_16_bytes
type: string
description: 16 ASCII hex bytes from Table 5 (IR Command Parameters), e.g. `30` for Volume Up, `00` for Power Off
notes: "setIrccCode - IRCC function code. See Table 5 for code values."
- id: set_power_status
label: Set Power Status
kind: action
command: "2A 53 43 POWR 0000000000000000 0A" # 0 = standby
params:
- name: state
type: enum
values: [standby, active]
description: Last parameter byte (0x30=standby/off, 0x31=active/on)
notes: "setPowerStatus - POWR. 0=Standby, 1=Active."
- id: get_power_status
label: Get Power Status
kind: query
command: "2A 53 45 POWR ################ 0A"
params: []
notes: "getPowerStatus - POWR enquiry."
- id: set_audio_volume
label: Set Audio Volume
kind: action
command: "2A 53 43 VOLU {volume_ascii_padded} 0A"
params:
- name: volume_ascii_padded
type: string
description: Volume in decimal digits, left-padded with ASCII `0` to fill the 16-byte parameter field (e.g. `0000000000000029` = 41)
notes: "setAudioVolume - VOLU."
- id: get_audio_volume
label: Get Audio Volume
kind: query
command: "2A 53 45 VOLU ################ 0A"
params: []
notes: "getAudioVolume - VOLU enquiry. Answer carries the decimal-padded value."
- id: set_audio_mute
label: Set Audio Mute
kind: action
command: "2A 53 43 AMUT 0000000000000000 0A"
params:
- name: state
type: enum
values: [unmute, mute]
description: Last parameter byte (0x30=unmute, 0x31=mute)
notes: "setAudioMute - AMUT. 0=Unmute, 1=Mute."
- id: get_audio_mute
label: Get Audio Mute Status
kind: query
command: "2A 53 45 AMUT ################ 0A"
params: []
notes: "getAudioMute - AMUT enquiry."
- id: set_channel
label: Set Channel (Preset)
kind: action
command: "2A 53 43 CHNN {channel_preset_16_bytes} 0A"
params:
- name: channel_preset_16_bytes
type: string
description: Preset channel as 16 ASCII bytes; major.minor format (e.g. `00000050.1000000` = 50.1, `00000006.0000000` = 6)
notes: "setChannel - CHNN. Change channel by preset number."
- id: get_channel
label: Get Current Preset Channel
kind: query
command: "2A 53 45 CHNN ################ 0A"
params: []
notes: "getChannel - CHNN enquiry. Answer carries preset channel in major.minor form."
- id: set_triplet_channel
label: Set Channel (Triplet)
kind: action
command: "2A 53 43 TCHN {triplet_16_bytes} 0A"
params:
- name: triplet_16_bytes
type: string
description: Triplet channel as 16 ASCII hex bytes (e.g. `7FE07FE00400` = 32736.32736.1024)
notes: "setTripletChannel - TCHN."
- id: get_triplet_channel
label: Get Current Triplet Channel
kind: query
command: "2A 53 45 TCHN ################ 0A"
params: []
notes: "getTripletChannel - TCHN enquiry."
- id: set_input_source
label: Set TV Input Source (Tuner Type)
kind: action
command: "2A 53 43 ISRC {source_16_bytes} 0A"
params:
- name: source_16_bytes
type: string
description: Source name right-padded with ASCII `#` (0x23) to 16 bytes; e.g. `dvbt############`, `dvbc`, `dvbs`, `isdbt`, `isdbbs`, `isdbcs`, `antenna`, `cable`, `isdbgt`
notes: "setInputSource - ISRC."
- id: get_input_source
label: Get Current TV Input Source
kind: query
command: "2A 53 45 ISRC ################ 0A"
params: []
notes: "getInputSource - ISRC enquiry."
- id: set_input_tv
label: Switch Input to TV Tuner
kind: action
command: "2A 53 43 INPT 0000000000000000 0A"
params: []
notes: "setInput - INPT, terminal code 0 (TV)."
- id: set_input_hdmi
label: Switch Input to HDMI
kind: action
command: "2A 53 43 INPT 00000001000{port}#### 0A"
params:
- name: port
type: integer
description: HDMI port number 1-9999
notes: "setInput - INPT, terminal code 1 (HDMI 1-9999)."
- id: set_input_scart
label: Switch Input to SCART
kind: action
command: "2A 53 43 INPT 00000002000{port}#### 0A"
params:
- name: port
type: integer
description: SCART port number 1-9999
notes: "setInput - INPT, terminal code 2 (SCART 1-9999)."
- id: set_input_composite
label: Switch Input to Composite
kind: action
command: "2A 53 43 INPT 00000003000{port}#### 0A"
params:
- name: port
type: integer
description: Composite port number 1-9999
notes: "setInput - INPT, terminal code 3 (Composite 1-9999)."
- id: set_input_component
label: Switch Input to Component
kind: action
command: "2A 53 43 INPT 00000004000{port}#### 0A"
params:
- name: port
type: integer
description: Component port number 1-9999
notes: "setInput - INPT, terminal code 4 (Component 1-9999)."
- id: set_input_screen_mirroring
label: Switch Input to Screen Mirroring
kind: action
command: "2A 53 43 INPT 00000005000{port}#### 0A"
params:
- name: port
type: integer
description: Screen mirroring port 1-9999
notes: "setInput - INPT, terminal code 5 (Screen Mirroring 1-9999)."
- id: set_input_pc_rgb
label: Switch Input to PC RGB
kind: action
command: "2A 53 43 INPT 00000006000{port}#### 0A"
params:
- name: port
type: integer
description: PC RGB port 1-9999
notes: "setInput - INPT, terminal code 6 (PC RGB Input 1-9999)."
- id: get_input
label: Get Current Input
kind: query
command: "2A 53 45 INPT ################ 0A"
params: []
notes: "getInput - INPT enquiry. Answer layout matches the terminal-code table above."
- id: set_picture_mute
label: Set Picture Mute
kind: action
command: "2A 53 43 PMUT 0000000000000000 0A"
params:
- name: state
type: enum
values: [disabled, enabled]
description: Last parameter byte (0x30=disable/picture-mute-off, 0x31=enable/black-screen)
notes: "setPictureMute - PMUT. 0=Disable picture mute, 1=Make screen black."
- id: get_picture_mute
label: Get Picture Mute Status
kind: query
command: "2A 53 45 PMUT ################ 0A"
params: []
notes: "getPictureMute - PMUT enquiry."
- id: toggle_picture_mute
label: Toggle Picture Mute
kind: action
command: "2A 53 43 TPMU ################ 0A"
params: []
notes: "togglePictureMute - TPMU."
- id: set_pip
label: Set Picture-in-Picture
kind: action
command: "2A 53 43 PIPI 0000000000000000 0A"
params:
- name: state
type: enum
values: [disabled, enabled]
description: Last parameter byte (0x30=disable PIP, 0x31=enable PIP)
notes: "setPip - PIPI. 0=Disable, 1=Enable."
- id: get_pip
label: Get PIP Status
kind: query
command: "2A 53 45 PIPI ################ 0A"
params: []
notes: "getPip - PIPI enquiry."
- id: toggle_pip
label: Toggle PIP Status
kind: action
command: "2A 53 43 TPIP ################ 0A"
params: []
notes: "togglePip - TPIP."
- id: toggle_pip_position
label: Cycle PIP Position
kind: action
command: "2A 53 43 TPPP ################ 0A"
params: []
notes: "togglePipPosition - TPPP. Change PIP position in turn."
- id: get_broadcast_address
label: Get Broadcast IPv4 Address
kind: query
command: "2A 53 45 BADR eth0############# 0A"
params:
- name: interface
type: string
description: Interface name right-padded with `#` to 16 bytes (e.g. `eth0`)
notes: "getBroadcastAddress - BADR."
- id: get_mac_address
label: Get MAC Address
kind: query
command: "2A 53 45 MADR eth0############# 0A"
params:
- name: interface
type: string
description: Interface name right-padded with `#` to 16 bytes (e.g. `eth0`)
notes: "getMacAddress - MADR."
Feedbacks
- id: power_state
type: enum
values: [standby, active]
notes: "Answer to getPowerStatus (POWR)."
- id: audio_volume
type: integer
notes: "Answer to getAudioVolume (VOLU); decimal-padded ASCII in parameter field."
- id: audio_mute
type: enum
values: [unmuted, muted]
notes: "Answer to getAudioMute (AMUT)."
- id: channel_preset
type: string
notes: "Answer to getChannel (CHNN); major.minor preset string."
- id: triplet_channel
type: string
notes: "Answer to getTripletChannel (TCHN); 16 ASCII hex bytes."
- id: input_source
type: string
notes: "Answer to getInputSource (ISRC); right-padded source name."
- id: input_terminal
type: enum
values: [tv, hdmi, scart, composite, component, screen_mirroring, pc_rgb]
notes: "Answer to getInput (INPT); terminal code 0-6 with optional port."
- id: picture_mute
type: enum
values: [disabled, enabled]
notes: "Answer to getPictureMute (PMUT)."
- id: pip_state
type: enum
values: [disabled, enabled]
notes: "Answer to getPip (PIPI)."
- id: broadcast_address
type: string
notes: "Answer to getBroadcastAddress (BADR)."
- id: mac_address
type: string
notes: "Answer to getMacAddress (MADR)."
Variables
# Discrete settable values are encoded as Actions above (per protocol). No
# additional free-form variables are exposed beyond the parameter fields.
Events
- id: power_change
type: enum
values: [standby, active]
notes: "Notify firePowerChange (POWR, type N). 0=powering off, 1=powering on."
- id: channel_change
type: string
notes: "Notify fireChannelChange (CHNN, type N); preset channel payload."
- id: input_change
type: object
notes: "Notify fireInputChange (INPT, type N); terminal code + port. See INPT codes under set_input_*."
- id: volume_change
type: integer
notes: "Notify fireVolumeChange (VOLU, type N); new volume value."
- id: mute_change
type: enum
values: [unmuted, muted]
notes: "Notify fireMuteChange (AMUT, type N). 0=unmuting, 1=muting."
- id: pip_change
type: enum
values: [disabled, enabled]
notes: "Notify firePipChange (PIPI, type N)."
- id: picture_mute_change
type: enum
values: [disabled, enabled]
notes: "Notify firePictureMuteChange (PMUT, type N)."
Macros
# UNRESOLVED: source does not define composite multi-step sequences.
Safety
confirmation_required_for: []
interlocks: []
# UNRESOLVED: source contains no explicit safety warnings, interlocks, or
# power-on sequencing requirements.
Notes
- Frame layout is fixed 24 bytes:
0x2A 0x53(header) | type (C/E/A/N) | Four-CC function (4 ASCII bytes) | 16 param bytes |0x0A(footer). - TCP port 20060. Server closes idle connections after 30 s of silence.
- Protocol is the "Low Level" bridge to the WebAPI layer; every command here is also available via the WebAPI JSON-RPC HTTP interface per source.
- IRCC command set (Table 5) is a single setIrccCode call with a 16-byte parameter from the IR code table; entries span
0x30..0x39and0x41..0x49(Power Off through Social), full list in source. entity_idprovided assony_kdxd7004_series; replace with canonical Convex entityId at ingest time.- "BRAVIA 2014 models" provenance from source — KD-XD7004 series is a 2014 lineup; spec lineage asserted from this, not separately verified.
Provenance
source_domains:
- aca.im
- applicationmarket.crestron.com
source_urls:
- "https://aca.im/driver_docs/Sony/sony%20bravia%20simple%20ip%20control.pdf"
- https://applicationmarket.crestron.com/content/Help/Sony/Sony_2014_Bravia_TV_v1_0_Help.pdf
retrieved_at: 2026-06-12T04:37:40.277Z
last_checked_at: 2026-06-12T19:50:57.235Z
Verification Summary
verdict: verified
checked_at: 2026-06-12T19:50:57.235Z
matched_actions: 30
action_count: 30
confidence: medium
summary: "All 30 spec actions matched verbatim to source Four-CC codes; transport parameters (port 20060, TCP, no auth) confirmed; all Notify commands represented in Events section. (4 unresolved item(s) noted in Known Gaps.)"
Known Gaps
- "source documents the protocol but does not name a specific KDXD7004 firmware build; compat is assumed via the \"BRAVIA 2014 models\" lineage."
- "source does not define composite multi-step sequences."
- "source contains no explicit safety warnings, interlocks, or"
- "no firmware version, no JSON-RPC command table (only the TCP bridge), no Wake-on-LAN behavior."
From the AI4AV catalog (https://ai4av.net) · ODbL-1.0