LgTvConnect 1.0.1

dotnet add package LgTvConnect --version 1.0.1
                    
NuGet\Install-Package LgTvConnect -Version 1.0.1
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="LgTvConnect" Version="1.0.1" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="LgTvConnect" Version="1.0.1" />
                    
Directory.Packages.props
<PackageReference Include="LgTvConnect" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add LgTvConnect --version 1.0.1
                    
#r "nuget: LgTvConnect, 1.0.1"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package LgTvConnect@1.0.1
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=LgTvConnect&version=1.0.1
                    
Install as a Cake Addin
#tool nuget:?package=LgTvConnect&version=1.0.1
                    
Install as a Cake Tool

LgTvConnect

A C# library for controlling LG Smart TVs through multiple network-based communication protocols.

Features

  • LG Connect WebSocket API: Control WebOS TVs via the native WebSocket interface
  • IP Control Protocol: Network-based control using LG's IP control protocol
  • RS-232 Over Network: Network-based RS-232 protocol emulation (not serial hardware)
  • Unified Interface: Single client API for all connection types
  • Auto-Pairing: Automatically accept pairing prompts using IP Control or RS-232
  • Event-Driven Architecture: Subscribe to TV state changes, authentication requests, and client key updates
  • Async/Await Support: Modern asynchronous programming model

Installation

dotnet add package LgTvConnect

Supported TVs

  • LG WebOS Smart TVs (2014+)
  • LG Commercial Displays with IP Control
  • LG TVs with network-accessible RS-232 protocol support

Prerequisites

  • Your TV and computer must be on the same network
  • Enable "LG Connect Apps" in TV settings (Network → LG Connect Apps)
  • For IP Control: Find your TV's IP control key in settings

Quick Start

using LgTvConnect;
using Microsoft.Extensions.Logging;

var logger = loggerFactory.CreateLogger<LgTvClient>();

var tv = new LgTvClient(logger, new LgTvOptions()
{
    IpAddress = IPAddress.Parse("192.168.1.100"),
    UseRs232 = true // Use RS-232 protocol over network
});

await tv.ConnectAsync();

// Handle authentication (first-time pairing)
await tv.OnAuthenticateRequested.SubscribeAsync(async () =>
{
    await tv.AuthenticateAsync("your-saved-client-key");
});

// Save the client key for future use
await tv.OnClientKeyChanged.SubscribeAsync(async key =>
{
    Console.WriteLine($"Save this key: {key}");
});

// Monitor connection state
await tv.OnStateChanged.SubscribeAsync(async state =>
{
    if (state == LgClientState.Ready)
    {
        await tv.ShowToastAsync("Connected!");
    }
});

Configuration Options

var options = new LgTvOptions()
{
    IpAddress = IPAddress.Parse("192.168.1.100"),
    
    // LG Connect WebSocket settings
    LgConnectPort = 3000,                           // Default: 3000
    
    // RS-232 over network settings
    UseRs232 = true,                                // Enable RS-232 protocol
    Rs232Port = 9761,                               // Default: 9761
    
    // IP Control settings
    UseIpControl = false,                           // Enable IP Control
    IpControlKey = "LGXXXXX",                       // Your TV's IP control key
    IpControlPort = 9761,                           // Default: 9761
    
    // Auto-pairing configuration
    AcceptSequence = LgAcceptSequence.DownEnter     // Or RightEnter
};

Connection Protocols

LG Connect (WebSocket)

The primary control method for WebOS TVs. Communicates over WebSocket on port 3000. Requires "LG Connect Apps" to be enabled and handles authentication/pairing.

Port: 3000 (default)
Use for: Main TV control, launching apps, media control, notifications

RS-232 (Network Protocol)

Network-based implementation of LG's RS-232 command protocol. Despite the name, this is not a hardware serial connection—it's a TCP/IP protocol on port 9761.

Port: 9761 (default)
Use for: Auto-accepting pairing prompts, sending navigation commands, power control

IP Control

LG's IP control protocol for commercial displays and TVs. Requires an IP control key from the TV's settings.

Port: 9761 (default)
Use for: Auto-accepting pairing prompts, direct command control with authentication

Auto-Pairing

The library can automatically accept pairing prompts when connecting for the first time:

var options = new LgTvOptions()
{
    IpAddress = IPAddress.Parse("192.168.1.100"),
    UseRs232 = true, // or UseIpControl = true
    AcceptSequence = LgAcceptSequence.DownEnter // Navigates down then presses OK
};

Available sequences:

  • LgAcceptSequence.DownEnter: Arrow Down → OK
  • LgAcceptSequence.RightEnter: Arrow Right → OK

When the TV displays the pairing prompt, the library automatically sends the navigation commands to accept it.

Direct Protocol Access

Execute commands directly on RS-232 or IP Control protocols:

// Execute RS-232 command
await tv.ExecuteRs232Async(async client =>
{
    await client.SendCommandAsync(Rs232Command.Down, cancellationToken);
    await client.SendCommandAsync(Rs232Command.Enter, cancellationToken);
});

// Execute IP Control command
await tv.ExecuteIpControlAsync(async client =>
{
    await client.SendKeyAsync(IpControlKey.ArrowDown, cancellationToken);
    await client.SendKeyAsync(IpControlKey.Ok, cancellationToken);
});

Authentication Flow

On first connection:

  1. Call ConnectAsync() - establishes WebSocket connection
  2. OnAuthenticateRequested fires when authentication is needed
  3. Call AuthenticateAsync(clientKey) with saved key (or empty string for first time)
  4. If pairing prompt appears and RS-232/IP Control is enabled, library auto-accepts
  5. OnClientKeyChanged fires with the client key - save this for future connections
  6. OnStateChanged fires with LgClientState.Ready when connection is complete

Available APIs

Power Control

await tv.TurnOffAsync();                              // Turn TV off
await tv.WakeOnLanAsync("AA:BB:CC:DD:EE:FF");        // Wake TV using MAC address
await tv.ScreenOnAsync();                             // Turn screen on (TV stays on)
await tv.ScreenOffAsync();                            // Turn screen off (TV stays on)

Volume & Audio

await tv.SetVolumeAsync(50);                          // Set volume (0-100)
await tv.SetMuteAsync(0);                             // Mute/unmute

Button Presses

await tv.PressButtonAsync(TvButton.VolumeUp);         // Press any button
await tv.PressButtonAsync(TvButton.Enter);

Available buttons: Back, ChannelUp, ChannelDown, VolumeUp, VolumeDown, Left, Right, Up, Down, Menu, Enter

Note: Requires UseIpControl or UseRs232 to be enabled

Inputs & Channels

await tv.SwitchInputAsync(TvInput.Hdmi1);             // Switch HDMI input
await tv.SwitchInputAsync(TvInput.LiveTv);            // Switch to Live TV
await tv.SetChannelAsync(15);                         // Change channel

Available inputs: Hdmi1, Hdmi2, Hdmi3, LiveTv

Apps & Browser

// Launch any app by ID
await tv.LaunchAppAsync("com.webos.app.netflix");     // Launch Netflix
await tv.LaunchAppAsync("youtube.leanback.v4");       // Launch YouTube

// Close apps
await tv.CloseAppAsync("com.webos.app.netflix");      // Close specific app

// Browser control
await tv.OpenBrowserAsync("https://example.com");     // Open URL in browser
await tv.CloseWebBrowserAsync();                      // Close browser

Screenshots

// Get screenshot URI
string imageUri = await tv.ScreenshotAsync();

// Or use callback
await tv.ScreenshotAsync(async uri => {
    Console.WriteLine($"Screenshot: {uri}");
});

Notifications

await tv.ShowToastAsync("Hello from LgTvConnect!");

Advanced

  • Send raw SSAP commands via LgConnectClient.RequestAsync()
  • Subscribe to real-time TV events
  • Direct protocol command execution with ExecuteRs232Async() and ExecuteIpControlAsync()

Network Ports

Protocol Default Port Purpose
LG Connect (WebSocket) 3000 Main TV control API
RS-232 (Network) 9761 RS-232 command protocol over TCP
IP Control 9761 IP control protocol

Note: RS-232 and IP Control use the same default port but are different protocols. Enable only one at a time unless using different port configurations.

License

MIT

Contributing

Contributions are welcome! Please open an issue or submit a pull request.

Credits

Based on LG's WebOS WebSocket API, RS-232 network protocol, and IP Control specifications.

Product Compatible and additional computed target framework versions.
.NET net9.0 is compatible.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 was computed.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.0.1 110 12/12/2025
1.0.0 105 12/12/2025