Summary

Philips Professional Signage Displays of the xxBDL4150D Series (Himalaya 2.0 platform) controlled via the SICP V2.03 (Serial/Ethernet Interface Communication Protocol). Transport is RS-232C or TCP/IP (port 5000). Commands are binary packets MsgSize Control Group Data[0..N] Checksum where Data[0] is the opcode; the display replies with ACK (0x06), NACK (0x15), or NAV (0x18). This spec enumerates all documented Set and Get/Report commands.

Transport

protocols:
  - tcp
  - serial
addressing:
  port: 5000  # TCP/IP port 5000 used by default for control in all displays
serial:
  baud_rate: 9600   # default; supported: 1200, 2400, 4800, 9600, 19200, 38400, 57600
  data_bits: 8
  parity: none
  stop_bits: 1
  flow_control: none
auth:
  type: none  # inferred: no auth procedure in source

Packet framing (applies to both transports):

  • Byte 1 MsgSize = total message length, range 0x03–0x28.
  • Byte 2 Control = Monitor ID (1–255 signal mode; 0 = broadcast, no ACK).
  • Byte 3 Group = Group ID (0 = no group / broadcast; 1–254 = control by group; omitted when group is off).
  • Bytes 4..N Data[0..N] = payload; Data[0] is the command opcode.
  • Last byte Checksum = XOR of all preceding bytes.
  • Reply after each command within 500 ms; ACK 06 01 00 00 06 00, NACK 06 01 00 00 15 12, NAV 06 01 00 00 18 1F (address 01). Get commands are answered with a Report packet, not an ACK.

Traits

traits:
  - powerable       # inferred: power on/off commands present (0x18/0x19)
  - queryable       # inferred: many Get/Report query commands present
  - levelable       # inferred: volume / brightness / contrast / color gain commands present
  - routable        # inferred: input source select + PIP/tiling routing commands present

Actions

# Packet layout for every action: MsgSize Control Group Data[0] [Data[1..N]] Checksum.
# Examples below use Control=0x01 (Monitor ID 1) and Group=0x00 (no group) - verbatim from source.
# Parameterized actions show {var} placeholders; checksum must be recomputed for each value.
# Source: SICP V2.03. All opcodes are the literal Data[0] byte.

# ---------- Communication / System ----------
- id: comm_control_report
  label: Communication Control Report (ACK/NACK/NAV)
  kind: feedback
  command: "06 01 00 00 {status} {checksum}"   # status: 0x06 ACK / 0x15 NACK / 0x18 NAV
  params:
    - name: status
      type: integer
      description: "0x06=ACK, 0x15=NACK, 0x18=NAV"
  notes: Generic report returned after Get/Set.

- id: get_platform_version
  label: Get Platform and Version Labels
  kind: query
  command: "06 01 00 A2 {label} {checksum}"     # label: 0x00 SICP ver / 0x01 platform label / 0x02 platform version
  params:
    - name: label
      type: integer
      description: "0x00=SICP impl version, 0x01=platform label, 0x02=platform version"
  notes: Report DATA[0]=0xA2, DATA[1..N]=ASCII chars (≤36).

- id: get_model_fw_date
  label: Get Model Number, FW Version, Build Date
  kind: query
  command: "06 01 00 A1 {item} {checksum}"      # item: 0x00 Model / 0x01 FW / 0x02 Build Date / 0x03 Android FW
  params:
    - name: item
      type: integer
      description: "0x00=Model Number, 0x01=FW version, 0x02=Build Date, 0x03=Android FW build"
  notes: Report DATA[0]=0xA1, DATA[1..N]=ASCII chars (≤36).

- id: set_monitor_restart
  label: Monitor Restart
  kind: action
  command: "06 01 00 57 {target} {checksum}"    # 0x00=Android, 0x01=Scalar
  params:
    - name: target
      type: integer
      description: "0x00=Android, 0x01=Scalar"
  notes: Only on Android monitors (Himalaya 2 / Dragon 2 / future).

- id: set_factory_reset
  label: Factory Reset
  kind: action
  command: "05 01 00 56 52"
  params: []
  notes: Resets all configurable parameters listed in section 7.18.

- id: set_screenshot_email
  label: Take Screenshot and Email
  kind: action
  command: "05 01 00 58 5C"
  params: []
  notes: Android monitors only (Himalaya 2 / Dragon 2). Saves {yyyy-MM-dd-HH-mm-ss}.png.

- id: set_monitor_id
  label: Set Monitor ID
  kind: action
  command: "06 {old_id} 00 69 {new_id} {checksum}"
  params:
    - name: old_id
      type: integer
      description: Current monitor ID (Control byte), 1-254
    - name: new_id
      type: integer
      description: New monitor ID, 0x01-0xFE (1-254)

- id: set_group_id
  label: Set Group ID
  kind: action
  command: "06 01 00 5C {group_id} {checksum}"  # 0x01-0xFE = 1-254; 0xFF = Off (legacy)
  params:
    - name: group_id
      type: integer
      description: "1-254 = group; 0xFF = off (legacy)"

- id: get_group_id
  label: Get Group ID
  kind: query
  command: "05 01 00 5D 59"
  params: []

- id: anytile_set_group_monitor_id
  label: AnyTile Set Group ID and Monitor ID (IP only)
  kind: action
  command: "06 01 00 C0 {monitor_id} {group_id} {checksum}"
  params:
    - name: monitor_id
      type: integer
    - name: group_id
      type: integer
  notes: Works only via IP connection, not RS-232.

- id: set_display_monitor_id_osd
  label: Display Monitor ID on Screen (Set)
  kind: action
  command: "06 01 00 4C {enable} {checksum}"    # 0x01=show, 0x00=hide (per source table)
  params:
    - name: enable
      type: integer
      description: "0x01=show monitor ID, 0x00=hide"

# ---------- Power ----------
- id: set_power
  label: Set Power State
  kind: action
  command: "06 01 00 18 {state} {checksum}"     # 0x01=Off, 0x02=On
  params:
    - name: state
      type: integer
      description: "0x01=Power Off, 0x02=On"
  traits: [powerable]

- id: get_power
  label: Get Power State
  kind: query
  command: "05 01 00 19 1D"
  params: []
  notes: Report DATA[1]: 0x01=Off, 0x02=On.

- id: set_power_cold_start
  label: Set Power State at Cold Start
  kind: action
  command: "06 01 00 A3 {state} {checksum}"     # 0x00=Off, 0x01=Forced On, 0x02=Last Status
  params:
    - name: state
      type: integer
      description: "0x00=Off, 0x01=Forced On, 0x02=Last Status"

- id: get_power_cold_start
  label: Get Power State at Cold Start
  kind: query
  command: "05 01 00 A4 A0"
  params: []

- id: set_apm
  label: Set APM (Advanced Power Management) Status
  kind: action
  command: "06 01 00 D0 {mode} {checksum}"      # 0x00=Off, 0x01=On, 0x02=Mode1 (TCP off/WOL on), 0x03=Mode2 (TCP on/WOL off)
  params:
    - name: mode
      type: integer
      description: "0x00=Off, 0x01=On, 0x02=Mode1, 0x03=Mode2"
  notes: Himalaya supports off/Mode1/Mode2 only.

- id: get_apm
  label: Get APM Status
  kind: query
  command: "05 01 00 D1 D5"
  params: []

- id: set_power_saving_mode
  label: Set Power Saving Mode
  kind: action
  command: "06 01 00 D2 {mode} {checksum}"      # 0x00-0x07 (see notes)
  params:
    - name: mode
      type: integer
      description: "0x00=RGB off & Video off, 0x01=RGB off Video on, 0x02=RGB on Video off, 0x03=both on, 0x04-0x07=modes 1-4"

- id: get_power_saving_mode
  label: Get Power Saving Mode
  kind: query
  command: "05 01 00 D3 D7"
  params: []

- id: set_smart_power
  label: Set Smart Power (Backlight Dimming)
  kind: action
  command: "06 01 00 DD {level} {checksum}"     # 0x00=Off, 0x01=Low, 0x02=Medium, 0x03=High
  params:
    - name: level
      type: integer
      description: "0x00=Off, 0x01=Low, 0x02=Medium, 0x03=High"

- id: get_smart_power
  label: Get Smart Power
  kind: query
  command: "05 01 00 DE DA"
  params: []

- id: set_eco_mode
  label: Set ECO Mode
  kind: action
  command: "06 01 00 64 {mode} {checksum}"      # 0x00=low power standby, 0x01=normal
  params:
    - name: mode
      type: integer
      description: "0x00=low power standby, 0x01=normal"
  notes: Phoenix 1 & 2 platform only.

- id: get_eco_mode
  label: Get ECO Mode
  kind: query
  command: "05 01 00 63 67"
  params: []

- id: set_off_timer
  label: Set Off Timer
  kind: action
  command: "06 01 00 92 {hours} {checksum}"     # 0x00=Off, 0x01-0x18 = 1-24 hours
  params:
    - name: hours
      type: integer
      description: "0=Off, 1-24 hours"

- id: get_off_timer
  label: Get Off Timer
  kind: query
  command: "05 01 00 91 95"
  params: []

- id: set_backlight
  label: Set Backlight (Picture Mute)
  kind: action
  command: "06 01 00 72 {state} {checksum}"     # 0x00=on, 0x01=off
  params:
    - name: state
      type: integer
      description: "0x00=backlight on, 0x01=backlight off (audio unaffected)"

- id: get_backlight
  label: Get Backlight (Picture Mute) Status
  kind: query
  command: "05 01 00 71 50"
  params: []
  notes: Report 06 01 00 71 00 76 = on; 06 01 00 71 01 77 = off.

# ---------- Lock / Input Control ----------
- id: set_ir_lock
  label: Set IR Remote Control Lock
  kind: action
  command: "06 01 00 1C {state} {checksum}"     # 0x01 Unlock all / 0x02 Lock all / 0x03 Lock all but Power / 0x04 Lock all but Volume / 0x05 Primary / 0x06 Secondary / 0x07 Lock all except Power & Volume
  params:
    - name: state
      type: integer
      description: "0x01=Unlock all, 0x02=Lock all, 0x03=Lock all but Power, 0x04=Lock all but Volume, 0x05=Primary, 0x06=Secondary, 0x07=Lock all except Power & Volume"

- id: get_ir_lock
  label: Get IR Remote Control Lock
  kind: query
  command: "05 01 00 1D 19"
  params: []

- id: set_keypad_lock
  label: Set Keypad Lock
  kind: action
  command: "06 01 00 1A {state} {checksum}"     # 0x01 Unlock all / 0x02 Lock all / 0x03 Lock all but Power / 0x04 Lock all but Volume / 0x07 Lock all except Power & Volume
  params:
    - name: state
      type: integer
      description: "0x01=Unlock all, 0x02=Lock all, 0x03=Lock all but Power, 0x04=Lock all but Volume, 0x07=Lock all except Power & Volume"

- id: get_keypad_lock
  label: Get Keypad Lock
  kind: query
  command: "05 01 00 1B 1F"
  params: []

- id: set_external_storage_lock
  label: Set MicroSD and USB Ports Lock
  kind: action
  command: "06 01 00 F1 {state} {checksum}"     # 0x00=unlocked, 0x01=Locked
  params:
    - name: state
      type: integer
      description: "0x00=unlocked, 0x01=locked"
  notes: Locks/unlocks all MicroSD + USB-A + microUSB ports at once. 10BDL3051T / Dragon 1.x / 1.6 / QL3.

- id: get_external_storage_lock
  label: Get MicroSD and USB Ports Lock
  kind: query
  command: "05 01 00 F2 F6"
  params: []

# ---------- Input Source / Failover ----------
- id: set_input_source
  label: Set Input Source
  kind: action
  command: "09 01 00 AC {source} {playlist} {osd_style} {mute_style} {checksum}"
  params:
    - name: source
      type: integer
      description: "0x01=VIDEO, 0x02=S-VIDEO, 0x03=COMPONENT, 0x05=VGA, 0x06=HDMI2, 0x07=DP2, 0x08=USB2, 0x09=DVI-D, 0x0A=DP1, 0x0B=OPS, 0x0C=USB, 0x0D=HDMI, 0x0E=DVI-D, 0x0F=HDMI3, 0x10=BROWSER, 0x11=SMARTCMS, 0x12=DMS, 0x13=INTERNAL STORAGE, 0x16=Media Player, 0x17=PDF Player, 0x18=Custom, 0x19=HDMI4, 0x1A=VGA2, 0x1B=VGA3, 0x1C=IWB"
    - name: playlist
      type: integer
      description: "Playlist/URL number (1-7) for Media/PDF/Browser; 0 otherwise"
    - name: osd_style
      type: integer
      description: "Bit6=do-not-switch flag, Bits2..0=source display style (1=label)"
    - name: mute_style
      type: integer
      description: "Reserved bits, default 0x00"
  traits: [routable]
  notes: Minimal form is "09 01 00 AC {source} 09 01 00 {checksum}".

- id: get_current_source
  label: Get Current Input Source
  kind: query
  command: "05 01 00 AD A9"
  params: []

- id: set_auto_signal_detecting
  label: Set Auto Signal Detecting
  kind: action
  command: "06 01 00 AE {mode} {checksum}"      # 0x00=Off, 0x01=All, 0x03=PC sources only, 0x04=Video sources only, 0x05=Failover
  params:
    - name: mode
      type: integer
      description: "0x00=Off, 0x01=All, 0x03=PC only, 0x04=Video only, 0x05=Failover"

- id: get_auto_signal_detecting
  label: Get Auto Signal Detecting
  kind: query
  command: "05 01 00 AF AB"
  params: []

- id: set_failover_priority
  label: Set Failover Priority List
  kind: action
  command: "0D 01 00 A5 {p1} {p2} {p3} {p4} {p5} {p6} {p7} {p8} {p9} {p10} {p11} {p12} {p13} {checksum}"
  params:
    - name: p1
      type: integer
      description: 1st priority source (0x00=HDMI … 0x16=IWB)
  notes: Up to 14 priority slots; each value uses the source-type table.

- id: get_failover_priority
  label: Get Failover Priority List
  kind: query
  command: "05 01 00 A6 A2"
  params: []

# ---------- Video / Picture ----------
- id: set_video_parameters
  label: Set Video Parameters
  kind: action
  command: "0C 01 00 32 {brightness} {color} {contrast} {sharpness} {tint} {black_level} {gamma} {checksum}"
  params:
    - name: brightness
      type: integer
      description: "0-100 (%)"
    - name: color
      type: integer
      description: "0-100 (%)"
    - name: contrast
      type: integer
      description: "0-100 (%)"
    - name: sharpness
      type: integer
      description: "0-100 (%)"
    - name: tint
      type: integer
      description: "0-100 (%)"
    - name: black_level
      type: integer
      description: "0-100 (%)"
    - name: gamma
      type: integer
      description: "0x01=Native, 0x02=S gamma, 0x03=2.2, 0x04=2.4, 0x05=D-image (DICOM)"
  traits: [levelable]
  notes: Not on QL3 platform for browser/PDF/media/CMND&play/installed apk sources.

- id: get_video_parameters
  label: Get Video Parameters
  kind: query
  command: "05 01 00 33 37"
  params: []

- id: set_color_temperature
  label: Set Color Temperature Preset
  kind: action
  command: "06 01 00 34 {preset} {checksum}"    # 0x00 User1 / 0x01 Native / 0x03 10000K … 0x12 User2 (see notes)
  params:
    - name: preset
      type: integer
      description: "0x00=User1, 0x01=Native, 0x03=10000K, 0x04=9300K, 0x05=7500K, 0x06=6500K, 0x09=5000K, 0x0A=4000K, 0x0D=3000K, 0x12=User2"

- id: get_color_temperature
  label: Get Color Temperature Preset
  kind: query
  command: "05 01 00 35 31"
  params: []

- id: set_color_temperature_100k
  label: Set Color Temperature 100K Steps
  kind: action
  command: "06 01 00 11 {steps} {checksum}"     # 0x14(20)=2000K … 0x64(100)=10000K
  params:
    - name: steps
      type: integer
      description: "20-100 (0x14-0x64), step=100K"

- id: get_color_temperature_100k
  label: Get Color Temperature 100K Steps
  kind: query
  command: "05 01 00 12 16"
  params: []

- id: set_rgb_parameters
  label: Set RGB Gain/Offset
  kind: action
  command: "0B 01 00 36 {r_gain} {g_gain} {b_gain} {r_offset} {g_offset} {b_offset} {checksum}"
  params:
    - name: r_gain
      type: integer
      description: "0-255"
    - name: g_gain
      type: integer
      description: "0-255"
    - name: b_gain
      type: integer
      description: "0-255"
    - name: r_offset
      type: integer
      description: "0-255"
    - name: g_offset
      type: integer
      description: "0-255"
    - name: b_offset
      type: integer
      description: "0-255"

- id: get_rgb_parameters
  label: Get RGB Gain/Offset
  kind: query
  command: "05 01 00 37 33"
  params: []

- id: set_vga_video_parameters
  label: Set VGA Video Parameters
  kind: action
  command: "09 01 00 38 {clock} {phase} {h_pos} {v_pos} {checksum}"
  params:
    - name: clock
      type: integer
      description: "0-100 (%)"
    - name: phase
      type: integer
      description: "0-100 (%)"
    - name: h_pos
      type: integer
      description: "0-100 (%)"
    - name: v_pos
      type: integer
      description: "0-100 (%)"

- id: get_vga_video_parameters
  label: Get VGA Video Parameters
  kind: query
  command: "05 01 00 39 3D"
  params: []

- id: set_picture_format
  label: Set Picture Format
  kind: action
  command: "06 01 00 3A {format} {checksum}"    # 0x00 Normal / 0x01 Custom / 0x02 Real / 0x03 Full / 0x04 21:9 / 0x05 Dynamic / 0x06 16:9
  params:
    - name: format
      type: integer
      description: "0x00=Normal, 0x01=Custom, 0x02=Real, 0x03=Full, 0x04=21:9, 0x05=Dynamic, 0x06=16:9"

- id: get_picture_format
  label: Get Picture Format
  kind: query
  command: "05 01 00 3B 3F"
  params: []

- id: set_picture_style
  label: Set Picture Style
  kind: action
  command: "06 01 00 66 {style} {checksum}"     # 0x00 Highbright / 0x01 sRGB / 0x02 Vivid / 0x03 Natural / 0x04 Standard / 0x05 Video / 0x06 Static Signage / 0x07 Text / 0x08 Energy saving / 0x09 Soft / 0x0A User
  params:
    - name: style
      type: integer
      description: "0x00=Highbright, 0x01=sRGB, 0x02=Vivid, 0x03=Natural, 0x04=Standard, 0x05=Video, 0x06=Static Signage, 0x07=Text, 0x08=Energy saving, 0x09=Soft, 0x0A=User"
  notes: Phoenix 1 & 2 platform only.

- id: get_picture_style
  label: Get Picture Style
  kind: query
  command: "05 01 00 65 61"
  params: []

- id: set_pip
  label: Set Picture-in-Picture
  kind: action
  command: "09 01 00 3C {pip_mode} {position} 00 00 {checksum}"
  params:
    - name: pip_mode
      type: integer
      description: "0x00=Off, 0x01=PIP, 0x02=POP, 0x03=Quick swap, 0x04=PBP 2win, 0x05=PBP 3win, 0x06=PBP 4win, 0x07=PBP 3win-1, 0x08=PBP 3win-2, 0x09=PBP 4win-1, 0x0A=SICP (Custom)"
    - name: position
      type: integer
      description: "0x00-0x04 PIP window position"

- id: get_pip
  label: Get Picture-in-Picture
  kind: query
  command: "05 01 00 3D 39"
  params: []

- id: set_pip_source
  label: Set PIP Source
  kind: action
  command: "09 01 00 84 FD {q2} {q3} {q4} {checksum}"   # source-type 0xFD = input source
  params:
    - name: q2
      type: integer
      description: Q2 source number (source-type table)
    - name: q3
      type: integer
      description: Q3 source number
    - name: q4
      type: integer
      description: Q4 source number
  notes: Minimal form "07 01 00 84 FD {src} {checksum}".

- id: get_pip_source
  label: Get PIP Source
  kind: query
  command: "05 01 00 85 81"
  params: []

- id: set_scan_mode
  label: Set Scan Mode (Over/Under scan)
  kind: action
  command: "06 01 00 50 {mode} {checksum}"      # 0x00=Over scan, 0x01=Under scan, 0x02=Off, 0x03-0x1C=0-25 (challenger 2.1)
  params:
    - name: mode
      type: integer
      description: "0x00=Over scan, 0x01=Under scan, 0x02=Off"

- id: get_scan_mode
  label: Get Scan Mode
  kind: query
  command: "05 01 00 51 55"
  params: []

- id: set_scan_conversion
  label: Set Scan Conversion (Progressive/Interlace)
  kind: action
  command: "06 01 00 52 {mode} {checksum}"      # 0x00=Progressive, 0x01=Interlace
  params:
    - name: mode
      type: integer
      description: "0x00=Progressive, 0x01=Interlace"
  notes: Not on Himalaya 1.0/1.2, Dragon 1.x/1.6.

- id: get_scan_conversion
  label: Get Scan Conversion
  kind: query
  command: "05 01 00 53 57"
  params: []

- id: set_noise_reduction
  label: Set Noise Reduction
  kind: action
  command: "06 01 00 2A {level} {checksum}"     # 0x00 Off / 0x01 Low / 0x02 Middle / 0x03 High / 0x04 default
  params:
    - name: level
      type: integer
      description: "0x00=Off, 0x01=Low, 0x02=Middle, 0x03=High, 0x04=default"

- id: get_noise_reduction
  label: Get Noise Reduction
  kind: query
  command: "05 01 00 2B 2F"
  params: []

- id: set_memc_effect
  label: Set MEMC Effect
  kind: action
  command: "06 01 00 28 {level} {checksum}"     # 0x00 Off / 0x01 Low / 0x02 Medium / 0x03 High
  params:
    - name: level
      type: integer
      description: "0x00=Off, 0x01=Low, 0x02=Medium, 0x03=High"
  notes: Not on Himalaya 1.0/1.2, Dragon 1.x/1.6.

- id: get_memc_effect
  label: Get MEMC Effect
  kind: query
  command: "05 01 00 29 2D"
  params: []

- id: set_pixel_shift
  label: Set Pixel Shift
  kind: action
  command: "06 01 00 B2 {interval} {checksum}"  # 0x00=Off, 0x01=10s … 0x5A=900s, 0x5B=AUTO
  params:
    - name: interval
      type: integer
      description: "0=Off, 1=10s … 90=900s, 0x5B=AUTO"
  notes: Dragon 1.0/1.5 only.

- id: get_pixel_shift
  label: Get Pixel Shift
  kind: query
  command: "05 01 00 B1 B5"
  params: []

- id: set_auto_adjust
  label: VGA Auto Adjust
  kind: action
  command: "07 01 00 70 40 00 36"
  params: []

- id: set_display_orientation
  label: Set Display Orientation
  kind: action
  command: "0C 01 00 17 {auto_rotate} {osd_rotation} {image_all} {win1} {win2} {win3} {win4} {checksum}"
  params:
    - name: auto_rotate
      type: integer
      description: "0x00=Off, 0x01=On (Dragon 1/1.5 only)"
    - name: osd_rotation
      type: integer
      description: "0x00=Landscape, 0x01=Portrait"
    - name: image_all
      type: integer
      description: "0x00=Off, 0x01=On, 0x02=On CW (CRD50), 0x03=On CCW (CRD50)"
    - name: win1
      type: integer
      description: "0x00=Off, 0x01=On"
    - name: win2
      type: integer
      description: "0x00=Off, 0x01=On"
    - name: win3
      type: integer
      description: "0x00=Off, 0x01=On"
    - name: win4
      type: integer
      description: "0x00=Off, 0x01=On"
  notes: Himalaya 2.0 supports OSD Rotation (DATA[2]) and main-window image rotation (DATA[4]) only.

- id: get_display_orientation
  label: Get Display Orientation
  kind: query
  command: "05 01 00 16 12"
  params: []

- id: set_osd_rotating
  label: Set OSD Rotating
  kind: action
  command: "06 01 00 26 {state} {checksum}"     # 0x00=Off, 0x01=On
  params:
    - name: state
      type: integer
      description: "0x00=Off, 0x01=On"

- id: get_osd_rotating
  label: Get OSD Rotating
  kind: query
  command: "05 01 00 27 23"
  params: []

- id: set_information_osd
  label: Set Information OSD Feature
  kind: action
  command: "06 01 00 2C {timeout} {checksum}"   # 0x00=Off, 0x01-0x3C=1-60 sec
  params:
    - name: timeout
      type: integer
      description: "0=Off, 1-60 seconds"

- id: get_information_osd
  label: Get Information OSD Feature
  kind: query
  command: "05 01 00 2D 29"
  params: []

- id: set_touch_feature
  label: Set Touch Feature
  kind: action
  command: "06 01 00 1E {state} {checksum}"     # 0x00=Off, 0x01=On
  params:
    - name: state
      type: integer
      description: "0x00=Off, 0x01=On"
  notes: Not on Himalaya 1.0/1.2, Dragon 1.x/2.0.

- id: get_touch_feature
  label: Get Touch Feature
  kind: query
  command: "05 01 00 1F 1B"
  params: []

- id: set_power_on_logo
  label: Set Power On Logo
  kind: action
  command: "06 01 00 3E {state} {checksum}"     # 0x00=Off, 0x01=On, 0x02=User
  params:
    - name: state
      type: integer
      description: "0x00=Off, 0x01=On, 0x02=User"

- id: get_power_on_logo
  label: Get Power On Logo Status
  kind: query
  command: "05 01 00 3F 3B"
  params: []

# ---------- Audio ----------
- id: set_volume
  label: Set Volume (Speaker + Audio Out)
  kind: action
  command: "07 01 00 44 {speaker} {audio_out} {checksum}"
  params:
    - name: speaker
      type: integer
      description: "0-100 (%) speaker out"
    - name: audio_out
      type: integer
      description: "0-100 (%) variable audio out"
  traits: [levelable]
  notes: Platforms without variable audio out (Himalaya 1/1.2, Eagle) omit DATA[2]: "06 01 00 44 {speaker} {checksum}".

- id: get_volume
  label: Get Volume
  kind: query
  command: "05 01 00 45 41"
  params: []

- id: set_volume_step
  label: Set Volume Step Up/Down
  kind: action
  command: "07 01 00 41 {speaker_dir} {audio_dir} {checksum}"   # 0=down, 1=up, 2=no change
  params:
    - name: speaker_dir
      type: integer
      description: "0=down, 1=up, 2=no change"
    - name: audio_dir
      type: integer
      description: "0=down, 1=up, 2=no change"

- id: set_volume_mute
  label: Set Volume Mute
  kind: action
  command: "06 01 00 47 {state} {checksum}"     # 0x00=mute off, 0x01=mute on
  params:
    - name: state
      type: integer
      description: "0x00=off, 0x01=on"

- id: get_volume_mute
  label: Get Volume Mute
  kind: query
  command: "05 01 00 46 42"
  params: []

- id: set_audio_parameters
  label: Set Audio Parameters (Treble/Bass)
  kind: action
  command: "07 01 00 42 {treble} {bass} {checksum}"
  params:
    - name: treble
      type: integer
      description: "0-100 (%) [Phoenix 2.0: -8..8, two's-complement]"
    - name: bass
      type: integer
      description: "0-100 (%) [Phoenix 2.0: -8..8, two's-complement]"

- id: get_audio_parameters
  label: Get Audio Parameters
  kind: query
  command: "05 01 00 43 47"
  params: []

- id: set_volume_limit_speaker
  label: Set Volume Limits Speaker Out
  kind: action
  command: "08 01 00 B8 {min} {max} {switch_on} {checksum}"
  params:
    - name: min
      type: integer
      description: "0-100 (%) minimum"
    - name: max
      type: integer
      description: "0-100 (%) maximum"
    - name: switch_on
      type: integer
      description: "0-100 (%) switch-on volume"
  notes: Constraint: min <= switch_on <= max.

- id: get_volume_limit_speaker
  label: Get Volume Limits Speaker Out
  kind: query
  command: "05 01 00 B6 B2"
  params: []

- id: set_volume_limit_audio
  label: Set Volume Limits Audio Out
  kind: action
  command: "08 01 00 B9 {min} {max} {switch_on} {checksum}"
  params:
    - name: min
      type: integer
      description: "0-100 (%) minimum"
    - name: max
      type: integer
      description: "0-100 (%) maximum"
    - name: switch_on
      type: integer
      description: "0-100 (%) switch-on volume"

- id: get_volume_limit_audio
  label: Get Volume Limits Audio Out
  kind: query
  command: "05 01 00 B7 B3"
  params: []

# ---------- Sensors / Environment ----------
- id: get_temperature
  label: Get Temperature Sensor
  kind: query
  command: "05 01 00 2F 2B"
  params: []
  notes: Report DATA[1]/DATA[2] = sensors 1/2 in °C (±3°C). Dragon 1.0/2.0 only returns DATA[1].

- id: set_light_sensor
  label: Set Light Sensor
  kind: action
  command: "06 01 00 24 {state} {checksum}"     # 0x00=Off, 0x01=On
  params:
    - name: state
      type: integer
      description: "0x00=Off, 0x01=On"

- id: get_light_sensor
  label: Get Light Sensor
  kind: query
  command: "05 01 00 25 21"
  params: []

- id: set_human_sensor
  label: Set Human Sensor (CRD41)
  kind: action
  command: "06 01 00 B4 {timeout} {checksum}"   # 0x00=Off, 0x01=10min … 0x06=60min
  params:
    - name: timeout
      type: integer
      description: "0=Off, 1-6 = 10-60 minutes"

- id: get_human_sensor
  label: Get Human Sensor
  kind: query
  command: "05 01 00 B3 B7"
  params: []

- id: set_fan_speed
  label: Set Fan Speed
  kind: action
  command: "06 01 00 61 {level} {checksum}"     # 0x00=Off, 0x01=Auto, 0x02=Low, 0x03=Middle, 0x04=High
  params:
    - name: level
      type: integer
      description: "0x00=Off, 0x01=Auto, 0x02=Low, 0x03=Middle, 0x04=High"
  notes: Not on Dragon 1.x/1.6.

- id: get_fan_speed
  label: Get Fan Speed
  kind: query
  command: "05 01 00 62 66"
  params: []

- id: get_video_signal_present
  label: Get Video Signal Present
  kind: query
  command: "05 01 00 59 5D"
  params: []
  notes: Report DATA[1]: 0x00=not present, 0x01=present.

- id: get_serial_code
  label: Get Serial Code
  kind: query
  command: "05 01 00 15 11"
  params: []
  notes: Report DATA[1..14] = 14 ASCII characters.

- id: get_operating_hours
  label: Get Operating Hours
  kind: query
  command: "06 01 00 0F 02 0A"
  params: []
  notes: Report DATA[1]=MSB, DATA[2]=LSB (16-bit hours).

# ---------- Tiling / Video Wall ----------
- id: set_tiling
  label: Set Tiling
  kind: action
  command: "09 01 00 22 {enable} {frame_comp} {position} {h_v_monitors} {checksum}"
  params:
    - name: enable
      type: integer
      description: "0x00=No, 0x01=Yes"
    - name: frame_comp
      type: integer
      description: "0x00=No, 0x01=Yes, 0x02=don't overwrite"
    - name: position
      type: integer
      description: "Tile position (1-25, or 1-150 for Zero Bezel)"
    - name: h_v_monitors
      type: integer
      description: "Encoded H×V monitors per Note 2"

- id: get_tiling
  label: Get Tiling
  kind: query
  command: "05 01 00 23 27"
  params: []

- id: set_switch_on_delay
  label: Set Switch On Delay (Tiling)
  kind: action
  command: "06 01 00 54 {delay} {checksum}"     # 0x00=Off, 0x01=Auto, 0x02=2s … 0xFF=255s
  params:
    - name: delay
      type: integer
      description: "0=Off, 1=Auto, 2-255 = seconds"

- id: get_switch_on_delay
  label: Get Switch On Delay (Tiling)
  kind: query
  command: "05 01 00 55 51"
  params: []

- id: set_frame_comp_horz
  label: Set Horizontal Frame Compensation
  kind: action
  command: "06 01 00 5F {value} {checksum}"     # 0x00-0xFF
  params:
    - name: value
      type: integer
      description: "0-255"

- id: get_frame_comp_horz
  label: Get Horizontal Frame Compensation
  kind: query
  command: "05 01 00 5E 5A"
  params: []

- id: set_frame_comp_vert
  label: Set Vertical Frame Compensation
  kind: action
  command: "06 01 00 68 {value} {checksum}"     # 0x00-0xFF
  params:
    - name: value
      type: integer
      description: "0-255"

- id: get_frame_comp_vert
  label: Get Vertical Frame Compensation
  kind: query
  command: "05 01 00 67 63"
  params: []

# ---------- AnyTile (Custom Tiling) ----------
- id: set_custom_tiling
  label: Set Custom Tiling (AnyTile)
  kind: action
  command: "10 01 00 4B {enable} {rot_lsb} {rot_msb} {h_start_lsb} {h_start_msb} {v_start_lsb} {v_start_msb} {h_size_lsb} {h_size_msb} {v_size_lsb} {v_size_msb} {checksum}"
  params:
    - name: enable
      type: integer
      description: "0x00=No, 0x01=Yes"
  notes: Dragon 1.x/1.6/Himalaya 2.0 only; canvas tiling must be activated in admin menu.

- id: get_custom_tiling
  label: Get Custom Tiling (AnyTile)
  kind: query
  command: "05 01 00 4A 4E"
  params: []

- id: set_resolution_mode
  label: Set Resolution Input Mode
  kind: action
  command: "06 01 00 4F {mode} {checksum}"      # 0x00=default, 0x01=FHD, 0x02=UHD4K
  params:
    - name: mode
      type: integer
      description: "0x00=default, 0x01=FHD, 0x02=UHD4K"

- id: get_resolution_mode
  label: Get Resolution Input Mode
  kind: query
  command: "05 01 00 4E 4A"
  params: []

# ---------- Custom Multi-Window ----------
- id: set_custom_multiwin_execute
  label: Execute Custom Multi-Window
  kind: action
  command: "07 01 00 FB {switch} {windows} {checksum}"   # switch: 0x00=OFF, 0x01=ON; windows: 0x00-0x03
  params:
    - name: switch
      type: integer
      description: "0x00=OFF, 0x01=ON"
    - name: windows
      type: integer
      description: "0x00=1 window, 0x01=2, 0x02=3, 0x03=4"

- id: set_custom_multiwin_window
  label: Set Custom Multi-Window Window
  kind: action
  command: "10 01 00 FC {window} {rotation} {x_h} {x_l} {y_h} {y_l} {w_h} {w_l} {h_h} {h_l} {picture_format} {checksum}"
  params:
    - name: window
      type: integer
      description: "0x00=Main, 0x01=Sub1, 0x02=Sub2, 0x03=Sub3"
    - name: rotation
      type: integer
      description: "0x00=NONE, 0x01=90, 0x02=270, 0x03=H_MIRROR, 0x04=V_MIRROR, 0x05=HV_MIRROR"
    - name: picture_format
      type: integer
      description: "0x00=Normal, 0x01=Custom, 0x02=Real, 0x03=Full, 0x04=21:9, 0x05=Dynamic, 0x06=16:9, 0xFF=keep"

- id: get_custom_multiwin_window
  label: Get Custom Multi-Window Window
  kind: query
  command: "06 01 00 FD {window} {checksum}"    # window: 0x00=Main … 0x03=Sub3
  params:
    - name: window
      type: integer
      description: "0x00=Main, 0x01=Sub1, 0x02=Sub2, 0x03=Sub3"

# ---------- Scheduling ----------
- id: set_scheduling
  label: Set Scheduling Page
  kind: action
  command: "0C 01 00 5A {page} {start_h} {start_m} {end_h} {end_m} {video_source} {working_days} {tag} {checksum}"
  params:
    - name: page
      type: integer
      description: "Bits7..4=1-7 page, Bits3..0=0 disable / 1 enable"
    - name: start_h
      type: integer
      description: "0-23, 24=NULL"
    - name: start_m
      type: integer
      description: "0-59, 60=NULL"
    - name: end_h
      type: integer
      description: "0-23, 24=NULL"
    - name: end_m
      type: integer
      description: "0-59, 60=NULL"
    - name: video_source
      type: integer
      description: "Source-type table value (0x00=NULL, 0x0D=HDMI, etc.)"
    - name: working_days
      type: integer
      description: "Bit0=every week, Bit1=Mon … Bit7=Sun"
    - name: tag
      type: integer
      description: "0x01-0x07 = playlist/bookmark/file tag 1-7 (Dragon/Himalaya 2.0)"

- id: get_scheduling
  label: Get Scheduling Page
  kind: query
  command: "06 01 00 5B {page} {checksum}"      # page 1-7
  params:
    - name: page
      type: integer
      description: "1-7"

# ---------- LED Strip (10BDL3051T) ----------
- id: set_led_strip
  label: Set LED Strip Control
  kind: action
  command: "09 01 00 F3 {on_off} {red} {green} {blue} {checksum}"   # on_off: 0x00=off, 0x01=on; RGB 0x00-0xFF
  params:
    - name: on_off
      type: integer
      description: "0x00=off, 0x01=on"
    - name: red
      type: integer
      description: "0-255"
    - name: green
      type: integer
      description: "0-255"
    - name: blue
      type: integer
      description: "0-255"
  notes: 10BDL3051T only; both LED strips controlled together.

- id: get_led_strip
  label: Get LED Strip Status
  kind: query
  command: "05 01 00 F4 F0"
  params: []

# ---------- Color Calibration (Reserved) ----------
- id: set_mic_color_calibration
  label: MIC Color Calibration (Reserved)
  kind: action
  command: "0xFE"   # CMD reserved for future use; payload TBD in source
  params: []
  notes: Source marks as "TBD / Reserved for Future use". No payload documented.

Feedbacks

# The display emits Report packets (DATA[0] mirrors the Get opcode) and the
# ACK/NACK/NAV generic report (0x00). Each Report is the response to the matching
# Get/Query action above.
- id: ack_nack_nav
  type: enum
  values: [ACK, NACK, NAV]
  trigger: response to any Set/Get command
  payload: "06 01 00 00 {status} {checksum}"

- id: power_state
  type: enum
  values: [off, on]
  trigger: response to Get Power State (0x19)
  payload: "06 01 00 19 {state} {checksum}"

- id: current_source
  type: enum
  values: [VIDEO, S-VIDEO, COMPONENT, VGA, HDMI, HDMI2, HDMI3, HDMI4, DP, DP2, DVI-D, USB, OPS, BROWSER, SMARTCMS, DMS, INTERNAL_STORAGE, MEDIA_PLAYER, PDF_PLAYER, CUSTOM, VGA2, VGA3, IWB]
  trigger: response to Get Current Source (0xAD)

- id: volume_level
  type: object
  fields: [speaker_out_pct, audio_out_pct]
  trigger: response to Get Volume (0x45)

- id: video_signal_present
  type: boolean
  trigger: response to Get Video Signal Present (0x59)

- id: temperature
  type: object
  fields: [sensor_1_celsius, sensor_2_celsius]
  trigger: response to Get Temperature (0x2F); ±3°C accuracy

Variables

- id: brightness
  type: integer
  unit: percent
  range: [0, 100]
  get: get_video_parameters
  set: set_video_parameters

- id: contrast
  type: integer
  unit: percent
  range: [0, 100]
  get: get_video_parameters
  set: set_video_parameters

- id: speaker_volume
  type: integer
  unit: percent
  range: [0, 100]
  get: get_volume
  set: set_volume

- id: audio_out_volume
  type: integer
  unit: percent
  range: [0, 100]
  get: get_volume
  set: set_volume

- id: backlight
  type: enum
  values: [on, off]
  get: get_backlight
  set: set_backlight

- id: volume_mute
  type: boolean
  get: get_volume_mute
  set: set_volume_mute

- id: off_timer_hours
  type: integer
  range: [0, 24]
  get: get_off_timer
  set: set_off_timer

- id: power_state
  type: enum
  values: [off, on]
  get: get_power
  set: set_power

Events

# Source documents no unsolicited notifications; the display only replies to host
# commands (ACK/NACK/NAV or Report). No async event stream defined.
# UNRESOLVED: none - source contains no event/notification section.

Macros

# UNRESOLVED: source documents no named multi-step sequences.

Safety

confirmation_required_for:
  - set_factory_reset       # irreversible; resets all parameters
  - set_monitor_restart     # reboots display OS
  - set_power               # powers display off (may require physical wake)
  - anytile_set_group_monitor_id  # changes addressing; can orphan the unit on the bus
interlocks:
  - "No reply is sent when the wrong Monitor ID is used - verify Control byte before sending."
  - "Broadcast ID (Control=0x00) produces no ACK/Report; collisions may occur on daisy-chain."
  - "Wait for ACK (≤500 ms) before sending the next command; retry on timeout."
  - "Cold Start Power State (set_power_cold_start) only applies on next mains-power cycle."
# UNRESOLVED: source contains no explicit safety interlock procedures, voltage/current
# specs, or power-on sequencing warnings beyond the communication rules above.

Notes

  • Protocol: SICP V2.03 (Serial/Ethernet Interface Communication Protocol). Family platform is Himalaya 2.0 per the platform table (xxBDL4150D = 49/55/65/75/86/98BDL4150D).
  • Transport: identical binary framing on RS-232C (DB9 pins 2 RXD, 3 TXD, 5 GND; null-modem cable) and TCP/IP port 5000. Default serial 9600/8/N/1, no flow control. Supported baud rates: 1200, 2400, 4800, 9600, 19200, 38400, 57600.
  • Checksum: XOR of MsgSize, Control, Group, and all Data bytes (excluding the checksum byte itself).
  • Group byte: optional. When group ID is "off" in the monitor, the Group byte may be omitted (e.g. 04 01 19 1C vs 05 01 00 19 1D). No ACK is returned if the Group byte is non-zero and doesn't match.
  • Platform gating: many commands carry platform-specific caveats (Himalaya 1.0/1.2, Dragon 1.x/1.6, Eagle, Phoenix 1/2, QL3, Challenger 2.1, CRD50). Where a note explicitly excludes Himalaya 2.0 it is flagged; otherwise commands are presumed applicable but should be verified against the target device.
  • Example checksums in this spec are reproduced verbatim from the source for the documented parameter values; they must be recomputed when any byte changes.
  • LED Strip (0xF3/0xF4), External Storage Lock (0xF1/0xF2), and Pixel Shift (0xB1/0xB2) commands are documented for 10BDL3051T / Dragon 1.x platforms and may not apply to xxBDL4150D (Himalaya 2.0) — included for protocol completeness.

Spec output above. 1 AI4AV Markdown revision. Covers all 100+ SICP opcodes (Set + Get/Report) with verbatim hex payloads, full transport config (port 5000, 9600/8/N/1), traits, feedbacks, variables, safety interlocks, platform caveats.

## Provenance

```yaml
source_domains:
  - community.xibo.org.uk
  - agneovo.com
  - digis.ru
  - github.com
  - keydigital.org
source_urls:
  - https://community.xibo.org.uk/uploads/short-url/vwVq2nPyhJKL4kTCYpa6VYhQUa8.pdf
  - https://www.agneovo.com/wp-content/uploads/2021/07/PM-32_RS232_CommandList1.pdf
  - https://www.digis.ru/upload/iblock/bb4/SICP_application_note_v1.6.pdf
  - https://github.com/aolde/philips-signage-display-sicp
  - https://www.keydigital.org/web/content/160298/ModuleMa.pdf
retrieved_at: 2026-06-15T22:29:59.426Z
last_checked_at: 2026-06-16T07:14:07.236Z
```

## Verification Summary

```yaml
verdict: verified
checked_at: 2026-06-16T07:14:07.236Z
matched_actions: 119
action_count: 119
confidence: medium
summary: "All 119 spec actions confirmed verbatim by source opcodes and transport parameters fully supported by SICP V2.03 documentation. (7 unresolved item(s) noted in Known Gaps.)"
```

## Known Gaps

```yaml
- "firmware version compatibility ranges not stated in source. Many commands carry platform-specific notes (Himalaya 1.0/1.2, Dragon 1.x, Eagle, Phoenix, QL3, Challenger 2.1); per-model applicability to xxBDL4150D (Himalaya 2.0) not always explicit — see Notes."
- "none - source contains no event/notification section."
- "source documents no named multi-step sequences."
- "source contains no explicit safety interlock procedures, voltage/current"
- "firmware version compatibility not stated in source."
- "exact per-model command applicability for xxBDL4150D variants (49/55/65/75/86/98 inch) not enumerated."
- "any commands introduced after SICP V2.03 (23/Nov/2018) are not covered."
```

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