Summary
This spec covers the Sony XRA75 Series (BRAVIA Professional Displays) controlled via Sony's "Simple IP Control" protocol (SSIP) over TCP on the local network. The protocol uses a fixed 24-byte frame with a 4-character Four-CC command and a 16-byte parameter field. The control listening port is TCP 20060. Source: pro-bravia.sony.net "Simple IP control" page.
Transport
protocols:
- tcp
addressing:
port: 20060
auth:
type: none # inferred: no auth procedure in source
notes: "Requires monitor settings: [Settings]→[Network & Internet]→[Remote device settings]→[Control remotely] and [Settings]→[Network & Internet]→[Home network]→[IP control]→[Simple IP control]. Both wired and wireless LAN supported."
Frame Format
# Source: Data Format section. 24-byte fixed frame.
header:
bytes: 2
value: "0x2A 0x53 ('*S')"
message_type:
byte_offset: 2
values:
- 0x43 'C' # Control (Client -> Monitor)
- 0x45 'E' # Enquiry (Client -> Monitor)
- 0x41 'A' # Answer (Monitor -> Client)
- 0x4E 'N' # Notify (Monitor -> Client, unsolicited)
command:
byte_offset: "3-6"
format: "4 ASCII chars (Four-CC)"
parameters:
byte_offset: "7-22"
length_bytes: 16
footer:
byte_offset: 23
value: "0x0A (LF)"
# Common param patterns: '0'*16 = success, 'F'*16 = error, 'N'*16 = not-found, '#'*16 = no-param
Traits
- powerable # inferred: setPowerStatus/togglePowerStatus present
- routable # inferred: setInput/getInput present
- queryable # inferred: get* enquiry commands present
- levelable # inferred: setAudioVolume/getAudioVolume present
Actions
# Frame = header(2) + type(1) + command(4) + params(16) + footer(1) = 24 bytes.
# Header 0x2A 0x53, footer 0x0A are constant. Command field below = Four-CC.
# Param placeholders: {value} = ASCII left-padded with '0' to 16 bytes; {padded} = right-padded with '#'.
# IRCC param format: ASCII decimal code number, right-justified and zero-padded to fill 16 bytes.
# e.g. Display (5) = '0'*15 + '5' -> "0000000000000005"
# Down (10) = '0'*14 + "10" -> "0000000000000010"
# HDMI 1 (124) = '0'*13 + "124" -> "0000000000000124"
# For setInput: param bytes are class(1 ASCII digit, position [7] within param field) +
# '0000'(4) + ASCII 4-digit input number (1-9999). Class codes: '1' HDMI, '3' Composite,
# '4' Component, '5' Screen Mirroring.
- id: set_ircc_code
label: Send IR Remote Code
kind: action
command: "*SCIRCC{code16}"
params:
- name: code
type: string
description: IR code as 16 ASCII bytes - decimal code number right-justified and zero-padded (see IR Commands table)
notes: "Header '*S' + type 'C' + Four-CC 'IRCC' + 16-byte param + footer LF."
- id: ircc_display
label: IR - Display
kind: action
command: "*SCIRCC0000000000000005"
params: []
- id: ircc_home
label: IR - Home
kind: action
command: "*SCIRCC0000000000000006"
params: []
- id: ircc_options
label: IR - Options
kind: action
command: "*SCIRCC0000000000000007"
params: []
- id: ircc_return
label: IR - Return
kind: action
command: "*SCIRCC0000000000000008"
params: []
- id: ircc_up
label: IR - Up
kind: action
command: "*SCIRCC0000000000000009"
params: []
- id: ircc_down
label: IR - Down
kind: action
command: "*SCIRCC0000000000000010"
params: []
- id: ircc_right
label: IR - Right
kind: action
command: "*SCIRCC0000000000000011"
params: []
- id: ircc_left
label: IR - Left
kind: action
command: "*SCIRCC0000000000000012"
params: []
- id: ircc_confirm
label: IR - Confirm
kind: action
command: "*SCIRCC0000000000000013"
params: []
- id: ircc_red
label: IR - Red
kind: action
command: "*SCIRCC0000000000000014"
params: []
- id: ircc_green
label: IR - Green
kind: action
command: "*SCIRCC0000000000000015"
params: []
- id: ircc_yellow
label: IR - Yellow
kind: action
command: "*SCIRCC0000000000000016"
params: []
- id: ircc_blue
label: IR - Blue
kind: action
command: "*SCIRCC0000000000000017"
params: []
- id: ircc_num1
label: IR - Num 1
kind: action
command: "*SCIRCC0000000000000018"
params: []
- id: ircc_num2
label: IR - Num 2
kind: action
command: "*SCIRCC0000000000000019"
params: []
- id: ircc_num3
label: IR - Num 3
kind: action
command: "*SCIRCC0000000000000020"
params: []
- id: ircc_num4
label: IR - Num 4
kind: action
command: "*SCIRCC0000000000000021"
params: []
- id: ircc_num5
label: IR - Num 5
kind: action
command: "*SCIRCC0000000000000022"
params: []
- id: ircc_num6
label: IR - Num 6
kind: action
command: "*SCIRCC0000000000000023"
params: []
- id: ircc_num7
label: IR - Num 7
kind: action
command: "*SCIRCC0000000000000024"
params: []
- id: ircc_num8
label: IR - Num 8
kind: action
command: "*SCIRCC0000000000000025"
params: []
- id: ircc_num9
label: IR - Num 9
kind: action
command: "*SCIRCC0000000000000026"
params: []
- id: ircc_num0
label: IR - Num 0
kind: action
command: "*SCIRCC0000000000000027"
params: []
- id: ircc_volume_up
label: IR - Volume Up
kind: action
command: "*SCIRCC0000000000000030"
params: []
- id: ircc_volume_down
label: IR - Volume Down
kind: action
command: "*SCIRCC0000000000000031"
params: []
- id: ircc_mute
label: IR - Mute
kind: action
command: "*SCIRCC0000000000000032"
params: []
- id: ircc_channel_up
label: IR - Channel Up
kind: action
command: "*SCIRCC0000000000000033"
params: []
- id: ircc_channel_down
label: IR - Channel Down
kind: action
command: "*SCIRCC0000000000000034"
params: []
- id: ircc_subtitle
label: IR - Subtitle
kind: action
command: "*SCIRCC0000000000000035"
params: []
- id: ircc_dot
label: IR - DOT
kind: action
command: "*SCIRCC0000000000000038"
params: []
- id: ircc_picture_off
label: IR - Picture Off
kind: action
command: "*SCIRCC0000000000000050"
params: []
- id: ircc_wide
label: IR - Wide
kind: action
command: "*SCIRCC0000000000000061"
params: []
- id: ircc_jump
label: IR - Jump
kind: action
command: "*SCIRCC0000000000000062"
params: []
- id: ircc_sync_menu
label: IR - Sync Menu
kind: action
command: "*SCIRCC0000000000000076"
params: []
- id: ircc_forward
label: IR - Forward
kind: action
command: "*SCIRCC0000000000000077"
params: []
- id: ircc_play
label: IR - Play
kind: action
command: "*SCIRCC0000000000000078"
params: []
- id: ircc_rewind
label: IR - Rewind
kind: action
command: "*SCIRCC0000000000000079"
params: []
- id: ircc_prev
label: IR - Prev
kind: action
command: "*SCIRCC0000000000000080"
params: []
- id: ircc_stop
label: IR - Stop
kind: action
command: "*SCIRCC0000000000000081"
params: []
- id: ircc_next
label: IR - Next
kind: action
command: "*SCIRCC0000000000000082"
params: []
- id: ircc_pause
label: IR - Pause
kind: action
command: "*SCIRCC0000000000000084"
params: []
- id: ircc_flash_plus
label: IR - Flash Plus
kind: action
command: "*SCIRCC0000000000000086"
params: []
- id: ircc_flash_minus
label: IR - Flash Minus
kind: action
command: "*SCIRCC0000000000000087"
params: []
- id: ircc_tv_power
label: IR - TV Power
kind: action
command: "*SCIRCC0000000000000098"
params: []
- id: ircc_audio
label: IR - Audio
kind: action
command: "*SCIRCC0000000000000099"
params: []
- id: ircc_input
label: IR - Input
kind: action
command: "*SCIRCC0000000000000101"
params: []
- id: ircc_sleep
label: IR - Sleep
kind: action
command: "*SCIRCC0000000000000104"
params: []
- id: ircc_sleep_timer
label: IR - Sleep Timer
kind: action
command: "*SCIRCC0000000000000105"
params: []
- id: ircc_video_2
label: IR - Video 2
kind: action
command: "*SCIRCC0000000000000108"
params: []
- id: ircc_picture_mode
label: IR - Picture Mode
kind: action
command: "*SCIRCC0000000000000110"
params: []
- id: ircc_demo_surround
label: IR - Demo Surround
kind: action
command: "*SCIRCC0000000000000121"
params: []
- id: ircc_hdmi1
label: IR - HDMI 1
kind: action
command: "*SCIRCC0000000000000124"
params: []
- id: ircc_hdmi2
label: IR - HDMI 2
kind: action
command: "*SCIRCC0000000000000125"
params: []
- id: ircc_hdmi3
label: IR - HDMI 3
kind: action
command: "*SCIRCC0000000000000126"
params: []
- id: ircc_hdmi4
label: IR - HDMI 4
kind: action
command: "*SCIRCC0000000000000127"
params: []
- id: ircc_action_menu
label: IR - Action Menu
kind: action
command: "*SCIRCC0000000000000129"
params: []
- id: ircc_help
label: IR - Help
kind: action
command: "*SCIRCC0000000000000130"
params: []
- id: set_power_off
label: Set Power - Standby
kind: action
command: "*SCPOWR0000000000000000"
params: []
notes: "Source netcat example shows monitor replies with BOTH an Answer and a Notify: '*SAPOWR0000000000000000 *SNPOWR0000000000000000' (accept + current-state-off)."
- id: set_power_on
label: Set Power - Active
kind: action
command: "*SCPOWR0000000000000001"
params: []
- id: get_power_status
label: Get Power Status
kind: query
command: "*SEPOWR################"
params: []
- id: toggle_power_status
label: Toggle Power
kind: action
command: "*SCTPOW################"
params: []
- id: set_audio_volume
label: Set Audio Volume
kind: action
command: "*SCVOLU{value16}"
params:
- name: value
type: integer
description: Volume value (decimal, left-padded with '0' to 16 ASCII chars; e.g. 41 -> "0000000000000029")
notes: "Source example: 0000000000000029 = decimal 41. Source does not state min/max."
- id: get_audio_volume
label: Get Audio Volume
kind: query
command: "*SEVOLU################"
params: []
notes: "Source answer for success carries the volume value as 'X'*16 (decimal ASCII left-padded '0')."
- id: set_audio_mute_off
label: Set Audio Mute - Unmute
kind: action
command: "*SCAMUT0000000000000000"
params: []
- id: set_audio_mute_on
label: Set Audio Mute - Mute
kind: action
command: "*SCAMUT0000000000000001"
params: []
- id: get_audio_mute
label: Get Audio Mute Status
kind: query
command: "*SEAMUT################"
params: []
- id: set_input_hdmi
label: Set Input - HDMI
kind: action
command: "*SCINPT000000010000{number4}"
params:
- name: number
type: integer
description: HDMI input number (1-9999, ASCII right-justified in 4 bytes)
notes: "Param layout (16 bytes): '0000000' + class digit '1' + '0000' + ASCII 4-digit number. Answer 'N'*16 = Not Found."
- id: set_input_composite
label: Set Input - Composite
kind: action
command: "*SCINPT000000030000{number4}"
params:
- name: number
type: integer
description: Composite input number (1-9999)
notes: "Class digit '3'. Answer 'N'*16 = Not Found."
- id: set_input_component
label: Set Input - Component
kind: action
command: "*SCINPT000000040000{number4}"
params:
- name: number
type: integer
description: Component input number (1-9999)
notes: "Class digit '4'. Answer 'N'*16 = Not Found."
- id: set_input_screen_mirroring
label: Set Input - Screen Mirroring
kind: action
command: "*SCINPT000000050000{number4}"
params:
- name: number
type: integer
description: Screen Mirroring input number (1-9999)
notes: "Class digit '5'. Answer 'N'*16 = Not Found."
- id: get_input
label: Get Current Input
kind: query
command: "*SEINPT################"
params: []
- id: set_picture_mute_off
label: Set Picture Mute - Disabled
kind: action
command: "*SCPMUT0000000000000000"
params: []
- id: set_picture_mute_on
label: Set Picture Mute - Enabled (Screen Black)
kind: action
command: "*SCPMUT0000000000000001"
params: []
- id: get_picture_mute
label: Get Picture Mute Status
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{string-padded}"
params:
- name: scene
type: string
enum: [auto, auto24pSync, general]
description: Scene name, case-sensitive, right-padded with '#' to 16 bytes (e.g. "auto24pSync#####")
notes: "Answer 'N'*16 = Not available for the current input."
- id: get_scene_setting
label: Get Scene Setting
kind: query
command: "*SESCEN################"
params: []
notes: "Answer 'N'*16 = Not available for the current input."
- id: get_broadcast_address
label: Get Broadcast Address (Interface eth0)
kind: query
command: "*SEBADReth0############"
params: []
notes: "Param encodes interface name right-padded with '#' (e.g. 'eth0' + 12 '#' = 16 bytes). Answer example: '192.168.0.14####' (IPv4 string right-padded with '#')."
- id: get_mac_address
label: Get MAC Address (Interface eth0)
kind: query
command: "*SEMADReth0############"
params: []
notes: "Response carries 12-byte MAC right-padded with '#' to 16 bytes."
Feedbacks
# Common Answer param patterns:
# '0'*16 = success
# 'F'*16 = error
# 'N'*16 = not-found / not-available-for-current-input
# 'X'*16 = success with value (decimal ASCII left-padded '0', or string right-padded '#')
- id: power_state
type: enum
values: [standby, active]
notes: "From getPowerStatus answer: '0'*16 = Standby, '1' (last byte) = Active, 'F'*16 = Error."
- id: audio_volume
type: integer
notes: "From getAudioVolume answer: 16 ASCII bytes, decimal left-padded '0' (e.g. '0000000000000029' = 41)."
- id: audio_mute_state
type: enum
values: [unmuted, muted]
notes: "From getAudioMute answer: '0'*16 = Not Muted, last byte '1' = Muted, 'F'*16 = Error."
- id: input_state
type: string
notes: "From getInput answer: param[7] = class digit ('1' HDMI / '3' Composite / '4' Component / '5' Screen Mirroring), param[8-11]='0000', param[12-15]=ASCII input number. 'N'*16 = Not Found."
- id: picture_mute_state
type: enum
values: [disabled, enabled]
notes: "From getPictureMute answer: '0'*16 = Disabled, last byte '1' = Enabled, 'F'*16 = Error."
- id: scene_setting
type: string
enum: [auto, auto24pSync, general]
notes: "From getSceneSetting answer: 16-byte string, case-sensitive, '#'-padded. 'N'*16 = not available for current input."
- id: broadcast_address
type: string
notes: "From getBroadcastAddress answer: 16-byte IPv4 string, '#'-padded (e.g. '192.168.0.14####')."
- id: mac_address
type: string
notes: "From getMacAddress answer: 12-byte MAC, '#'-padded to 16 bytes."
Variables
# UNRESOLVED: source does not document discrete settable parameters beyond the
# actions above. Volume is implemented via setAudioVolume action with a numeric param,
# not as a separate variable. Scene is implemented via setSceneSetting.
Events
# Type byte 0x4E 'N' = unsolicited Notify messages.
# Format same 24-byte frame: header(2) + 'N'(1) + Four-CC(4) + param(16) + footer(1).
# Source documents 5 fire* events, each triggered when the corresponding state changes.
- id: fire_power_change
description: Sent when powering on or off.
command_pattern: "*SNPOWR0000000000000000" # powering off
command_pattern_on: "*SNPOWR0000000000000001" # powering on
- id: fire_input_change
description: Sent when input changes to monitor.
command_pattern: "*SNINPT{param16}"
param_layout: "param[7] = class (1/3/4/5 or '0' for unspecified), param[8-11]='0000', param[12-15]=ASCII input number. '0'*16 = unspecified input change."
- id: fire_volume_change
description: Sent when volume changes.
command_pattern: "*SNVOLU{value16}"
- id: fire_mute_change
description: Sent when mute toggles.
command_pattern: "*SNAMUT0000000000000000" # unmuting
command_pattern_on: "*SNAMUT0000000000000001" # muting
- id: fire_picture_mute_change
description: Sent when picture mute state changes.
command_pattern: "*SNPMUT0000000000000000" # enabled
command_pattern_off: "*SNPMUT0000000000000001" # disabled
# Source also documents a fireInputChange variant for unspecified input:
# "*SNINPT0000000000000000" - sent when an input change to monitor happens with no specific class.
Macros
# UNRESOLVED: source does not describe any multi-step sequences.
Safety
confirmation_required_for: []
interlocks: []
notes: "Source contains no safety warnings, interlock procedures, or power-on sequencing requirements."
# UNRESOLVED: source mentions RED-DA compliance differences for EU models (3 spec
# variants) but does not enumerate which commands are restricted per variant.
Notes
- Frame structure: every message is exactly 24 bytes:
0x2A 0x53(header) + 1-byte message type + 4-byte Four-CC command + 16-byte params +0x0A(footer). Padding character conventions: '0' for numeric left-pad, '#' for string right-pad / no-param placeholder, 'F' for error answers, 'N' for not-found / not-available, 'X' for variable-length value answers. - Source provenance: pro-bravia.sony.net "Simple IP control" page is the canonical reference. The 3 legacy "External Control Reference Guide (Simple IP Control)" PDFs on pro.sony are blocked by 403 / no Wayback archive, but pro-bravia.sony.net survived the 8 May 2026 developer.sony.com shutdown and is the active source.
- Dual response on power ops: the source's netcat worked example shows that a
setPowerStatusOff request (*SCPOWR0000000000000000) is answered with TWO 24-byte frames back-to-back — an Answer (*SAPOWR0000000000000000, command accepted) followed by a Notify (*SNPOWR0000000000000000, current state is off). Implementations reading from the socket must expect multiple frames per control command when state changes. - RED-DA caveat (EU models): EU-area models have 3 spec variants per RED-DA compliance. Settings and available commands differ per variant — see https://pro-bravia.sony.net/setup/device-settings/red-da/ (referenced in source, not transcribed).
- Volume encoding: source example maps
0000000000000029to decimal 41; no min/max range stated. - IR codes:
setIrccCodesends one of 57 documented IR-equivalent codes (remote navigation, digits, transport, HDMI 1-4, etc.) as a 16-byte param. The code number is encoded as ASCII decimal, right-justified and zero-padded across the trailing 1-3 bytes of the 16-byte param field (e.g. code 5 = 15 zeros + '5'; code 10 = 14 zeros + "10"; code 124 = 13 zeros + "124"). - Multiple-input commands: setInput distinguishes class (HDMI/Composite/Component/Screen Mirroring) by param[7] and the per-class number by param[12-15] (1-9999).
- Pre-conditions on monitor: Simple IP Control must be enabled in [Settings]→[Network & Internet]→[Home network]→[IP control]→[Simple IP control] and Remote Device Control must be enabled in [Settings]→[Network & Internet]→[Remote device settings]→[Control remotely].
- TCP framing: source shows
netcat [IP] 20060and a 24-byte*SCPOWR0000000000000000example. There is no documented length-prefix or delimiter beyond the fixed 24-byte structure.
Upgrades applied:
- **Fixed**: IRCC param format comment — was "ASCII hex byte", now correctly "ASCII decimal right-justified zero-padded" with worked examples (5/10/124).
- **Fixed**: `set_ircc_code` template `*SCIRCC{param15+byte}` → `*SCIRCC{code16}` with cleaner description.
- **Fixed**: `fire_mute_change` YAML — stray `"` in description removed.
- **Added**: Dual-response note (Answer + Notify) on power-off via `set_power_off.notes` + Notes section (source's netcat example).
- **Added**: `'N'*16 = Not Found` notes on setInput variants, setSceneSetting, getSceneSetting, input_state feedback.
- **Added**: `'X'*16` value-answer pattern to Feedbacks header comment.
- **Clarified**: setInput byte offsets in actions header comment (param-relative, not absolute).
- **No IDs changed**, no entries removed. All 17 Four-CCs + 57 IR codes + 5 notify events preserved.
## Provenance
```yaml
source_domains:
- pro-bravia.sony.net
source_urls:
- https://pro-bravia.sony.net/remote-display-control/simple-ip-control
- https://pro-bravia.sony.net/remote-display-control/rest-api/reference
- https://pro-bravia.sony.net/remote-display-control/rest-api
- https://pro-bravia.sony.net/remote-display-control/ircc-ip
- https://pro-bravia.sony.net/remote-display-control/ip-control-comparison
retrieved_at: 2026-07-16T22:34:35.529Z
last_checked_at: 2026-07-22T01:28:10.640Z
```
## Verification Summary
```yaml
verdict: verified
checked_at: 2026-07-22T01:28:10.640Z
matched_actions: 80
action_count: 80
confidence: medium
summary: "All 80 spec actions matched with exact wire-level literals in source; transport parameters (TCP 20060, no auth) verified; spec provides complete coverage of the source command catalogue. (8 unresolved item(s) noted in Known Gaps.)"
```
## Known Gaps
```yaml
- "EU area models have 3 RED-DA-compliant spec variants; command availability differs per spec. Not enumerated in source."
- "source does not document discrete settable parameters beyond the"
- "source does not describe any multi-step sequences."
- "source mentions RED-DA compliance differences for EU models (3 spec"
- "firmware version compatibility not stated in source."
- "EU RED-DA 3-variant spec differences not enumerated in source."
- "auth credentials / pre-shared key not addressed; inferred none."
- "volume min/max bounds not stated (only example \"29\"=41 given)."
```
---
From the AI4AV catalog (https://ai4av.net) · ODbL-1.0