使用BetterTouchTool在Touch bar中显示Magic Mouse Battery

时间:2018-05-05 14:58:11

标签: applescript

我正在使用这个BetterTouchToll让我的触控条更有趣,非常酷。

他接受一些Apple Scripts更具动态性,所以我开始研究这个脚本。

现在我想在我的触控条上显示我的Magic Mouse Battery,为此我尝试了这段代码,但是没有用。

if application "Mouse" is running then
    tell application "Mouse"
        return (get Battery)
    end tell
end if
return "no mouse"

我的猜测是,鼠标不是一个应用程序,但不知道该放置什么

2 个答案:

答案 0 :(得分:2)

获取电池电量的传统方法是在命令行上使用ioreg。然而,传统的这种做法似乎不再适用于至少macOS High Sierra / 10.13.4;也就是说,他们不再允许选择仅显示单个蓝牙设备的电池百分比。

所以这是一个假设魔术鼠标永远是ioreg显示的最后一个设备的黑客。如果不是在不同的macOS安装中,则可能会失败,然后跨越不同的版本。

ioreg -c AppleDeviceManagementHIDEventService | grep BatteryPercent | tail -1 | sed 's/[^[:digit:]]//g'

在AppleScript中,这将是:

do shell script "ioreg -c AppleDeviceManagementHIDEventService | grep BatteryPercent | tail -1 | sed 's/[^[:digit:]]//g'"

您的代码设置也可以检测Magic Mouse未连接的时间。产品名称位于ioreg的“产品”属性中。例如:

ioreg -c AppleDeviceManagementHIDEventService | grep '"Product" ='

因此,为确保最终设备是鼠标,您可以这样做:

set finalDevice to do shell script "ioreg -c AppleDeviceManagementHIDEventService | grep '\"Product\" =' | tail -1"
if finalDevice contains "Magic Mouse" then
    set remaining to do shell script "ioreg -c AppleDeviceManagementHIDEventService | grep BatteryPercent | tail -1 | sed 's/[^[:digit:]]//g'"
    remaining & "%"
else
    "no mouse"
end if

基本逻辑:

  1. 使用ioreg
  2. 获取所有产品的列表
  3. 使用tail仅获取列表中的最终产品。
  4. 如果最终产品是Magic Mouse,那么:
    1. 使用ioreg抓取所有电池百分比列表。
    2. 使用tail仅获取列表中的最终电池百分比。
    3. 使用sed仅获取该行的实际数字。
    4. 在数字上附加百分比符号。
  5. 否则,没有鼠标。 (或者鼠标不是列表中的最后一项。)
  6. 对于较早使用ioreg的方法,请参阅:

答案 1 :(得分:0)

非常感谢您的解决方案。非常鼓舞人心。由于我有多个设备,因此我根据您的解决方案制作了自己的脚本。我想在这里分享它,以免对其他人有用。

由于我有多个蓝牙设备,因此它们在ioreg中的顺序取决于它们的连接顺序。这意味着我不能认为鼠标是最后一个设备。

我在shell中而不是在applescript中完成了大部分工作,因为我对shell更有经验,因此可以更快地完成。使用Applescript过滤ioreg的输出将是一个“清洁”的解决方案:p

警告:我知道这段代码简直糟透了,但是编写起来很快,并且可以完成工作,不要以为这是做事的一种方式。

我的解决方案

在BTT中,以下脚本调用了shell脚本

set devicename to "Magic Mouse 2" -- The name of the device in ioreg
set displayname to "Mouse" -- The name to display on the touchbar

set remaining to do shell script "~/.dotfiles/shell/device_battery_level.sh" & " " & quoted form of devicename

if remaining is "" then

    "" --No device present = no output to touchbar

else

    displayname & " " & remaining & "%" -- Show output on touchbar

end if

如所见,代码几乎只调用了shell脚本。变量“ devicename”中提供的名称用作脚本的参数,并且是脚本将在ioreg中查找的名称。如果Shell脚本输出一个空脚本,则不会显示任何小部件。对我来说,这比显示“无设备”更好。

“〜/ .dotfiles / shell / device_battery_level.sh”中的脚本如下所示:

#!/bin/sh
DEVICES=$(ioreg -r -l -n AppleHSBluetoothDevice | egrep '"BatteryPercent" = |^  \|   "Bluetooth Product Name" = ') #Lets get a list of all bluetooth devices

DEVICELINE=$(grep -n "$1" <<< "$DEVICES") #$1 is the device that this script was called with. Lets extract only the line with that device
if [$DEVICELINE = ""] #If DEVICELINE is empty the name of the device was not in the output and it is properly not connected.
then

    echo "" #Device not present, lets give BTT an empty string

else

    LINENR="${DEVICELINE:0:1}" #Then we find out where the line of the device is located

    NEXTLINE=$(expr $LINENR + "1") #The battery level is at the next line therefore we increment the line number
    SEDCOMMAND="p"

    BATTERYLINE=$(echo "$DEVICES" | sed -n  $NEXTLINE$SEDCOMMAND) # Now we can extract the line with the battery percent

    echo $BATTERYLINE | sed 's/[^[:digit:]]//g' #Finally we just need to get the digit and echo that to BTT

fi

基本逻辑与上述答案相同。除了不是使用带尾部的ioreg抓取最后一行外,egrep仅用于输出相关行。 egrep代码基于此处的另一篇文章:https://apple.stackexchange.com/questions/293502/how-can-i-determine-the-battery-level-of-my-magic-mouse-from-the-command-line/293505#293505 基于此,找到提及设备名称的行。逻辑是,由于电池电量信息始终在ioreg中的设备名称下方,因此提取列表中的下一行必须是电池电量。