Bluetooth Connection/Battery Script for macOS

My BeatsX Earphones

I recently purchased a pair of BeatsX Earphones as I wanted to stop dealing with wired earbuds. For some reason, the wired connections always stopped working properly after a number of months. I supect it is just the stress on the wire while in my pocket during my commute.

When arriving at work, or really anytime I am transitioning from iPhone to MacBook Pro, I have to manually connect my BeatsX to the MacBook Pro. I wanted to automate this process, down to a simple command. If the BeatsX are in range and on they would initiate the connection process to my machine. In addition, it would be nice to have a way to monitor the battery level using a similar process.

Looking around, I couldn’t find any way through a command-line interface to do what I wanted. I eventually figured out that I could use macOS’s AppleScript to automate the menu navigation.

The following script will attempt to connect to the desired device (i.e., BeatsX by name). If it is already connected then it will retrieve the battery level.

activate application "SystemUIServer"
set deviceName to "Kevin Jalbert's BeatsX"

tell application "System Events"
  tell process "SystemUIServer"
    set bluetoothMenu to (menu bar item 1 of menu bar 1 whose description contains "bluetooth")
    tell bluetoothMenu
      click

      set deviceMenuItem to (menu item deviceName of menu 1)
      tell deviceMenuItem
        click

        if exists menu item "Connect" of menu 1 then
          click menu item "Connect" of menu 1
          return "Connecting..."
        else
          set batteryLevelMenuItem to (menu item 3 of menu 1)
          tell batteryLevelMenuItem
            set batteryLevelText to title of batteryLevelMenuItem
          end tell

          key code 53 -- esc key

          return batteryLevelText
        end if
      end tell
    end tell
  end tell
end tell

This on its own is a nice win and works as desired. Now, I’m a heavy user of Alfred and I quickly threw together a workflow that uses this script. I now get a notification during connection, and repeated invokations will display the battery level.

My BeatsX Alfred workflow