Summary

Linn Kustom DSM audio device controlled via LPEC (Linn Protocol for Eventing and Control), a TCP/IP text-based protocol on port 23. Supports media transport, volume/mute, source selection via fixed system names, and PIN selection. UPnP services exposed over raw TCP socket.

Transport

protocols:
  - tcp
addressing:
  port: 23
auth:
  type: none  # inferred: no auth procedure in source

Traits

- queryable  # inferred: GetVolume, Source query examples present
- routable   # inferred: SetSourceIndex, SetSourceBySystemName examples present

Actions

- id: play
  label: Play
  kind: action
  params:
    - name: instance_id
      type: string
      description: UPnP instance ID (typically "0")
    - name: speed
      type: string
      description: Playback speed (typically "1")

- id: pause
  label: Pause
  kind: action
  params:
    - name: instance_id
      type: string
      description: UPnP instance ID (typically "0")

- id: next
  label: Next Track
  kind: action
  params:
    - name: instance_id
      type: string
      description: UPnP instance ID (typically "0")

- id: previous
  label: Previous Track
  kind: action
  params:
    - name: instance_id
      type: string
      description: UPnP instance ID (typically "0")

- id: get_volume
  label: Get Volume
  kind: action
  params:
    - name: instance_id
      type: string
      description: UPnP instance ID (typically "0")
    - name: channel
      type: string
      description: Channel name (e.g., "Master")

- id: set_mute
  label: Set Mute
  kind: action
  params:
    - name: mute
      type: string
      description: "\"true\"" or "\"false\""

- id: set_source_index
  label: Set Source Index
  kind: action
  params:
    - name: index
      type: string
      description: Source index number (0-4); may change with firmware

- id: set_source_by_system_name
  label: Set Source By System Name
  kind: action
  params:
    - name: name
      type: string
      description: Fixed system name (e.g., "Balanced", "CD12", "Playlist")

- id: set_source_index_by_name
  label: Set Source Index By Name
  kind: action
  params:
    - name: name
      type: string
      description: Source name as configured in Konfig

- id: source_query
  label: Query Source Info
  kind: action
  params:
    - name: index
      type: string
      description: Source index to query

- id: invoke_pin
  label: Invoke PIN
  kind: action
  params:
    - name: id
      type: string
      description: PIN identifier (requires Davaar 67+)

- id: read_pin_list
  label: Read PIN List
  kind: action
  params:
    - name: id
      type: string
      description: PIN identifier in array format "[ n]"

- id: get_id_array
  label: Get ID Array
  kind: action
  params: []

Feedbacks

- id: action_response
  label: Action Response
  type: string
  description: RESPONSE "[outarg1]" "[outarg2]" ... - output args or empty on success

- id: error_response
  label: Error Response
  type: object
  description: ERROR [code] "[description]"

- id: subscribe_response
  label: Subscribe Response
  type: integer
  description: SUBSCRIBE [subscription-id]

- id: unsubscribe_response
  label: Unsubscribe Response
  type: integer
  description: UNSUBSCRIBE [subscription-id]

Events

- id: service_event
  label: Service Event
  description: EVENT [subscription-id] [sequence-no] [var-name] "[value]" ...
  params:
    - name: subscription_id
      type: integer
    - name: sequence_no
      type: integer
      description: 0 = initial state; subsequent = incremented 32-bit uint
    - name: variables
      type: object
      description: Changed variable name/value pairs

- id: alive
  label: Sub-Device Alive
  description: ALIVE [sub-device] [udn] - sent on connection and when sub-device enabled

- id: byebye
  label: Sub-Device Gone
  description: BYEBYE [sub-device] [udn] - sent when sub-device disabled; subscriptions revoked

Macros

# UNRESOLVED: no multi-step sequences explicitly documented in source

Safety

confirmation_required_for: []
interlocks: []
# UNRESOLVED: no safety warnings or interlock procedures in source

Notes

  • Max 4 simultaneous LPEC sessions; device ignores excess.
  • Crestron: close TELNET before sleep to avoid port leaks.
  • First command after ALIVE may error — send blank command to clear.
  • SourceIndex may change with firmware or disabled sources; use SetSourceBySystemName for stability.
  • PIN numbers unstable after reboot if recently altered; requires Davaar 67+.
  • LPEC has no service discovery; use UPnP tools (Intel Device Spy/Monitor) to enumerate actions, then map to LPEC ACTION syntax.

Provenance

source_domains:
  - docs.linn.co.uk
source_urls:
  - https://docs.linn.co.uk/wiki/index.php/Developer:LPEC
  - https://docs.linn.co.uk/wiki/index.php/Kustom_DSM
  - https://docs.linn.co.uk/wiki/index.php/Crestron/Linn_Crestron_4-Series_Driver_for_SIMPL_Windows
  - "https://docs.linn.co.uk/wiki/index.php/Control4_Driver_FAQ%27s"
  - https://docs.linn.co.uk/wiki/index.php/Developer:Documentation
retrieved_at: 2026-04-26T16:36:15.790Z
last_checked_at: 2026-06-12T19:25:10.318Z

Verification Summary

verdict: verified
checked_at: 2026-06-12T19:25:10.318Z
matched_actions: 13
action_count: 13
confidence: medium
summary: "All 13 spec actions matched cleanly against LPEC protocol examples; transport confirmed; bidirectional coverage achieved. (6 unresolved item(s) noted in Known Gaps.)"

Known Gaps

- "power on/off commands not documented in source"
- "full action list requires UPnP service discovery per source"
- "no multi-step sequences explicitly documented in source"
- "no safety warnings or interlock procedures in source"
- "complete action list requires UPnP service discovery"
- "firmware compatibility range not stated in source"

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