Отображение батареи Magic Mouse на сенсорной панели с помощью BetterTouchTool - PullRequest
0 голосов
/ 05 мая 2018

Я использую этот BetterTouchToll для того, чтобы сделать мою сенсорную панель более интересной, что очень круто.

Он принимает некоторые сценарии Apple для более динамичной работы, поэтому я начинаю изучать эти сценарии.

Теперь я хочу отобразить аккумулятор Magic Mouse на сенсорной панели, для этого я пробовал этот код, но не работает.

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

Я предполагаю, что Мышь не является приложением, но не знаю, что поставить на место

Ответы [ 2 ]

0 голосов
/ 20 июня 2019

Большое спасибо за решение. Очень вдохновляюще. Поскольку у меня есть несколько устройств, я сделал свой собственный сценарий на основе ваших решений. Я хочу поделиться этим здесь на случай, если это может быть полезно для других.

Поскольку у меня более одного устройства Bluetooth, их порядок в ioreg основан на порядке их подключения. Это означает, что я не могу предположить, что мышь - последнее устройство.

Я сделал большую часть этого в оболочке, а не в appleScript, так как у меня больше опыта в оболочке, и поэтому так было быстрее. Использование Applescript для фильтрации выходных данных из ioreg было бы правильным решением: p

ВНИМАНИЕ: я знаю, что этот код довольно дурацкий, но его быстро написать, и он справляется со своей задачей, не думайте, что это способ работать правильно.

Мое решение

Из BTT следующий скрипт вызывает скрипт оболочки

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

Как видно, код в значительной степени просто вызывает скрипт оболочки. Имя, указанное в переменной «devicename», используется в качестве аргумента сценария и является именем, которое сценарий будет искать в ioreg. Если скрипт оболочки выводит пустой скрипт, виджет не будет отображаться. Для меня это было предпочтительнее, чем отображение «Нет устройства».

Сценарий в «~ / .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 с tail, 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, следующей строкой в ​​извлеченном списке должен быть уровень заряда батареи.

0 голосов
/ 05 мая 2018

Традиционным способом определения уровня заряда батареи является использование ioreg в командной строке. Однако традиционные средства для этого больше не работают, по крайней мере, в macOS High Sierra / 10.13.4; то есть они больше не позволяют отображать только процент заряда батареи одного устройства Bluetooth.

Так что это хак, который предполагает, что Волшебная Мышь всегда является последним устройством, отображаемым 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. Используйте tail, чтобы получить только конечный продукт в списке.
  3. Если конечным продуктом является Magic Mouse, то:
    1. Получить список всех процентов батареи, используя ioreg.
    2. Используйте tail, чтобы получить только окончательный процент заряда батареи в списке.
    3. Используйте sed, чтобы получить только фактическое число из этой строки.
    4. Добавить символ процента к числу.
  4. В противном случае нет мыши. (Или мышь не является последним элементом в списке.)

Более старые способы использования ioreg см., Например:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...