Skip to main content

HA-agnostic Sony BRAVIA Connect ControlDeviceService client

Project description

pybravia-connect

PyPI Python versions CI License

HA-agnostic Python client for Sony BRAVIA Connect local gRPC (ControlDeviceService).

This is a protocol library, not a Home Assistant integration. Integrations that speak BRAVIA Connect (for example bravia-quad-homeassistant and bravia-tv-grpc-homeassistant) can depend on this package once cut over.

Protocol code was extracted from those integrations (MIT). Thanks to @steamEngineer and @braviafanboy.

Status

Alpha (0.1.x on PyPI). APIs may change before 1.0. See CHANGELOG.md for release history. Apps that need a fixed surface can pin a specific version in their own lockfile.

Install

Requires Python 3.12+.

pip install pybravia-connect

bravia-connect is a reserved PyPI alias for the same release (pip install bravia-connect installs pybravia-connect at the matching version). Prefer the canonical name above; the import package is always pybravia_connect.

For TV app-list and icon reads (AES-GCM decrypt):

pip install "pybravia-connect[crypto]"

For local development:

pip install -e ".[dev]"

Quickstart

Obtain credentials JSON first (see Credentials CLI), then:

from pybravia_connect import (
    BraviaConnectClient,
    DEFAULT_THEATRE_PORT,
    load_credentials,
)

HOST = "192.168.x.x"
CREDS_PATH = "/path/to/session_keys.json"  # never commit

creds = load_credentials(CREDS_PATH)
client = BraviaConnectClient(
    HOST,
    DEFAULT_THEATRE_PORT,  # or discover_grpc_port(HOST) for TVs
    creds["device_id"],
    creds["hmac_key"],
    key_id=creds.get("key_id"),
    session_key=creds.get("session_key"),
)
client.connect()
print(client.get_capabilities_json())
client.start_notify(lambda path, value: print(path, value))
# optional: client.get_states(["power", "volume"])
# optional write: client.exec_command("volume", 10)  # power on first
client.close()

BraviaConnectClient is synchronous — run it in an executor from asyncio. The example is read-mostly; volume/mute writes no-op while the control unit is off. Public exports are listed in pybravia_connect.__all__.

Features

  • Connect and auth handshake for local ControlDeviceService gRPC
  • GetCapabilities / get_capabilities_json and capability helpers
  • StartNotifyStates delta stream and get_states
  • ExecCommandWithAuth (fresh session random per write)
  • OAuth / Seeds credential helpers (sync for scripts; async_* for HA)
  • TCP port discovery for non-Theatre devices (discover_grpc_port)
  • Optional TV AES-GCM app-list / icon reads (session_key + [crypto])

Validated on HT-A9M2 for connect/handshake, capabilities, notify, get_states, and volume writes while powered on.

Requirements

  • Device on a trusted private LAN (do not expose the gRPC port)
  • Credentials JSON with at least device_id and hmac_key (optional key_id, session_key)
  • Theatre systems default to port 55051 (DEFAULT_THEATRE_PORT); TVs often need discover_grpc_port
  • Stop any Home Assistant bravia_quad gRPC session on the same device before experimenting — dual key_id sessions flake

Credentials CLI

OAuth login and write credentials for local gRPC (never commit the output):

python tools/get_session_keys.py --login --open -o /tmp/session_keys.json

See python tools/get_session_keys.py --help for --code, --token, --refresh, and --from-har.

Documentation

Security

Local gRPC control assumes a trusted private LAN. Do not expose the device’s gRPC port to the internet. Never commit session-key JSON, OAuth tokens, or HAR files from the CLI tools.

See SECURITY.md for reporting and operator guidance, and THREAT_MODEL.md for what is in scope for private advisories.

Development

python3 -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"
ruff check . && ruff format --check .
mypy
pytest -q

Live device smoke (env details in the script docstring):

export BRAVIA_HOST=192.168.x.x
export BRAVIA_CREDENTIALS=/path/to/keys.json
python tools/live_smoke.py

Open PRs against main and complete .github/PULL_REQUEST_TEMPLATE.md (tick exactly one change type so CI can label the PR for release notes). See AGENTS.md for agent/contributor conventions.

Protobuf regeneration and release steps: docs/development.md, docs/releasing.md.

License

MIT. Protocol code was extracted from the integrations listed above; thanks to @steamEngineer and @braviafanboy.

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

pybravia_connect-0.1.0a10.tar.gz (52.8 kB view details)

Uploaded Source

Built Distribution

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

pybravia_connect-0.1.0a10-py3-none-any.whl (37.5 kB view details)

Uploaded Python 3

File details

Details for the file pybravia_connect-0.1.0a10.tar.gz.

File metadata

  • Download URL: pybravia_connect-0.1.0a10.tar.gz
  • Upload date:
  • Size: 52.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for pybravia_connect-0.1.0a10.tar.gz
Algorithm Hash digest
SHA256 7dea2a73d220b620b27025ff63c28282a3aa5b55e7f21cf0bb08c8f85ab65777
MD5 7852577e7343b2a6808b2fe11719576b
BLAKE2b-256 560df42f0163043c3d83650a09f52ffbee9f8f0a0d26347b5a0b4bdb9d423f97

See more details on using hashes here.

Provenance

The following attestation bundles were made for pybravia_connect-0.1.0a10.tar.gz:

Publisher: publish.yml on steamEngineer/pybravia-connect

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

File details

Details for the file pybravia_connect-0.1.0a10-py3-none-any.whl.

File metadata

File hashes

Hashes for pybravia_connect-0.1.0a10-py3-none-any.whl
Algorithm Hash digest
SHA256 77d745f3f94ad3a50d7b6e356fb30abcc61c4d4dab5e42a15fea774519bf89eb
MD5 84cf206807921433d6bd3c4821cb8cf4
BLAKE2b-256 4c59b205b2fe2f16056f1e1d933ed15a223da4575059e89255ddc6952ab00dd8

See more details on using hashes here.

Provenance

The following attestation bundles were made for pybravia_connect-0.1.0a10-py3-none-any.whl:

Publisher: publish.yml on steamEngineer/pybravia-connect

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