Skip to main content

Async library to control Sony Bravia TVs over RS232, built on serialkit

Project description

sony-tv-rs232

Async Python library to control Sony Bravia TVs over RS232 serial, built on serialkit 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;
  • 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
uvx ruff check

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

License

MIT

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

sony_tv_rs232-0.2.1.tar.gz (15.9 kB view details)

Uploaded Source

Built Distribution

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

sony_tv_rs232-0.2.1-py3-none-any.whl (19.8 kB view details)

Uploaded Python 3

File details

Details for the file sony_tv_rs232-0.2.1.tar.gz.

File metadata

  • Download URL: sony_tv_rs232-0.2.1.tar.gz
  • Upload date:
  • Size: 15.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for sony_tv_rs232-0.2.1.tar.gz
Algorithm Hash digest
SHA256 0aae948cc0d3731ed840a96400b61a552d059d69a3700f192048c27b1d30fb84
MD5 155ce92bc85b7ffb2b0a3396672fd3f0
BLAKE2b-256 c696cae84249ad39f675cfc5ca641d34b45c6efb9a2ca569e7bd8ad284e72777

See more details on using hashes here.

Provenance

The following attestation bundles were made for sony_tv_rs232-0.2.1.tar.gz:

Publisher: publish.yml on bbangert/sony-tv-rs232

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file sony_tv_rs232-0.2.1-py3-none-any.whl.

File metadata

  • Download URL: sony_tv_rs232-0.2.1-py3-none-any.whl
  • Upload date:
  • Size: 19.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for sony_tv_rs232-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 4078cde47071e9504302a79dee0591c2247f8b5ff3bbfad0324a9c8999f9072a
MD5 e3ac1789e1907f480b26d95b5c1e2366
BLAKE2b-256 282dd0d643b78bacb656f36acf4d2f013909ff96c7f14a7ce53a9412311f4e23

See more details on using hashes here.

Provenance

The following attestation bundles were made for sony_tv_rs232-0.2.1-py3-none-any.whl:

Publisher: publish.yml on bbangert/sony-tv-rs232

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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