「Bluetoothデバイスの電池残量をチェックする」がうまく動かなかったのでちょっと書き換えたら動いた

  • 投稿日:
  • by
  • カテゴリ:

<追記 2018/8/26>
🔋マークを絵文字で書くと、ページが真っ白になってしまうという罠に
今日気付いたので修正すると同時に、
スクリプトも動かないケースがあったため、修正しました。
</追記>

<追記 2018/10/9>
Magic Trackpad と Magic Keyboardを2に買い換えたら、
"Product"にデバイス名が表示されるようになった。
つまり、
古い電池式の Magic Trackpad と Magic Keyboard は下のscriptを、
新しい充電式の Magic Trackpad と Magic Keyboard は
veadarさんのscriptを使えばいい

ということだと思われる。
</追記>

veadarさんのBluetoothデバイスの電池残量をチェックする | Macの手書き説明書を読んで、
興味を持ったのでダウンロードしてみたのだが、なぜかエラーが出て動かない。

どうやら、私の環境では"Product"でデバイス名が取得できないようだった。

  "Product" =

空っぽ。なんでだろう?

コマンドを打って調べてみたところ、
"IOClass"という項目にそれらしいものが見つかった。

  "IOClass" = "AppleBluetoothHIDKeyboard"

そこでAppleScriptを書き換えたら、動くようになった。

20180822bluetooth-check1.png

やった!

ということで、scriptを置いておく。
スクリプトの下のボタンを押すと、
スクリプトエディターが開くはずなので、
適当に保存して動かせばいい、はず。

-- http://ascii.jp/elem/000/000/592/592958/
-- https://gist.github.com/miyagawa/ed22215692e1937ab4bc


property shellText : "ioreg -r -d 1 -k BatteryPercent | egrep '(\"BatteryPercent\"|\"IOClass\") '"
property soundName : "Pop"


set shellResult to do shell script shellText


set batteryInfoList to extractText(shellResult)


set theText to ""


repeat with i from 1 to number of items in batteryInfoList
set this_item to item i of batteryInfoList
set theText to theText & item 1 of this_item & " : " & item 2 of this_item & "%🔋" & return
end repeat


notification(theText)
on notification(theText)
try
display notification theText sound name soundName with title "remaining battery level"
on error
display alert theText
end try
end notification


on extractText(shellResult)
set tempList to every paragraph of shellResult
set productNameList to {}
set batteryPercentList to {}



repeat with i from 1 to number of items in tempList
set this_item to item i of tempList
if 2nd item of makeList(this_item, "\"") = "IOClass" then
set productName to item 4 of makeList(this_item, "\"")
set end of productNameList to productName
-- display dialog productName
else if 2nd item of makeList(this_item, "\"") = "BatteryPercent" then
set batteryPercent to last item of makeList(this_item, "\" = ")
set end of batteryPercentList to batteryPercent as number
else -- 奇数処理:バッテリー残量
end if
end repeat
set resultList to {}
repeat with i from 1 to number of items in productNameList
set this_item to item i of productNameList
set that_item to item i of batteryPercentList
-- insert actions here
set end of resultList to {this_item, that_item}
end repeat


return resultList
end extractText


on makeList(theText, theDelimiter) --テキストを指定語句で区切り配列に格納する
set tmp to AppleScript's text item delimiters
set AppleScript's text item delimiters to theDelimiter
set theList to every text item of theText
set AppleScript's text item delimiters to tmp
return theList
end makeList