Summary

The Steinway Lyngdorf P1 is an audio/video surround-sound processor. This spec covers its RS-232 serial control interface using ASCII commands framed by ! and <CR>. Commands cover power, volume, mute, source selection, audio processing modes, RoomPerfect focus and voicing, lipsync, video input routing, trigger outputs, and various status queries.

Transport

protocols:
  - serial
serial:
  baud_rate: 9600  # default; source also allows 19200, 38400, 57600, 115200 (selectable from UI)
  data_bits: 8
  parity: none
  stop_bits: 1
  flow_control: UNRESOLVED  # hardware handshake is optional and configurable from UI; default not stated
auth:
  type: UNRESOLVED  # source does not specify authentication

Traits

- powerable    # inferred from power commands: !POWERONMAIN, !POWEROFFMAIN, !POWERONZONE2, !POWEROFFZONE2
- routable     # inferred from routing commands: !SRC(X), !ZSRC(X), !ZONEMAINCOMPX, !ZONE2COMPX
- queryable    # inferred from status query commands: !POWER?, !VOL?, !SRC?, etc.
- levelable    # inferred from volume commands: !VOL(X), !VOL+(X), !VOL-(X), !ZVOL(X), etc.

Actions

- id: power_on_main
  label: Main Zone Power On
  kind: action
  command: "!POWERONMAIN\r"  # source writes !POWERONMAIN<CR>
  params: []

- id: power_off_main
  label: Main Zone Power Off
  kind: action
  command: "!POWEROFFMAIN\r"
  params: []

- id: power_on_zone2
  label: Zone 2 Power On
  kind: action
  command: "!POWERONZONE2\r"
  params: []

- id: power_off_zone2
  label: Zone 2 Power Off
  kind: action
  command: "!POWEROFFZONE2\r"
  params: []

- id: mute_on
  label: User Mute On
  kind: action
  command: "!MUTEON\r"
  params: []

- id: mute_off
  label: User Mute Off
  kind: action
  command: "!MUTEOFF\r"
  params: []

- id: mute_toggle
  label: Toggle User Mute
  kind: action
  command: "!MUTE\r"
  params: []

- id: zone_mute_on
  label: Zone User Mute On
  kind: action
  command: "!ZMUTEON\r"
  params: []

- id: zone_mute_off
  label: Zone User Mute Off
  kind: action
  command: "!ZMUTEOFF\r"
  params: []

- id: zone_mute_toggle
  label: Toggle Zone User Mute
  kind: action
  command: "!ZMUTE\r"
  params: []

- id: dir_up
  label: Up Arrow Button
  kind: action
  command: "!DIRU\r"
  params: []

- id: dir_down
  label: Down Arrow Button
  kind: action
  command: "!DIRD\r"
  params: []

- id: dir_left
  label: Left Arrow Button
  kind: action
  command: "!DIRL\r"
  params: []

- id: dir_right
  label: Right Arrow Button
  kind: action
  command: "!DIRR\r"
  params: []

- id: enter
  label: Enter Button
  kind: action
  command: "!ENTER\r"
  params: []

- id: back
  label: Back Button
  kind: action
  command: "!BACK\r"
  params: []

- id: menu
  label: Menu Button (Installer menu)
  kind: action
  command: "!MENU\r"
  params: []

- id: info
  label: Info Button
  kind: action
  command: "!INFO\r"
  params: []

- id: zone_main_show
  label: Main Zone Component Output - Non-Bypass (Main Display)
  kind: action
  command: "!ZONEMAINSHOW\r"
  params: []

- id: zone_main_comp1
  label: Main Zone Component Output - Component 1 (Bypass)
  kind: action
  command: "!ZONEMAINCOMP1\r"
  params: []

- id: zone_main_comp2
  label: Main Zone Component Output - Component 2 (Bypass)
  kind: action
  command: "!ZONEMAINCOMP2\r"
  params: []

- id: zone_main_comp3
  label: Main Zone Component Output - Component 3 (Bypass)
  kind: action
  command: "!ZONEMAINCOMP3\r"
  params: []

- id: zone_main_comp4
  label: Main Zone Component Output - Component 4 (Bypass)
  kind: action
  command: "!ZONEMAINCOMP4\r"
  params: []

- id: zone_main_comp5
  label: Main Zone Component Output - Component 5 (Bypass)
  kind: action
  command: "!ZONEMAINCOMP5\r"
  params: []

- id: zone2_show
  label: Zone 2 Component Output - Non-Bypass (Main Display)
  kind: action
  command: "!ZONE2SHOW\r"
  params: []

- id: zone2_comp1
  label: Zone 2 Component Output - Component 1 (Bypass)
  kind: action
  command: "!ZONE2COMP1\r"
  params: []

- id: zone2_comp2
  label: Zone 2 Component Output - Component 2 (Bypass)
  kind: action
  command: "!ZONE2COMP2\r"
  params: []

- id: zone2_comp3
  label: Zone 2 Component Output - Component 3 (Bypass)
  kind: action
  command: "!ZONE2COMP3\r"
  params: []

- id: zone2_comp4
  label: Zone 2 Component Output - Component 4 (Bypass)
  kind: action
  command: "!ZONE2COMP4\r"
  params: []

- id: zone2_comp5
  label: Zone 2 Component Output - Component 5 (Bypass)
  kind: action
  command: "!ZONE2COMP5\r"
  params: []

- id: num
  label: Number Button
  kind: action
  command: "!NUM{X}\r"
  params:
    - name: digit
      type: integer
      description: Digit 0..9

- id: volume_up
  label: Volume Up
  kind: action
  command: "!VOL+\r"
  params: []

- id: volume_down
  label: Volume Down
  kind: action
  command: "!VOL-\r"
  params: []

- id: volume_increase
  label: Increase Volume By Amount
  kind: action
  command: "!VOL+{amount}\r"
  params:
    - name: amount
      type: integer
      description: 0..999 (1 unit = 0.1dB)

- id: volume_decrease
  label: Decrease Volume By Amount
  kind: action
  command: "!VOL-{amount}\r"
  params:
    - name: amount
      type: integer
      description: 0..999 (1 unit = 0.1dB)

- id: volume_set
  label: Set Volume
  kind: action
  command: "!VOL{level}\r"
  params:
    - name: level
      type: integer
      description: -799..200 (-79.9dB..+20.0dB; source also describes 0.5dB intervals; 1 unit = 0.1dB)

- id: audmode_up
  label: Audio Processing Mode Up
  kind: action
  command: "!AUDMODE+\r"
  params: []

- id: audmode_down
  label: Audio Processing Mode Down
  kind: action
  command: "!AUDMODE-\r"
  params: []

- id: audmode_set
  label: Set Audio Processing Mode
  kind: action
  command: "!AUDMODE{mode}\r"
  params:
    - name: mode
      type: integer
      description: "Processing mode value (see Audio Processing Modes table): 1=No processing, 2=Mono, 3=Stereo, 4=PLII Movie, 5=PLII Music, 6=PLIIx Movie, 7=PLIIx Music, 8=PLIIx Games, 9=DolbyDigital EX, 10=DTS Neo6 Cinema, 11=DTS Neo6 Music, 25=party, 26=Downmix to front, 27=PLII Movie+Downmix to front"

- id: modecat_set
  label: Set Mode Category
  kind: action
  command: "!MODECAT{category}\r"
  params:
    - name: category
      type: integer
      description: "Mode category value (see Audio Modes table): 0=Not In Use, 1=Movie, 2=Music, 3=Games, 4=No Proc., 5=Custom 1, 6=Custom 2, 7=Custom 3, 8=Custom 4"

- id: src_up
  label: Source Up
  kind: action
  command: "!SRC+\r"
  params: []

- id: src_down
  label: Source Down
  kind: action
  command: "!SRC-\r"
  params: []

- id: src_set
  label: Select Main Source
  kind: action
  command: "!SRC{index}\r"
  params:
    - name: index
      type: integer
      description: "Source number, 1..max source count (queryable via !SRCS?)"

- id: srcoff_set
  label: Set Current Source Volume Offset
  kind: action
  command: "!SRCOFF{offset}\r"
  params:
    - name: offset
      type: integer
      description: "-100..100 (-10dB..+10dB; 1 unit = 0.1dB)"

- id: verbosity_set
  label: Set Feedback Level (Verbosity)
  kind: action
  command: "!VERB{level}\r"
  params:
    - name: level
      type: integer
      description: "0=query only, 1=auto on change, 2=echo + auto"

- id: rpfoc_set
  label: Set RoomPerfect Focus Position
  kind: action
  command: "!RPFOC{index}\r"
  params:
    - name: index
      type: integer
      description: "0=Bypass, 1..8=Focus 1..8, 9=Global (list queryable via !RPFOCS?)"

- id: rpfoc_up
  label: Focus Position Up
  kind: action
  command: "!RPFOC+\r"
  params: []

- id: rpfoc_down
  label: Focus Position Down
  kind: action
  command: "!RPFOC-\r"
  params: []

- id: zsrc_up
  label: Zone Source Up
  kind: action
  command: "!ZSRC+\r"
  params: []

- id: zsrc_down
  label: Zone Source Down
  kind: action
  command: "!ZSRC-\r"
  params: []

- id: zsrc_set
  label: Select Zone Source
  kind: action
  command: "!ZSRC{index}\r"
  params:
    - name: index
      type: integer
      description: "1..5 (5 zone sources always present)"

- id: zvol_up
  label: Zone Volume Up
  kind: action
  command: "!ZVOL+\r"
  params: []

- id: zvol_down
  label: Zone Volume Down
  kind: action
  command: "!ZVOL-\r"
  params: []

- id: zvol_increase
  label: Increase Zone Volume By Amount
  kind: action
  command: "!ZVOL+{amount}\r"
  params:
    - name: amount
      type: integer
      description: "0..1160 (1 unit = 0.1dB)"

- id: zvol_decrease
  label: Decrease Zone Volume By Amount
  kind: action
  command: "!ZVOL-{amount}\r"
  params:
    - name: amount
      type: integer
      description: "0..1160 (1 unit = 0.1dB)"

- id: zvol_set
  label: Set Zone Volume
  kind: action
  command: "!ZVOL{level}\r"
  params:
    - name: level
      type: integer
      description: "-960..200 (-96.0dB..+20.0dB, 0.5dB intervals; 1 unit = 0.1dB)"

- id: rpvoi_set
  label: Set Voicing
  kind: action
  command: "!RPVOI{index}\r"
  params:
    - name: index
      type: integer
      description: "0=Neutral, 1=Music, 2=Music II, 3=Relaxed, 4=Tilt, 5=Action, 6=Action+Movie; the command table lists 0..6, while usage text says 0..7 (UNRESOLVED)"

- id: rpvoi_up
  label: Voicing Up
  kind: action
  command: "!RPVOI+\r"
  params: []

- id: rpvoi_down
  label: Voicing Down
  kind: action
  command: "!RPVOI-\r"
  params: []

- id: lipsync_set
  label: Set Lipsync Trim
  kind: action
  command: "!LIPSYNC{ms}\r"
  params:
    - name: ms
      type: integer
      description: Lipsync trim in ms; valid range via !LIPSYNCRANGE?

- id: lipsync_up
  label: Lipsync Up (+10ms)
  kind: action
  command: "!LIPSYNC+\r"
  params: []

- id: lipsync_down
  label: Lipsync Down (-10ms)
  kind: action
  command: "!LIPSYNC-\r"
  params: []

- id: plii_cw_set
  label: Dolby PLII/PLIIx Center Width
  kind: action
  command: "!PLIICW{value}\r"
  params:
    - name: value
      type: integer
      description: "0..7"

- id: plii_pan_set
  label: Dolby PLII/PLIIx Panorama
  kind: action
  command: "!PLIIPAN{value}\r"
  params:
    - name: value
      type: integer
      description: "0=Off, 1=On"

- id: plii_dim_set
  label: Dolby PLII/PLIIx Dimension
  kind: action
  command: "!PLIIDIM{value}\r"
  params:
    - name: value
      type: integer
      description: "-3..3"

- id: neo6_cgain_set
  label: DTS Neo6 Center Gain
  kind: action
  command: "!NEO6CGAIN{value}\r"
  params:
    - name: value
      type: integer
      description: "0..10"

- id: neo6_wide_set
  label: DTS Neo6 Wide
  kind: action
  command: "!NEO6WIDE{value}\r"
  params:
    - name: value
      type: integer
      description: "0=Off, 1=On"

- id: dddyn_set
  label: Dolby Digital / Dolby Digital+ Dynamics
  kind: action
  command: "!DDDYN{value}\r"
  params:
    - name: value
      type: integer
      description: "0=Max, 1=Normal, 2=Min"

- id: ddhd_dyn_set
  label: Dolby TrueHD Dynamics
  kind: action
  command: "!DDHDDYN{value}\r"
  params:
    - name: value
      type: integer
      description: "0=Auto, 1=Off, 2=Force On"

- id: trigger_off
  label: Trigger Output 0V
  kind: action
  command: "!TROOFF{output}\r"
  params:
    - name: output
      type: integer
      description: "Trigger output 1..4"

- id: trigger_on_6v
  label: Trigger Output 6V
  kind: action
  command: "!TROON{output}\r"
  params:
    - name: output
      type: integer
      description: "Trigger output 3 or 4 only (dual-voltage outputs)"

- id: trigger_hi_12v
  label: Trigger Output 12V
  kind: action
  command: "!TROHI{output}\r"
  params:
    - name: output
      type: integer
      description: "Trigger output 1..4"

- id: trigger_enabled
  label: Trigger Output To Configured Level
  kind: action
  command: "!TROEN{output}\r"
  params:
    - name: output
      type: integer
      description: "Trigger output 1..4"

- id: trigger_disable
  label: Disable Trigger Output
  kind: action
  command: "!TRODIS{output}\r"
  params:
    - name: output
      type: integer
      description: "Trigger output 1..4 (same effect as !TROOFF)"

- id: trigger_do
  label: Execute Trigger Function
  kind: action
  command: "!TRODO{output}\r"
  params:
    - name: output
      type: integer
      description: "Trigger output 1..4; virtually fires the configured trigger condition"

- id: ping
  label: Ping
  kind: query
  command: "!PING?"
  params: []

- id: power_status_query
  label: Power Status
  kind: query
  command: "!POWER?"
  params: []

- id: mute_status_query
  label: User Mute Status
  kind: query
  command: "!MUTE?"
  params: []

- id: zmute_status_query
  label: Zone User Mute Status
  kind: query
  command: "!ZMUTE?"
  params: []

- id: volume_status_query
  label: Main Volume Status
  kind: query
  command: "!VOL?"
  params: []

- id: zvol_status_query
  label: Zone Volume Status
  kind: query
  command: "!ZVOL?"
  params: []

- id: src_status_query
  label: Current Main Source
  kind: query
  command: "!SRC?"
  params: []

- id: src_query
  label: Query Specific Main Source By Index
  kind: query
  command: "!SRC{index}?"
  params:
    - name: index
      type: integer
      description: "Source number 1..max"

- id: srcs_query
  label: List All Main Sources
  kind: query
  command: "!SRCS?"
  params: []

- id: tro_status_query
  label: Single Trigger Output Status
  kind: query
  command: "!TRO{output}?"
  params:
    - name: output
      type: integer
      description: "Trigger number 1..6"

- id: tros_status_query
  label: All Trigger Outputs Status
  kind: query
  command: "!TROS?"
  params: []

- id: vidin_status_query
  label: Current Main Zone Video Input
  kind: query
  command: "!VIDIN?"
  params: []

- id: lipsync_status_query
  label: Current Lipsync Trim
  kind: query
  command: "!LIPSYNC?"
  params: []

- id: lipsync_range_query
  label: Lipsync Trim Valid Range
  kind: query
  command: "!LIPSYNCRANGE?"
  params: []

- id: vidtype_status_query
  label: Current Video Type
  kind: query
  command: "!VIDTYPE?"
  params: []

- id: audin_status_query
  label: Current Main Zone Audio Input
  kind: query
  command: "!AUDIN?"
  params: []

- id: audtype_status_query
  label: Current Audio Type
  kind: query
  command: "!AUDTYPE?"
  params: []

- id: audmode_status_query
  label: Current Audio Processing Mode
  kind: query
  command: "!AUDMODE?"
  params: []

- id: audmodel_query
  label: List Available Audio Processing Modes
  kind: query
  command: "!AUDMODEL?"
  params: []

- id: modecat_status_query
  label: Current Mode Category
  kind: query
  command: "!MODECAT?"
  params: []

- id: modecats_query
  label: List Configured Mode Categories
  kind: query
  command: "!MODECATS?"
  params: []

- id: plii_dim_query
  label: Dolby PLII Dimension Status
  kind: query
  command: "!PLIIDIM?"
  params: []

- id: plii_cw_query
  label: Dolby PLII Center Width Status
  kind: query
  command: "!PLIICW?"
  params: []

- id: plii_pan_query
  label: Dolby PLII Panorama Status
  kind: query
  command: "!PLIIPAN?"
  params: []

- id: neo6_cgain_query
  label: DTS Neo6 Center Gain Status
  kind: query
  command: "!NEO6CGAIN?"
  params: []

- id: neo6_wide_query
  label: DTS Neo6 Wide Status
  kind: query
  command: "!NEO6WIDE?"
  params: []

- id: dddyn_query
  label: Dolby Digital Dynamics Status
  kind: query
  command: "!DDDYN?"
  params: []

- id: ddhd_dyn_query
  label: Dolby TrueHD Dynamics Status
  kind: query
  command: "!DDHDDYN?"
  params: []

- id: rpfoc_status_query
  label: Current RoomPerfect Focus
  kind: query
  command: "!RPFOC?"
  params: []

- id: rpfocs_query
  label: List All RoomPerfect Focus Positions
  kind: query
  command: "!RPFOCS?"
  params: []

- id: zvidin_status_query
  label: Current Zone 2 Video Input
  kind: query
  command: "!ZVIDIN?"
  params: []

- id: zaudin_status_query
  label: Current Zone 2 Audio Input
  kind: query
  command: "!ZAUDIN?"
  params: []

- id: zsrc_status_query
  label: Current Zone 2 Source
  kind: query
  command: "!ZSRC?"
  params: []

- id: zsrc_query
  label: Query Specific Zone Source By Index
  kind: query
  command: "!ZSRC{index}?"
  params:
    - name: index
      type: integer
      description: "Zone source number 1..5"

- id: zsrcs_query
  label: List All Zone Sources
  kind: query
  command: "!ZSRCS?"
  params: []

- id: rpvoi_status_query
  label: Current Voicing
  kind: query
  command: "!RPVOI?"
  params: []

- id: rpvois_query
  label: List All Voicings
  kind: query
  command: "!RPVOIS?"
  params: []

- id: device_query
  label: Device Identification
  kind: query
  command: "!DEVICE?"
  params: []

- id: swinfo_query
  label: Dump Software Versions
  kind: query
  command: "!SWINFO?"
  params: []

Feedbacks

- id: power_state
  type: integer
  description: "0=system powered down, 1=main only on, 2=zone2 only on, 3=both on. Only emitted automatically at feedback level >=1."

- id: mute_state
  type: enum
  values: [on, off]
  description: "Mirrors !MUTEON / !MUTEOFF."

- id: zone_mute_state
  type: enum
  values: [on, off]
  description: "Mirrors !ZMUTEON / !ZMUTEOFF."

- id: volume_level
  type: integer
  description: "Main zone volume; -799..200 (-79.9..+20.0 dB in 0.1dB units). Emitted automatically at feedback level >=1, throttled to >=100ms between messages."

- id: zone_volume_level
  type: integer
  description: "Zone volume; -960..200 (-96.0..+20.0 dB in 0.1dB units)."

- id: src_current
  type: string
  description: "!SRC(X)\"Source name\" - X is index (1-based), name in quotes. Empty/dash if main off + zone on."

- id: zsrc_current
  type: string
  description: "!ZSRC(X)\"Source name\" - zone 2. !ZSRC(0)\"Zone is off\" if zone off."

- id: vidin_current
  type: integer
  description: "100..10x=Composite, 200..20x=S-Video, 300..30x=Component, 400..40x=HDMI."

- id: vidtype_current
  type: string
  description: "!VIDTYPE(XXXYZ). XXX resolution (480/576/720/1080 or e.g. 800x600), Y=i/p, Z=colorspace 1..4."

- id: audin_current
  type: integer
  description: "101..1xx Analog 2ch (105 balanced), 201 Analog 8ch, 301..3xx Coax, 401..4xx Optical, 501 HDMI, 701 AES/EBU."

- id: audtype_current
  type: string
  description: "!AUDTYPE(XX,YYYY) - XX=signal type code (1..27), YYYY=channel config ABCD hex."

- id: audmode_current
  type: integer
  description: "Current processing mode; source lists values 1..11 and 25..27."

- id: modecat_current
  type: string
  description: "!MODECAT(X)\"Name\" or !MODECAT(0)\"-\" if categories unused."

- id: lipsync_ms
  type: integer
  description: "Lipsync trim in ms (within range reported by !LIPSYNCRANGE?). Cleared on every source change."

- id: lipsync_range
  type: string
  description: "!LIPSYNCRANGE(X,Y,Z) - X=range in ms, Y=min trim, Z=max trim."

- id: zvidin_current
  type: integer
  description: "0=no video or zone off, 1..5 = Component 1..5."

- id: zaudin_current
  type: integer
  description: "0=none or zone off, 1..4=Stereo 1..4, 5=Balanced XLR."

- id: rpfoc_current
  type: string
  description: "!RPFOC(X)\"Focus name\" - 0=Bypass, 1..8=Focus 1..8, 9=Global."

- id: rpvoi_current
  type: string
  description: "!RPVOI(X)\"Voicing name\" - 0=Neutral..6=Action+Movie."

- id: trigger_state
  type: string
  description: "!TRO(XY) - X=trigger number (1..6), Y=0 (0V) / 1 (6V) / 2 (12V)."

- id: plii_dim
  type: integer
  description: "-3..3"

- id: plii_cw
  type: integer
  description: "0..7"

- id: plii_pan
  type: enum
  values: [off, on]
  description: "0=Off, 1=On"

- id: neo6_cgain
  type: integer
  description: "0..10"

- id: neo6_wide
  type: enum
  values: [off, on]
  description: "0=Off, 1=On"

- id: dddyn
  type: integer
  description: "0=Max, 1=Normal, 2=Min"

- id: ddhd_dyn
  type: integer
  description: "0=Auto, 1=Off, 2=Force On"

- id: device_id
  type: string
  description: "!DEVICE(<string>) - e.g. \"P1\""

- id: sw_versions
  type: string
  description: "!SWINFO? returns a dump of system software versions; format not specified in source."

Variables

# Source volume offset; set with !SRCOFF(X).
- id: srcoff
  label: Per-source volume offset
  command: "!SRCOFF{offset}"
  range: [-100, 100]
  unit: "0.1 dB"
  description: "Current source volume offset (-10dB..+10dB). Set via !SRCOFF(X)."

- id: verbosity
  label: Feedback level
  command: "!VERB{level}"
  range: [0, 2]
  description: "0=query only, 1=auto on change, 2=echo + auto."

Events

- id: power_state_changed
  description: "!POWER(X) - emitted automatically at feedback level >=1 when power state changes. 0=off, 1=main on, 2=zone2 on, 3=both on."

- id: volume_changed
  description: "!VOL(X) - emitted automatically at feedback level >=1 during volume change. Throttled to >=100ms between messages."

- id: zone_volume_changed
  description: "!ZVOL(X) - emitted automatically at feedback level >=1."

- id: mute_changed
  description: "!MUTEON / !MUTEOFF - emitted at feedback level >=1."

- id: zone_mute_changed
  description: "!ZMUTEON / !ZMUTEOFF - emitted at feedback level >=1."

- id: src_changed
  description: "!SRC(X)\"NAME\" - emitted at feedback level >=1. Note: also returns \"-\" if main off + zone on."

- id: zsrc_changed
  description: "!ZSRC(X)\"NAME\" - emitted at feedback level >=1. !ZSRC(0)\"Zone is off\" if zone off."

- id: audin_changed
  description: "!AUDIN(X) - emitted at feedback level >=1 when audio input changes."

- id: audtype_changed
  description: "!AUDTYPE(XX,YYYY) - emitted at feedback level >=1 when audio signal type changes."

- id: audmode_changed
  description: "!AUDMODE(X) - emitted at feedback level >=1 when processing mode changes."

- id: modecat_changed
  description: "!MODECAT(X)\"NAME\" - emitted at feedback level >=1 when Audio Mode changes (only if Audio Modes are used)."

- id: vidin_changed
  description: "!VIDIN(X) - emitted at feedback level >=1 when video input changes."

- id: vidtype_changed
  description: "!VIDTYPE(XXXYZ) - emitted at feedback level >=1 when video type changes."

- id: zvidin_changed
  description: "!ZVIDIN(X) - emitted at feedback level >=1 when zone 2 video input changes."

- id: zaudin_changed
  description: "!ZAUDIN(X) - emitted at feedback level >=1 when zone 2 audio input changes."

- id: rpfoc_changed
  description: "!RPFOC(X)\"NAME\" - emitted at feedback level >=1 when focus position changes."

- id: rpvoi_changed
  description: "!RPVOI(X)\"NAME\" - emitted at feedback level >=1 when voicing changes."

- id: command_echo
  description: "Feedback level 2 only - every command is echoed back with '#' prefix (e.g. #VOL?)."

- id: lipsync_changed
  description: "!LIPSYNC(X) - emitted at feedback level >=1 when lipsync trim changes."

Macros

# UNRESOLVED: source does not define composite macros; all multi-step behavior is in the integrator's hands.

Safety

confirmation_required_for:
  - trigger_hi_12v       # 12V on a trigger output; could energize attached equipment
  - trigger_on_6v        # 6V on dual-voltage trigger outputs 3/4
  - zone_main_compX      # bypasses UI and may route a component input while HDMI is active
  - zone2_compX          # bypasses UI; recommended only when Zone Video Output is "Independent"
  - zone_main_show       # overrides UI; component output only meaningful without HDMI display
  - zone2_show           # overrides UI; component output only meaningful without HDMI display
interlocks:
  - "Volume set commands (incl. !VOL(X), !VOL+(X), !VOL-(X)) are clamped by the maximum volume setting configured on the device. There is no maximum for zone 2."
  - "!TROON(X) only valid for X = 3 or 4 (the dual-voltage trigger outputs)."
  - "Source commands ignored while OSD menu is open."
  - "Audio mode selection ignored if mode is not in currently available list (caller must refresh via !AUDMODEL?)."
notes: |
  Source contains explicit warning: "Usage maximum volume setting is highly recommended to prevent
  damage to equipment because of too loud volume setting!... It is never possible to set the volume
  above the maximum volume level setting with serial interface commands, but it is very easy to
  accidentally reach the maximum volume level."

Notes

Commands and responses are ASCII. Commands start with ! and end with <CR>; status responses start with !, and feedback-level-2 echoes start with #. Commands with malformed framing are ignored.

Feedback levels:

  • 0 — replies only on !FOO? queries.
  • 1 — also emits status responses automatically whenever any tracked state changes (volume throttled to >=100ms).
  • 2 — also echoes every command back with # prefix.

Direct component-output routing (!ZONEMAINCOMPx, !ZONE2COMPx, !ZONEMAINSHOW, !ZONE2SHOW) completely bypasses the UI and can desync UI state.

Trigger-output command set and status set disagree about the number of triggers: !TROOFF/HI/EN/DIS/DO(X) all restrict X to 1..4, but !TRO(X)? response allows X = 1..6. Source inconsistent — recorded as-is, do not infer.

Lipsync trim is cleared on every source change. Valid range must be re-queried with !LIPSYNCRANGE? after boot and after source change. The source describes the response as range, minimum trim, and maximum trim; its example is !LIPSYNCRANGE(250,-200,50).

Zone 2 power may be set to "Follow Main" — in that mode !POWERONZONE2 also powers on the main zone, and vice versa.

Source count and source names are user-configurable. Audio Mode categories (Movie/Music/Games/Custom 1..4) and focus position names ("Focus 1..8") are installer-configurable. The set of voicings is fixed and non-renameable.

Provenance

source_domains:
  - steinwaylyngdorf.com
  - manualslib.com
source_urls:
  - "https://steinwaylyngdorf.com/downloads/model-p1-serial-control-manual/?wpdmdl=6497&ind=1597920749186&refresh=fb3a3764&filename=Model-P1-Serial-Control-Manual-Version-1.3.pdf"
  - https://steinwaylyngdorf.com/downloads/model-p1-serial-control-manual
  - https://www.manualslib.com/manual/2927264/Steinway-Lyngdorf-P1.html
retrieved_at: 2026-09-02T20:11:43.985Z
last_checked_at: 2026-10-07T12:54:55.059Z

Verification Summary

verdict: verified
checked_at: 2026-10-07T12:54:55.059Z
matched_actions: 114
action_count: 114
confidence: medium
summary: "All 114 spec actions have literal counterparts in the source with matching shapes; transport serial parameters are supported and the source catalogue is fully represented. (4 unresolved item(s) noted in Known Gaps.)"

Known Gaps

- "trigger output count is described inconsistently — direct commands accept X = 1..4, while `!TRO(X)?` status responses describe X = 1..6. The source is ambiguous."
- "source does not define composite macros; all multi-step behavior is in the integrator's hands."
- "hardware handshake default state not stated in source (only that it is optional and configurable from UI)."
- "trigger output count discrepancy (4 vs 6) — see Safety.notes."

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