Summary

Simple IP control protocol for Sony KJW870 Series professional displays. Uses fixed 24-byte TCP frames on port 20060 with FourCC command mnemonics. Supports power, input, volume, mute, picture mute, scene setting, IR-passthrough, and network info commands.

Transport

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

Traits

- powerable       # inferred from setPowerStatus / togglePowerStatus
- routable        # inferred from setInput (HDMI/Composite/Component/Screen Mirroring)
- queryable       # inferred from getPowerStatus, getInput, getAudioVolume, getAudioMute, getPictureMute, getSceneSetting, getBroadcastAddress, getMacAddress
- levelable       # inferred from setAudioVolume

Actions

# All commands are 24-byte fixed-size frames:
#   Byte[0-1]  Header   0x2A 0x53 ("*S")
#   Byte[2]    Type     0x43[C] Control | 0x45[E] Enquiry | 0x41[A] Answer | 0x4E[N] Notify
#   Byte[3-6]  Command  FourCC
#   Byte[7-22] Params   16 bytes
#   Byte[23]   Footer   0x0A
# ASCII form shown below as "*S" + type char + FourCC + 16-char params + "\n".

- id: set_ircc_code
  label: Set IR Command Code
  kind: action
  command: "*SCIRCC"  # followed by 16-byte IR parameter; see Feedbacks/Variables for table
  params: []

- id: set_power_status
  label: Set Power Status
  kind: action
  command: "*SCPOWR000000000000000{0|1}"  # trailing byte: 0=Standby, 1=Active
  params:
    - name: state
      type: integer
      description: 0=Standby (Off), 1=Active (On)

- id: get_power_status
  label: Get Power Status
  kind: query
  command: "*SEPOWR################"
  params: []

- id: toggle_power_status
  label: Toggle Power Status
  kind: action
  command: "*SCTPOW################"
  params: []

- id: set_audio_volume
  label: Set Audio Volume
  kind: action
  command: "*SCVOLU{XXXXXXXXXXXXXX29}"  # zero-padded decimal on the right; e.g. 0000000000000029
  params:
    - name: level
      type: integer
      description: Volume value, right-padded with zeros in 16-byte field

- id: get_audio_volume
  label: Get Audio Volume
  kind: query
  command: "*SEVOLU################"
  params: []

- id: set_audio_mute
  label: Set Audio Mute
  kind: action
  command: "*SCAMUT000000000000000{0|1}"  # trailing byte: 0=Unmute, 1=Mute
  params:
    - name: state
      type: integer
      description: 0=Unmute, 1=Mute

- id: get_audio_mute
  label: Get Audio Mute
  kind: query
  command: "*SEAMUT################"
  params: []

- id: set_input
  label: Set Input
  kind: action
  command: "*SCINPT00000000000{1|3|4|5}000{XXXX}"  # type 1=HDMI, 3=Composite, 4=Component, 5=Screen Mirroring; then 4-digit port (1-9999)
  params:
    - name: input_type
      type: integer
      description: 1=HDMI, 3=Composite, 4=Component, 5=Screen Mirroring
    - name: port
      type: integer
      description: Port number (1-9999)

- id: get_input
  label: Get Input
  kind: query
  command: "*SEINPT################"
  params: []

- id: set_picture_mute
  label: Set Picture Mute
  kind: action
  command: "*SCPMUT000000000000000{0|1}"  # trailing byte: 0=Disabled, 1=Enabled
  params:
    - name: state
      type: integer
      description: 0=Disable picture mute, 1=Enable (screen black)

- id: get_picture_mute
  label: Get Picture Mute
  kind: query
  command: "*SEPMUT################"
  params: []

- id: toggle_picture_mute
  label: Toggle Picture Mute
  kind: action
  command: "*SCTPMU################"
  params: []

- id: set_scene_setting
  label: Set Scene Setting
  kind: action
  command: "*SCSCEN{value###########}"  # right-padded with "#"; case-sensitive; e.g. auto24pSync#####
  params:
    - name: scene
      type: string
      description: "Scene name; one of: auto, auto24pSync, general (right-padded with '#')"

- id: get_scene_setting
  label: Get Scene Setting
  kind: query
  command: "*SESCEN################"
  params: []

- id: get_broadcast_address
  label: Get Broadcast Address (EU models)
  kind: query
  command: "*SEBADReth0###########"  # interface id "eth0" left-aligned in 4-byte slot
  params:
    - name: interface
      type: string
      description: "Interface identifier (e.g. 'eth0')"

- id: get_mac_address
  label: Get MAC Address (EU models)
  kind: query
  command: "*SEMADReth0###########"
  params:
    - name: interface
      type: string
      description: "Interface identifier (e.g. 'eth0')"

Feedbacks

- id: power_state
  type: enum
  values: [on, off]

- id: audio_mute_state
  type: enum
  values: [muted, unmuted]

- id: picture_mute_state
  type: enum
  values: [enabled, disabled]

- id: current_input
  type: string
  description: "Active input as FourCC-encoded value (type 1/3/4/5 + 4-digit port)"

- id: scene_setting
  type: string

- id: broadcast_address
  type: string  # e.g. "192.168.0.14", right-padded with "#"

- id: mac_address
  type: string  # right-padded with "#"

Variables

# IR command codes (parameter table for setIrccCode)
# Each entry: 14 leading "0" bytes + 2 ASCII hex digit code.
# Emit one variable per code; values right-padded with "0" to 16 bytes total.
# UNRESOLVED: full IR table copied here as enum values; see Notes.
- name: ir_code
  type: string
  description: "IR command mnemonic (see ir_commands table in Notes)"

Events

# Notify (0x4E) messages - unsolicited, monitor-to-client
- id: power_change
  fourcc: POWR
  description: "Sent on power state change. Last param byte 0=powering off, 1=powering on."

- id: input_change
  fourcc: INPT
  description: "Sent on input change. Type+port as per setInput parameter layout."

- id: volume_change
  fourcc: VOLU
  description: "Sent on volume change. 16-byte zero-padded decimal volume value."

- id: mute_change
  fourcc: AMUT
  description: "Sent on mute state change. Last byte 0=unmuted, 1=muted."

- id: picture_mute_change
  fourcc: PMUT
  description: "Sent on picture mute change. Last byte 0=enabled, 1=disabled."

Macros

# UNRESOLVED: source does not describe multi-step sequences.

Safety

confirmation_required_for: []
interlocks: []
# UNRESOLVED: source does not document safety warnings, interlocks, or power-on sequencing.

Notes

Protocol uses fixed 24-byte frames wrapped as *S + type char + FourCC + 16 params + LF. Power-off example from source: request *SCPOWR0000000000000000 → response *SAPOWR0000000000000000 *SNPOWR0000000000000000 (Accept + state notify).

EU models ship in 3 RED-DA specification variants; not all commands available on all variants. See https://pro-bravia.sony.net/setup/device-settings/red-da/ for per-spec command availability.

IR command codes (parameter for setIrccCode) — verbatim from source:

IR Command Last 2 hex bytes
Display 5
Home 6
Options 7
Return 8
Up 9
Down 10
Right 11
Left 12
Confirm 13
Red 14
Green 15
Yellow 16
Blue 17
Num1 18
Num2 19
Num3 20
Num4 21
Num5 22
Num6 23
Num7 24
Num8 25
Num9 26
Num0 27
Volume Up 30
Volume Down 31
Mute 32
Channel Up 33
Channel Down 34
Subtitle 35
DOT 38
Picture Off 50
Wide 61
Jump 62
Sync Menu 76
Forward 77
Play 78
Rewind 79
Prev 80
Stop 81
Next 82
Pause 84
Flash Plus 86
Flash Minus 87
TV Power 98
Audio 99
Input 101
Sleep 104
Sleep Timer 105
Video 2 108
Picture Mode 110
Demo Surround 121
HDMI 1 124
HDMI 2 125
HDMI 3 126
HDMI 4 127
Action Menu 129
Help 130

Provenance

source_domains:
  - pro-bravia.sony.net
  - aca.im
source_urls:
  - https://pro-bravia.sony.net/remote-display-control/simple-ip-control/
  - "https://aca.im/driver_docs/Sony/sony%20bravia%20simple%20ip%20control.pdf"
retrieved_at: 2026-06-09T01:57:29.266Z
last_checked_at: 2026-06-09T07:22:55.007Z

Verification Summary

verdict: verified
checked_at: 2026-06-09T07:22:55.007Z
matched_actions: 17
action_count: 17
confidence: medium
summary: "All 17 spec actions matched verbatim in source command table; transport and shapes verified. (5 unresolved item(s) noted in Known Gaps.)"

Known Gaps

- "EU models have 3 RED-DA specification variants with different available commands; spec not enumerated."
- "full IR table copied here as enum values; see Notes."
- "source does not describe multi-step sequences."
- "source does not document safety warnings, interlocks, or power-on sequencing."
- "setInput port number range (1-9999) and power/volume/mute param byte values copied verbatim from source prose. Max/min volume value bounds not stated. Connection keepalive / reconnection behavior not stated."

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