Summary
Simple IP control protocol (SSIP) for Sony BRAVIA Professional Displays, including the KD-75ZH8 and KD-85ZH8 8K HDR models. Control travels over TCP port 20060 using 24-byte fixed-size ASCII frames. Frame layout: 2-byte header *S, 1-byte message type, 4-byte FourCC command, 16-byte parameter field, 1-byte footer LF.
Transport
protocols:
- tcp
addressing:
port: 20060
framing:
header: "0x2A 0x53" # "*S" fixed
footer: "0x0A" # LF fixed
fixed_size_bytes: 24
auth:
type: none # inferred: no auth procedure in source
Traits
- powerable # inferred from setPowerStatus / togglePowerStatus / firePowerChange
- routable # inferred from setInput / getInput / fireInputChange
- queryable # inferred from getPowerStatus / getAudioVolume / getAudioMute / getInput / getPictureMute / getSceneSetting / getBroadcastAddress / getMacAddress
- levelable # inferred from setAudioVolume / getAudioVolume / fireVolumeChange
Actions
- id: set_ircc_code
label: Send IR Remote Command (setIrccCode)
kind: action
command: "*SCIRCC{ircc_code_padded_16}\n" # bytes 0-6 fixed prefix, bytes 7-22 hold IRCC code as 16 ASCII chars, byte 23 = 0x0A
params:
- name: ircc_code
type: string
description: "16-byte ASCII IRCC code from the IR Commands table (e.g. 0...030 for Volume Up). Right-padded with '0' (per source note for SCEN) or as shown in the IR table."
notes: "Source documents 50+ distinct IR commands (Display, Home, Options, Return, Up/Down/Left/Right/Confirm, Red/Green/Yellow/Blue, Num0-9, Volume Up/Down, Mute, Channel Up/Down, Subtitle, DOT, Picture Off, Wide, Jump, Sync Menu, Forward, Play, Rewind, Prev, Stop, Next, Pause, Flash Plus/Minus, TV Power, Audio, Input, Sleep, Sleep Timer, Video 2, Picture Mode, Demo Surround, HDMI 1-4, Action Menu, Help). Each is a parameter value of this single command, not a separate action."
- id: set_power_status
label: Set Power Status (setPowerStatus)
kind: action
command: "*SCPOWR00000000000000{0|1}\n"
params:
- name: state
type: enum
values: [standby, active]
description: "0 = Standby (Off), 1 = Active (On). Right-padded ASCII '0' in the 16-byte param field."
- id: get_power_status
label: Get Power Status (getPowerStatus)
kind: query
command: "*SEPOWR################\n" # 16 '#' placeholders per source common-param table
params: []
- id: toggle_power_status
label: Toggle Power Status (togglePowerStatus)
kind: action
command: "*SCTPOW################\n" # C T P O W + 16 '#' per common-param rule for no-param control
params: []
- id: set_audio_volume
label: Set Audio Volume (setAudioVolume)
kind: action
command: "*SCVOLU{volume_16}\n"
params:
- name: volume
type: integer
description: "Volume value as a 16-digit decimal right-justified ASCII string, e.g. 0000000000000029 for 41. Source: 'decimal digit pad on the left with 0'."
- id: get_audio_volume
label: Get Audio Volume (getAudioVolume)
kind: query
command: "*SEVOLU################\n"
params: []
- id: set_audio_mute
label: Set Audio Mute (setAudioMute)
kind: action
command: "*SCAMUT000000000000000{0|1}\n"
params:
- name: state
type: enum
values: [unmute, mute]
description: "0 = Unmute, 1 = Mute."
- id: get_audio_mute
label: Get Audio Mute (getAudioMute)
kind: query
command: "*SEAMUT################\n"
params: []
- id: set_input
label: Set Input (setInput)
kind: action
command: "*SCINPT0000000000{type}{port_4}\n"
params:
- name: type
type: enum
values: [hdmi, composite, component, screen_mirroring]
description: "1 = HDMI, 3 = Composite, 4 = Component, 5 = Screen Mirroring. Single ASCII digit at byte[14]."
- name: port
type: integer
description: "1-9999, right-justified in 4 ASCII digit positions at bytes 19-22."
notes: "Source also lists Answer A with 'NNNNNNNNNNNNNNNNNNNNNNN' = Not Found."
- id: get_input
label: Get Current Input (getInput)
kind: query
command: "*SEINPT################\n"
params: []
- id: set_picture_mute
label: Set Picture Mute (setPictureMute)
kind: action
command: "*SCPMUT000000000000000{0|1}\n"
params:
- name: state
type: enum
values: [disabled, enabled]
description: "0 = Disabled (picture mute off), 1 = Enabled (screen black)."
- id: get_picture_mute
label: Get Picture Mute (getPictureMute)
kind: query
command: "*SEPMUT################\n"
params: []
- id: toggle_picture_mute
label: Toggle Picture Mute (togglePictureMute)
kind: action
command: "*SCTPMU################\n"
params: []
- id: set_scene_setting
label: Set Scene Setting (setSceneSetting)
kind: action
command: "*SCSCEN{scene_padded_16}\n"
params:
- name: scene
type: enum
values: [auto, auto24pSync, general]
description: "Case-sensitive string, right-padded with '#' to 16 bytes. e.g. auto24pSync#####"
- id: get_scene_setting
label: Get Scene Setting (getSceneSetting)
kind: query
command: "*SESCEN################\n"
params: []
- id: get_broadcast_address
label: Get Broadcast Address (getBroadcastAddress)
kind: query
command: "*SEBADREth0##########\n" # bytes 7-12 = 'eth0', bytes 13-22 = '#'
params:
- name: interface
type: string
description: "Interface name as ASCII, padded with '#' to 16 bytes. Source example uses 'eth0'."
notes: "EU models: per RED-DA spec compliance the command may be restricted."
- id: get_mac_address
label: Get MAC Address (getMacAddress)
kind: query
command: "*SEMADREth0##########\n"
params:
- name: interface
type: string
description: "Interface name as ASCII, padded with '#' to 16 bytes. Source example uses 'eth0'."
notes: "EU models: per RED-DA spec compliance the command may be restricted."
Feedbacks
- id: power_state
type: enum
values: [standby, active]
source_command: get_power_status
description: "0 = Standby (Off), 1 = Active (On) in the trailing byte of the 16-byte param field."
- id: audio_volume
type: integer
source_command: get_audio_volume
description: "16-digit decimal right-justified ASCII in param field."
- id: audio_mute
type: enum
values: [unmuted, muted]
source_command: get_audio_mute
description: "0 = Not Muted, 1 = Muted."
- id: current_input
type: object
source_command: get_input
description: "Type digit at byte[14]: 1=HDMI, 3=Composite, 4=Component, 5=Screen Mirroring. Port number in bytes 19-22."
- id: picture_mute
type: enum
values: [disabled, enabled]
source_command: get_picture_mute
description: "0 = Disabled, 1 = Enabled."
- id: scene_setting
type: string
source_command: get_scene_setting
description: "Current scene string, right-padded with '#'."
- id: broadcast_address
type: string
source_command: get_broadcast_address
description: "Dotted-IPv4 string, right-padded with '#'."
- id: mac_address
type: string
source_command: get_mac_address
description: "MAC address, right-padded with '#'."
Variables
- id: ircc_codes
type: enum
description: "IR remote command codes passed as 16-byte ASCII param to setIrccCode."
values:
- { name: Display, code: "0000000000000005" }
- { name: Home, code: "0000000000000006" }
- { name: Options, code: "0000000000000007" }
- { name: Return, code: "0000000000000008" }
- { name: Up, code: "0000000000000009" }
- { name: Down, code: "0000000000000010" }
- { name: Right, code: "0000000000000011" }
- { name: Left, code: "0000000000000012" }
- { name: Confirm, code: "0000000000000013" }
- { name: Red, code: "0000000000000014" }
- { name: Green, code: "0000000000000015" }
- { name: Yellow, code: "0000000000000016" }
- { name: Blue, code: "0000000000000017" }
- { name: Num1, code: "0000000000000018" }
- { name: Num2, code: "0000000000000019" }
- { name: Num3, code: "0000000000000020" }
- { name: Num4, code: "0000000000000021" }
- { name: Num5, code: "0000000000000022" }
- { name: Num6, code: "0000000000000023" }
- { name: Num7, code: "0000000000000024" }
- { name: Num8, code: "0000000000000025" }
- { name: Num9, code: "0000000000000026" }
- { name: Num0, code: "0000000000000027" }
- { name: VolumeUp, code: "0000000000000030" }
- { name: VolumeDown, code: "0000000000000031" }
- { name: Mute, code: "0000000000000032" }
- { name: ChannelUp, code: "0000000000000033" }
- { name: ChannelDown, code: "0000000000000034" }
- { name: Subtitle, code: "0000000000000035" }
- { name: DOT, code: "0000000000000038" }
- { name: PictureOff, code: "0000000000000050" }
- { name: Wide, code: "0000000000000061" }
- { name: Jump, code: "0000000000000062" }
- { name: SyncMenu, code: "0000000000000076" }
- { name: Forward, code: "0000000000000077" }
- { name: Play, code: "0000000000000078" }
- { name: Rewind, code: "0000000000000079" }
- { name: Prev, code: "0000000000000080" }
- { name: Stop, code: "0000000000000081" }
- { name: Next, code: "0000000000000082" }
- { name: Pause, code: "0000000000000084" }
- { name: FlashPlus, code: "0000000000000086" }
- { name: FlashMinus, code: "0000000000000087" }
- { name: TVPower, code: "0000000000000098" }
- { name: Audio, code: "0000000000000099" }
- { name: Input, code: "0000000000000101" }
- { name: Sleep, code: "0000000000000104" }
- { name: SleepTimer, code: "0000000000000105" }
- { name: Video2, code: "0000000000000108" }
- { name: PictureMode, code: "0000000000000110" }
- { name: DemoSurround, code: "0000000000000121" }
- { name: HDMI1, code: "0000000000000124" }
- { name: HDMI2, code: "0000000000000125" }
- { name: HDMI3, code: "0000000000000126" }
- { name: HDMI4, code: "0000000000000127" }
- { name: ActionMenu, code: "0000000000000129" }
- { name: Help, code: "0000000000000130" }
Events
- id: power_change
type: notification
message_type: N
fourcc: POWR
payload: "16-byte param field, trailing byte 0=powering off, 1=powering on"
description: "firePowerChange - sent when power state changes."
- id: input_change
type: notification
message_type: N
fourcc: INPT
payload: "16-byte param field. Trailing byte or type+port encoding (see setInput for layout). Sent when input change to monitor happens."
description: "fireInputChange."
- id: volume_change
type: notification
message_type: N
fourcc: VOLU
payload: "16-byte param field with new volume value as 16-digit decimal ASCII."
description: "fireVolumeChange - sent when volume changes."
- id: mute_change
type: notification
message_type: N
fourcc: AMUT
payload: "16-byte param field, trailing byte 0=unmuting, 1=muting"
description: "fireMuteChange - sent when mute state changes."
- id: picture_mute_change
type: notification
message_type: N
fourcc: PMUT
payload: "16-byte param field, trailing byte 0=picture mute enabled, 1=disabled (note: source has this reversed from setPictureMute semantics; reproduced verbatim)"
description: "firePictureMuteChange - sent when picture mute state changes."
Macros
# UNRESOLVED: source does not document multi-step sequences
Safety
confirmation_required_for: []
interlocks: []
# UNRESOLVED: source does not document safety warnings, interlocks, or power-on sequencing requirements
Notes
Required monitor settings (must be enabled before Simple IP Control works):
- Settings → Network & Internet → Remote device settings → Control remotely
- Settings → Network & Internet → Home network → IP control → Simple IP control
Frame format reminder: Every message is exactly 24 bytes. Header *S (0x2A 0x53), then a single ASCII character for message type (Control, Enquiry, Answer, Notify), 4 ASCII characters for the FourCC command, 16 ASCII characters for parameters, then LF (0x0A).
Parameter padding: For Control without parameters, use 16 # characters. For Enquiry without parameters, also use 16 #. Answer success = 16 0 characters. Answer error = 16 F characters. String parameters (scene names) are right-padded with #. Numeric values are right-justified ASCII with leading 0.
EU models / RED-DA: EU-area ZH8 models have 3 RED-DA compliance spec variants; available commands and settings differ per spec. See https://pro-bravia.sony.net/setup/device-settings/red-da/. Some commands (getBroadcastAddress, getMacAddress) marked with * in the source carry this caveat.
Unsolicited notifications (N-type): The monitor pushes events on the same TCP connection when state changes. A controller must read the socket to observe these. Fire events documented: power, input, volume, mute, picture mute.
irccX command interpretation: setIrccCode (FourCC IRCC with leading C/message-type) is a passthrough for sending IR remote button presses from the controller. The 16-byte parameter holds the IR code from the documented table; codes are case-sensitive per source.
Provenance
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/
- https://pro-bravia.sony.net/
retrieved_at: 2026-05-27T09:00:00.688Z
last_checked_at: 2026-06-02T07:06:42.390Z
Verification Summary
verdict: verified
checked_at: 2026-06-02T07:06:42.390Z
matched_actions: 17
action_count: 17
confidence: medium
summary: "All 17 spec actions matched literally in source; transport parameters verified; spec covers all distinct source command tokens. (4 unresolved item(s) noted in Known Gaps.)"
Known Gaps
- "source does not state per-model firmware, RED-DA EU spec compliance level, or any authentication requirements"
- "source does not document multi-step sequences"
- "source does not document safety warnings, interlocks, or power-on sequencing requirements"
- "firmware version compatibility, RED-DA spec variant per region, auth requirements, retry/timeout behavior, recommended keepalive interval, behavior on disconnect"
From the AI4AV catalog (https://ai4av.net) · ODbL-1.0