Highlights
Version 2.0.0 adds an optional gRPC transport that speaks the...
...BRAVIA Connect control plane...
on your local network (port 55051), alongside the existing TCP "External Control" legacy mode (port 33336, no Sony sign-in). After a series of public pre-releases, I'm dropping the experimental and promoting gRPC to beta.
There are still bugs, but it's stable enough for me to feel comfortable pushing it out as a beta feature in this major release. It is the recommended setup choice for HT-A9M2 and for future similar devices that expose BRAVIA Connect — there are still bugs, and will still labeled a Beta Feature while parity with TCP and firmware coverage keep evolving.
Primary validation is on HT-A9M2 firmware 001.454. TCP mode remains fully supported if you prefer no Sony sign-in.
Before you upgrade / switch transports
- Staying on TCP: Existing 1.7.x TCP installs can upgrade in place. No re-setup required.
- Trying gRPC: Transport is chosen once at setup. Remove the integration, restart Home Assistant if needed, add it again, choose gRPC — BRAVIA Connect (recommended), and complete Sony sign-in. Entity sets differ per transport — see Removal and Transport modes.
- Legacy option: Entries that used Enable gRPC state sync migrate automatically to gRPC transport on reload.
- Setup walkthrough: gRPC setup guide (Sony sign-in, Chrome Network redirect, Seeds options).
Beta Feature: gRPC is the recommended transport and still evolving — expect parity gaps vs TCP and occasional changes across releases or firmware.
What's new in gRPC
gRPC connects with a one-time Sony account sign-in in the setup flow. Session keys refresh automatically when a refresh token is available. Control and live updates use the local BRAVIA Connect gRPC session (notify stream); optional Seeds cloud reads fill in settings the device does not return locally.
Media player
- Power, volume, mute, and input source selection (including HDMI mapping fixes from the betas)
- Sound field mode on the media player (Dolby Speaker Virtualizer, Neural:X, 360SSM, and related modes)
- Now-playing metadata — title, artist, album, duration, position, album art when the source provides it
- Play / pause / next / previous on Spotify, Bluetooth, and AirPlay when those transports are active
- Source-filtered read-only attributes (TV/HDMI audio format, Bluetooth codec/signal, Spotify playlist status, spatial flags, and more)
- Dynamic source list when the device publishes available inputs
Sound & system entities
Mapped entities are driven by device capabilities and the gRPC ↔ TCP mapping. Exact set depends on model, firmware, and subwoofer detection. Full table: entities.md.
| Category | Controls |
|---|---|
| Levels | Rear level; bass (min/mid/max without sub); subwoofer level (−10…10 with sub) |
| Voice | Voice enhancer; Voice Zoom on/off + level |
| Sound processing | Sound field on/off; night mode; dual mono; DRC; Auto Volume; DSEE Ultimate; DTS Dialog Control |
| Spatial / IMAX | Sound field mode (media player); 360SSM height; center speaker mode; IMAX Enhanced |
| Sync | HDMI AV sync; TV/ARC AV sync |
| Display / CEC | Display brightness (bright / dark / off); HDMI CEC; HDMI CEC power-off sync |
| System | Network/BT standby; auto standby*; auto update*; external control*; HDMI ARC (TV) as on/off switch; HDMI standby through* |
| Bluetooth | Connection quality select |
| Diagnostics | Device name, serial, timezone, wired MAC, IP address, firmware update, room calibration state |
* Ships disabled by default until confirmed on your firmware (or matches TCP’s disabled defaults for companion power/volume entities). Key sound entities that were off in early betas are enabled by default in this release.
Seeds cloud reads (opt-in)
Some settings accept local gRPC writes but are not readable over local gRPC on current firmware (DRC, Auto Volume, DSEE Ultimate, 360SSM height, display brightness, and others). They may stay unknown until you:
- Enable Read notify-only settings from Sony Seeds cloud (
grpc_seeds_poll) in integration options, or - Change the setting once from Home Assistant, or
- Rely on Home Assistant restoring the last known state
Seeds uses the same Sony cloud API BRAVIA Connect uses for those reads — discovery credit @mafredri. Details: seeds-cloud-states.md.
Reliability & Home Assistant quality
- More reliable gRPC exec after standby / idle (fresh preflight and session random per command)
- Avoids keepalive pings that caused Quad disconnects on some setups
- Entity availability refreshes when the gRPC session connects or drops
- Streaming transport controls stay available when the device reports playback availability with reason
none(Spotify / Bluetooth / AirPlay) - Alignment with Home Assistant Bronze practices and harder entity availability / parallel-update behavior
Known limitations
- Parity gaps vs TCP: Bluetooth pairing button, HDMI passthrough, temperature, and some network diagnostics remain TCP-only — see parity gaps.
- Transport switch requires remove + re-add (entity sets differ).
- AirPlay cannot be selected as an input on either transport (casting activates it). gRPC omits it from the source list unless it is already active; TCP left it visible even when inactive.
- Notify-only / Seeds paths may show
unknownuntil Seeds, a write, or restore — expected on fw 001.454. - Model coverage: gRPC is verified on HT-A9M2; other Theatre models vary (see Device compatibility). Sony can change firmware behavior at any time.
Documentation
- gRPC setup — Sony sign-in and Seeds options
- Configuration — transport modes, options, removal
- Entities — TCP and gRPC entity reference
- gRPC ↔ TCP mapping — feature map and parity gaps
- Seeds cloud states — opt-in cloud reads for notify-only settings
What's Changed
✨ New features
- Add gRPC Display Brightness select entity @steamEngineer (#158)
- Add HDMI CEC power-off sync select entity @steamEngineer (#153)
- Add gRPC transport mode with Sony Seeds OAuth and mapped entities @steamEngineer (#127)
🐛 Bug fixes
- Fix gRPC audio return exec failure with bool encoding and on/off switch @steamEngineer (#159)
- Fix volume entity lookup in notification tests @steamEngineer (#160)
- Accept notify-confirmed gRPC source switch ExecCommands @steamEngineer (#157)
- Map hdmi1 to gRPC hdmi for media player source selection @steamEngineer (#155)
- Fix bass select showing raw 0/1/2 after min/mid/max changes @steamEngineer (#147)
- Keep streaming transport controls when playback_command availability is false with reason none @steamEngineer (#146)
- Refresh gRPC entity availability on session connect and disconnect @steamEngineer (#135)
- Recover gRPC exec after stale preflight tokens following standby idle @steamEngineer (#134)
- Disable gRPC keepalive pings that trigger Quad disconnects @steamEngineer (#132)
- Run signed GetStates preflight before gRPC ExecCommand @steamEngineer (#131)
🚀 Enhancements
- Enable sound entities by default and clarify media player labels @steamEngineer (#168)
- Harden entity availability and parallel updates @steamEngineer (#164)
- Align integration with Home Assistant Bronze practices @steamEngineer (#163)
- Rename HDMI standby link to HDMI standby through @steamEngineer (#154)
- Expose gRPC previous track transport via playback_command prev @steamEngineer (#149)
- Use Seeds cloud reads for gRPC notify-only state (replace TCP hybrid) @steamEngineer (#144)
- Simplify gRPC exec auth with fresh GetSessionRandom per command @steamEngineer (#141)
🧰 Maintenance
- Group Python version bumps in Renovate @steamEngineer (#152)
- Align CI Python install pins with .python-version 3.14.6 @steamEngineer (#151)
- Block private local artifacts from commits, pushes, and CI @steamEngineer (#128)
📚 Documentation
- Prepare docs and setup copy for the v2 gRPC soft graduate @steamEngineer (#170)
- Add gRPC setup guide for Sony sign-in @steamEngineer (#169)
- Fix ty check command in developer documentation @steamEngineer (#150)
- Incorporate @mafredri gRPC RE doc corrections from #16 @steamEngineer (#140)
- Move device compatibility into README with gRPC/TCP status @steamEngineer (#130)
⬆️ Dependency updates
Routine CI and lockfile updates via Renovate (setup-uv, paths-filter, Python 3.14.6 image, lock file maintenance).
Full changelog: v1.7.1...v2.0.0