Skip to main content

sony-tv-rs232

Async Python library to control Sony Bravia TVs over RS232 serial, built on serialkit (the serial-toolkit distribution on PyPI) and serialx.

Installation

pip install sony-tv-rs232

# To talk to a TV over an ESPHome serial proxy:
pip install 'sony-tv-rs232[esphome]'

Requires Python 3.14+.

Quick start

import asyncio
from sony_tv_rs232 import SonyTV, InputSource


async def main():
    tv = SonyTV("/dev/ttyUSB0")
    await tv.connect()

    await tv.enable_standby_listening()  # so power_on works from standby
    await tv.power_on()
    await tv.set_volume(20)
    await tv.select_input_source(InputSource.HDMI1)

    await tv.disconnect()


asyncio.run(main())

CLI

python -m sony_tv_rs232 /dev/ttyUSB0                 # query + print status
python -m sony_tv_rs232 socket://192.168.1.29:5000   # raw TCP bridge
python -m sony_tv_rs232 'esphome://192.168.1.29/?port_name=TTL'
python -m sony_tv_rs232 /dev/ttyUSB0 --power on
python -m sony_tv_rs232 /dev/ttyUSB0 --input HDMI1
python -m sony_tv_rs232 /dev/ttyUSB0 --diagnose      # raw wiring diagnosis

Protocol notes

Sony's consumer RS-232C protocol is effectively set-only: the TV acknowledges every Set command but most models ignore query packets, and the answer frame carries no echo of which command it answers. The library:

  • updates state optimistically when a Set is acknowledged, and from query replies on the Pro Bravia displays that answer them;
  • runs every command as an exclusive exchange, because answers are unaddressed — holding the wire for one send-and-read round, anchored on arrival order, is what keeps a dropped or garbled answer from being read as the next command's;
  • paces commands ≥ 500 ms apart, as the Sony spec requires;
  • resends the first command after an idle gap once: a TV that has slept loses the leading bytes of the frame that wakes it and answers PARSE_ERROR, so that reply is treated as "send it again";
  • reconnects automatically when the serial link drops.

All of that machinery lives in serialkit; this library is the Sony command surface plus a checksum-discriminated answer framer.

Connection handling

from sony_tv_rs232 import CommandTimeoutError, ConnectionLostError, SonyCommandError

try:
    await tv.set_volume(50)
except SonyCommandError as err:  # TV returned a non-zero answer code
    ...
except CommandTimeoutError:  # no answer in time (common on set-only TVs)
    ...
except ConnectionLostError:  # serial link dropped
    ...

Subscribe to state changes; callbacks receive a TVState snapshot, or None when the connection is lost:

unsub = tv.subscribe(lambda state: print("state:", state))

Serial connection

Sony Bravia sets use 9600 baud, 8N1. The library accepts any serialx-compatible URL (/dev/ttyUSB0, socket://host:port, esphome://host/?port_name=TTL).

Development

uv run --python 3.14 pytest
uv run --python 3.14 --with mypy mypy --strict src/
uvx ruff check && uvx ruff format --check

The RS-232C protocol reference is in docs/.

License

MIT

Metadata

Release files for sony-tv-rs232 0.3.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for sony-tv-rs232 0.3.0
File Size Uploaded
sony_tv_rs232-0.3.0.tar.gz 17.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for sony-tv-rs232 0.3.0
File Interpreter ABI Platform
sony_tv_rs232-0.3.0-py3-none-any.whl Python 3 none any Details

Total release size: 37.7 kB

Release files / sony_tv_rs232-0.3.0.tar.gz

Download URL sony_tv_rs232-0.3.0.tar.gz
Size 17.1 kB
Tags Source
SHA-256 checksum
How to use checksums
2e32aa5e75fca413939afe59dead8ac318596bcdd4a3a0b873167c81086858aa
BLAKE2b-256 checksum
How to use checksums
fe553f6144890fbeaeb3d2741f608b111ceb355dc4a3285cb845afef2a9e3140
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 11, 2026.

Transparency log

Release files / sony_tv_rs232-0.3.0-py3-none-any.whl

Download URL sony_tv_rs232-0.3.0-py3-none-any.whl
Size 20.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
15d39f6b9d426e43972bac661f56347149181788e116b29ff1d1922fa5a7198c
BLAKE2b-256 checksum
How to use checksums
99bb57625d5f1915b9e6d50a03e0bec8d8ada7089eb03512e4b544b542495e3b
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 11, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.3.0 This release

2 release files

0.2.1

2 release files

0.2.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page