Skip to content

Add Pixel Buddy plugin - #1047

Open
Phill544 wants to merge 6 commits into
SteamDeckHomebrew:mainfrom
Phill544:plugin/pixel-buddy
Open

Phill544 wants to merge 6 commits into
SteamDeckHomebrew:mainfrom
Phill544:plugin/pixel-buddy

Conversation

@Phill544

@Phill544 Phill544 commented May 13, 2026 •

Copy link
Copy Markdown

Add Pixel Buddy to Plugin Store

A Decky Loader plugin that lets you monitor battery and control ANC on your Google Pixel Buds Pro directly from Steam Deck. Inspired by MagicPods, they do not support Google Pixel Buds so this plugin fills that gap

Pixel Buddy screenshot

Features

  • Battery levels for left bud, right bud, and case, with charging indicators
  • ANC mode switching: Noise Cancellation / Off / Aware (+ Adaptive for PBP2)
  • Auto-refresh every 5 seconds

Task Checklist

Developer

  • I am the original author or an authorized maintainer of this plugin.
  • I have abided by the licenses of the libraries I am utilizing, including attaching license notices where appropriate.
  • Generative AI was NOT used to write a majority of the code I am submitting.

Plugin

  • I have verified that my plugin works properly on the Stable and Beta update channels of SteamOS.
  • I have verified my plugin is unique or provides more/alternative functionality to a plugin already on the store.

Backend

  • No: I am using a custom backend other than Python.
  • Yes: I am using a tool or software from a 3rd party FOSS project that does not have it's dependencies statically linked.
  • No: I am using a custom binary that has all of it's dependencies statically linked.

Community

  • I have tested and left feedback on two other pull requests for new or updating plugins.
  • I have commented links to my testing report in this PR.

Testing

  • Tested by a third party on SteamOS Preview update channel.

@Phill544
Phill544 requested a review from a team as a code owner May 13, 2026 13:46
@github-actions github-actions Bot added the plugin-addition Adding a plugin to the Plugin Store label May 13, 2026
@github-actions

Copy link
Copy Markdown

Issues Found

No issues with your PR description were found.

Next Steps

  1. If we found any issues above, please edit your pull request description to resolve them and leave a comment saying you've done so.
  2. For the quickest review, please see the Community section of the pull request template for how you can help other developers.
  3. Once your description is correct, a maintainer will review your pull request as soon as possible.

Thank you for your contribution! If you need any help, please reach out on our Discord server. ❤️

@beebls

beebls commented May 13, 2026

Copy link
Copy Markdown
Contributor

Before we review this, you mention that MagicPods doesn't have support for Pixel Buds Pro, have you considered PRing that functionality to MagicPods or asking the dev to add it?

@Phill544

Copy link
Copy Markdown
Author

I haven't reached out directly. There was a thread from last year that the support was requested by another user and it hasn't been acted on. Not sure whether it's a compatibility or willingness issue. I made this plugin for myself, as a Pixel Buds owner, so I wanted to share it with the community in case it would be beneficial to others too

@binaryj

binaryj commented May 15, 2026

Copy link
Copy Markdown

I haven't reached out directly. There was a thread from last year that the support was requested by another user and it hasn't been acted on. Not sure whether it's a compatibility or willingness issue. I made this plugin for myself, as a Pixel Buds owner, so I wanted to share it with the community in case it would be beneficial to others too

Just to provide some confirmation from someone other than the developer, I own Pixel Buds that I use for my ROG Ally, and this would be very helpful for me as well.

@AAGaming00

Copy link
Copy Markdown
Member

add codec switching pls 🙏

if nobody reviews this soon i can do it i have the hardware

@Phill544

Copy link
Copy Markdown
Author

add codec switching pls 🙏

I can look into this as a future update, I'd like to make sure the initial logic is solid first!

@github-actions

Copy link
Copy Markdown

This pull request is stale as no updates or testing reports have been posted within the last 7 days. Please ensure you are actively recruiting testers or resolving the issues discussed. If you do not remove the stale label or comment, this will be closed in 7 days. Please close this pull request if you need more time to resolve issues so we can keep our repo healthy.

@github-actions github-actions Bot added the stale label May 26, 2026
@Phill544

Copy link
Copy Markdown
Author

add codec switching pls 🙏

if nobody reviews this soon i can do it i have the hardware

@AAGaming00 If you could review the plugin when you have a few minutes spare, I would be very grateful!

@AAGaming00

Copy link
Copy Markdown
Member

bug me tomorrow it's 3 am

@Phill544

Copy link
Copy Markdown
Author

@AAGaming00 bugging you now. Hopefully it's a better time for you, I'm in Australia so our timezones are flipped.

@github-actions github-actions Bot removed the stale label May 28, 2026
@AAGaming00
AAGaming00 requested review from a team and removed request for a team October 19, 2026 21:10
@AAGaming00 AAGaming00 moved this to Ready for review in Plugin Review Oct 19, 2026
Tormak9970
Tormak9970 previously approved these changes Oct 19, 2026

@Tormak9970 Tormak9970 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good to me

@github-project-automation github-project-automation Bot moved this from Ready for review to Approved, needs testing in Plugin Review Oct 19, 2026
@Tormak9970

Copy link
Copy Markdown
Contributor

@Phill544 Can you push a commit to your fork? The deployment script ran too long ago for us to re-run it

@AAGaming00
AAGaming00 requested a review from a team October 19, 2026 23:04
@AAGaming00 AAGaming00 moved this from Approved, needs testing to Ready for review in Plugin Review Oct 19, 2026
AAGaming00
AAGaming00 previously approved these changes Oct 19, 2026

@AAGaming00 AAGaming00 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

rebased

@github-project-automation github-project-automation Bot moved this from Ready for review to Approved, needs testing in Plugin Review Oct 19, 2026
@AAGaming00
AAGaming00 deployed to testing_env October 19, 2026 23:05 — with GitHub Actions Active
@Phill544
Phill544 dismissed stale reviews from AAGaming00 and Tormak9970 via b10477c October 20, 2026 04:42
@AAGaming00
AAGaming00 requested a review from a team October 20, 2026 04:43
@AAGaming00 AAGaming00 moved this from Approved, needs testing to Ready for review in Plugin Review Oct 20, 2026
@Phill544

Copy link
Copy Markdown
Author

Thanks! Just merged the conflicting .gitmodules files. No other changes needed.

AAGaming00
AAGaming00 previously approved these changes Oct 20, 2026
@github-project-automation github-project-automation Bot moved this from Ready for review to Approved, needs testing in Plugin Review Oct 20, 2026
@AAGaming00

Copy link
Copy Markdown
Member

dont need to approve the testing deploy

@wynn1212

Copy link
Copy Markdown
Contributor

Plugin Testing Report

Installed Plugins

  • Pixel Buddy - 1.0.0-1ac4c36
  • Pause Games - 1.0.2-65d835d
  • Decky Terminal - 0.5.3
  • Game Sync - 1.1.4-270594c
  • PlayTime - 3.3.2-9342d50
  • CSS Loader - 2.1.3-f191788
  • Wine Cellar - 0.2.1-ac918b7
  • HLTB for Deck - 2.0.12-800f649
  • Game Theme Music - 1.8.2
  • Better Keyboard - 0.3.4
  • ProtonDB Badges - 1.3.4
  • SteamGridDB - 1.8.1-88b52c1
  • Picture in Picture - 1.0.1
  • ScreenSaver - 1.1.2
  • Animation Changer - 1.3.2
  • AutoFlatpaks - 1.6.8
  • EmuDecky - 1.0.8-cca33c1
  • Notebook - 1.0.5
  • Battery Tracker - 0.2.0
  • Audio Loader - 1.6.1
  • NonSteamLaunchers - 1.0.1-2213950
  • DeckSettings - 1.3.0-de05be7

Specifications

  • SteamOS 3.9.3_20261015.100 (Beta&Preview)
    • (Note: Beta and Preview channel are using same SteamOS version)
    • Also tested on SteamOS 3.10_20261020.1000 (Main)
  • Steam 1792192922 (Beta)
  • Decky v3.3.0 (Stable)

Issues

Has the following major blocking issue(s):

  • On the plugin page, the display repeatedly cycles between showing my Pixel Buds Pro 2's battery levels and ANC options, Not Connected, and Connecting.
    Has the following minor non-blocking issue(s): None

Summary

As a Pixel Buds Pro 2 owner, I'm happy to see this plugin exist!
(I previously owned the Pixel Buds Pro, but lost them. Google Find Hub is useless once the earbuds are in the case, as both stop broadcasting Bluetooth signals.)

However, I've encountered an issue: the plugin page keeps cycling between displaying my Pixel Buds Pro 2, Not Connected, and Connecting.

This also happened when I testing on SteamOS 3.10_20261020.1000 main channel, which has the same issue.

Here's the error log, which seems to point to the root cause.

Oct 22 00:58:51 SDOLED1T PluginLoader[1311]: [loader][ERROR]: Method get_battery of plugin Pixel Buddy (v1.0.0-1ac4c36) failed with the following exception:
Oct 22 00:58:51 SDOLED1T PluginLoader[1311]: Traceback (most recent call last):
Oct 22 00:58:51 SDOLED1T PluginLoader[1311]:   File "decky_loader/loader.py", line 229, in handle_plugin_method_call
Oct 22 00:58:51 SDOLED1T PluginLoader[1311]:   File "decky_loader/plugin/plugin.py", line 137, in execute_method
Oct 22 00:58:51 SDOLED1T PluginLoader[1311]:   File "decky_loader/plugin/messages.py", line 44, in wait_for_result
Oct 22 00:58:51 SDOLED1T PluginLoader[1311]: Exception: pbpctrl timed out

Hope this log helps!

@AAGaming00
AAGaming00 requested a review from a team October 22, 2026 10:54
@AAGaming00 AAGaming00 moved this from Approved, needs testing to Ready for review in Plugin Review Oct 22, 2026
@Phill544

Copy link
Copy Markdown
Author

@wynn1212 Thanks mate, I only have the Pixel Bud Pro 1s so I appreciate testing out on the 2s. I believe I've fixed the issue, please confirm next opportunity you have! I've updated the plugin to 1.0.1, I also added the adaptive noise cancelling option for the PBP2s.

@sidharthify sidharthify left a comment •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hello, after reviewing the backend and frontend a bit, I found a few things I'd like you to address because bluetooth is kinda iffy in general


a) In _run_pbpctrl, every invocation calls _find_buds(), which runs bluetoothctl devices Connected and then fires bluetoothctl info for every single connected Bluetooth device via asyncio.gather.

cause refresh()in Content calls bothgetBattery()andgetAnc()` every five seconds, this entire sequence runs twice per poll. On a steam deck with a couple of controllers connected, that is easily like 5-10 subprocesses spawning every 5 seconds on battery

Can you cache the resolved MAC address and device class after the first successful check, and only rerun _find_buds() if a subsequent call fails or disconnects?


b) Checking device_class in (0x240404, 0x244404) is going to cause false negatives. Bluetooth CoD is a bitfield representing service classes alongside the device type.

If the buds connect with slightly different service flags active (telephony, audio and rendering), or if BlueZ reports different bits under different profile states, _connected_buds_class returns None and the UI says its not connected even though the buds are working fine and are connected.

This is probably why pbpctrl show battery in terminal works when the UI shows disconnected. Google's Maestro UUID (25e97ff7-24ce-4c4c-8951-f764a708f7b5) is already unique to Pixel Buds, we probably shouldn't gate connection status on an exact integer match for CoD.

If you need to distinguish Buds Pro 2 for adaptive ANC support, check the model name or inspect whether adaptive ANC is supported rather than hardcoding the entire bitfield.


c) Layout and styling are kinda hacky here:

-- The <style> tag injected directly inside AncToggleGrid on every render to style .gpfocus. If you need custom focus styling, see if this can be moved to a static stylesheet or applied at the top level so you aren't appending style nodes on each render cycle

-- The connected status dot positioning uses position: "absolute", left: "calc(50% - 46px)"

If someone change the font scale, applies a custom css that conflicts with it, or if Decky adds localization somewhere in the future, this will drift or overlap the text.

Using flexbox with standard gap (like in the disconnected state above it) would be much cleaner imo

@github-project-automation github-project-automation Bot moved this from Ready for review to Changes requested in Plugin Review Oct 22, 2026
@sidharthify

Copy link
Copy Markdown
Contributor

Also, side note: LLMs seem to be used heavily, not a big deal because most of the code is fine, but please do clarify.

@sidharthify

Copy link
Copy Markdown
Contributor
Screenshot_202610@Phill544 2_235436

Also @Phill544, please do a better implementation of this UI! It doesn't suit the Steam UI at all.

@AAGaming00
AAGaming00 requested a review from a team October 25, 2026 01:11
@AAGaming00 AAGaming00 moved this from Changes requested to Ready for review in Plugin Review Oct 25, 2026
@Phill544

Copy link
Copy Markdown
Author

Hey @sidharthify I've actioned your bluetooth feedback, thanks for that! I've also pulled out the custom UI so that it is built using Decky's standard css (visible in PR message). While I think it's a step back in terms of readability, you raise a good point regarding scaling, etc.

Cheers!

This branch is waiting to be deployed

1 waiting deployment
testing_env — f8af80e0 Waiting Oct 25, 2026 by Phill544 via Build plugin (pixel-buddy, true) #4175
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

plugin-addition Adding a plugin to the Plugin Store

Projects

Status: Ready for review

Development

Successfully merging this pull request may close these issues.

7 participants