Summary

LPEC is Linn's raw TCP socket control protocol for DS/DSI/DSM players and preamps. Connection on port 23. Clients send ACTION/SUBSCRIBE/UNSUBSCRIBE messages; device responds with RESPONSE/EVENT/ERROR. No authentication required.

Transport

protocols:
  - tcp
addressing:
  port: 23
auth:
  type: none

Traits

- routable
- queryable
- levelable

Actions

- id: play
  label: Play
  kind: action
  params:
    - name: instance_id
      type: string
      description: UPnP instance ID (usually "0")
    - name: speed
      type: string
      description: Speed (usually "1")
- id: pause
  label: Pause
  kind: action
  params:
    - name: instance_id
      type: string
      description: UPnP instance ID (usually "0")
- id: next
  label: Next Track
  kind: action
  params:
    - name: instance_id
      type: string
      description: UPnP instance ID (usually "0")
- id: previous
  label: Previous Track
  kind: action
  params:
    - name: instance_id
      type: string
      description: UPnP instance ID (usually "0")
- id: get_volume
  label: Get Volume
  kind: action
  params:
    - name: instance_id
      type: string
      description: UPnP instance ID (usually "0")
    - name: channel
      type: string
      description: Channel (e.g., "Master")
- id: set_volume
  label: Set Volume
  kind: action
  params:
    - name: instance_id
      type: string
    - name: channel
      type: string
    - name: level
      type: integer
      description: Volume level (0-100)
- id: set_mute
  label: Set Mute
  kind: action
  params:
    - name: mute
      type: boolean
      description: "true" to mute, "false" to unmute
- id: set_source_index
  label: Set Source by Index
  kind: action
  params:
    - name: index
      type: integer
      description: Source index number
- id: set_source_by_system_name
  label: Set Source by System Name
  kind: action
  params:
    - name: name
      type: string
      description: Source system name (e.g., "Balanced", "Radio")
- id: set_source_index_by_name
  label: Set Source by Name
  kind: action
  params:
    - name: name
      type: string
      description: Source name (e.g., "CD12")
- id: get_source
  label: Get Source Info
  kind: action
  params:
    - name: index
      type: integer
      description: Source index
- id: invoke_pin
  label: Invoke PIN
  kind: action
  params:
    - name: id
      type: integer
      description: PIN ID number
- id: read_pin_list
  label: Read PIN List
  kind: action
  params:
    - name: index
      type: string
      description: PIN index
- id: get_pin_array
  label: Get PIN Array
  kind: action
  params: []

Feedbacks

- id: response
  type: object
  description: RESPONSE "[outarg1]" "[outarg2]" ... - replies to ACTION, contains all output args
- id: subscribe_ack
  type: integer
  description: SUBSCRIBE [subscription-id] - confirms subscription, id used for unsubscribe
- id: event
  type: object
  description: EVENT messages contain variable name/value pairs for subscribed services
- id: alive
  type: object
  description: ALIVE [sub-device] [udn] - sent on connect for each enabled sub-device
- id: byebye
  type: object
  description: BYEBYE [sub-device] [udn] - sent when sub-device disabled
- id: error
  type: object
  description: ERROR [code] "[description]" - error response

Variables

- id: volume
  type: integer
  description: Current volume level (0-100)
- id: mute
  type: boolean
  description: Current mute state
- id: source_index
  type: integer
  description: Current source selection index
- id: source_name
  type: string
  description: Current source system name
- id: product_name
  type: string
  description: Device product name
- id: product_room
  type: string
  description: Device room name
- id: product_standby
  type: boolean
  description: Device standby state

Events

- id: state_change
  type: object
  description: Unsolicited EVENT messages sent when subscribed variables change
- id: device_event
  type: object
  description: BYEBYE/ALIVE messages when sub-devices enabled/disabled

Macros

- id: subscribe_service
  description: Send SUBSCRIBE [sub-device]/[service] to receive ongoing state updates
- id: unsubscribe_service
  description: Send UNSUBSCRIBE [subscription-id] or UNSUBSCRIBE [sub-device]/[service]
- id: unsubscribe_all
  description: Send UNSUBSCRIBE (no args) to unsubscribe all services

Safety

confirmation_required_for: []
interlocks: []

Notes

Max 4 simultaneous LPEC sessions. Crestron processors may reopen Telnet ports without closing existing ones — close connection when touchpanel asleep. First command after ALIVE may error — send blank command to clear.

Source names: Playlist(0), Radio(1), Songcast(2), NetAux(3), UpnpAv(4), plus fixed inputs Analog1/Phono/Balanced/Front Aux/HDMI1/SPDIF1/TOSLINK1 with configurable names.

PIN numbers may change after reboot if recently altered.

Provenance

source_domains:
  - docs.linn.co.uk
source_urls:
  - https://docs.linn.co.uk/wiki/index.php/Developer:LPEC
retrieved_at: 2026-04-30T04:32:34.983Z
last_checked_at: 2026-06-02T22:09:25.067Z

Verification Summary

verdict: verified
checked_at: 2026-06-02T22:09:25.067Z
matched_actions: 14
action_count: 14
confidence: medium
summary: "All 14 spec actions traced to source (dip-safe re-verify). (3 unresolved item(s) noted in Known Gaps.)"

Known Gaps

- "power on/off commands not present in source"
- "firmware version compatibility not stated"
- "LPEC protocol version not stated"

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