MacOS – Toggle Bluetooth AppleScript not Working in Yosemite

applescriptbluetoothmacosshortcut

Prior to upgrading to Yosemite, I used Keyboard Maestro to invoke this Applescript with a shortcut:

tell application "System Preferences"
    reveal pane "com.apple.preferences.Bluetooth"
end tell
tell application "System Events" to tell process "System Preferences"
    click button 6 of window 1
end tell
quit application "System Preferences"

It behaved just as expected, toggling bluetooth whenever I pressed my shortcut.

It's no longer working with Yosemite though, I'm sure it has something do with Apple changing the System Preferences pane or the order of icons, but I'm not sure what to change. The Keyboard Maestro shortcut is invoking the file, because I hear the sound I had assigned to it, so it's definitely something with the script.

Here's what I'm getting under "Replies" when I run this in Apple's Script Editor:

tell application "System Preferences"
    reveal pane "com.apple.preferences.Bluetooth"
        --> missing value
end tell
tell application "System Events"
    click button 6 of window 1 of process "System Preferences"
        --> button 6 of window "Bluetooth" of application process "System Preferences"
end tell
tell application "Script Editor"
    quit
end tell

Updates:

It's definitely not the pane that's causing the problem. To debug, I changed the code to:

tell application "System Preferences"
    set current pane to pane id "com.apple.preferences.bluetooth"
end tell

And it correctly opens the Bluetooth pane. Now all that's left is to figure what kind of action I want to run on this pane:

enter image description here

Update on solutions: Thanks fartheraway! Both of markhunte's and fartheraway's solutions worked for me, but I chose the latter because it was more similar to my code. I guess you can't choose two "best" answers. I wish there'd be a solution to make it work without bringing up the preferences pane (visually) like my script did with Mavericks, but these two should be good enough.

Best Answer

Updated/Better Answer:

1) This new script doesn't flash.

2) For reasons unbeknownst to man and logic (or just me), applescript sometimes/almost-always fails to Turn Bluetooth Off, if the System Preference window is in the background. Instead of turning off, what actually occurs is that Bluetooth immediately re-enable itself, so the pane is in a fresh state: it's ON, but no connections.

To overcome that, one way to to bring SysPref to the front, as in the original answer. Or, run a loop that click the button again (or for a 3rd time) until Bluetooth is really off. That's why there are two variables and a loop in the script. This should make the script more reliable. statName variable records the original status. Loop will continue clicking the button until status has changes. failSafe makes sure the script will not run forever in case of error. All at the cost of aesthetics of the code.

tell application "System Events"

    tell process "System Preferences"
        activate
    end tell

    tell application "System Preferences"
        set current pane to pane "com.apple.preferences.Bluetooth"
    end tell

    tell process "System Preferences"

        set statName to name of button 3 of window 1 as string
        set failSafe to 0

        repeat until statName is not name of button 3 of window 1 as string ¬
            or failSafe is 10
            click button 3 of window 1
            set failSafe to failSafe + 1
            delay 0.1
        end repeat

    end tell

    tell application "System Preferences"
        quit
    end tell

end tell

Original Answer:

tell application "System Preferences"
    activate --Change 1/2
    reveal pane "com.apple.preferences.Bluetooth"
end tell
tell application "System Events" to tell process "System Preferences"
    click button 3 of window 1 --Change 2/2
end tell
quit application "System Preferences"

From Accessibility Inspector:

enter image description here

button 3 in the the no.6 item on the list. The 6th button is no.11 in the list. When you call button 6 Preference Window goes Genie. I guess Mavericks had all the buttons bunched up at the front.