Skip to main content

Library to control a Lyngdorf A/V processor

Project description

Lyngdorf Audio Control Library

Python library to control Lyngdorf A/V processors and integrated amplifiers over TCP/IP (port 84).

Tests Python 3.11+ Code style: black

Supported Models

MP Series (Multichannel Processors)

  • MP-40 - Entry-level processor (3 HDMI inputs, 12-channel decoding)
  • MP-50 - Mid-level processor (8 HDMI inputs, 11.1 + 4 aux)
  • MP-60 - Flagship processor (8 HDMI inputs, 16-channel decoding)

TDAI Series (Integrated Amplifiers)

  • TDAI-1120 - Entry-level integrated amplifier
  • TDAI-2170 - Older integrated amplifier model
  • TDAI-3400 - Top-of-line networked integrated amplifier

All models support:

  • Power control
  • Volume/mute control
  • Source selection
  • RoomPerfect™ room correction
  • Voicing selection
  • Trim controls (bass, treble, center, height, LFE, surround)
  • Zone B control (MP series)

Installation

From PyPI

pip install lyngdorf

From Source

git clone https://github.com/fishloa/lyngdorf.git
cd lyngdorf
poetry install

Quick Start

import asyncio
from lyngdorf import async_create_receiver, LyngdorfModel

async def main():
    # Auto-detect model (recommended)
    receiver = await async_create_receiver("192.168.1.100")

    # Or specify model explicitly
    receiver = await async_create_receiver("192.168.1.100", LyngdorfModel.MP_60)

    # Connect to the receiver
    await receiver.async_connect()

    # Control the receiver
    receiver.power_on(True)
    print(f"Volume: {receiver.volume} dB")
    receiver.volume = -22.5
    receiver.mute_enabled = False

    # Change source
    receiver.source = "HDMI 1"

    # RoomPerfect control
    receiver.room_perfect_position = "Focus 1"

    # Disconnect when done
    await receiver.async_disconnect()

asyncio.run(main())

Usage Examples

Power Control

receiver.power_on(True)   # Turn on
receiver.power_on(False)  # Turn off
print(receiver.power_on)  # Check power state

Volume Control

receiver.volume = -25.0   # Set volume in dB
receiver.volume_up()      # Increase volume
receiver.volume_down()    # Decrease volume
receiver.mute_enabled = True  # Mute

Source Selection

# List available sources
print(receiver.sources)

# Select source by name
receiver.source = "HDMI 1"

# Or by index
receiver.change_source(1)

RoomPerfect™ & Voicing

# List available positions
print(receiver.room_perfect_positions)

# Select position
receiver.room_perfect_position = "Focus 1"
receiver.room_perfect_position = "Global"
receiver.room_perfect_position = "Bypass"

# List available voicings
print(receiver.voicings)

# Select voicing
receiver.voicing = "Neutral"

Trim Controls (MP Series)

# Adjust trim levels (in dB)
receiver.trim_bass(1.5)      # +1.5 dB
receiver.trim_treble(-0.5)   # -0.5 dB
receiver.trim_centre(0.0)    # Reset to 0 dB
receiver.trim_height(2.0)
receiver.trim_lfe(-1.0)
receiver.trim_surround(0.5)

# Or use increment/decrement
receiver.trim_bass_up()
receiver.trim_bass_down()

Zone B Control (MP Series)

# Zone B power
receiver.zone_b_power_on(True)

# Zone B volume
receiver.zone_b_volume = -30.0
receiver.zone_b_volume_up()
receiver.zone_b_volume_down()

# Zone B source
receiver.change_zone_b_source(2)

Callbacks & Events

# Register for volume changes
def on_volume_change(param1, param2):
    print(f"Volume changed: {param1}")

receiver._api.register_callback("VOL", on_volume_change)

# Register for any change notification
def on_any_change():
    print("Receiver state changed")

receiver._api.register_notification_callback(on_any_change)

Model-Specific Features

MP-40

  • 3 HDMI inputs
  • 12-channel decoding
  • 16 balanced audio outputs

MP-50

  • 8 HDMI inputs
  • 3 HDMI outputs (including HDBT)
  • 11.1 setup + 4 auxiliary channels
  • Optional 16-channel AES module support

MP-60

  • 8 HDMI inputs
  • 3 HDMI outputs (including HDBT)
  • 16-channel decoding
  • Optional 16-channel AES module support

TDAI-3400

  • I-prefixed command protocol
  • Dual speaker setup switching
  • Headphone output controls
  • Network connectivity (Ethernet + Wi-Fi)
  • Media playback (Spotify, TIDAL, Roon, etc.)
  • 3-band equalizer + balance control

Development

Setup

poetry install

Run Tests

poetry run pytest -v

Code Quality

poetry run black lyngdorf/ tests/      # Format code
poetry run ruff check lyngdorf/ tests/  # Lint
poetry run mypy lyngdorf/               # Type check

Home Assistant Integration

This library is designed for use with Home Assistant. See the Home Assistant Lyngdorf integration for setup instructions.

Protocol Documentation

All models communicate via TCP/IP on port 84 using ASCII commands:

  • Commands start with ! and end with \r
  • Format: !COMMAND(parameter)\r or !COMMAND?\r for queries
  • Responses start with ! for status messages

Protocol details available in the /spec folder.

License

MIT License - see LICENSE file for details.

Contributing

Contributions welcome! Please:

  1. Run tests: poetry run pytest
  2. Format code: poetry run black .
  3. Check types: poetry run mypy lyngdorf/
  4. Ensure all CI checks pass

Support

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

lyngdorf-1.2.1.tar.gz (17.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

lyngdorf-1.2.1-py3-none-any.whl (20.6 kB view details)

Uploaded Python 3

File details

Details for the file lyngdorf-1.2.1.tar.gz.

File metadata

  • Download URL: lyngdorf-1.2.1.tar.gz
  • Upload date:
  • Size: 17.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.3.2 CPython/3.12.3 Linux/6.11.0-1018-azure

File hashes

Hashes for lyngdorf-1.2.1.tar.gz
Algorithm Hash digest
SHA256 9d651c4e61e0d5bd3c743d9357794ce16f2e7bb440177f90315e1ff1ba21fe96
MD5 79c3143818e901d813e57beed75e5bc0
BLAKE2b-256 ada39b1db021038ab39f3d93ea636dad6f8e5a41badaf495aae97d5490040bc3

See more details on using hashes here.

File details

Details for the file lyngdorf-1.2.1-py3-none-any.whl.

File metadata

  • Download URL: lyngdorf-1.2.1-py3-none-any.whl
  • Upload date:
  • Size: 20.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.3.2 CPython/3.12.3 Linux/6.11.0-1018-azure

File hashes

Hashes for lyngdorf-1.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 c8baa5e0f8a27f3765e1b180e5809695ced74f5bf6e0804a515f2b25956a5e7a
MD5 e68ed67a274f578639bc768b51966bcf
BLAKE2b-256 cecfbb106ea216ae93f97b82985ca41e234e627954cc26a01514d7543a2d4a35

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page