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.2.tar.gz (17.9 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.2-py3-none-any.whl (20.8 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: lyngdorf-1.2.2.tar.gz
  • Upload date:
  • Size: 17.9 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.2.tar.gz
Algorithm Hash digest
SHA256 aa5065685999837523e22cfe580d4aa1232baf95ddab55c3c98c2b3df36f594a
MD5 c9f9c60a305e2eb2c6bee934471f3d3b
BLAKE2b-256 b4d74bb6d32a784efdb5890f76df46b7df5f7acd7460fe00ea11a37e4609449a

See more details on using hashes here.

File details

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

File metadata

  • Download URL: lyngdorf-1.2.2-py3-none-any.whl
  • Upload date:
  • Size: 20.8 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.2-py3-none-any.whl
Algorithm Hash digest
SHA256 0564e67f9fc4e0a5ede6192b6cb6ec70e414cd1b1d8165ad942d3de07bfd82f0
MD5 af610b01033a3538f0025bb0aa110769
BLAKE2b-256 40f9f289ceb62a8c38c5507093748015fff1ca04241880c4a56ba7530c6177d8

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