Summary

Spec covers Sony KDZD9 Series professional display monitors using the SSIP Simple IP Control protocol over TCP. Protocol uses fixed 24-byte messages on TCP port 20060. Source is the Sony Simple IP control reference (SSIP, BRAVIA Professional Displays).

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 / getAudioVolume / getInput / etc.
- levelable       # inferred from setAudioVolume

Actions

# Simple IP Control uses 24-byte fixed messages: header (0x2A 0x53) + type + 4-CC + 16 params + footer (0x0A).
# Literal string forms (as shown in the source's netcat example) preserved for setPowerStatus Off.
# For other commands, the command field shows the 4-CC + parameter template; full wire form = header + type + 4CC + params + LF.

# --- IR Remote Code Forwarding ---
- id: set_ircc_code
  label: Send IR Remote Code
  kind: action
  command: "*SCIRCC{ir_code_padded}"  # 16-byte param; pad right with "0" to 16 chars
  params:
    - name: ir_code
      type: string
      description: IR code as documented (e.g. "0000000000000005" for Display). See IR Commands table.

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

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

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

# --- Audio Volume ---
- id: set_audio_volume
  label: Set Audio Volume
  kind: action
  command: "*SCVOLU{volume_padded}"  # decimal value, left-pad with "0" to 16 chars (e.g. "0000000000000029" = 29)
  params:
    - name: volume
      type: integer
      description: Volume value (decimal), left-padded with zeros to 16 chars

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

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

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

# --- Input ---
- id: set_input
  label: Set Input
  kind: action
  command: "*SCINPT0000000000{src_type}000{port_padded}"  # src_type: 1=HDMI 3=Composite 4=Component 5=Screen Mirroring; port 1-9999 right-padded with X (treat as numeric)
  params:
    - name: source_type
      type: integer
      enum: [1, 3, 4, 5]
      description: 1=HDMI, 3=Composite, 4=Component, 5=Screen Mirroring
    - name: port
      type: integer
      description: Port number 1-9999

- id: get_input
  label: Get Current Input
  kind: query
  command: "*SEINPT0000000000000000"
  params: []

# --- Picture Mute ---
- id: set_picture_mute
  label: Set Picture Mute
  kind: action
  command: "*SCPMUT000000000000000{state}"  # 0=disable, 1=turn screen black
  params:
    - name: state
      type: integer
      enum: [0, 1]
      description: 0=Disabled (picture mute off), 1=Enabled (screen black)

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

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

# --- Scene Setting ---
- id: set_scene_setting
  label: Set Scene Setting
  kind: action
  command: "*SCSCEN{value_padded_#}"  # value right-padded with "#" to 16 chars; values: "auto", "auto24pSync", "general"
  params:
    - name: value
      type: string
      enum: [auto, auto24pSync, general]
      description: Scene name, case-sensitive, right-padded with "#" to 16 chars

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

# --- Network Info (queries) ---
- id: get_broadcast_address
  label: Get Broadcast Address (eth0)
  kind: query
  command: "*SEBADRETH0000000000000"  # param block: "eth0" + 12 "#" padding
  params: []
  notes: Returns broadcast IPv4 of interface (source documents eth0 only)

- id: get_mac_address
  label: Get MAC Address (eth0)
  kind: query
  command: "*SEMADRETH0000000000000"  # param block: "eth0" + 12 "#" padding
  params: []
  notes: Returns MAC address of interface (source documents eth0 only)

Feedbacks

- id: power_status
  type: enum
  values: [standby, active]
  description: "0=Standby (Off), 1=Active (On)"

- id: audio_volume
  type: integer
  description: "Current volume value, returned as 16-byte left-padded decimal"

- id: audio_mute
  type: enum
  values: [unmuted, muted]
  description: "0=Not Muted, 1=Muted"

- id: current_input
  type: object
  description: "Current input: source type (1=HDMI, 3=Composite, 4=Component, 5=Screen Mirroring) + port number (1-9999)"

- id: picture_mute
  type: enum
  values: [disabled, enabled]
  description: "0=Disabled (picture mute off), 1=Enabled (screen black)"

- id: scene_setting
  type: string
  description: "Current scene name, right-padded with '#' (auto, auto24pSync, general, or 'N' x16 for N/A)"

- id: broadcast_address
  type: string
  description: "Broadcast IPv4 address, right-padded with '#' to 16 chars"

- id: mac_address
  type: string
  description: "MAC address, right-padded with '#' to 16 chars"

Variables

# UNRESOLVED: no continuous/parameter-only variables beyond the discrete actions above.

Events

# All Notify (0x4E) messages the monitor sends unsolicited.

- id: power_change
  description: Sent when power state changes. FourCC=POWR, last param byte: 0=powering off, 1=powering on.
- id: input_change
  description: Sent when input changes. FourCC=INPT, follows same encoding as getInput answer.
- id: volume_change
  description: Sent when volume changes. FourCC=VOLU, param block contains new volume value.
- id: mute_change
  description: Sent when mute state changes. FourCC=AMUT, last param byte: 0=unmuting, 1=muting.
- id: picture_mute_change
  description: Sent when picture mute state changes. FourCC=PMUT, last param byte: 0=enabled, 1=disabled.

Macros

# UNRESOLVED: no multi-step sequences described in source.

Safety

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

Notes

Wire format: every SSIP message = header 0x2A 0x53 (1 byte * + 1 byte S) + type byte (C=0x43 / E=0x45 / A=0x41 / N=0x4E) + 4-CC command (4 ASCII bytes, byte[3]-byte[6]) + 16-byte parameter block (byte[7]-byte[22]) + footer 0x0A (LF). Total 24 bytes.

Type bytes: C=Control (client→monitor, expects Answer), E=Enquiry (client→monitor, expects Answer), A=Answer (monitor→client), N=Notify (monitor→client, unsolicited). Answer success = 16 0 bytes; Answer error = 16 F bytes. Some commands return N*16 for "Not Found" or "Not available for current input".

Netcat example from source: $ netcat [IP address] 20060 then send *SCPOWR0000000000000000 for Power Off; response *SAPOWR0000000000000000 *SNPOWR0000000000000000 (Accept + current state Notify).

EU model caveat: EU variants have 3 RED-DA compliance specifications; available commands and settings differ per variant. See https://pro-bravia.sony.net/setup/device-settings/red-da/ .

Required monitor menu setup: Settings → Network & Internet → Remote device settings → Control remotely (enable); Settings → Network & Internet → Home network → IP control → Simple IP control (enable).

Numeric parameter padding: integer values are left-padded with 0 ASCII to fill 16 bytes; string values are right-padded with # ASCII to fill 16 bytes. Parameter bytes labeled X in the source represent variable numeric digits.

getBroadcastAddress and getMacAddress source table specifies only eth0 as the interface name embedded in the param block; other interfaces not documented.

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/structure/
  - https://pro-bravia.sony.net/remote-display-control/rest-api/reference/
  - https://pro-bravia.sony.net/remote-display-control/ircc-ip
  - https://pro-bravia.sony.net/remote-display-control/
retrieved_at: 2026-06-09T00:59:53.885Z
last_checked_at: 2026-06-09T07:22:54.273Z

Verification Summary

verdict: verified
checked_at: 2026-06-09T07:22:54.273Z
matched_actions: 17
action_count: 17
confidence: medium
summary: "All 17 spec actions matched literal 4-CC codes in source table; port 20060 verified; full coverage of SSIP command inventory. (5 unresolved item(s) noted in Known Gaps.)"

Known Gaps

- "EU models have 3 RED-DA compliance variants; command availability differs per variant. Source references external page for full details."
- "no continuous/parameter-only variables beyond the discrete actions above."
- "no multi-step sequences described in source."
- "no explicit safety warnings, interlocks, or power-on sequencing in source."
- "firmware version compatibility, baud rate (N/A — TCP), authentication credentials, error recovery sequences."

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