Summary

Sony BRAVIA 2014 models (KDL-W608 series) exposing a Simple IP Control protocol. The spec covers both the high-level HTTP/JSON-RPC WebAPI and the low-level TCP fixed-size byte stream on port 20060. Low-level protocol is a bridge to the high-level; every low-level command is available via JSON-RPC.

Transport

protocols:
  - tcp
  - http
addressing:
  port: 20060
  base_url: ""  # UNRESOLVED: JSON-RPC HTTP base URL/path not stated in source
auth:
  type: none  # inferred: no auth procedure in source

Traits

- powerable       # inferred from setPowerStatus / firePowerChange
- routable        # inferred from setInputSource / setInput / fireInputChange
- queryable       # inferred from getPowerStatus, getInput, getAudioVolume, etc.
- levelable       # inferred from setAudioVolume / fireVolumeChange

Actions

# setIrccCode - send IR-like code (4-byte FourCC "IRCC" + 16-byte IR code)
- id: set_ircc_code
  label: Send IR-like Code
  kind: action
  command: "2A 53 43 49 52 43 43 {ir_code_16bytes} 0A"  # Header+S+Control+IRCC+16-byte param+LF
  params:
    - name: ir_code
      type: string
      description: 16-byte IR code from Table 5 (e.g. 0000000000000000 for Power Off)

# Power
- id: set_power_status_off
  label: Power Off (Standby)
  kind: action
  command: "2A 53 43 50 4F 57 52 0000000000000000 0A"  # *S C POWR 0...0 LF
  params: []
- id: set_power_status_on
  label: Power On (Active)
  kind: action
  command: "2A 53 43 50 4F 57 52 0000000000000001 0A"
  params: []
- id: get_power_status
  label: Get Power Status
  kind: query
  command: "2A 53 45 50 4F 57 52 ################ 0A"  # *S E POWR ######## LF
  params: []

# Audio Volume
- id: set_audio_volume
  label: Set Audio Volume
  kind: action
  command: "2A 53 43 56 4F 4C 55 {volume_16char_decimal} 0A"
  params:
    - name: volume
      type: integer
      description: Volume value (0-100 typical), left-padded with '0' to 16 chars, e.g. "0000000000000029"
- id: get_audio_volume
  label: Get Audio Volume
  kind: query
  command: "2A 53 45 56 4F 4C 55 ################ 0A"
  params: []

# Audio Mute
- id: set_audio_mute_off
  label: Unmute Audio
  kind: action
  command: "2A 53 43 41 4D 55 54 0000000000000000 0A"
  params: []
- id: set_audio_mute_on
  label: Mute Audio
  kind: action
  command: "2A 53 43 41 4D 55 54 0000000000000001 0A"
  params: []
- id: get_audio_mute
  label: Get Audio Mute Status
  kind: query
  command: "2A 53 45 41 4D 55 54 ################ 0A"
  params: []

# Channel (preset number major.minor)
- id: set_channel
  label: Set Channel (Preset)
  kind: action
  command: "2A 53 43 43 48 4E 4E {major_8}.{minor_7} 0A"
  params:
    - name: channel
      type: string
      description: Preset channel as major.minor, left-padded with '0'. Example: "00000050.1000000" = 50.1
- id: get_channel
  label: Get Current Preset Channel
  kind: query
  command: "2A 53 45 43 48 4E 4E ################ 0A"
  params: []

# Channel (triplet)
- id: set_triplet_channel
  label: Set Channel (Triplet Hex)
  kind: action
  command: "2A 53 43 54 43 48 4E {triplet_hex_12}.{param4} 0A"
  params:
    - name: triplet
      type: string
      description: 12 hex digits representing source.transport.major padded. Example: "7FE07FE00400" = 32736.32736.1024
- id: get_triplet_channel
  label: Get Current Triplet Channel
  kind: query
  command: "2A 53 45 54 43 48 4E ################ 0A"
  params: []

# Input source (tuner type)
- id: set_input_source
  label: Set Input Source (Tuner)
  kind: action
  command: "2A 53 43 49 53 52 43 {source_padded} 0A"
  params:
    - name: source
      type: string
      description: Tuner source name, right-padded with '#' to 16 chars. One of: dvbt, dvbc, dvbs, isdbt, isdbbs, isdbcs, antenna, cable, isdbgt
- id: get_input_source
  label: Get Current Tuner Input Source
  kind: query
  command: "2A 53 45 49 53 52 43 ################ 0A"
  params: []

# Input (physical source)
- id: set_input_tv
  label: Change Input to TV
  kind: action
  command: "2A 53 43 49 4E 50 54 0000000000000000 0A"
  params: []
- id: set_input_hdmi
  label: Change Input to HDMI
  kind: action
  command: "2A 53 43 49 4E 50 54 0000000001000000{port:04d} 0A"
  params:
    - name: port
      type: integer
      description: HDMI port number (1-9999)
- id: set_input_scart
  label: Change Input to SCART
  kind: action
  command: "2A 53 43 49 4E 50 54 0000000002000000{port:04d} 0A"
  params:
    - name: port
      type: integer
      description: SCART port number (1-9999)
- id: set_input_composite
  label: Change Input to Composite
  kind: action
  command: "2A 53 43 49 4E 50 54 0000000003000000{port:04d} 0A"
  params:
    - name: port
      type: integer
      description: Composite port number (1-9999)
- id: set_input_component
  label: Change Input to Component
  kind: action
  command: "2A 53 43 49 4E 50 54 0000000004000000{port:04d} 0A"
  params:
    - name: port
      type: integer
      description: Component port number (1-9999)
- id: set_input_screen_mirroring
  label: Change Input to Screen Mirroring
  kind: action
  command: "2A 53 43 49 4E 50 54 0000000005000000{port:04d} 0A"
  params:
    - name: port
      type: integer
      description: Screen Mirroring port number (1-9999)
- id: set_input_pc_rgb
  label: Change Input to PC RGB
  kind: action
  command: "2A 53 43 49 4E 50 54 0000000006000000{port:04d} 0A"
  params:
    - name: port
      type: integer
      description: PC RGB port number (1-9999)
- id: get_input
  label: Get Current Input
  kind: query
  command: "2A 53 45 49 4E 50 54 ################ 0A"
  params: []

# Picture Mute
- id: set_picture_mute_off
  label: Disable Picture Mute
  kind: action
  command: "2A 53 43 50 4D 55 54 0000000000000000 0A"
  params: []
- id: set_picture_mute_on
  label: Enable Picture Mute (Black Screen)
  kind: action
  command: "2A 53 43 50 4D 55 54 0000000000000001 0A"
  params: []
- id: get_picture_mute
  label: Get Picture Mute Status
  kind: query
  command: "2A 53 45 50 4D 55 54 ################ 0A"
  params: []
- id: toggle_picture_mute
  label: Toggle Picture Mute
  kind: action
  command: "2A 53 43 54 50 4D 55 ################ 0A"
  params: []

# PIP
- id: set_pip_off
  label: Disable PIP
  kind: action
  command: "2A 53 43 50 49 50 49 0000000000000000 0A"
  params: []
- id: set_pip_on
  label: Enable PIP
  kind: action
  command: "2A 53 43 50 49 50 49 0000000000000001 0A"
  params: []
- id: get_pip
  label: Get PIP Status
  kind: query
  command: "2A 53 45 50 49 50 49 ################ 0A"
  params: []
- id: toggle_pip
  label: Toggle PIP
  kind: action
  command: "2A 53 43 54 50 49 50 ################ 0A"
  params: []
- id: toggle_pip_position
  label: Cycle PIP Position
  kind: action
  command: "2A 53 43 54 50 50 50 ################ 0A"
  params: []

# Network info
- id: get_broadcast_address
  label: Get Broadcast IPv4 Address
  kind: query
  command: "2A 53 45 42 41 44 52 eth0########## 0A"
  params:
    - name: interface
      type: string
      description: Network interface name (e.g. eth0), right-padded with '#'
- id: get_mac_address
  label: Get MAC Address
  kind: query
  command: "2A 53 45 4D 41 44 52 eth0########## 0A"
  params:
    - name: interface
      type: string
      description: Network interface name (e.g. eth0), right-padded with '#'

Feedbacks

- id: power_state
  type: enum
  values: [off, on]
  description: Reply parameter byte: 0=Standby(Off), 1=Active(On)
- id: audio_mute_state
  type: enum
  values: [unmuted, muted]
- id: picture_mute_state
  type: enum
  values: [disabled, enabled]
- id: pip_state
  type: enum
  values: [disabled, enabled]
- id: input_state
  type: enum
  values: [tv, hdmi, scart, composite, component, screen_mirroring, pc_rgb]
  description: First payload byte selects category, last 4 bytes hold port number
- id: input_source
  type: string
  description: 16-byte tuner source name, right-padded with '#'
- id: channel_preset
  type: string
  description: 16-byte major.minor channel, e.g. "00000050.1000000"
- id: channel_triplet
  type: string
  description: 16-byte hex triplet string
- id: audio_volume
  type: integer
  description: Volume as decimal integer, parsed from 16-byte decimal-padded field
- id: broadcast_address
  type: string
  description: IPv4 broadcast address, right-padded with '#'
- id: mac_address
  type: string
  description: MAC address, right-padded with '#'

Variables

- id: volume
  type: integer
  description: Audio volume level
  range: 0-100
  command_set: set_audio_volume
  command_get: get_audio_volume

Events

- id: power_change
  command: "2A 53 4E 50 4F 57 52 {state} 0A"  # 'N' (0x4E) Notify type
  description: 0=powering off, 1=powering on
- id: channel_change
  command: "2A 53 4E 43 48 4E 4E {major}.{minor} 0A"
  description: New preset channel after change
- id: input_change
  command: "2A 53 4E 49 4E 50 54 {input_code} 0A"
  description: 0=TV, 1=HDMI(n), 2=SCART(n), 3=Composite(n), 4=Component(n), 5=Screen Mirroring(n), 6=PC RGB(n)
- id: volume_change
  command: "2A 53 4E 56 4F 4C 55 {volume} 0A"
- id: mute_change
  command: "2A 53 4E 41 4D 55 54 {state} 0A"
  description: 0=unmuted, 1=muted
- id: pip_change
  command: "2A 53 4E 50 49 50 49 {state} 0A"
  description: 0=disabled, 1=enabled
- id: picture_mute_change
  command: "2A 53 4E 50 4D 55 54 {state} 0A"
  description: 0=disabled, 1=enabled

Macros

# UNRESOLVED: source does not document named macro sequences

Safety

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

Notes

Protocol is a 24-byte fixed-size TCP message: 0x2A 0x53 header, 1-byte type (C/E/A/N), 4-byte ASCII FourCC function code, 16-byte parameter, 0x0A footer. Server disconnects after 30s idle. IR-like remote commands (Table 5: Power Off, Input, EPG, Volume, Channel, Numeric, Playback, Netflix, etc., ~96 codes) are sent via the single setIrccCode (IRCC) action using the 16-byte parameter from Table 5. Channel preset format is MM.MM (8-char major, dot, 7-char minor) and triplet format is 12 hex digits.

Provenance

source_domains:
  - aca.im
source_urls:
  - "https://aca.im/driver_docs/Sony/sony%20bravia%20simple%20ip%20control.pdf"
retrieved_at: 2026-06-08T15:17:44.023Z
last_checked_at: 2026-06-09T07:17:43.349Z

Verification Summary

verdict: verified
checked_at: 2026-06-09T07:17:43.349Z
matched_actions: 34
action_count: 34
confidence: medium
summary: "All 34 spec actions found in source with exact FourCC codes and matching parameter shapes; transport port verified. (5 unresolved item(s) noted in Known Gaps.)"

Known Gaps

- "exact model list within KDLW608 series not enumerated in source"
- "JSON-RPC HTTP base URL/path not stated in source"
- "source does not document named macro sequences"
- "source contains no explicit safety warnings, interlocks, or"
- "JSON-RPC HTTP method/path/endpoints for the high-level WebAPI not documented in source. UNRESOLVED: detailed 16-byte IRCC parameter values for ~96 Table 5 functions are listed numerically; only Power Off (0000000000000000) and a few example bytes are quoted verbatim. UNRESOLVED: firmware version compatibility not stated. UNRESOLVED: port for HTTP WebAPI not stated (port 20060 is TCP low-level only)."

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