IFTTT & D-Link Smart Plug – MacBook Pro battery charging management
2015年に購入して愛用し続けているMacBook Pro 13インチ。随分使ってきたのでバッテリーでの稼働時間が短くなってきました。2018年頃までは職場でも頻繁に使っていたので充電と放電を然るべきサイクルで行っていましたが、2018年からはデスクトップ感覚で自宅に常設して使っているため常にACアダプターがつながった状態でした。既に稼働時間が短くなったバッテリーはもとに戻らないのですが、ずっと自宅に置いておくとしても充電しっぱなしは避けたいと思い手元にあったD-LinkのスマートプラグとIFTTTを使って充電を制御してみることにしました。
目標は
- バッテリーの残量がある閾値を下回ったらACアダプターへの電源を供給して充電を開始する
- バッテリーの残量がある閾値を上回ったらACアダプターへの電源供給を止めて充電を終了する
- システムがシャットダウンする際にはACアダプターへの電源供給を止める
を実現することです。
まずはD-LinkのスマートプラグをmyDlinkというスマートフォンアプリでセットアップしてWiFiに接続して、IFTTTで利用するための準備を済ませます。
具体的なアプローチはMacBook Pro上で常にAppleScriptを動かしてバッテリーの残量を監視してその結果に応じてIFTTTを通じてスマートプラグをON・OFFすることにしました。IFTTTのWebhooksを利用することで、MacBook Pro上のAppleScriptからcurlコマンドでトリガーをかけます。
mydlinkとWebhooksサービスをIFTTTに追加し、Webhooksに適当なイベントネーム(mbp_charger_onやoffなど)を指定して、対象のD-LinkスマートプラグをON・OFFするように設定しています。
Webhooksサービスのドキュメンテーションを確認すると自分のアカウントに割り当てられたユニークなキーを確認できます。Webブラウザを使って、イベント名を先程のトリガーで設定した値、と自分のキーで構成したURLにアクセスすればD-Linkのプラグを操作できるはずです。
MacBook Pro側ではScript Editorを使って新しいApple Scriptを書きます。オンラインのいくつかの情報を参考にしながら以下のスクリプトで上手く動いています。もし使われる方がいらっしゃいましたらキーとトリガー名は置き換えてお使いください。
use AppleScript version "2.4"
use framework "Foundation"
use framework "AppKit"
use scripting additions
delay 10
global IFTTT_KEY, MIN, MAX, STATUS, AWAKE
set IFTTT_KEY to "<<Your Key>>"
set MIN to 20
set MAX to 80
set STATUS to ""
set AWAKE to true
set aCenter to current application's NSWorkspace's sharedWorkspace()'s notificationCenter()
aCenter's addObserver:me selector:"notifSleep:" |name|:"NSWorkspaceWillSleepNotification" object:(missing value)
aCenter's addObserver:me selector:"notifWaked:" |name|:"NSWorkspaceDidWakeNotification" object:(missing value)
on exeCurl(message)
if AWAKE and message is not STATUS then
do shell script "curl -X POST https://maker.ifttt.com/trigger/" & message & "/with/key/" & IFTTT_KEY
set STATUS to message
end if
end exeCurl
on idle
set per to (do shell script "pmset -g batt | grep % | sed 's/[%;]/ /' | awk '{print $3}'") as number
if per ≤ MIN then
exeCurl("mbp_charger_on")
else if MAX ≤ per then
exeCurl("mbp_charger_off")
end if
return 60
end idle
on quit
exeCurl("mbp_charger_off")
continue quit
end quit
on notifSleep:aNotif
exeCurl("mbp_charger_off")
set AWAKE to false
end notifSleep:
on notifWaked:aNotif
set AWAKE to true
end notifWaked:
最近は在宅勤務が多くてMacBook Proも大活躍。完全にバッテリーが故障してしまうことがないようにこのスクリプトも活用して使い続けています。将来新しいモデルに新調した際にも使い続けられるセットアップかな、と思っています。
Macで上手くいったのでWindows 10のPCでも同じことをやってみました。まだシステム終了時の処理がうまくいっていませんのでもう少し調整してからご紹介できればと思います。