Summary

BRAVIA 2014 series professional displays (KDXE8588 family) exposing Sony's Simple IP Control protocol over TCP. Low-level transport is a fixed 24-byte frame on TCP port 20060, with an HTTP/JSON-RPC high-level wrapper. This spec covers the low-level TCP wire format and the full command catalogue (Control, Enquiry, Answer, Notify).

Transport

protocols:
  - tcp
addressing:
  port: 20060
auth:
  type: none  # inferred: no auth procedure in source
notes:
  frame_size_bytes: 24
  header_hex: "0x2A 0x53"
  footer_hex: "0x0A"
  idle_disconnect_seconds: 30

Traits

powerable: true       # inferred: setPowerStatus / getPowerStatus commands
routable: true        # inferred: setInput / setInputSource commands
queryable: true       # inferred: get* enquiry commands returning state
levelable: true       # inferred: setAudioVolume / getAudioVolume commands

Actions

# Low-level frame layout (24 bytes):
#   [0..1]   Header        0x2A 0x53
#   [2]      Type          'C' (0x43) Control | 'E' (0x45) Enquiry | 'A' (0x41) Answer | 'N' (0x4E) Notify
#   [3..6]   Function      FourCC ASCII (e.g. POWR, VOLU, AMUT, CHNN, TCHN, ISRC, INPT, PMUT, PIPI, TPIP, TPPP, BADR, MADR, IRCC)
#   [7..22]  Parameter     16 bytes, ASCII hex digits or ASCII data padded with '#' / '0'
#   [23]     Footer        0x0A (LF)
#
# Each action below is a distinct row in the source command table (Table 4) or IR table (Table 5).

- id: set_ircc_code
  label: Send IR-like Code
  kind: action
  command: "0x2A 0x53 0x43 IRCC {ircc_hex_16chars} 0x0A"  # 24-byte frame, type C, function IRCC, 16-hex-digit param
  params:
    - name: ircc_hex
      type: string
      description: 16-character hex IR code from Table 5 (e.g. "0000000000000000" for Power Off, "0000000000000030" for Volume Up)

- id: set_power_status
  label: Set Power Status
  kind: action
  command: "0x2A 0x53 0x43 POWR {power_hex_16chars} 0x0A"
  params:
    - name: power
      type: enum
      values: [standby, active]
      description: "00..0 = Standby (Off), 00..01 = Active (On) - 16 hex chars total, last digit carries state"

- id: get_power_status
  label: Get Power Status
  kind: query
  command: "0x2A 0x53 0x45 POWR {param_16chars} 0x0A"  # type E (Enquiry); parameter bytes filled with '########' / hex placeholder
  params: []

- id: set_audio_volume
  label: Set Audio Volume
  kind: action
  command: "0x2A 0x53 0x43 VOLU {volume_hex_16chars} 0x0A"
  params:
    - name: volume
      type: integer
      description: Volume value left-padded with '0' to 16 hex chars (e.g. volume 41 → "0000000000000029")

- id: get_audio_volume
  label: Get Audio Volume
  kind: query
  command: "0x2A 0x53 0x45 VOLU {param_16chars} 0x0A"
  params: []

- id: set_audio_mute
  label: Set Audio Mute
  kind: action
  command: "0x2A 0x53 0x43 AMUT {mute_hex_16chars} 0x0A"
  params:
    - name: mute
      type: enum
      values: [unmute, mute]
      description: "00..0 = Unmute, 00..01 = Mute"

- id: get_audio_mute
  label: Get Audio Mute
  kind: query
  command: "0x2A 0x53 0x45 AMUT {param_16chars} 0x0A"
  params: []

- id: set_channel
  label: Set Channel (Preset Number)
  kind: action
  command: "0x2A 0x53 0x43 CHNN {channel_hex_16chars} 0x0A"
  params:
    - name: channel
      type: string
      description: Preset channel as 8 + '.' + 7 hex digits (e.g. "00000050.1000000" = channel 50.1, "00000006.0000000" = channel 6)

- id: get_channel
  label: Get Channel (Preset Number)
  kind: query
  command: "0x2A 0x53 0x45 CHNN {param_16chars} 0x0A"
  params: []

- id: set_triplet_channel
  label: Set Channel (Triplet Hex)
  kind: action
  command: "0x2A 0x53 0x43 TCHN {triplet_hex_16chars} 0x0A"
  params:
    - name: triplet
      type: string
      description: 12 hex digits in 3 groups of 4 (e.g. "7FE07FE00400" = 32736.32736.1024)

- id: get_triplet_channel
  label: Get Channel (Triplet Hex)
  kind: query
  command: "0x2A 0x53 0x45 TCHN {param_16chars} 0x0A"
  params: []

- id: set_input_source
  label: Set TV Input Source
  kind: action
  command: "0x2A 0x53 0x43 ISRC {source_ascii_16chars} 0x0A"
  params:
    - name: source
      type: enum
      values: [dvbt, dvbc, dvbs, isdbt, isdbbs, isdbcs, antenna, cable, isdbgt]
      description: Source name ASCII, padded right with '#' to 16 chars (e.g. "dvbt############")

- id: get_input_source
  label: Get TV Input Source
  kind: query
  command: "0x2A 0x53 0x45 ISRC {param_16chars} 0x0A"
  params: []

- id: set_input
  label: Set Input
  kind: action
  command: "0x2A 0x53 0x43 INPT {input_hex_16chars} 0x0A"
  params:
    - name: input_type
      type: enum
      values: [tv, hdmi, scart, composite, component, screen_mirroring, pc_rgb]
      description: First hex nibble groups: 0=TV, 1=HDMI, 2=SCART, 3=Composite, 4=Component, 5=Screen Mirroring, 6=PC RGB
    - name: input_number
      type: integer
      description: Per-type instance number 1..9999, encoded in trailing hex digits (full 16-char param layout per source Table 4)

- id: get_input
  label: Get Input
  kind: query
  command: "0x2A 0x53 0x45 INPT {param_16chars} 0x0A"
  params: []

- id: set_picture_mute
  label: Set Picture Mute
  kind: action
  command: "0x2A 0x53 0x43 PMUT {pmut_hex_16chars} 0x0A"
  params:
    - name: state
      type: enum
      values: [disable, enable]
      description: "00..0 = Disable, 00..01 = Enable (black screen)"

- id: get_picture_mute
  label: Get Picture Mute
  kind: query
  command: "0x2A 0x53 0x45 PMUT {param_16chars} 0x0A"
  params: []

- id: toggle_picture_mute
  label: Toggle Picture Mute
  kind: action
  command: "0x2A 0x53 0x43 TPMU {param_16chars} 0x0A"
  params: []

- id: set_pip
  label: Set PIP (Picture in Picture)
  kind: action
  command: "0x2A 0x53 0x43 PIPI {pip_hex_16chars} 0x0A"
  params:
    - name: state
      type: enum
      values: [disable, enable]

- id: get_pip
  label: Get PIP Status
  kind: query
  command: "0x2A 0x53 0x45 PIPI {param_16chars} 0x0A"
  params: []

- id: toggle_pip
  label: Toggle PIP
  kind: action
  command: "0x2A 0x53 0x43 TPIP {param_16chars} 0x0A"
  params: []

- id: toggle_pip_position
  label: Toggle PIP Position
  kind: action
  command: "0x2A 0x53 0x43 TPPP {param_16chars} 0x0A"
  params: []

- id: get_broadcast_address
  label: Get Broadcast IPv4 Address
  kind: query
  command: "0x2A 0x53 0x45 BADR Eth0{param_15chars} 0x0A"  # function 'BADR', param "Eth0###########"
  params:
    - name: interface
      type: string
      description: Interface name (source example uses "Eth0")

- id: get_mac_address
  label: Get MAC Address
  kind: query
  command: "0x2A 0x53 0x45 MADR Eth0{param_15chars} 0x0A"
  params:
    - name: interface
      type: string
      description: Interface name (source example uses "Eth0")

Feedbacks

- id: power_state
  type: enum
  values: [standby, active]
  source: "Answer on POWR: 00..0 = Standby, 00..01 = Active"

- id: audio_volume
  type: integer
  source: "Answer on VOLU: volume value in 16-hex-char field"

- id: audio_mute
  type: enum
  values: [not_muted, muted]
  source: "Answer on AMUT: 00..0 = Not Muted, 00..01 = Muted"

- id: channel_preset
  type: string
  source: "Answer on CHNN: 8 hex digits + '.' + 7 hex digits"

- id: channel_triplet
  type: string
  source: "Answer on TCHN: 12 hex digits"

- id: input_source_tuner
  type: enum
  values: [dvbt, dvbc, dvbs, isdbt, isdbbs, isdbcs, antenna, cable, isdbgt]
  source: "Answer on ISRC: source name padded with '#'"

- id: input
  type: enum
  values: [tv, hdmi, scart, composite, component, screen_mirroring, pc_rgb]
  source: "Answer on INPT: 0=TV, 1=HDMI, 2=SCART, 3=Composite, 4=Component, 5=Screen Mirroring, 6=PC RGB"

- id: picture_mute
  type: enum
  values: [disabled, enabled]
  source: "Answer on PMUT: 00..0 = Disabled, 00..01 = Enabled"

- id: pip_state
  type: enum
  values: [disabled, enabled]
  source: "Answer on PIPI: 00..0 = Disabled, 00..01 = Enabled"

- id: broadcast_address
  type: string
  source: "Answer on BADR: IPv4 dotted-quad padded with '#' (e.g. 192.168.0.14####)"

- id: mac_address
  type: string
  source: "Answer on MADR: MAC address padded with '#'"

Events

# All events are unsolicited Notify frames (type 'N'). Wire shape:
#   0x2A 0x53 0x4E {FourCC} {param 16 bytes} 0x0A

- id: power_change
  type: notify
  command: "0x2A 0x53 0x4E POWR {param_16chars} 0x0A"
  payload_meaning: "00..0 = power off, 00..01 = power on"
  source: "Table 4 row firePowerChange"

- id: channel_change
  type: notify
  command: "0x2A 0x53 0x4E CHNN {param_16chars} 0x0A"
  payload_meaning: "Preset channel number (8 + '.' + 7 hex digits)"
  source: "Table 4 row fireChannelChange"

- id: input_change
  type: notify
  command: "0x2A 0x53 0x4E INPT {param_16chars} 0x0A"
  payload_meaning: "0=TV, 1=HDMI, 2=SCART, 3=Composite, 4=Component, 5=Screen Mirroring, 6=PC RGB"
  source: "Table 4 row fireInputChange"

- id: volume_change
  type: notify
  command: "0x2A 0x53 0x4E VOLU {param_16chars} 0x0A"
  payload_meaning: "Volume value in 16-hex-char field"
  source: "Table 4 row fireVolumeChange"

- id: mute_change
  type: notify
  command: "0x2A 0x53 0x4E AMUT {param_16chars} 0x0A"
  payload_meaning: "00..0 = unmuting, 00..01 = muting"
  source: "Table 4 row fireMuteChange"

- id: pip_change
  type: notify
  command: "0x2A 0x53 0x4E PIPI {param_16chars} 0x0A"
  payload_meaning: "00..0 = PIP disabled, 00..01 = PIP enabled"
  source: "Table 4 row firePipChange"

- id: picture_mute_change
  type: notify
  command: "0x2A 0x53 0x4E PMUT {param_16chars} 0x0A"
  payload_meaning: "00..0 = picture mute disabled, 00..01 = picture mute enabled"
  source: "Table 4 row firePictureMuteChange"

Variables

# UNRESOLVED: source documents no persistent settable parameter unrelated to a discrete action

Macros

# UNRESOLVED: source documents no multi-step macro sequences

Safety

confirmation_required_for: []
interlocks: []
# UNRESOLVED: source contains no safety warnings, interlock procedures, or power-on sequencing requirements

Notes

Protocol is a fixed 24-byte frame: 0x2A 0x53 header, type byte (C/E/A/N), 4-char FourCC function code, 16-byte parameter field, 0x0A footer. Parameter encoding is per-table: hex digits left/right padded with 0 or # depending on the row. Server closes idle TCP connections after 30s. Enable protocol via Settings → Network → Home Network Setup → IP Control → Simple IP Control (Normal Mode) or Hotel/Pro Mode → IP Control → Simple IP Control. High-level protocol (HTTP/JSON-RPC) wraps the same commands but is not detailed in this revision.

Provenance

source_domains:
  - aca.im
source_urls:
  - "https://aca.im/driver_docs/Sony/sony%20bravia%20simple%20ip%20control.pdf"
retrieved_at: 2026-06-08T17:19:06.633Z
last_checked_at: 2026-06-09T07:21:03.132Z

Verification Summary

verdict: verified
checked_at: 2026-06-09T07:21:03.132Z
matched_actions: 24
action_count: 24
confidence: medium
summary: "All 24 spec actions matched exactly in source; all FourCC codes, frame structure, and transport parameters verified literal. (7 unresolved item(s) noted in Known Gaps.)"

Known Gaps

- "source does not state firmware version compatibility, voltage, current, or power specifications"
- "source documents no persistent settable parameter unrelated to a discrete action"
- "source documents no multi-step macro sequences"
- "source contains no safety warnings, interlock procedures, or power-on sequencing requirements"
- "firmware version compatibility not stated in source"
- "voltage, current, or power specifications not stated in source"
- "high-level HTTP/JSON-RPC WebAPI endpoint paths not detailed in this source revision"

From the AI4AV catalog (https://ai4av.net) · ODbL-1.0