Summary

Control spec for Sony BRAVIA Professional Displays (KD-XH8096 Series) using Sony's "Simple IP Control" protocol (SSIP). The monitor exposes a TCP listener on port 20060 and exchanges 24-byte fixed-size frames for power, input, volume, mute, picture-mute, and scene-setting control.

Transport

protocols:
  - tcp
addressing:
  port: 20060
  framing:
    header: "0x2A 0x53"   # ASCII "*S"
    footer: "0x0A"         # LF
    total_length_bytes: 24
    layout:
      - "Byte[0-1]   : Header (fixed 0x2A 0x53)"
      - "Byte[2]     : Message Type (C=Control 0x43, E=Enquiry 0x45, A=Answer 0x41, N=Notify 0x4E)"
      - "Byte[3-6]   : FourCC command (4 ASCII chars)"
      - "Byte[7-22]  : Parameters (16 bytes, ASCII digits or '#' padding)"
      - "Byte[23]    : Footer (fixed 0x0A / LF)"
auth:
  type: none  # inferred: no auth procedure in source

Traits

- powerable       # setPowerStatus, togglePowerStatus, firePowerChange
- routable        # setInput, getInput, fireInputChange
- queryable       # get* commands (POWR, VOLU, AMUT, INPT, PMUT, SCEN, BADR, MADR)
- levelable       # setAudioVolume

Actions

- id: set_ircc_code
  label: Send IRCC Remote Code
  kind: action
  command: "*SCIRCC{ircc_code:016d}\n"
  params:
    - name: ircc_code
      type: integer
      description: |
        Right-aligned decimal IR code in 16-byte param field. Examples:
        Display=5, Home=6, VolumeUp=30, VolumeDown=31, Mute=32,
        HDMI1=124, HDMI2=125, HDMI3=126, HDMI4=127, TVPower=98.
        Full list in the source IR Commands table.

- id: set_power_status
  label: Set Power Status
  kind: action
  command: "*SCPOWR000000000000000{state}\n"
  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: "*SEPOWR################\n"
  params: []

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

- id: set_audio_volume
  label: Set Audio Volume
  kind: action
  command: "*SCVOLU000000000000{volume:02X}\n"
  params:
    - name: volume
      type: integer
      description: |
        Volume value as 2-digit hex (right-aligned in 16-byte param field).
        Source example: 0x29 (= 41 decimal). Max value not specified in source.

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

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

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

- id: set_input
  label: Set Input
  kind: action
  command: "*SCINPT0000000{input_type}0000{input_number:04d}\n"
  params:
    - name: input_type
      type: integer
      enum: [1, 3, 4, 5]
      description: "1=HDMI, 3=Composite, 4=Component, 5=Screen Mirroring"
    - name: input_number
      type: integer
      description: "Input number, 1-9999, zero-padded to 4 digits in the trailing param bytes."

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

- id: set_picture_mute
  label: Set Picture Mute
  kind: action
  command: "*SCPMUT000000000000000{state}\n"
  params:
    - name: state
      type: integer
      enum: [0, 1]
      description: "0=Disable picture mute, 1=Enable picture mute (screen black)"

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

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

- id: set_scene_setting
  label: Set Scene Setting
  kind: action
  command: "*SCSCEN{scene:<16}#\n"
  params:
    - name: scene
      type: string
      enum: ["auto", "auto24pSync", "general"]
      description: |
        Case-sensitive scene name, left-aligned and right-padded with '#'
        to fill 16 param bytes. Examples: "auto############",
        "auto24pSync###", "general#########".

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

- id: get_broadcast_address
  label: Get Broadcast Address
  kind: query
  command: "*SEBADR{interface:<16}#\n"
  params:
    - name: interface
      type: string
      description: |
        Interface name left-aligned, right-padded with '#' to 16 bytes.
        Source example: "eth0############" (10 '#' fill).

- id: get_mac_address
  label: Get MAC Address
  kind: query
  command: "*SEMADR{interface:<16}#\n"
  params:
    - name: interface
      type: string
      description: |
        Interface name left-aligned, right-padded with '#' to 16 bytes.
        Source example: "eth0############" (10 '#' fill).

Feedbacks

- id: power_state
  type: enum
  values: [standby, active]
  source: "getPowerStatus answer byte[22]: 0=Standby, 1=Active"

- id: audio_volume
  type: integer
  source: "getAudioVolume answer bytes[7-22] as hex, e.g. 0x29 = 41"

- id: audio_mute_state
  type: enum
  values: [unmuted, muted]
  source: "getAudioMute answer byte[22]: 0=Unmuted, 1=Muted"

- id: current_input
  type: object
  source: |
    getInput answer bytes[7-22]: input type code at byte[14]
    (1=HDMI, 3=Composite, 4=Component, 5=Screen Mirroring), 4-digit
    input number in bytes[19-22].

- id: picture_mute_state
  type: enum
  values: [disabled, enabled]
  source: "getPictureMute answer byte[22]: 0=Disabled, 1=Enabled"

- id: scene_setting
  type: enum
  values: ["auto", "auto24pSync", "general"]
  source: "getSceneSetting answer bytes[7-22] as scene name"

- id: broadcast_address
  type: string
  source: "getBroadcastAddress answer bytes[7-22] as IPv4, e.g. 192.168.0.14"

- id: mac_address
  type: string
  source: "getMacAddress answer bytes[7-22] padded with '#' on the right"

Events

- id: power_change
  trigger: "N type message, FourCC POWR"
  payload:
    - "byte[22]=0: monitor is powering off"
    - "byte[22]=1: monitor is powering on"

- id: input_change
  trigger: "N type message, FourCC INPT"
  payload:
    - "byte[22]=0: input change (generic)"
    - "byte[14]=1 + bytes[19-22]=NNNN: HDMI N"
    - "byte[14]=3 + bytes[19-22]=NNNN: Composite N"
    - "byte[14]=4 + bytes[19-22]=NNNN: Component N"
    - "byte[14]=5 + bytes[19-22]=NNNN: Screen Mirroring N"

- id: volume_change
  trigger: "N type message, FourCC VOLU"
  payload: "bytes[7-22] as hex volume value, e.g. 0x29"

- id: mute_change
  trigger: "N type message, FourCC AMUT"
  payload:
    - "byte[22]=0: unmuting"
    - "byte[22]=1: muting"

- id: picture_mute_change
  trigger: "N type message, FourCC PMUT"
  payload:
    - "byte[22]=0: picture mute enabled"
    - "byte[22]=1: picture mute disabled"

Safety

confirmation_required_for: []
interlocks: []
# UNRESOLVED: no safety warnings, interlocks, or power-on sequencing
# requirements stated in the source. Nothing populated.

Notes

  • Protocol is Sony's "Simple IP control" (SSIP), exchanged as fixed 24-byte frames over TCP. The exact 24-byte example in the source is *SCPOWR0000000000000000 (23 visible ASCII bytes plus the LF footer at byte 23).
  • Two settings must be enabled on the monitor before commands will be accepted: Settings → Network & Internet → Remote device settings → Control remothely (sic, as printed in source) and Settings → Network & Internet → Home network → IP control → Simple IP control.
  • Both wired and wireless LANs are supported; the monitor and controller must share the same network.
  • EU-area models ship in three RED-DA compliance variants; available commands and setting paths may differ between variants. See https://pro-bravia.sony.net/setup/device-settings/red-da/ for the per-variant table.
  • The full IR command table (Display, Home, Options, Return, Up/Down/Left/Right, Confirm, colour keys, Num0–9, Volume/Channel, Mute, Subtitle, DOT, Picture Off, Wide, Jump, Sync Menu, transport keys, TV Power, Audio, Input, Sleep, Video 2, Picture Mode, Demo Surround, HDMI 1–4, Action Menu, Help) is a parameter table for setIrccCode — it is not a separate set of protocol commands. Codes are right-aligned decimal in the 16-byte param field.
  • Hex values in the source are stated using 0x prefix only for the header/footer/message-type table. Command mnemonics and param values are shown in the source as bare digits; treated as ASCII digits here.
  • Source: https://pro-bravia.sony.net/remote-display-control/simple-ip-control/

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/
  - 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/serial-control/
retrieved_at: 2026-05-27T08:23:51.823Z
last_checked_at: 2026-06-02T07:36:15.672Z

Verification Summary

verdict: verified
checked_at: 2026-06-02T07:36:15.672Z
matched_actions: 17
action_count: 17
confidence: medium
summary: "All 17 spec actions matched verbatim in source with correct command mnemonics, parameters, and transport (TCP port 20060, 24-byte framing). (6 unresolved item(s) noted in Known Gaps.)"

Known Gaps

- "full command coverage is derived from the public Sony \"Simple IP control\" reference; behaviour on EU RED-DA variant firmware may differ (see Notes)."
- "no safety warnings, interlocks, or power-on sequencing"
- "maximum audio volume value not stated in source (only example 0x29=41 given)."
- "discoverable broadcast interval, keepalive, or socket-reconnect behaviour not stated in source."
- "authentication / pairing procedure not stated in source (auth.type inferred as none)."
- "firmware version compatibility range not stated in source."

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