Summary

Sony BRAVIA 2014-series LCD televisions (KDX8577 family) implementing the Sony Simple IP Control v0.6 low-level protocol over TCP. Control via 24-byte fixed frames on TCP port 20060 using Four-CC function codes. No authentication required. Source covers the generic BRAVIA 2014 IP protocol; X8577 SKU conformance to Simple IP Control is not explicitly confirmed in the source.

Transport

protocols:
  - tcp
addressing:
  port: 20060
auth:
  type: none  # inferred: no auth procedure in source

Traits

powerable: true   # inferred from setPowerStatus command examples
queryable: true   # inferred from getPowerStatus, getAudioVolume, getInput, etc.
routable: true    # inferred from setInputSource / setInput command examples
levelable: true   # inferred from setAudioVolume command examples

Actions

# Sony Simple IP Control low-level protocol.
# 24-byte frame: [0x2A 0x53] [Type 1B] [Function 4B ASCII] [Parameter 16B] [0x0A]
# Type bytes: 0x43 [C] Control, 0x45 [E] Enquiry, 0x41 [A] Answer, 0x4E [N] Notify
# `command:` below shows the 24-byte frame template with the variable parameter bytes
# replaced by {param} placeholders. Header 0x2A 0x53 + Type byte + FourCC + parameters + footer 0x0A.

- id: set_ircc_code
  label: Send IR-like Code
  kind: action
  command: "2A 53 43 49 52 43 43 {ircc_param_bytes} 0A"
  params:
    - name: ircc_param_bytes
      type: bytes
      description: 16-byte parameter block; IR code is encoded in the last 2 bytes per Table 5 (e.g. Power Off = 0x0000, Volume Up = 0x0030).
  notes: "See IR Commands table in source for the 87 IR function codes and their parameter values."

- id: set_power_status
  label: Set Power
  kind: action
  command: "2A 53 43 50 4F 57 52 00 00 00 00 00 00 00 00 00 00 00 00 00 00 {state} 0A"
  params:
    - name: state
      type: enum
      values: [standby, active]
      description: 0x00 = Standby (Off), 0x01 = Active (On).
  notes: "Encoded as decimal digits in parameter block: 0000000000000000 = standby, 0000000000000001 = active."

- id: get_power_status
  label: Get Power Status
  kind: query
  command: "2A 53 45 50 4F 57 52 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0A"
  params: []

- id: set_audio_volume
  label: Set Audio Volume
  kind: action
  command: "2A 53 43 56 4F 4C 55 {volume_padded} 0A"
  params:
    - name: volume
      type: integer
      description: Volume value, decimal, left-padded with "0" to 16-byte field (e.g. 41 = "0000000000000029").
  notes: "Parameter is 16 ASCII decimal digits representing the volume value."

- id: get_audio_volume
  label: Get Audio Volume
  kind: query
  command: "2A 53 45 56 4F 4C 55 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0A"
  params: []

- id: set_audio_mute
  label: Set Audio Mute
  kind: action
  command: "2A 53 43 41 4D 55 54 00 00 00 00 00 00 00 00 00 00 00 00 00 00 {state} 0A"
  params:
    - name: state
      type: enum
      values: [unmute, mute]
      description: 0x00 = Unmute, 0x01 = Mute.

- id: get_audio_mute
  label: Get Audio Mute Status
  kind: query
  command: "2A 53 45 41 4D 55 54 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0A"
  params: []

- id: set_channel
  label: Set Channel (preset)
  kind: action
  command: "2A 53 43 43 48 4E 4E {channel_padded} 0A"
  params:
    - name: channel
      type: string
      description: Preset channel in format MAJOR.MINOR, decimal digits padded to 16 bytes (e.g. channel 50.1 = "00000050.1000000", channel 6 = "00000006.0000000").
  notes: "Answer with all N (0x4E) bytes means no such channel."

- id: get_channel
  label: Get Current Channel
  kind: query
  command: "2A 53 45 43 48 4E 4E 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0A"
  params: []

- id: set_triplet_channel
  label: Set Channel (triplet)
  kind: action
  command: "2A 53 43 54 43 48 4E {triplet_padded} 0A"
  params:
    - name: triplet
      type: string
      description: 12 hex digits + 4 trailing placeholder bytes (e.g. "7FE07FE00400" = triplet 32736.32736.1024).

- id: get_triplet_channel
  label: Get Current Triplet Channel
  kind: query
  command: "2A 53 45 54 43 48 4E 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0A"
  params: []

- id: set_input_source
  label: Set TV Input Source (tuner)
  kind: action
  command: "2A 53 43 49 53 52 43 {source_padded} 0A"
  params:
    - name: source
      type: enum
      values: [dvbt, dvbc, dvbs, isdbt, isdbbs, isdbcs, antenna, cable, isdbgt]
      description: Tuner source name, right-padded with "#" to fill 16-byte parameter field (e.g. "dvbt############").

- id: get_input_source
  label: Get Current TV Input Source
  kind: query
  command: "2A 53 45 49 53 52 43 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0A"
  params: []

- id: set_input
  label: Set Input
  kind: action
  command: "2A 53 43 49 4E 50 54 00 00 00 00 00 00 00 {kind} 00 00 00 00 {port_padded} 0A"
  params:
    - name: kind
      type: enum
      values: [tv, hdmi, scart, composite, component, screen_mirroring, pc_rgb]
      description: 0x00=TV, 0x01=HDMI, 0x02=SCART, 0x03=Composite, 0x04=Component, 0x05=Screen Mirroring, 0x06=PC RGB.
    - name: port
      type: integer
      description: Port number 1-9999, right-padded as ASCII decimal digits within the 4-byte sub-field.

- id: get_input
  label: Get Current Input
  kind: query
  command: "2A 53 45 49 4E 50 54 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0A"
  params: []

- id: set_picture_mute
  label: Set Picture Mute
  kind: action
  command: "2A 53 43 50 4D 55 54 00 00 00 00 00 00 00 00 00 00 00 00 00 00 {state} 0A"
  params:
    - name: state
      type: enum
      values: [disabled, enabled]
      description: 0x00 = Disable picture mute, 0x01 = Make screen black.

- id: get_picture_mute
  label: Get Picture Mute Status
  kind: query
  command: "2A 53 45 50 4D 55 54 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0A"
  params: []

- id: toggle_picture_mute
  label: Toggle Picture Mute
  kind: action
  command: "2A 53 43 54 50 4D 55 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0A"
  params: []

- id: set_pip
  label: Set PIP (Picture in Picture)
  kind: action
  command: "2A 53 43 50 49 50 49 00 00 00 00 00 00 00 00 00 00 00 00 00 00 {state} 0A"
  params:
    - name: state
      type: enum
      values: [disable, enable]
      description: 0x00 = Disable PIP, 0x01 = Enable PIP.

- id: get_pip
  label: Get PIP Status
  kind: query
  command: "2A 53 45 50 49 50 49 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0A"
  params: []

- id: toggle_pip
  label: Toggle PIP
  kind: action
  command: "2A 53 43 54 50 49 50 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0A"
  params: []

- id: toggle_pip_position
  label: Toggle PIP Position
  kind: action
  command: "2A 53 43 54 50 50 50 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0A"
  params: []

- id: get_broadcast_address
  label: Get Broadcast IPv4 Address
  kind: query
  command: "2A 53 45 42 41 44 52 65 74 68 30 23 23 23 23 23 23 23 23 23 23 23 0A"
  params:
    - name: interface
      type: string
      description: Interface name, "eth0" for wired Ethernet (other interfaces not specified in source).
  notes: "Answer contains the IPv4 broadcast address as ASCII, right-padded with '#'."

- id: get_mac_address
  label: Get MAC Address
  kind: query
  command: "2A 53 45 4D 41 44 52 65 74 68 30 23 23 23 23 23 23 23 23 23 23 23 0A"
  params:
    - name: interface
      type: string
      description: Interface name, "eth0" for wired Ethernet.
  notes: "Answer contains MAC address as ASCII, right-padded with '#'."

Feedbacks

- id: power_state
  type: enum
  values: [standby, active]
  description: Response to getPowerStatus. 0x00 = Standby, 0x01 = Active.

- id: audio_volume
  type: integer
  description: Response to getAudioVolume. Volume value as decimal digits in 16-byte field.

- id: audio_mute_state
  type: enum
  values: [not_muted, muted]
  description: Response to getAudioMute. 0x00 = Not Muted, 0x01 = Muted.

- id: channel_preset
  type: string
  description: Response to getChannel. Preset channel number in MAJOR.MINOR decimal format.

- id: channel_triplet
  type: string
  description: Response to getTripletChannel. Triplet channel in hexadecimal format.

- id: input_source_tuner
  type: string
  description: Response to getInputSource. Tuner source name (e.g. dvbt, dvbc).

- id: current_input
  type: enum
  values: [tv, hdmi, scart, composite, component, screen_mirroring, pc_rgb]
  description: Response to getInput. 0x00=TV, 0x01=HDMI, 0x02=SCART, 0x03=Composite, 0x04=Component, 0x05=Screen Mirroring, 0x06=PC RGB. Includes port number sub-field.

- id: picture_mute_state
  type: enum
  values: [disabled, enabled]
  description: Response to getPictureMute. 0x00 = Disabled, 0x01 = Enabled.

- id: pip_state
  type: enum
  values: [disabled, enabled]
  description: Response to getPip. 0x00 = Disabled, 0x01 = Enabled.

- id: broadcast_address
  type: string
  description: Response to getBroadcastAddress. IPv4 broadcast address as ASCII.

- id: mac_address
  type: string
  description: Response to getMacAddress. MAC address as ASCII.

Variables

# UNRESOLVED: source documents no settable parameters that are not discrete actions.

Events

- id: fire_power_change
  type: notification
  fourcc: "POWR"
  description: Sent when power state changes. 0x00 = powering off, 0x01 = powering on.

- id: fire_channel_change
  type: notification
  fourcc: "CHNN"
  description: Sent when channel changes. Parameter contains the new preset channel number.

- id: fire_input_change
  type: notification
  fourcc: "INPT"
  description: Sent when input changes. Parameter encodes the new input kind and port (same encoding as setInput).

- id: fire_volume_change
  type: notification
  fourcc: "VOLU"
  description: Sent when volume changes. Parameter contains the new volume value.

- id: fire_mute_change
  type: notification
  fourcc: "AMUT"
  description: Sent when mute state changes. 0x00 = unmuting, 0x01 = muting.

- id: fire_pip_change
  type: notification
  fourcc: "PIPI"
  description: Sent when PIP state changes. 0x00 = PIP disabled, 0x01 = PIP enabled.

- id: fire_picture_mute_change
  type: notification
  fourcc: "PMUT"
  description: Sent when picture mute state changes. 0x00 = disabled, 0x01 = enabled.

Macros

# UNRESOLVED: source documents no multi-step sequences.

Safety

confirmation_required_for: []
interlocks: []
# UNRESOLVED: source contains no safety warnings or interlock procedures.

Notes

  • Source is the Sony Simple IP Control v0.6 generic BRAVIA 2014 protocol document. KDX8577-series SKU-specific confirmation of Simple IP Control support is not present in the source.
  • TCP connections are kept alive between requests but the server drops the connection if no command is sent within 30 seconds. Clients must reconnect after idle periods.
  • All commands are 24-byte fixed-size frames: header 0x2A 0x53, 1-byte type, 4-byte ASCII FourCC function, 16-byte parameter, footer 0x0A.
  • The "Low Level Protocol" described here is a bridge to Sony's high-level WebAPI (JSON-RPC over HTTP); the WebAPI surface is not documented in this source.
  • setIrccCode supports 87 IR-equivalent remote control functions (Power Off, Input, Volume Up/Down, Channel Up/Down, 0-9 numeric, colored buttons, transport controls, etc.) — see Table 5 in source for the full list and parameter bytes.
  • Discovery flow: send getBroadcastAddress or getMacAddress to confirm the TV is reachable on port 20060 after enabling Simple IP Control in the TV menu (Network > Home Network Setup > IP Control > Simple IP Control, or Hotel/Pro Mode > IP Control > Simple IP Control).

Provenance

source_domains:
  - aca.im
  - pro-bravia.sony.net
source_urls:
  - "https://aca.im/driver_docs/Sony/sony%20bravia%20simple%20ip%20control.pdf"
  - https://pro-bravia.sony.net/remote-display-control/
  - https://pro-bravia.sony.net/remote-display-control/simple-ip-control/
  - https://pro-bravia.sony.net/remote-display-control/serial-control/command/
  - https://pro-bravia.sony.net/remote-display-control/rest-api/reference/
retrieved_at: 2026-07-24T19:02:03.519Z
last_checked_at: 2026-08-05T08:46:17.518Z

Verification Summary

verdict: verified
checked_at: 2026-08-05T08:46:17.518Z
matched_actions: 24
action_count: 24
confidence: medium
summary: "All 24 spec actions map one-to-one to FourCC commands in source Table 4; transport port 20060 confirmed. (9 unresolved item(s) noted in Known Gaps.)"

Known Gaps

- "X8577-series SKU-specific confirmation of Simple IP Control support not stated in source."
- "firmware version range not stated in source."
- "serial control (RS-232C) applicability to consumer X8577 models not confirmed in source."
- "source documents no settable parameters that are not discrete actions."
- "source documents no multi-step sequences."
- "source contains no safety warnings or interlock procedures."
- "Wording above on consumer KDX8577 menu path is from source; consumer SKU may not have Hotel/Pro Mode menu."
- "high-level JSON-RPC WebAPI surface not documented in this source."
- "serial / RS-232C control applicability to consumer X8577 models not stated in source."

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